Files
ti/citti_indkoebsseddel.html

777 lines
45 KiB
HTML
Raw Permalink Normal View History

2026-06-06 00:55:31 +02:00
<!DOCTYPE html>
<html lang="da">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Citti Indkøbsseddel — Uge 23-25</title>
<link href="https://fonts.googleapis.com/css2?family=DM+Mono:wght@400;500&family=DM+Sans:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
:root {
--bg: #f5f2ed;
--card: #ffffff;
--border: #e2ddd6;
--text: #1a1814;
--muted: #8a857c;
--accent: #c84b2f;
--accent-light: #f7ede9;
--green: #2d6a4f;
--green-light: #e8f4ee;
--amber: #92580a;
--amber-light: #fef3e2;
--blue: #1d4e89;
--blue-light: #e8f0f9;
--mono: 'DM Mono', monospace;
--sans: 'DM Sans', sans-serif;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: var(--sans);
background: var(--bg);
color: var(--text);
font-size: 15px;
line-height: 1.5;
padding: 2rem 1rem 4rem;
}
.page { max-width: 860px; margin: 0 auto; }
header {
display: grid;
grid-template-columns: 1fr auto;
align-items: start;
gap: 1rem;
margin-bottom: 2rem;
padding-bottom: 1.5rem;
border-bottom: 2px solid var(--text);
}
.header-left h1 {
font-size: 2rem;
font-weight: 600;
letter-spacing: -0.03em;
line-height: 1.1;
margin-bottom: 0.5rem;
}
.header-left h1 span { color: var(--accent); }
.header-meta {
display: flex;
flex-wrap: wrap;
gap: 0.5rem 1.5rem;
font-size: 13px;
color: var(--muted);
}
.header-meta strong { color: var(--text); }
.savings-card {
background: var(--text);
color: white;
border-radius: 12px;
padding: 1rem 1.25rem;
text-align: right;
min-width: 180px;
}
.savings-card .label { font-size: 11px; opacity: 0.6; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 4px; }
.savings-card .amount { font-size: 2rem; font-weight: 600; font-family: var(--mono); letter-spacing: -0.02em; color: #7de8b0; }
.savings-card .sublabel { font-size: 11px; opacity: 0.5; margin-top: 2px; }
.stats-row {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 10px;
margin-bottom: 2rem;
}
.stat {
background: var(--card);
border: 1px solid var(--border);
border-radius: 10px;
padding: 0.875rem 1rem;
}
.stat .s-label { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 4px; }
.stat .s-val { font-size: 1.5rem; font-weight: 600; font-family: var(--mono); letter-spacing: -0.02em; }
.stat .s-sub { font-size: 11px; color: var(--muted); margin-top: 2px; }
.section { margin-bottom: 1.5rem; }
.section-header {
display: flex;
align-items: center;
gap: 10px;
padding: 0.6rem 0.875rem;
background: var(--text);
color: white;
border-radius: 8px 8px 0 0;
font-size: 13px;
font-weight: 500;
letter-spacing: 0.04em;
text-transform: uppercase;
}
.section-header .emoji { font-size: 16px; }
.section-header .est { margin-left: auto; font-family: var(--mono); font-size: 12px; opacity: 0.7; }
.items-table {
background: var(--card);
border: 1px solid var(--border);
border-top: none;
border-radius: 0 0 8px 8px;
overflow: hidden;
}
.item-row {
display: grid;
grid-template-columns: 28px 1fr 60px 90px 90px;
align-items: center;
gap: 0;
border-bottom: 1px solid var(--border);
transition: background 0.15s;
}
.item-row:last-child { border-bottom: none; }
.item-row:hover { background: #faf9f7; }
.item-row.checked { opacity: 0.45; }
.item-row.checked .item-name { text-decoration: line-through; }
.item-check {
display: flex;
align-items: center;
justify-content: center;
padding: 0.75rem 0 0.75rem 0.875rem;
}
.item-check input[type=checkbox] {
width: 16px;
height: 16px;
accent-color: var(--accent);
cursor: pointer;
}
.item-name {
padding: 0.75rem 0.5rem;
font-size: 14px;
}
.item-name .note {
font-size: 11px;
color: var(--muted);
display: block;
margin-top: 1px;
}
.badge {
display: inline-block;
font-size: 10px;
padding: 1px 6px;
border-radius: 4px;
margin-left: 6px;
vertical-align: middle;
font-weight: 500;
}
.badge-card { background: var(--blue-light); color: var(--blue); }
.badge-kasse { background: var(--amber-light); color: var(--amber); }
.item-qty {
padding: 0.75rem 0.5rem;
font-size: 12px;
color: var(--muted);
font-family: var(--mono);
text-align: center;
}
.item-est {
padding: 0.75rem 0.5rem;
font-size: 13px;
font-family: var(--mono);
color: var(--muted);
text-align: right;
}
.item-actual {
padding: 0.5rem 0.875rem 0.5rem 0.5rem;
}
.item-actual input {
width: 100%;
border: 1px solid var(--border);
border-radius: 6px;
padding: 4px 8px;
font-size: 13px;
font-family: var(--mono);
background: var(--bg);
color: var(--text);
text-align: right;
outline: none;
transition: border-color 0.15s, background 0.15s;
}
.item-actual input:focus {
border-color: var(--accent);
background: white;
}
.item-actual input.has-value {
background: var(--green-light);
border-color: #a8d5bc;
color: var(--green);
font-weight: 500;
}
.section-total {
display: grid;
grid-template-columns: 28px 1fr 60px 90px 90px;
align-items: center;
background: #f7f5f2;
border-top: 1px solid var(--border);
padding: 0.5rem 0;
}
.section-total .st-label {
grid-column: 1/4;
padding: 0 0.5rem 0 0.875rem;
font-size: 12px;
font-weight: 500;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.section-total .st-est {
font-size: 13px;
font-family: var(--mono);
font-weight: 500;
color: var(--muted);
text-align: right;
padding: 0 0.5rem;
}
.section-total .st-actual {
font-size: 13px;
font-family: var(--mono);
font-weight: 600;
color: var(--green);
text-align: right;
padding: 0 0.875rem 0 0.5rem;
}
.col-headers {
display: grid;
grid-template-columns: 28px 1fr 60px 90px 90px;
background: #f0ece6;
border: 1px solid var(--border);
border-top: none;
padding: 4px 0;
}
.col-h {
font-size: 10px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: 0.07em;
font-weight: 500;
}
.col-h:nth-child(1) { padding-left: 0.875rem; }
.col-h:nth-child(2) { padding-left: 0.5rem; }
.col-h:nth-child(3) { text-align: center; padding: 0 0.5rem; }
.col-h:nth-child(4) { text-align: right; padding: 0 0.5rem; }
.col-h:nth-child(5) { text-align: right; padding: 0 0.875rem 0 0.5rem; }
.rema-section {
background: var(--card);
border: 1px solid var(--border);
border-radius: 8px;
padding: 1rem 1.25rem;
margin-bottom: 1.5rem;
}
.rema-title {
font-size: 13px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--muted);
margin-bottom: 0.75rem;
display: flex;
align-items: center;
gap: 8px;
}
.rema-items { display: flex; flex-wrap: wrap; gap: 6px; }
.rema-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
background: var(--bg);
border: 1px solid var(--border);
border-radius: 6px;
padding: 4px 10px;
cursor: pointer;
transition: background 0.15s;
}
.rema-item:hover { background: #eae6e0; }
.rema-item.checked { opacity: 0.4; text-decoration: line-through; }
.rema-item input { width: 14px; height: 14px; accent-color: var(--accent); }
.freezer-section {
background: var(--card);
border: 1px solid var(--border);
border-radius: 8px;
overflow: hidden;
margin-bottom: 1.5rem;
}
.freezer-header {
background: var(--blue);
color: white;
padding: 0.6rem 1rem;
font-size: 13px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.05em;
display: flex;
align-items: center;
gap: 8px;
}
.freezer-grid {
display: grid;
grid-template-columns: 1fr 80px 100px 100px;
font-size: 13px;
}
.fh { padding: 6px 12px; font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; font-weight: 500; background: #f0ece6; border-bottom: 1px solid var(--border); }
.fc { padding: 8px 12px; border-bottom: 1px solid var(--border); }
.fc.num { text-align: right; font-family: var(--mono); }
.fc.bold { font-weight: 600; background: #faf9f7; }
.fc.highlight { color: var(--green); font-weight: 600; }
.notes-section {
background: var(--amber-light);
border: 1px solid #f0d8a0;
border-radius: 8px;
padding: 1rem 1.25rem;
margin-bottom: 1.5rem;
}
.notes-title { font-size: 13px; font-weight: 500; color: var(--amber); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem; }
.notes-list { display: flex; flex-direction: column; gap: 4px; }
.notes-list li { font-size: 13px; color: #6b4a0a; list-style: none; padding-left: 1.25rem; position: relative; }
.notes-list li::before { content: '→'; position: absolute; left: 0; color: var(--amber); }
.summary-section {
background: var(--text);
color: white;
border-radius: 12px;
padding: 1.5rem;
margin-bottom: 1.5rem;
}
.summary-title { font-size: 13px; opacity: 0.5; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 1.25rem; }
.summary-grid {
display: grid;
grid-template-columns: 1fr 100px 100px;
font-size: 13px;
gap: 0;
}
.sg-h { font-size: 11px; opacity: 0.4; text-transform: uppercase; letter-spacing: 0.06em; padding: 0 0 8px; }
.sg-h.num { text-align: right; }
.sg-row { display: contents; }
.sg-label { padding: 5px 0; opacity: 0.75; border-top: 1px solid rgba(255,255,255,0.08); }
.sg-est { padding: 5px 0; text-align: right; font-family: var(--mono); opacity: 0.5; border-top: 1px solid rgba(255,255,255,0.08); }
.sg-actual { padding: 5px 0; text-align: right; font-family: var(--mono); color: #7de8b0; border-top: 1px solid rgba(255,255,255,0.08); }
.sg-total { padding: 10px 0 0; font-weight: 600; font-size: 15px; border-top: 2px solid rgba(255,255,255,0.2); margin-top: 4px; }
.sg-total-est { padding: 10px 0 0; text-align: right; font-family: var(--mono); font-weight: 600; font-size: 15px; border-top: 2px solid rgba(255,255,255,0.2); margin-top: 4px; }
.sg-total-actual { padding: 10px 0 0; text-align: right; font-family: var(--mono); font-weight: 600; font-size: 15px; color: #7de8b0; border-top: 2px solid rgba(255,255,255,0.2); margin-top: 4px; }
.savings-row {
margin-top: 1.25rem;
padding-top: 1.25rem;
border-top: 1px solid rgba(255,255,255,0.15);
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 12px;
}
.sav-box { background: rgba(255,255,255,0.07); border-radius: 8px; padding: 0.875rem 1rem; }
.sav-box .sb-label { font-size: 11px; opacity: 0.5; margin-bottom: 4px; }
.sav-box .sb-val { font-size: 1.5rem; font-weight: 600; font-family: var(--mono); color: #7de8b0; letter-spacing: -0.02em; }
.sav-box .sb-sub { font-size: 11px; opacity: 0.4; margin-top: 2px; }
footer {
text-align: center;
font-size: 12px;
color: var(--muted);
padding-top: 1rem;
border-top: 1px solid var(--border);
}
@media (max-width: 600px) {
.stats-row { grid-template-columns: repeat(2, 1fr); }
header { grid-template-columns: 1fr; }
.savings-card { text-align: left; }
.header-left h1 { font-size: 1.5rem; }
.savings-row { grid-template-columns: 1fr; }
.summary-grid { grid-template-columns: 1fr 80px 80px; }
}
</style>
</head>
<body>
<div class="page">
<header>
<div class="header-left">
<h1>Citti <span>Indkøbsseddel</span></h1>
<div class="header-meta">
<span><strong>Uge 2325</strong> · 03.0623.06.2026</span>
<span>Åbent manlør 0820</span>
<span>Langberger Weg 4, Flensburg</span>
<span>1 EUR ≈ 7,46 DKK</span>
</div>
</div>
<div class="savings-card">
<div class="label">Estimeret besparelse</div>
<div class="amount" id="total-savings">~1.800</div>
<div class="sublabel">kr. vs. dansk normalpris</div>
</div>
</header>
<div class="stats-row">
<div class="stat">
<div class="s-label">Aftensmadsdage</div>
<div class="s-val">~40</div>
<div class="s-sub">fra én tur</div>
</div>
<div class="stat">
<div class="s-label">Kødportioner</div>
<div class="s-val">24</div>
<div class="s-sub">à 500g i fryseren</div>
</div>
<div class="stat">
<div class="s-label">Estimeret total</div>
<div class="s-val" style="font-size:1.2rem">~4.400</div>
<div class="s-sub">kr. inkl. Rema</div>
</div>
<div class="stat">
<div class="s-label">Pr. aftensmad</div>
<div class="s-val">~110</div>
<div class="s-sub">kr. for 23 pers.</div>
</div>
</div>
<!-- KØD & FISK -->
<div class="section">
<div class="section-header"><span class="emoji">🥩</span> Kød & fisk <span class="est">est. ~1.580 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table" id="sec-koed">
<div class="item-row" data-est="605.94"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Entrecote ½ kg<span class="note">Frisk sydamerikansk <span class="badge badge-card">CITTI CARD</span></span></div><div class="item-qty">6 × ½ kg</div><div class="item-est">605,94</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="191.94"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Nakkekoteletter ½ kg<span class="note">Med/uden krydderi</span></div><div class="item-qty">6 × ½ kg</div><div class="item-est">191,94</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="359.94"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Kyllingebryst ½ kg<span class="note">Texas-marinade</span></div><div class="item-qty">6 × ½ kg</div><div class="item-est">359,94</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="240"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Hakket oksekød<span class="note">Køddisk — spørg personalet</span></div><div class="item-qty">3 kg</div><div class="item-est">~240</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="167.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Rumpsteak ½ kg<span class="note">Modnet, tyske kvier</span></div><div class="item-qty">1 × ½ kg</div><div class="item-est">167,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="112"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Lakseside premium<span class="note">15,99/100g · tag ~700g</span></div><div class="item-qty">~700g</div><div class="item-est">~112</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="74.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Gerstand grillpølser<span class="note">10 stk. à 100g</span></div><div class="item-qty">1 kg</div><div class="item-est">74,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="74.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Steinemann bacon i skiver<span class="note">Røget · fryseegnet</span></div><div class="item-qty">1 kg</div><div class="item-est">74,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- FROSTGRØNT -->
<div class="section">
<div class="section-header"><span class="emoji">🧊</span> Frostgrønt · 3 kg poser <span class="est">est. ~100 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="40"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Wok-mix blandede grøntsager</div><div class="item-qty">3 kg</div><div class="item-est">~3545</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="30"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Ærter</div><div class="item-qty">3 kg</div><div class="item-est">~2535</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="35"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Broccoli</div><div class="item-qty">3 kg</div><div class="item-est">~3040</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="0"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Hvad der ellers frister<span class="note">Tjek frysedisken</span></div><div class="item-qty"></div><div class="item-est"></div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- MEJERI & FROST -->
<div class="section">
<div class="section-header"><span class="emoji">🧀</span> Mejeri, ost & frost <span class="est">est. ~185 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="44.97"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Greco Schaffeta feta 150g<span class="note">70% fåremælk</span></div><div class="item-qty">3 stk.</div><div class="item-est">44,97</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="59.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Frutti di Mare<span class="note">Rejer, muslinger, blæksprutte</span></div><div class="item-qty">1 kg</div><div class="item-est">59,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="79.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Sorte tigerrejer frost<span class="note">Rå, pillede · wok/grill</span></div><div class="item-qty">1 kg</div><div class="item-est">79,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- PASTA -->
<div class="section">
<div class="section-header"><span class="emoji">🍝</span> Pasta frisk køl · Gut & Günstig ~800g <span class="est">est. ~160 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="55"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tortelloni Skinke</div><div class="item-qty">2 stk.</div><div class="item-est">~2530</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="55"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tortelloni Spinat & ricotta</div><div class="item-qty">2 stk.</div><div class="item-est">~2530</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="55"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tortelloni valgfri variant<span class="note">Svampe, tomaat-mozzarella o.l.</span></div><div class="item-qty">2 stk.</div><div class="item-est">~2530</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- GRØNT & TØRVARER -->
<div class="section">
<div class="section-header"><span class="emoji">🥗</span> Grønt, olier & tørvarer <span class="est">est. ~245 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="74.95"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Avocado Hass<span class="note">Fra Peru, SanLucar</span></div><div class="item-qty">5 stk.</div><div class="item-est">74,95</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="99.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Bertolli olivenolie extra vergine</div><div class="item-qty">1L</div><div class="item-est">99,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="44.97"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Mutti passata<span class="note">Natur eller basilikum</span></div><div class="item-qty">3 × 700g</div><div class="item-est">44,97</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="75.96"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Rustichella d'Abruzzo pasta</div><div class="item-qty">4 × 500g</div><div class="item-est">75,96</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- KONSERVES -->
<div class="section">
<div class="section-header"><span class="emoji">🥫</span> Konserves — tomat & basis <span class="est">est. ~185 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="50"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Hakkede tomater 400g</div><div class="item-qty">8 dåser</div><div class="item-est">~50</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="25"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Flåede tomater 400g</div><div class="item-qty">4 dåser</div><div class="item-est">~25</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="35"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tomatpuré / koncentrat 200g</div><div class="item-qty">4 stk.</div><div class="item-est">~35</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="47"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tun i olie 80g</div><div class="item-qty">6 dåser</div><div class="item-est">~47</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="28"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Majs 340g</div><div class="item-qty">4 dåser</div><div class="item-est">~28</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- INDISK -->
<div class="section">
<div class="section-header"><span class="emoji">🌶️</span> Indisk & karry <span class="est">est. ~160 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="70"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tikka masala sauce<span class="note">350500g · Taste of India / Deluxe</span></div><div class="item-qty">5 stk.</div><div class="item-est">~70</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="20"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Karrypasta rød 50g</div><div class="item-qty">2 stk.</div><div class="item-est">~20</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="20"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Karrypasta grøn 50g</div><div class="item-qty">2 stk.</div><div class="item-est">~20</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="20"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Karrypasta gul / mild 50g</div><div class="item-qty">2 stk.</div><div class="item-est">~20</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="24"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Mango chutney 300g</div><div class="item-qty">2 stk.</div><div class="item-est">~24</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="28"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Basmatiris 1 kg</div><div class="item-qty">2 stk.</div><div class="item-est">~28</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- MEXICANSK -->
<div class="section">
<div class="section-header"><span class="emoji">🌮</span> Mexicansk & asiatisk <span class="est">est. ~185 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="33"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tacokrydderi pakke</div><div class="item-qty">6 stk.</div><div class="item-est">~33</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="16"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Jalapeños på glas 200g</div><div class="item-qty">2 stk.</div><div class="item-est">~16</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="19"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Salsa / tomatdip 300g</div><div class="item-qty">2 stk.</div><div class="item-est">~19</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="24"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Tacoshells / tortilla wraps</div><div class="item-qty">2 stk.</div><div class="item-est">~24</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="47"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Kokosmælk 400ml</div><div class="item-qty">6 dåser</div><div class="item-est">~47</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="10"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Sojasauce 250ml</div><div class="item-qty">1 stk.</div><div class="item-est">~10</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="14"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Bambusskud / vandkastanjer</div><div class="item-qty">2 dåser</div><div class="item-est">~14</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- DRIKKEVARER -->
<div class="section">
<div class="section-header"><span class="emoji">🍺</span> Drikkevarer <span class="est">est. ~530 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="79"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Carlsberg / Carls Special 0,33L <span class="badge badge-kasse">Hel kasse</span></div><div class="item-qty">24 stk.</div><div class="item-est">79,00</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="49.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Pepsi Max 1,5L <span class="badge badge-kasse">Hel kasse</span></div><div class="item-qty">6 stk.</div><div class="item-est">49,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="54.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Faxe Kondi Appelsin 0,33L <span class="badge badge-kasse">Hel kasse</span></div><div class="item-qty">24 stk.</div><div class="item-est">54,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="159.96"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Kühling hvid-/rosévin 0,75L <span class="badge badge-card">CITTI CARD · øko</span></div><div class="item-qty">4 stk.</div><div class="item-est">159,96</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="59.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Grauburgunder hvidvin 1,5L <span class="badge badge-card">CITTI CARD</span></div><div class="item-qty">1 stk.</div><div class="item-est">59,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="104.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Eduscho Caffè Crema hele bønner</div><div class="item-qty">1 kg</div><div class="item-est">104,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- HUSHOLDNING -->
<div class="section">
<div class="section-header"><span class="emoji">🏠</span> Husholdning & skafferi <span class="est">est. ~535 kr.</span></div>
<div class="col-headers"><div class="col-h"></div><div class="col-h">Vare</div><div class="col-h">Antal</div><div class="col-h">Estimat</div><div class="col-h">Faktisk</div></div>
<div class="items-table">
<div class="item-row" data-est="199.90"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Ariel vaskemiddel<span class="note">100111 vaske · fra 1,80 kr./vask</span></div><div class="item-qty">1 stk.</div><div class="item-est">199,90</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="59.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Finish opvasketabs<span class="note">64 stk. · 0,94 kr./stk.</span></div><div class="item-qty">1 stk.</div><div class="item-est">59,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="79.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">BASE Culinar cashewnødder</div><div class="item-qty">1 kg</div><div class="item-est">79,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="49.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Nutella 1 kg glas <span class="badge badge-card">CITTI CARD</span></div><div class="item-qty">1 stk.</div><div class="item-est">49,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="99.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Lotus Biscoff smørepålæg 1,6 kg <span class="badge badge-card">CITTI CARD</span></div><div class="item-qty">1 stk.</div><div class="item-est">99,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
<div class="item-row" data-est="44.99"><div class="item-check"><input type="checkbox" onchange="toggleRow(this)"></div><div class="item-name">Haribo vingummi / lakrids<span class="note">8001000g</span></div><div class="item-qty">1 stk.</div><div class="item-est">44,99</div><div class="item-actual"><input type="number" placeholder="—" oninput="updateActual(this)" step="0.01"></div></div>
</div>
</div>
<!-- REMA -->
<div class="rema-section">
<div class="rema-title">🛒 Køb i Rema1000 / Netto</div>
<div class="rema-items">
<label class="rema-item"><input type="checkbox" onchange="this.closest('.rema-item').classList.toggle('checked')"> Frisk frugt & grøntsager</label>
<label class="rema-item"><input type="checkbox" onchange="this.closest('.rema-item').classList.toggle('checked')"> Løg & hvidløg</label>
<label class="rema-item"><input type="checkbox" onchange="this.closest('.rema-item').classList.toggle('checked')"> Kartofler</label>
<label class="rema-item"><input type="checkbox" onchange="this.closest('.rema-item').classList.toggle('checked')"> Mælk, æg, smør</label>
<label class="rema-item"><input type="checkbox" onchange="this.closest('.rema-item').classList.toggle('checked')"> Brød & pålæg</label>
<label class="rema-item"><input type="checkbox" onchange="this.closest('.rema-item').classList.toggle('checked')"> Mel, gær, bagepulver</label>
<label class="rema-item"><input type="checkbox" onchange="this.closest('.rema-item').classList.toggle('checked')"> Vaniljesukker</label>
</div>
</div>
<!-- NOTER -->
<div class="notes-section">
<div class="notes-title">⚠ Noter</div>
<ul class="notes-list">
<li>Varer med "Hel kasse" sælges kun i hele kasser</li>
<li>CITTI CARD er gratis — hent ved kassen eller citti.dk/citti-card</li>
<li>Hakket oksekød: spørg i køddisken — ikke i tilbudsavisen</li>
<li>Karrypasta: tjek den asiatiske afdeling — ikke altid i fast sortiment</li>
<li>Husk fryseposer + marker hjemmefra — 500g portioner til kød, ~350g til grønt</li>
</ul>
</div>
<!-- FRYSER -->
<div class="freezer-section">
<div class="freezer-header">📦 Fryseroversigt</div>
<div class="freezer-grid">
<div class="fh">Vare</div><div class="fh" style="text-align:right">Total</div><div class="fh" style="text-align:right">Portioner</div><div class="fh" style="text-align:right">Aftensmadsdage</div>
<div class="fc">Entrecote</div><div class="fc num">3 kg</div><div class="fc num">6 poser</div><div class="fc num">6</div>
<div class="fc">Nakkekoteletter</div><div class="fc num">3 kg</div><div class="fc num">6 poser</div><div class="fc num">6</div>
<div class="fc">Kyllingebryst</div><div class="fc num">3 kg</div><div class="fc num">6 poser</div><div class="fc num">6</div>
<div class="fc">Hakket oksekød</div><div class="fc num">3 kg</div><div class="fc num">6 poser</div><div class="fc num">6</div>
<div class="fc">Tortelloni</div><div class="fc num">~4,8 kg</div><div class="fc num">6 pakker</div><div class="fc num">6</div>
<div class="fc">Wok-mix grønt</div><div class="fc num">3 kg</div><div class="fc num">~8 port.</div><div class="fc num" style="color:var(--muted)">tilbehør</div>
<div class="fc">Ærter</div><div class="fc num">3 kg</div><div class="fc num">~8 port.</div><div class="fc num" style="color:var(--muted)">tilbehør</div>
<div class="fc">Broccoli</div><div class="fc num">3 kg</div><div class="fc num">~8 port.</div><div class="fc num" style="color:var(--muted)">tilbehør</div>
<div class="fc bold">Total kød</div><div class="fc num bold">12 kg</div><div class="fc num bold">24 poser</div><div class="fc num highlight">~30 aftener</div>
</div>
</div>
<!-- SAMMENFATNING -->
<div class="summary-section">
<div class="summary-title">Prissammenfatning</div>
<div class="summary-grid">
<div class="sg-h">Kategori</div><div class="sg-h num">Estimat</div><div class="sg-h num">Faktisk</div>
<div class="sg-label">Kød & fisk</div><div class="sg-est">~1.580</div><div class="sg-actual" id="s-koed"></div>
<div class="sg-label">Frostgrønt</div><div class="sg-est">~100</div><div class="sg-actual" id="s-frost"></div>
<div class="sg-label">Mejeri, ost & frost</div><div class="sg-est">~185</div><div class="sg-actual" id="s-mejeri"></div>
<div class="sg-label">Pasta (frisk)</div><div class="sg-est">~160</div><div class="sg-actual" id="s-pasta"></div>
<div class="sg-label">Grønt, olier & tørvarer</div><div class="sg-est">~245</div><div class="sg-actual" id="s-groent"></div>
<div class="sg-label">Konserves</div><div class="sg-est">~185</div><div class="sg-actual" id="s-konserves"></div>
<div class="sg-label">Indisk & karry</div><div class="sg-est">~160</div><div class="sg-actual" id="s-indisk"></div>
<div class="sg-label">Mexicansk & asiatisk</div><div class="sg-est">~185</div><div class="sg-actual" id="s-mex"></div>
<div class="sg-label">Drikkevarer</div><div class="sg-est">~530</div><div class="sg-actual" id="s-drikke"></div>
<div class="sg-label">Husholdning & skafferi</div><div class="sg-est">~535</div><div class="sg-actual" id="s-hus"></div>
<div class="sg-total">Total Citti</div><div class="sg-total-est">~4.065</div><div class="sg-total-actual" id="s-total-citti"></div>
<div class="sg-label" style="opacity:0.5">Rema1000 supplement</div><div class="sg-est">~350</div><div class="sg-actual"></div>
<div class="sg-total">Samlet total</div><div class="sg-total-est">~4.400</div><div class="sg-total-actual" id="s-total-all"></div>
</div>
<div class="savings-row">
<div class="sav-box">
<div class="sb-label">Faktisk betalt</div>
<div class="sb-val" id="sav-paid"></div>
<div class="sb-sub">kr. hos Citti</div>
</div>
<div class="sav-box">
<div class="sb-label">Besparelse vs. DK normalpris</div>
<div class="sb-val" id="sav-saved">~1.800</div>
<div class="sb-sub">kr. estimeret</div>
</div>
<div class="sav-box">
<div class="sb-label">Pr. aftensmad</div>
<div class="sb-val" id="sav-permeal">~110</div>
<div class="sb-sub">kr. for 23 pers.</div>
</div>
</div>
</div>
<footer>Citti Flensborg · Langberger Weg 4 · citti.dk · Tilbud gælder 03.0623.06.2026</footer>
</div>
<script>
function toggleRow(cb) {
cb.closest('.item-row').classList.toggle('checked', cb.checked);
}
function updateActual(input) {
const val = parseFloat(input.value);
input.classList.toggle('has-value', !isNaN(val) && val > 0);
recalcAll();
}
const sectionMap = [
{ id: 's-koed', rows: 8 },
{ id: 's-frost', rows: 4 },
{ id: 's-mejeri', rows: 3 },
{ id: 's-pasta', rows: 3 },
{ id: 's-groent', rows: 4 },
{ id: 's-konserves', rows: 5 },
{ id: 's-indisk', rows: 6 },
{ id: 's-mex', rows: 7 },
{ id: 's-drikke', rows: 6 },
{ id: 's-hus', rows: 6 },
];
const DK_SAVINGS_RATIO = 0.35;
function recalcAll() {
const allInputs = document.querySelectorAll('.item-actual input');
let totalActual = 0;
let totalEst = 0;
let hasAny = false;
allInputs.forEach(input => {
const row = input.closest('.item-row');
const est = parseFloat(row.dataset.est) || 0;
const val = parseFloat(input.value);
totalEst += est;
if (!isNaN(val) && val > 0) {
totalActual += val;
hasAny = true;
}
});
const sections = document.querySelectorAll('.items-table');
const secIds = ['s-koed','s-frost','s-mejeri','s-pasta','s-groent','s-konserves','s-indisk','s-mex','s-drikke','s-hus'];
sections.forEach((sec, i) => {
const inputs = sec.querySelectorAll('.item-actual input');
let secActual = 0; let secHas = false;
inputs.forEach(inp => {
const v = parseFloat(inp.value);
if (!isNaN(v) && v > 0) { secActual += v; secHas = true; }
});
const el = document.getElementById(secIds[i]);
if (el) el.textContent = secHas ? Math.round(secActual).toLocaleString('da-DK') : '—';
});
const cittiEl = document.getElementById('s-total-citti');
const allEl = document.getElementById('s-total-all');
const paidEl = document.getElementById('sav-paid');
const savedEl = document.getElementById('sav-saved');
const mealEl = document.getElementById('sav-permeal');
const headerSavings = document.getElementById('total-savings');
if (hasAny) {
const withRema = totalActual + 350;
cittiEl.textContent = Math.round(totalActual).toLocaleString('da-DK');
allEl.textContent = Math.round(withRema).toLocaleString('da-DK');
paidEl.textContent = Math.round(totalActual).toLocaleString('da-DK');
const saved = Math.round(totalActual * DK_SAVINGS_RATIO);
savedEl.textContent = saved.toLocaleString('da-DK');
headerSavings.textContent = saved.toLocaleString('da-DK');
mealEl.textContent = Math.round(withRema / 40);
} else {
cittiEl.textContent = '—';
allEl.textContent = '—';
paidEl.textContent = '—';
savedEl.textContent = '~1.800';
headerSavings.textContent = '~1.800';
mealEl.textContent = '~110';
}
}
</script>
</body>
</html>