quartermaster/docs/mockups/month-editorial-ledger.html
archeious 761336c71d docs: keep design mockups alongside the shipped UI
Three iterations captured under docs/mockups/ with shared logo
assets:

* month-editorial-ledger.html — first pass, loose spacing, Fraunces
  serif throughout, no logo.
* month-editorial-ledger-dense.html — tightened spacing, logo
  integrated as masthead and behind the zero widget.
* month-condensed-sans.html — the shipped direction. Logo in the
  zero hero, Barlow Condensed everywhere, masthead dropped.

These give a paper trail for why the app looks the way it does and
a sandbox for future typographic experiments without touching the
live CSS.

Refs #17

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 16:58:22 -06:00

1055 lines
34 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Quartermaster · April 2026 · Editorial Ledger Mockup</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght,SOFT,WONK@0,9..144,300..900,30..100,0..1;1,9..144,300..900,30..100,0..1&family=IBM+Plex+Sans:ital,wght@0,400;0,500;0,600;1,400&display=swap" rel="stylesheet">
<style>
:root {
--paper: #f5efe0;
--paper-deep: #efe7d4;
--paper-soft: #faf5e8;
--ink: #1a1814;
--ink-soft: #3a362e;
--muted: #7e7668;
--rule: #c8bfa8;
--rule-soft: #dcd4bf;
--accent: #7a1f28; /* oxblood */
--accent-soft: #a3384a;
--ochre: #9c6b1a;
--sage: #2d4a30;
--sage-soft: #4f7455;
--indigo: #353a5e;
--serif: "Fraunces", "Georgia", serif;
--sans: "IBM Plex Sans", "Helvetica Neue", sans-serif;
}
*, *::before, *::after { box-sizing: border-box; }
html, body {
margin: 0;
padding: 0;
color: var(--ink);
background: var(--paper);
font-family: var(--serif);
font-variation-settings: "opsz" 14, "SOFT" 50, "WONK" 0;
font-feature-settings: "onum" 1, "ss01" 1;
line-height: 1.5;
/* Subtle paper texture via layered gradients */
background-image:
radial-gradient(circle at 18% 12%, rgba(200, 191, 168, 0.18) 0, transparent 44%),
radial-gradient(circle at 82% 80%, rgba(200, 191, 168, 0.14) 0, transparent 50%),
repeating-linear-gradient(90deg, transparent 0 3px, rgba(120, 110, 90, 0.012) 3px 4px);
min-height: 100vh;
}
.page {
max-width: 760px;
margin: 0 auto;
padding: 3.5rem 1.5rem 6rem;
}
/* ==================================================================
MASTHEAD
================================================================== */
.masthead {
text-align: center;
padding-bottom: 1.25rem;
border-bottom: 1px solid var(--ink);
position: relative;
}
.masthead::after {
content: "";
position: absolute;
left: 0; right: 0; bottom: -4px;
height: 1px;
background: var(--ink);
}
.masthead .title {
font-family: var(--serif);
font-variation-settings: "opsz" 144, "SOFT" 30, "WONK" 1;
font-weight: 500;
font-style: italic;
font-size: clamp(2.6rem, 7vw, 4.2rem);
line-height: 1;
letter-spacing: -0.01em;
margin: 0;
}
.folio {
font-family: var(--sans);
font-size: 0.72rem;
font-weight: 400;
font-style: italic;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--muted);
margin-top: 0.8rem;
font-feature-settings: "lnum" 1;
}
.folio .sep { display: inline-block; margin: 0 0.5em; opacity: 0.6; }
/* ==================================================================
MONTH BANNER
================================================================== */
.month-banner {
display: grid;
grid-template-columns: 1fr auto 1fr;
align-items: center;
gap: 1rem;
padding: 1.75rem 0 0.75rem;
border-bottom: 1px solid var(--rule);
}
.nav-month {
font-family: var(--serif);
font-style: italic;
font-size: 0.95rem;
color: var(--muted);
text-decoration: none;
transition: color 0.12s ease;
}
.nav-month:hover { color: var(--ink); }
.nav-month.prev { text-align: left; }
.nav-month.next { text-align: right; }
.nav-month .chev { display: inline-block; font-size: 0.85em; margin: 0 0.3em; }
.month-title {
font-family: var(--serif);
font-variation-settings: "opsz" 144, "SOFT" 30, "WONK" 0;
font-weight: 400;
font-size: clamp(1.4rem, 4vw, 2rem);
letter-spacing: 0.08em;
text-transform: uppercase;
margin: 0;
white-space: nowrap;
font-feature-settings: "lnum" 1;
}
.month-title .year {
font-variation-settings: "opsz" 144, "SOFT" 30, "WONK" 1;
font-style: italic;
font-weight: 400;
margin-left: 0.3em;
letter-spacing: 0;
}
.month-meta {
display: flex;
justify-content: space-between;
align-items: baseline;
padding: 0.6rem 0 1.5rem;
font-family: var(--sans);
font-size: 0.78rem;
color: var(--muted);
font-style: italic;
}
.state {
font-family: var(--serif);
font-style: italic;
font-size: 0.92rem;
color: var(--sage);
letter-spacing: 0.01em;
font-variation-settings: "opsz" 48, "SOFT" 40;
}
.state::before { content: "— "; opacity: 0.7; }
.state::after { content: " —"; opacity: 0.7; }
.state.planning { color: var(--indigo); }
.state.closed { color: var(--muted); }
.actions { display: flex; gap: 1.25rem; align-items: baseline; }
.action-link {
font-family: var(--sans);
font-size: 0.72rem;
letter-spacing: 0.22em;
text-transform: uppercase;
color: var(--muted);
text-decoration: none;
transition: color 0.12s ease;
}
.action-link:hover { color: var(--ink); }
.btn-close {
font-family: var(--serif);
font-style: italic;
font-size: 0.92rem;
color: var(--ink);
background: var(--paper-soft);
border: 1px solid var(--ink);
padding: 0.4rem 1rem 0.45rem;
cursor: pointer;
letter-spacing: 0.02em;
transition: background 0.12s ease, color 0.12s ease;
font-variation-settings: "opsz" 48, "SOFT" 30;
}
.btn-close:hover { background: var(--ink); color: var(--paper); }
.btn-close::after { content: " →"; font-style: normal; margin-left: 0.1em; }
/* ==================================================================
ZERO AMOUNT HERO
================================================================== */
.zero {
padding: 3rem 0 2.75rem;
text-align: center;
border-bottom: 3px double var(--ink);
position: relative;
}
.zero-label {
font-family: var(--sans);
font-size: 0.75rem;
font-weight: 500;
letter-spacing: 0.32em;
text-transform: uppercase;
color: var(--muted);
margin: 0 0 0.6rem;
}
.zero-value {
font-family: var(--serif);
font-variation-settings: "opsz" 144, "SOFT" 30, "WONK" 0;
font-weight: 400;
font-size: clamp(4.4rem, 13vw, 7rem);
line-height: 0.95;
letter-spacing: -0.015em;
margin: 0;
color: var(--sage);
font-feature-settings: "lnum" 1, "tnum" 1;
transition: color 0.2s ease;
}
.zero-value .dollar {
font-size: 0.55em;
vertical-align: 0.22em;
margin-right: 0.04em;
font-feature-settings: "lnum" 1;
color: var(--muted);
}
.zero-value .cent {
font-size: 0.4em;
vertical-align: 0.82em;
margin-left: 0.06em;
color: var(--muted);
}
.zero-value.positive { color: var(--ochre); }
.zero-value.negative { color: var(--accent); }
.zero-caption {
font-family: var(--serif);
font-style: italic;
font-size: 1rem;
color: var(--muted);
margin: 0.85rem 0 0;
font-variation-settings: "opsz" 48, "SOFT" 50;
}
.zero-split {
display: grid;
grid-template-columns: 1fr auto 1fr;
gap: 2rem;
align-items: baseline;
margin-top: 1.8rem;
padding: 0 1rem;
}
.zero-split .cell { text-align: center; }
.zero-split .cell.left { text-align: right; padding-right: 1.5rem; }
.zero-split .cell.right { text-align: left; padding-left: 1.5rem; }
.zero-split .sublabel {
font-family: var(--sans);
font-size: 0.68rem;
letter-spacing: 0.28em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 0.2rem;
}
.zero-split .subvalue {
font-family: var(--serif);
font-weight: 400;
font-size: 1.45rem;
color: var(--ink);
font-feature-settings: "lnum" 1, "tnum" 1;
}
.zero-split .subvalue .cent {
font-size: 0.7em;
vertical-align: 0.35em;
margin-left: 0.08em;
color: var(--muted);
}
.zero-divider {
height: 2.4rem;
width: 1px;
background: var(--rule);
align-self: center;
}
/* ==================================================================
LEDGER GROUPS
================================================================== */
.ledger-group {
border-bottom: 1px solid var(--ink);
margin: 0;
}
.ledger-group[open] { padding-bottom: 1.5rem; }
.ledger-group > summary {
display: grid;
grid-template-columns: auto 1fr auto;
gap: 1rem;
align-items: baseline;
padding: 1.4rem 0 1rem;
cursor: pointer;
list-style: none;
user-select: none;
}
.ledger-group > summary::-webkit-details-marker { display: none; }
.ledger-group .chev {
display: inline-block;
width: 0.9rem;
height: 0.9rem;
position: relative;
transform: rotate(-90deg);
transition: transform 0.18s ease;
}
.ledger-group .chev::before {
content: "";
position: absolute;
top: 50%;
left: 0;
width: 0.9rem;
height: 1px;
background: var(--ink);
transform: translateY(-0.5px);
}
.ledger-group .chev::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
width: 1px;
height: 0.9rem;
background: var(--ink);
transform: translate(-50%, -50%);
opacity: 1;
transition: opacity 0.18s ease;
}
.ledger-group[open] > summary .chev { transform: rotate(0deg); }
.ledger-group[open] > summary .chev::after { opacity: 0; }
.group-name {
font-family: var(--serif);
font-style: italic;
font-weight: 500;
font-size: 1.55rem;
letter-spacing: 0.01em;
font-variation-settings: "opsz" 48, "SOFT" 30, "WONK" 1;
}
.group-total {
font-family: var(--serif);
font-weight: 400;
font-size: 1.4rem;
font-feature-settings: "lnum" 1, "tnum" 1;
color: var(--ink);
text-align: right;
}
.group-total .split {
display: inline-flex;
gap: 0.9rem;
align-items: baseline;
}
.group-total .split .applied { color: var(--ink); }
.group-total .split .slash {
color: var(--rule);
font-family: var(--serif);
font-style: italic;
font-weight: 300;
}
.group-total .split .planned { color: var(--muted); font-size: 0.88em; }
/* ==================================================================
LEDGER SECTIONS
================================================================== */
.ledger-section {
padding: 0.25rem 0 1.4rem 1.9rem;
border-left: 1px solid var(--rule-soft);
margin-left: 0.4rem;
}
.ledger-section + .ledger-section {
margin-top: 0.6rem;
padding-top: 1rem;
border-top: 1px dashed var(--rule);
}
.section-header {
display: grid;
grid-template-columns: 1fr auto;
align-items: baseline;
gap: 1rem;
margin-bottom: 0.5rem;
padding-right: 0.25rem;
}
.section-title {
font-family: var(--sans);
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.26em;
text-transform: uppercase;
color: var(--ink-soft);
margin: 0;
}
.section-subtotal {
font-family: var(--serif);
font-weight: 400;
font-size: 1rem;
color: var(--ink-soft);
font-feature-settings: "lnum" 1, "tnum" 1;
}
.section-subtotal .slash { color: var(--rule); margin: 0 0.3em; font-weight: 300; font-style: italic; }
.section-subtotal .planned { color: var(--muted); }
/* ==================================================================
ENTRY ROWS
================================================================== */
.entry {
padding: 0.5rem 0.25rem 0.6rem 0;
position: relative;
}
.entry + .entry { border-top: 1px dotted var(--rule); }
.entry-row {
display: grid;
grid-template-columns: 1fr auto auto 1.5rem;
gap: 1.25rem;
align-items: baseline;
}
.entry-name {
font-family: var(--serif);
font-weight: 400;
font-size: 1.02rem;
color: var(--ink);
letter-spacing: 0.005em;
}
.entry-name input {
font: inherit;
color: inherit;
background: transparent;
border: none;
border-bottom: 1px solid transparent;
padding: 0.1rem 0;
width: 100%;
outline: none;
transition: border-color 0.12s ease;
}
.entry-name input:hover { border-bottom-color: var(--rule); }
.entry-name input:focus { border-bottom-color: var(--ink); }
.entry-num {
font-family: var(--serif);
font-weight: 400;
font-size: 1rem;
color: var(--ink);
font-feature-settings: "lnum" 1, "tnum" 1;
text-align: right;
min-width: 5rem;
}
.entry-num input {
font: inherit;
font-variant-numeric: tabular-nums;
color: inherit;
background: transparent;
border: none;
border-bottom: 1px solid transparent;
padding: 0.1rem 0;
width: 100%;
outline: none;
text-align: right;
transition: border-color 0.12s ease;
}
.entry-num input:hover { border-bottom-color: var(--rule); }
.entry-num input:focus { border-bottom-color: var(--ink); }
.entry-num.planned { color: var(--muted); font-weight: 300; }
.entry-num.planned input { color: var(--muted); font-weight: 300; }
.entry .delete {
font-family: var(--serif);
font-size: 1.3rem;
line-height: 1;
color: var(--rule);
background: none;
border: none;
cursor: pointer;
padding: 0;
transition: color 0.12s ease;
}
.entry .delete:hover { color: var(--accent); }
/* Progress bar — ambient feedback for applied/planned ratio */
.entry-progress {
position: relative;
height: 2px;
margin: 0.35rem 0 0.15rem;
background: var(--rule-soft);
border-radius: 1px;
overflow: visible;
}
.entry-progress::before {
content: "";
position: absolute;
top: 0; left: 0; bottom: 0;
width: min(100%, calc(var(--ratio, 1) * 100%));
background: var(--sage-soft);
border-radius: 1px;
transition: width 0.3s ease;
}
.entry-progress::after {
content: "";
position: absolute;
top: -1px; bottom: -1px;
left: 100%;
width: calc(max(var(--ratio, 1), 1) * 100% - 100%);
background: var(--accent);
border-radius: 1px;
}
.entry-progress.under::before { background: var(--ochre); opacity: 0.55; }
.entry-progress.over::before { background: var(--accent); }
.entry-progress.at::before { background: var(--sage); }
.entry-progress.at::after { display: none; }
.entry-progress.under::after { display: none; }
.entry-notes {
font-family: var(--serif);
font-style: italic;
font-size: 0.88rem;
color: var(--muted);
margin: 0.35rem 0 0;
padding: 0;
font-variation-settings: "opsz" 14, "SOFT" 50;
}
.entry-notes input {
font: inherit;
font-style: italic;
color: inherit;
background: transparent;
border: none;
padding: 0.05rem 0;
width: 100%;
outline: none;
}
.entry-notes input::placeholder {
color: var(--rule);
font-style: italic;
}
/* ==================================================================
PRIMARY DEBT TARGET — special treatment
================================================================== */
.target-section {
padding: 1rem 0 1rem 1.9rem;
border-left: 3px solid var(--accent);
margin-left: 0.4rem;
position: relative;
}
.target-section::before {
content: "↳";
position: absolute;
left: -1.3rem;
top: 1rem;
color: var(--accent);
font-size: 1.1rem;
font-family: var(--serif);
}
.target-header {
display: grid;
grid-template-columns: 1fr auto;
gap: 1rem;
align-items: baseline;
margin-bottom: 0.4rem;
}
.target-label {
font-family: var(--sans);
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.28em;
text-transform: uppercase;
color: var(--accent);
}
.target-amount {
font-family: var(--serif);
font-weight: 400;
font-size: 1.1rem;
font-feature-settings: "lnum" 1, "tnum" 1;
}
.target-name {
font-family: var(--serif);
font-style: italic;
font-size: 1.05rem;
color: var(--ink);
font-variation-settings: "opsz" 48, "SOFT" 50;
}
.target-detail {
font-family: var(--sans);
font-size: 0.78rem;
color: var(--muted);
font-style: italic;
margin-top: 0.15rem;
}
/* ==================================================================
ADD ROW
================================================================== */
.add-row {
padding-top: 0.75rem;
margin-top: 0.4rem;
border-top: 1px solid var(--rule);
}
.add-link {
font-family: var(--serif);
font-style: italic;
font-size: 0.92rem;
color: var(--muted);
background: none;
border: none;
padding: 0;
cursor: pointer;
letter-spacing: 0.01em;
font-variation-settings: "opsz" 48, "SOFT" 50;
transition: color 0.12s ease;
}
.add-link:hover { color: var(--ink); }
.add-link::before { content: "+ "; font-style: normal; color: var(--rule); margin-right: 0.15em; }
/* ==================================================================
TAGS (deviation indicators)
================================================================== */
.tag {
font-family: var(--sans);
font-size: 0.58rem;
font-weight: 500;
letter-spacing: 0.22em;
text-transform: uppercase;
padding: 0.08rem 0.45rem 0.1rem;
margin-left: 0.5rem;
vertical-align: 0.15em;
border: 1px solid currentColor;
color: var(--ochre);
}
.tag.new { color: var(--indigo); }
/* ==================================================================
FOOTER
================================================================== */
.colophon {
text-align: center;
margin: 4rem 0 0;
padding-top: 2rem;
border-top: 1px solid var(--rule);
font-family: var(--serif);
font-style: italic;
font-size: 0.82rem;
color: var(--muted);
letter-spacing: 0.08em;
font-variation-settings: "opsz" 48, "SOFT" 50;
}
.colophon::before {
content: "·";
display: block;
margin: 0 auto 1rem;
font-size: 1.2rem;
color: var(--rule);
letter-spacing: 1em;
}
.colophon .signoff {
font-family: var(--sans);
font-size: 0.68rem;
font-style: normal;
letter-spacing: 0.28em;
text-transform: uppercase;
color: var(--muted);
margin-top: 0.4rem;
}
/* ==================================================================
RESPONSIVE
================================================================== */
@media (max-width: 520px) {
.page { padding: 2rem 1rem 4rem; }
.month-banner { grid-template-columns: 1fr; gap: 0.5rem; text-align: center; }
.nav-month.prev, .nav-month.next { text-align: center; }
.entry-row {
grid-template-columns: 1fr 1.5rem;
gap: 0.4rem;
}
.entry-num { grid-column: 1; text-align: left; }
.entry-num.planned::before { content: "planned "; font-family: var(--sans); font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.15em; color: var(--muted); margin-right: 0.4em; }
.entry-num:not(.planned)::before { content: "applied "; font-family: var(--sans); font-size: 0.65rem; text-transform: uppercase; letter-spacing: 0.15em; color: var(--muted); margin-right: 0.4em; }
.zero-split { grid-template-columns: 1fr; gap: 0.8rem; }
.zero-split .cell.left, .zero-split .cell.right { text-align: center; padding: 0; }
.zero-divider { display: none; }
}
</style>
</head>
<body>
<div class="page">
<!-- ============== MASTHEAD ============== -->
<header class="masthead">
<h1 class="title">Quartermaster</h1>
<div class="folio">
Household Budget
<span class="sep">·</span>
Vol. MMXXVI
<span class="sep">·</span>
No. 04
</div>
</header>
<!-- ============== MONTH BANNER ============== -->
<nav class="month-banner">
<a class="nav-month prev" href="#">
<span class="chev"></span>
<em>March</em>
</a>
<h2 class="month-title">April<span class="year">MMXXVI</span></h2>
<a class="nav-month next" href="#">
<em>May</em>
<span class="chev"></span>
</a>
</nav>
<div class="month-meta">
<span class="state">Active</span>
<div class="actions">
<a class="action-link" href="#">Back to Budget</a>
<button class="btn-close">Close month</button>
</div>
</div>
<!-- ============== ZERO AMOUNT HERO ============== -->
<section class="zero">
<p class="zero-label">Zero Amount</p>
<h2 class="zero-value">
<span class="dollar">$</span>0<span class="cent">.00</span>
</h2>
<p class="zero-caption">— the month balances —</p>
<div class="zero-split">
<div class="cell left">
<div class="sublabel">Applied</div>
<div class="subvalue">$2,500<span class="cent">.00</span></div>
</div>
<div class="zero-divider"></div>
<div class="cell right">
<div class="sublabel">Planned</div>
<div class="subvalue">$2,500<span class="cent">.00</span></div>
</div>
</div>
</section>
<!-- ============== INCOME ============== -->
<details class="ledger-group" open>
<summary>
<span class="chev" aria-hidden="true"></span>
<span class="group-name">Income</span>
<span class="group-total"><span class="split">
<span class="applied">$2,500.00</span>
<span class="slash">/</span>
<span class="planned">$2,500.00</span>
</span></span>
</summary>
<section class="ledger-section">
<header class="section-header">
<h3 class="section-title">Incomes</h3>
<div class="section-subtotal">$2,500.00 <span class="slash">/</span> <span class="planned">$2,500.00</span></div>
</header>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Paycheck" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="2500.00" aria-label="Planned"></span>
<span class="entry-num"><input value="2500.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input value="biweekly deposit, direct to checking" aria-label="Notes"></p>
</div>
<div class="add-row">
<button class="add-link">add income</button>
</div>
</section>
</details>
<!-- ============== COMMITTED ============== -->
<details class="ledger-group" open>
<summary>
<span class="chev" aria-hidden="true"></span>
<span class="group-name">Committed</span>
<span class="group-total"><span class="split">
<span class="applied">$1,720.00</span>
<span class="slash">/</span>
<span class="planned">$1,720.00</span>
</span></span>
</summary>
<!-- FIXED BILLS -->
<section class="ledger-section">
<header class="section-header">
<h3 class="section-title">Fixed Amount Bills</h3>
<div class="section-subtotal">$1,280.00 <span class="slash">/</span> <span class="planned">$1,280.00</span></div>
</header>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Rent" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="1200.00" aria-label="Planned"></span>
<span class="entry-num"><input value="1200.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input value="ACH on the 1st, account ending 4421" aria-label="Notes"></p>
</div>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Internet" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="80.00" aria-label="Planned"></span>
<span class="entry-num"><input value="80.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input placeholder="notes..." aria-label="Notes"></p>
</div>
<div class="add-row">
<button class="add-link">add fixed bill</button>
</div>
</section>
<!-- DEBT MINIMUMS -->
<section class="ledger-section">
<header class="section-header">
<h3 class="section-title">Debt Minimums</h3>
<div class="section-subtotal">$70.00 <span class="slash">/</span> <span class="planned">$70.00</span></div>
</header>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Card B" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="30.00" aria-label="Planned"></span>
<span class="entry-num"><input value="30.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input value="15.99% APR, min only" aria-label="Notes"></p>
</div>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Card C" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="40.00" aria-label="Planned"></span>
<span class="entry-num"><input value="40.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input value="21.4% APR, min only" aria-label="Notes"></p>
</div>
<div class="add-row">
<button class="add-link">add debt minimum</button>
</div>
</section>
<!-- PRIMARY DEBT TARGET -->
<section class="target-section">
<div class="target-header">
<div class="target-label">Primary Debt Target</div>
<div class="target-amount">$370.00 <span class="slash">/</span> <span class="planned">$370.00</span></div>
</div>
<div class="target-name">Card A</div>
<div class="target-detail">28.9% APR · avalanche focus · receives leftover at close</div>
</section>
</details>
<!-- ============== SAVINGS (collapsed) ============== -->
<details class="ledger-group">
<summary>
<span class="chev" aria-hidden="true"></span>
<span class="group-name">Savings</span>
<span class="group-total"><span class="split">
<span class="applied">$300.00</span>
<span class="slash">/</span>
<span class="planned">$300.00</span>
</span></span>
</summary>
<section class="ledger-section">
<header class="section-header">
<h3 class="section-title">Sinking Funds</h3>
<div class="section-subtotal">$300.00 <span class="slash">/</span> <span class="planned">$300.00</span></div>
</header>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Emergency fund" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="300.00" aria-label="Planned"></span>
<span class="entry-num"><input value="300.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input value="target: 3 months of expenses (~$11k)" aria-label="Notes"></p>
</div>
<div class="add-row">
<button class="add-link">add sinking fund</button>
</div>
</section>
</details>
<!-- ============== FLEXIBLE ============== -->
<details class="ledger-group" open>
<summary>
<span class="chev" aria-hidden="true"></span>
<span class="group-name">Flexible</span>
<span class="group-total"><span class="split">
<span class="applied">$480.00</span>
<span class="slash">/</span>
<span class="planned">$470.00</span>
</span></span>
</summary>
<!-- FOOD -->
<section class="ledger-section">
<header class="section-header">
<h3 class="section-title">Food and Essentials</h3>
<div class="section-subtotal">$430.00 <span class="slash">/</span> <span class="planned">$400.00</span></div>
</header>
<div class="entry">
<div class="entry-row">
<span class="entry-name">
<input value="Groceries" aria-label="Entry name">
<span class="tag">modified</span>
</span>
<span class="entry-num planned"><input value="400.00" aria-label="Planned"></span>
<span class="entry-num"><input value="430.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress over" style="--ratio: 1.075"></div>
<p class="entry-notes"><input value="went over by $30 — store run on the 28th" aria-label="Notes"></p>
</div>
<div class="add-row">
<button class="add-link">add food entry</button>
</div>
</section>
<!-- SUBSCRIPTIONS -->
<section class="ledger-section">
<header class="section-header">
<h3 class="section-title">Subscriptions</h3>
<div class="section-subtotal">$30.00 <span class="slash">/</span> <span class="planned">$40.00</span></div>
</header>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Streaming" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="15.00" aria-label="Planned"></span>
<span class="entry-num"><input value="15.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input placeholder="notes..." aria-label="Notes"></p>
</div>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Cloud backup" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="25.00" aria-label="Planned"></span>
<span class="entry-num"><input value="15.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress under" style="--ratio: 0.6"></div>
<p class="entry-notes"><input value="prorated, billed mid-cycle" aria-label="Notes"></p>
</div>
<div class="add-row">
<button class="add-link">add subscription</button>
</div>
</section>
<!-- OTHER -->
<section class="ledger-section">
<header class="section-header">
<h3 class="section-title">Other</h3>
<div class="section-subtotal">$20.00 <span class="slash">/</span> <span class="planned">$30.00</span></div>
</header>
<div class="entry">
<div class="entry-row">
<span class="entry-name"><input value="Parking" aria-label="Entry name"></span>
<span class="entry-num planned"><input value="30.00" aria-label="Planned"></span>
<span class="entry-num"><input value="20.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress under" style="--ratio: 0.666"></div>
<p class="entry-notes"><input placeholder="notes..." aria-label="Notes"></p>
</div>
<div class="entry">
<div class="entry-row">
<span class="entry-name">
<input value="Mother's Day gift" aria-label="Entry name">
<span class="tag new">new this month</span>
</span>
<span class="entry-num planned"><input value="0.00" aria-label="Planned"></span>
<span class="entry-num"><input value="0.00" aria-label="Applied"></span>
<button class="delete" aria-label="Delete">×</button>
</div>
<div class="entry-progress at" style="--ratio: 1"></div>
<p class="entry-notes"><input value="planning to spend $40 first week of May" aria-label="Notes"></p>
</div>
<div class="add-row">
<button class="add-link">add other</button>
</div>
</section>
</details>
<!-- ============== COLOPHON ============== -->
<footer class="colophon">
the art of giving every dollar a job
<div class="signoff">Quartermaster · MMXXVI</div>
</footer>
</div>
</body>
</html>