ClubLedger/static/style.css
Claude 1f8fe21eaf
feat: two-step bar charge flow with full-screen PIN overlay
Staff enter amount and note, click Charge; a full-screen patron-facing
screen appears showing the charge total, member name, and a large PIN
input that auto-focuses. PIN errors stay on the overlay; Cancel returns
to the amount form so staff can adjust before handing the device back.

https://claude.ai/code/session_01JuRTR5Xjx8emQsyerBgGU7
2026-05-30 17:38:18 +00:00

489 lines
12 KiB
CSS
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.

/* ClubLedger GitHub-style theme */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
:root {
--canvas: #ffffff;
--canvas-subtle: #f6f8fa;
--border: #d0d7de;
--border-muted: #d8dee4;
--fg: #1f2328;
--fg-muted: #59636e;
--fg-subtle: #818b98;
--accent: #0969da;
--accent-muted: #ddf4ff;
--success: #1a7f37;
--success-muted: #dafbe1;
--danger: #d1242f;
--danger-muted: #ffebe9;
--nav-bg: #24292f;
--nav-text: #f0f6fc;
--radius: 6px;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.5;
background: var(--canvas-subtle);
color: var(--fg);
min-height: 100vh;
}
/* ---- Nav ---- */
nav {
background: var(--nav-bg);
color: var(--nav-text);
display: flex;
align-items: center;
padding: 0 16px;
height: 48px;
gap: 4px;
position: sticky;
top: 0;
z-index: 100;
}
.brand {
font-size: 1rem;
font-weight: 600;
color: #fff;
margin-right: 12px;
white-space: nowrap;
display: flex;
align-items: center;
gap: 6px;
}
.brand::before {
content: "";
display: inline-block;
width: 20px;
height: 20px;
background: #fff;
border-radius: 50%;
opacity: .9;
}
.nav-btn, .nav-link {
background: transparent;
border: 1px solid transparent;
color: rgba(240,246,252,.7);
padding: 0 12px;
height: 32px;
line-height: 30px;
border-radius: var(--radius);
cursor: pointer;
font-size: .875rem;
font-family: inherit;
white-space: nowrap;
text-decoration: none;
display: inline-flex;
align-items: center;
transition: color .1s, background .1s, border-color .1s;
}
.nav-btn:hover, .nav-link:hover {
color: var(--nav-text);
background: rgba(177,186,196,.12);
}
.nav-btn.active, .nav-link.active {
color: #fff;
background: rgba(177,186,196,.12);
border-color: rgba(240,246,252,.3);
font-weight: 600;
}
/* ---- Views ---- */
.view { max-width: 960px; margin: 24px auto; padding: 0 16px; display: flex; flex-direction: column; gap: 20px; }
.hidden { display: none !important; }
/* ---- Panel ---- */
.panel {
background: var(--canvas);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 20px 24px;
}
.panel h2 {
font-size: 1rem;
font-weight: 600;
padding-bottom: 12px;
margin-bottom: 16px;
border-bottom: 1px solid var(--border);
color: var(--fg);
}
/* ---- Forms ---- */
.form-row { display: flex; flex-direction: column; gap: 4px; margin-bottom: 12px; }
.form-row label {
font-size: .8125rem;
font-weight: 600;
color: var(--fg);
}
.form-row input,
.form-row select,
.form-row textarea {
padding: 5px 12px;
border: 1px solid var(--border);
border-radius: var(--radius);
font-size: .875rem;
font-family: inherit;
background: var(--canvas);
color: var(--fg);
outline: none;
transition: border-color .15s, box-shadow .15s;
line-height: 20px;
}
.form-row input:focus,
.form-row select:focus,
.form-row textarea:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(9,105,218,.12);
}
.form-row select { cursor: pointer; }
.form-row textarea { resize: vertical; min-height: 64px; }
.search-row { display: flex; gap: 8px; margin-bottom: 12px; }
.search-row input {
flex: 1;
padding: 5px 12px;
border: 1px solid var(--border);
border-radius: var(--radius);
font-size: .875rem;
font-family: inherit;
background: var(--canvas);
outline: none;
transition: border-color .15s, box-shadow .15s;
}
.search-row input:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(9,105,218,.12);
}
/* ---- Buttons ---- */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
padding: 5px 16px;
border: 1px solid var(--border);
border-radius: var(--radius);
background: var(--canvas-subtle);
color: var(--fg);
cursor: pointer;
font-size: .875rem;
font-family: inherit;
font-weight: 500;
line-height: 20px;
white-space: nowrap;
transition: background .1s, border-color .1s;
margin-right: 4px;
}
.btn:hover { background: #f3f4f6; border-color: rgba(31,35,40,.3); }
.btn-primary {
background: #1f883d;
color: #fff;
border-color: rgba(31,35,40,.15);
}
.btn-primary:hover { background: #1a7f37; }
.btn-danger {
background: #d1242f;
color: #fff;
border-color: rgba(31,35,40,.15);
}
.btn-danger:hover { background: #b91c28; }
/* ---- Data table ---- */
.data-table { width: 100%; border-collapse: collapse; font-size: .8125rem; margin-top: 4px; }
.data-table th {
background: var(--canvas-subtle);
padding: 8px 12px;
text-align: left;
font-weight: 600;
color: var(--fg-muted);
font-size: .75rem;
text-transform: uppercase;
letter-spacing: .04em;
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
.data-table td { padding: 10px 12px; border-bottom: 1px solid var(--border-muted); }
.data-table tr:last-child td { border-bottom: none; }
.data-table tbody tr:hover td { background: var(--canvas-subtle); }
.num { text-align: right; font-variant-numeric: tabular-nums; }
.balance-pos { color: var(--success); font-weight: 600; }
.balance-neg { color: var(--danger); font-weight: 600; }
/* ---- Member pick list ---- */
.member-pick-list { margin-bottom: 12px; display: flex; flex-direction: column; gap: 1px; }
.member-pick-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 14px;
background: var(--canvas);
border: 1px solid var(--border);
border-radius: var(--radius);
cursor: pointer;
transition: background .1s, border-color .1s;
}
.member-pick-item:hover { background: var(--canvas-subtle); border-color: var(--accent); }
.member-pick-name { font-weight: 600; font-size: .875rem; }
.member-pick-sub { font-size: .75rem; color: var(--fg-muted); }
/* ---- Selected member box ---- */
.selected-member-box {
background: var(--accent-muted);
border: 1px solid #b6e3ff;
border-radius: var(--radius);
padding: 10px 14px;
margin-bottom: 14px;
font-size: .875rem;
color: var(--fg);
}
.selected-member-box strong { font-size: .9375rem; font-weight: 600; }
/* ---- Cashier dual-action panels ---- */
.cashier-action-panel {
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 16px;
margin-bottom: 10px;
background: var(--canvas);
}
.cashier-action-panel h3 {
margin: 0 0 12px;
font-size: .6875rem;
font-weight: 600;
color: var(--fg-muted);
text-transform: uppercase;
letter-spacing: .06em;
}
/* ---- Product results ---- */
.product-results { margin-bottom: 12px; }
.product-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 8px 12px;
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: 4px;
cursor: pointer;
font-size: .875rem;
transition: background .1s;
}
.product-item:hover { background: var(--canvas-subtle); border-color: var(--accent); }
.product-price { font-weight: 700; color: var(--accent); }
/* ---- Staff chips ---- */
.staff-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.staff-chip {
display: inline-flex;
align-items: center;
gap: 4px;
background: var(--canvas-subtle);
border: 1px solid var(--border);
border-radius: 2em;
padding: 2px 8px 2px 10px;
font-size: .8125rem;
color: var(--fg);
}
.chip-del {
background: none;
border: none;
cursor: pointer;
color: var(--fg-subtle);
font-size: .9rem;
line-height: 1;
padding: 0 1px;
}
.chip-del:hover { color: var(--danger); }
/* ---- Select / dropdown (standalone, outside form-row) ---- */
select {
font-family: inherit;
}
/* ---- Row action buttons ---- */
.row-actions { white-space: nowrap; }
.row-btn { padding: 3px 10px !important; font-size: .75rem !important; margin-right: 4px !important; }
/* ---- Edit modal ---- */
.modal-overlay {
position: fixed;
inset: 0;
background: rgba(31,35,40,.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 200;
}
.modal {
background: var(--canvas);
border: 1px solid var(--border);
border-radius: 12px;
padding: 24px 28px;
width: 440px;
max-width: calc(100vw - 32px);
box-shadow: 0 8px 24px rgba(140,149,159,.2);
}
.modal h3 {
font-size: 1rem;
font-weight: 600;
padding-bottom: 12px;
margin-bottom: 16px;
border-bottom: 1px solid var(--border);
}
.modal-actions { display: flex; gap: 8px; margin-top: 16px; }
/* ---- Messages / flash ---- */
.msg {
margin-top: 10px;
padding: 8px 14px;
border-radius: var(--radius);
font-size: .8125rem;
border: 1px solid transparent;
}
.msg:empty { display: none; }
.msg.ok { background: var(--success-muted); color: #0a3622; border-color: #a4e6b8; }
.msg.err { background: var(--danger-muted); color: #67060c; border-color: #ffcec7; }
/* ---- Login overlay ---- */
.login-overlay {
position: fixed;
inset: 0;
background: var(--canvas-subtle);
display: flex;
align-items: center;
justify-content: center;
z-index: 500;
}
.login-card {
background: var(--canvas);
border: 1px solid var(--border);
border-radius: 12px;
padding: 36px 40px;
width: 360px;
max-width: calc(100vw - 32px);
box-shadow: 0 8px 24px rgba(140,149,159,.2);
}
.login-card h1 {
font-size: 1.25rem;
font-weight: 600;
text-align: center;
margin-bottom: 4px;
}
.login-sub { text-align: center; color: var(--fg-muted); font-size: .8125rem; margin-bottom: 20px; }
/* ---- Nav right (user + logout) ---- */
.nav-right { margin-left: auto; display: flex; align-items: center; gap: 10px; }
.nav-user { color: rgba(240,246,252,.7); font-size: .8125rem; }
.nav-logout {
background: transparent;
border: 1px solid rgba(240,246,252,.3);
color: rgba(240,246,252,.7);
padding: 3px 12px;
border-radius: var(--radius);
cursor: pointer;
font-size: .8125rem;
font-family: inherit;
transition: color .1s, border-color .1s;
}
.nav-logout:hover { color: var(--nav-text); border-color: rgba(240,246,252,.5); }
/* ---- Admin form extras ---- */
.label-hint { font-weight: 400; color: var(--fg-subtle); font-size: .75rem; }
.form-row-check { flex-direction: row !important; align-items: center; gap: 8px; }
.form-row-check label { font-weight: 400; color: var(--fg); font-size: .875rem; }
.panel-divider { border: none; border-top: 1px solid var(--border); margin: 18px 0; }
.sub-heading { font-size: .875rem; font-weight: 600; margin-bottom: 12px; color: var(--fg); }
/* ---- PIN confirmation overlay ---- */
.pin-overlay {
position: fixed;
inset: 0;
background: var(--canvas);
display: flex;
align-items: center;
justify-content: center;
z-index: 150;
padding: 24px 16px;
}
.pin-card {
display: flex;
flex-direction: column;
align-items: center;
gap: 16px;
width: 100%;
max-width: 380px;
}
.pin-charge-amount {
font-size: clamp(2rem, 8vw, 3rem);
font-weight: 700;
color: var(--fg);
text-align: center;
line-height: 1.15;
}
.pin-member-name {
font-size: 1.0625rem;
color: var(--fg-muted);
text-align: center;
}
.pin-instruction {
font-size: .875rem;
color: var(--fg-subtle);
text-align: center;
margin-top: 8px;
}
.pin-input {
width: 100%;
max-width: 260px;
padding: 14px 16px;
font-size: 1.5rem;
letter-spacing: .25em;
text-align: center;
border: 2px solid var(--border);
border-radius: var(--radius);
outline: none;
background: var(--canvas);
color: var(--fg);
transition: border-color .15s, box-shadow .15s;
}
.pin-input:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(9,105,218,.15);
}
.pin-actions {
display: flex;
gap: 12px;
width: 100%;
max-width: 260px;
}
.pin-cancel-btn {
flex: 1;
}
.pin-ok-btn {
flex: 2;
font-size: 1rem;
padding: 10px 0;
}