Files
workh/frontend/styles.css
T
2026-10-11 03:26:15 +03:00

459 lines
7.1 KiB
CSS

:root {
--bg: #f6f7f9;
--card: #ffffff;
--text: #1c2024;
--muted: #6b7280;
--border: #e3e6ea;
--accent: #2563eb;
--pos: #15803d;
--neg: #c2410c;
--pos-bg: #ecfdf3;
--neg-bg: #fff4ed;
--today: #eff4ff;
color-scheme: light;
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
font-size: 15px;
}
@media (prefers-color-scheme: dark) {
:root {
--bg: #111317;
--card: #1a1d22;
--text: #e6e8eb;
--muted: #9aa1ab;
--border: #2c3138;
--accent: #7aa2ff;
--pos: #4ade80;
--neg: #fb923c;
--pos-bg: #13261b;
--neg-bg: #2b1c12;
--today: #1b2338;
color-scheme: dark;
}
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
}
main {
max-width: 1100px;
margin: 0 auto;
padding: 1.5rem 1rem 3rem;
}
h1 {
margin: 0;
font-size: 1.5rem;
}
h2 {
margin: 0;
font-size: 1.1rem;
}
h3 {
margin: 1.25rem 0 0.25rem;
font-size: 1rem;
}
.muted {
color: var(--muted);
}
.small {
font-size: 0.85rem;
}
.pos {
color: var(--pos);
}
.neg {
color: var(--neg);
}
.num {
font-variant-numeric: tabular-nums;
text-align: right;
}
input,
button {
font: inherit;
color: inherit;
background: var(--card);
border: 1px solid var(--border);
border-radius: 6px;
padding: 0.3rem 0.5rem;
}
button {
cursor: pointer;
}
button:hover {
border-color: var(--accent);
}
button.link {
border: none;
background: none;
color: var(--accent);
padding: 0.3rem;
}
button.link.danger {
color: var(--neg);
}
input:focus-visible,
button:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
input.invalid {
border-color: var(--neg);
background: var(--neg-bg);
}
.app-header {
display: flex;
align-items: baseline;
justify-content: space-between;
margin-bottom: 1rem;
}
.save-state {
font-size: 0.85rem;
color: var(--muted);
}
.save-state.saved {
color: var(--pos);
}
.save-state.error {
color: var(--neg);
font-weight: 600;
}
.card {
background: var(--card);
border: 1px solid var(--border);
border-radius: 10px;
padding: 1rem 1.25rem;
margin-bottom: 1rem;
}
.top {
display: grid;
grid-template-columns: minmax(0, 1fr) 260px;
gap: 1rem;
align-items: start;
}
@media (max-width: 820px) {
.top {
grid-template-columns: 1fr;
}
}
/* Week */
.week-nav {
display: flex;
align-items: center;
gap: 0.5rem;
flex-wrap: wrap;
margin-bottom: 0.75rem;
}
.week-nav h2 {
flex: 0 1 auto;
}
.days {
display: flex;
flex-direction: column;
}
.day {
display: grid;
grid-template-columns: 6.5rem auto minmax(0, 1fr) 6.5rem;
align-items: center;
gap: 0.75rem;
padding: 0.4rem 0.5rem;
border-top: 1px solid var(--border);
}
.day.today {
background: var(--today);
border-radius: 6px;
}
.day.weekend .day-name {
color: var(--muted);
}
.day-figures {
text-align: right;
white-space: nowrap;
}
@media (max-width: 640px) {
.day {
grid-template-columns: 1fr auto;
}
.day-input {
grid-column: 1 / -1;
}
}
.mode-toggle {
display: inline-flex;
}
.mode-toggle button {
border-radius: 0;
font-size: 0.8rem;
padding: 0.25rem 0.5rem;
}
.mode-toggle button:first-child {
border-radius: 6px 0 0 6px;
}
.mode-toggle button:last-child {
border-radius: 0 6px 6px 0;
}
.mode-toggle button + button {
border-left: none;
}
.mode-toggle button.active {
background: var(--accent);
color: #fff;
border-color: var(--accent);
}
input.duration {
width: 6.5rem;
}
input.note {
width: 100%;
max-width: 18rem;
}
.range {
display: inline-flex;
align-items: center;
gap: 0.35rem;
flex-wrap: wrap;
}
.range label {
display: inline-flex;
align-items: center;
gap: 0.3rem;
color: var(--muted);
}
input.break {
width: 4.5rem;
}
.week-total {
display: flex;
flex-wrap: wrap;
gap: 1.5rem;
border-top: 2px solid var(--border);
margin-top: 0.25rem;
padding-top: 0.75rem;
}
.week-total div {
display: flex;
flex-direction: column;
}
.week-total strong {
font-size: 1.1rem;
font-variant-numeric: tabular-nums;
}
.week-total .pos strong {
color: var(--pos);
}
.week-total .neg strong {
color: var(--neg);
}
/* Balance */
.balance {
display: flex;
flex-direction: column;
gap: 0.25rem;
}
.balance.pos {
background: var(--pos-bg);
}
.balance.neg {
background: var(--neg-bg);
}
.balance-value {
font-size: 2rem;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.balance.pos .balance-value {
color: var(--pos);
}
.balance.neg .balance-value {
color: var(--neg);
}
/* History */
.table-wrap {
overflow-x: auto;
margin-top: 0.5rem;
}
table {
width: 100%;
border-collapse: collapse;
}
th,
td {
padding: 0.4rem 0.6rem;
border-bottom: 1px solid var(--border);
text-align: left;
white-space: nowrap;
}
th {
font-weight: 600;
color: var(--muted);
font-size: 0.85rem;
}
th.num,
td.num {
text-align: right;
}
tbody tr {
cursor: pointer;
}
tbody tr:hover {
background: var(--today);
}
tbody tr.selected {
background: var(--today);
font-weight: 600;
}
/* Settings */
.settings summary {
display: flex;
align-items: baseline;
gap: 1rem;
flex-wrap: wrap;
cursor: pointer;
}
.settings-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
gap: 1rem;
margin-top: 1rem;
}
.settings-grid > label {
display: flex;
flex-direction: column;
gap: 0.3rem;
font-size: 0.9rem;
}
fieldset {
border: 1px solid var(--border);
border-radius: 6px;
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
label.check {
display: inline-flex;
align-items: center;
gap: 0.2rem;
}
.periods {
list-style: none;
padding: 0;
margin: 0.5rem 0;
display: flex;
flex-direction: column;
gap: 0.4rem;
}
.periods li {
display: flex;
align-items: center;
gap: 0.5rem;
flex-wrap: wrap;
}
.periods input[type='number'] {
width: 4.5rem;
}
/* Header user / login */
.app-header .user {
display: flex;
align-items: baseline;
gap: 0.25rem;
}
.app-header .save-state {
margin-left: auto;
margin-right: 1rem;
}
.login {
display: flex;
justify-content: center;
padding-top: 12vh;
}
.login form {
width: 100%;
max-width: 22rem;
display: flex;
flex-direction: column;
gap: 0.9rem;
}
.login label {
display: flex;
flex-direction: column;
gap: 0.3rem;
font-size: 0.9rem;
}
.login p {
margin: 0;
}
button.primary {
background: var(--accent);
border-color: var(--accent);
color: #fff;
padding: 0.5rem;
}
button:disabled {
opacity: 0.6;
cursor: default;
}
/* Account */
.account summary {
display: flex;
align-items: baseline;
gap: 1rem;
flex-wrap: wrap;
cursor: pointer;
}
.account > button,
.danger-zone {
margin-top: 1rem;
}
.danger-zone {
display: flex;
flex-direction: column;
gap: 0.75rem;
max-width: 28rem;
}
.danger-zone p {
margin: 0;
}
.danger-zone label {
display: flex;
flex-direction: column;
gap: 0.3rem;
font-size: 0.9rem;
}
.danger-zone .actions {
display: flex;
gap: 0.5rem;
}
button.danger {
background: var(--neg);
border-color: var(--neg);
color: #fff;
}
button.danger-outline {
color: var(--neg);
border-color: var(--neg);
}
.login h2 {
font-size: 1rem;
}
.login .hint {
margin-top: -0.6rem;
}