/*
 * pfsvr: a thin layer over Bootstrap 5.3's dark mode. Handwritten, no build step.
 * Colours are set once here as Bootstrap variables so Edith's partials pick them up.
 */

:root,
[data-bs-theme="dark"] {
    --app-bg: #0e1116;
    --app-surface: #151a21;
    --app-surface-2: #1b212a;
    --app-border: #262d38;
    --app-text: #d7dce4;
    --app-muted: #8390a2;
    /* The accent is each person's choice (Preferences); the layout sets these from App\Support\Theme. These are its defaults. */
    --app-accent: #e0b072;
    --app-accent-rgb: 224, 176, 114;
    --app-accent-hover: #e8c495;
    --app-accent-hover-rgb: 232, 196, 149;
    --app-accent-active: #be9661;
    --app-on-accent: #111418;   /* text on an accent fill */
    --app-chart: #a88456;       /* chart marks: the accent's darker step, kept at 3:1 or better on the dark surface */

    --app-font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
    --app-mono: ui-monospace, "Cascadia Mono", "Cascadia Code", "JetBrains Mono", Consolas, "Liberation Mono", monospace;

    --bs-body-font-family: var(--app-font);
    --bs-font-monospace: var(--app-mono);
    --bs-body-bg: var(--app-bg);
    --bs-body-bg-rgb: 14, 17, 22;
    --bs-body-color: var(--app-text);
    --bs-secondary-color: var(--app-muted);
    --bs-secondary-bg: var(--app-surface-2);
    --bs-tertiary-bg: var(--app-surface);
    --bs-border-color: var(--app-border);
    --bs-emphasis-color: #f3f5f8;
    --bs-link-color: var(--app-accent);
    --bs-link-color-rgb: var(--app-accent-rgb);
    --bs-link-hover-color: var(--app-accent-hover);
    --bs-link-hover-color-rgb: var(--app-accent-hover-rgb);
    --bs-primary: var(--app-accent);
    --bs-primary-rgb: var(--app-accent-rgb);
    --bs-focus-ring-color: rgba(var(--app-accent-rgb), .3);
}

body {
    background: var(--app-bg);
    font-size: .925rem;
}

code {
    color: #f0b37e;
}

/* Numbers that should line up: times, totals, money. */
.num,
.font-monospace {
    font-family: var(--app-mono);
    font-variant-numeric: tabular-nums;
}
td.num,
th.num {
    text-align: end;
    white-space: nowrap;
}

/* Nav */
.app-nav {
    background: var(--app-surface);
    border-bottom: 1px solid var(--app-border);
}
.app-brand {
    font-family: var(--app-mono);
    font-weight: 600;
    letter-spacing: .02em;
    color: var(--app-accent);
}
.app-brand:hover,
.app-brand:focus {
    color: var(--app-accent);
}
.app-nav .nav-link.active {
    color: var(--bs-emphasis-color);
    box-shadow: inset 0 -2px 0 var(--app-accent);
}
.app-who {
    color: var(--app-muted);
    padding-inline: .5rem;
}

/* Surfaces */
.card {
    --bs-card-bg: var(--app-surface);
    --bs-card-border-color: var(--app-border);
    --bs-card-cap-bg: var(--app-surface-2);
}
.table {
    --bs-table-bg: transparent;
    --bs-table-border-color: var(--app-border);
    --bs-table-hover-bg: rgba(255, 255, 255, .03);
    --bs-table-striped-bg: rgba(255, 255, 255, .02);
}
.form-control,
.form-select {
    background-color: var(--app-surface-2);
    border-color: var(--app-border);
}
.form-control:focus,
.form-select:focus {
    background-color: var(--app-surface-2);
    border-color: rgba(var(--app-accent-rgb), .6);
}

/* Buttons: the accent replaces Bootstrap's blue. */
.btn-primary {
    --bs-btn-color: var(--app-on-accent);
    --bs-btn-bg: var(--app-accent);
    --bs-btn-border-color: var(--app-accent);
    --bs-btn-hover-color: var(--app-on-accent);
    --bs-btn-hover-bg: var(--app-accent-hover);
    --bs-btn-hover-border-color: var(--app-accent-hover);
    --bs-btn-active-color: var(--app-on-accent);
    --bs-btn-active-bg: var(--app-accent-active);
    --bs-btn-active-border-color: var(--app-accent-active);
    --bs-btn-disabled-color: var(--app-on-accent);
    --bs-btn-disabled-bg: var(--app-accent);
    --bs-btn-disabled-border-color: var(--app-accent);
}
.btn-outline-primary {
    --bs-btn-color: var(--app-accent);
    --bs-btn-border-color: var(--app-accent);
    --bs-btn-hover-color: var(--app-on-accent);
    --bs-btn-hover-bg: var(--app-accent);
    --bs-btn-hover-border-color: var(--app-accent);
    --bs-btn-active-color: var(--app-on-accent);
    --bs-btn-active-bg: var(--app-accent);
    --bs-btn-active-border-color: var(--app-accent);
}
.nav-pills {
    --bs-nav-pills-link-active-bg: var(--app-accent);
    --bs-nav-pills-link-active-color: var(--app-on-accent);
    --bs-nav-link-color: var(--app-text);
    --bs-nav-link-hover-color: var(--bs-emphasis-color);
}
.form-check-input:focus {
    border-color: rgba(var(--app-accent-rgb), .6);
    box-shadow: 0 0 0 .25rem rgba(var(--app-accent-rgb), .25);
}
.form-control-color {
    width: 4rem;
}
.prefs-page {
    max-width: 36rem;
}
.prefs-size {
    width: 9rem;
}
.form-check-input:checked {
    background-color: var(--app-accent);
    border-color: var(--app-accent);
}
.pagination {
    --bs-pagination-color: var(--app-accent);
    --bs-pagination-bg: var(--app-surface);
    --bs-pagination-border-color: var(--app-border);
    --bs-pagination-active-bg: var(--app-accent);
    --bs-pagination-active-border-color: var(--app-accent);
    --bs-pagination-active-color: var(--app-on-accent);
}

/* Pages with a max-width sit in the middle of wide screens; the nav stays full width. */
.note-page,
.time-page,
.tasks-page,
.billing-page,
.logs-page,
.prefs-page {
    margin-inline: auto;
}

/* Login */
.app-login {
    max-width: 22rem;
    margin: 12vh auto 0;
}
.app-login .app-brand {
    font-size: 1.5rem;
}

/* Rendered markdown (note pages and the editor preview). */
.note-page {
    max-width: 60rem;
}
.markdown-body {
    line-height: 1.6;
    overflow-wrap: anywhere;
}
.markdown-body h1,
.markdown-body h2,
.markdown-body h3,
.markdown-body h4 {
    margin-top: 1.6em;
    margin-bottom: .6em;
    color: var(--bs-emphasis-color);
}
.markdown-body h1 { font-size: 1.6rem; }
.markdown-body h2 { font-size: 1.3rem; border-bottom: 1px solid var(--app-border); padding-bottom: .3em; }
.markdown-body h3 { font-size: 1.1rem; }
.markdown-body > :first-child { margin-top: 0; }
.markdown-body code {
    font-family: var(--app-mono);
    font-size: .875em;
    color: #f0b37e;
    background: var(--app-surface-2);
    padding: .1em .35em;
    border-radius: .25rem;
}
.markdown-body pre {
    background: #0a0d11;
    border: 1px solid var(--app-border);
    border-radius: .375rem;
    padding: .9rem 1rem;
    overflow-x: auto;
}
.markdown-body pre code,
.markdown-body pre code.hljs {
    color: var(--app-text);
    background: transparent;
    padding: 0;
    font-size: .85rem;
    overflow-wrap: normal;
}
.markdown-body blockquote {
    border-left: 3px solid var(--app-border);
    padding-left: 1rem;
    color: var(--app-muted);
}
.markdown-body table {
    border-collapse: collapse;
    margin-bottom: 1rem;
}
.markdown-body th,
.markdown-body td {
    border: 1px solid var(--app-border);
    padding: .35rem .6rem;
}
.markdown-body hr {
    border-color: var(--app-border);
    opacity: 1;
}

/* EasyMDE, dark. */
/* .cm-s-easymde raises specificity: easymde.min.css loads after this file. */
.EasyMDEContainer .CodeMirror.cm-s-easymde {
    background: var(--app-surface-2);
    color: var(--app-text);
    border-color: var(--app-border);
    font-family: var(--app-mono);
    font-size: .875rem;
    line-height: 1.55;
}
.EasyMDEContainer .CodeMirror-cursor {
    border-left-color: var(--app-accent);
}
.EasyMDEContainer .CodeMirror-selected,
.EasyMDEContainer .CodeMirror-focused .CodeMirror-selected,
.EasyMDEContainer .CodeMirror-line::selection,
.EasyMDEContainer .CodeMirror-line > span::selection {
    background: rgba(var(--app-accent-rgb), .25);
}
.CodeMirror.cm-s-easymde .cm-header { color: var(--bs-emphasis-color); }
.CodeMirror.cm-s-easymde .cm-header-1 { font-size: 1.25em; }
.CodeMirror.cm-s-easymde .cm-header-2 { font-size: 1.15em; }
.CodeMirror.cm-s-easymde .cm-header-3,
.CodeMirror.cm-s-easymde .cm-header-4,
.CodeMirror.cm-s-easymde .cm-header-5,
.CodeMirror.cm-s-easymde .cm-header-6 { font-size: 1.05em; }
.CodeMirror.cm-s-easymde .cm-comment { color: #f0b37e; background: transparent; }
.CodeMirror.cm-s-easymde .cm-link,
.CodeMirror.cm-s-easymde .cm-url { color: var(--app-accent); }
.CodeMirror.cm-s-easymde .cm-quote { color: var(--app-muted); }
.CodeMirror.cm-s-easymde .cm-string { color: #a5d6ff; }
.CodeMirror.cm-s-easymde .cm-tag { color: #7ee787; }
.CodeMirror.cm-s-easymde .cm-attribute { color: #d2a8ff; }
.editor-toolbar {
    background: var(--app-surface);
    border-color: var(--app-border);
    opacity: 1;
}
.editor-toolbar button.mde-btn {
    width: auto;
    min-width: 30px;
    padding: 0 .5rem;
    color: var(--app-text);
    font-family: var(--app-font);
    font-size: .85rem;
}
.editor-toolbar button:hover,
.editor-toolbar button.active {
    background: var(--app-surface-2);
    border-color: var(--app-border);
}
.editor-toolbar i.separator {
    border-left-color: var(--app-border);
    border-right-color: transparent;
}
.EasyMDEContainer .editor-preview,
.EasyMDEContainer .editor-preview-side {
    background: var(--app-bg);
    border-color: var(--app-border);
    padding: 1rem 1.25rem;
}
.EasyMDEContainer .editor-preview pre {
    background: #0a0d11;
}
.EasyMDEContainer.sided--no-fullscreen .editor-preview-active-side {
    border-left: 1px solid var(--app-border);
}

/* Running clocks in the nav. */
.app-running {
    color: var(--bs-emphasis-color) !important;
    display: flex;
    align-items: center;
    gap: .4rem;
}
.app-running-dot {
    width: .55rem;
    height: .55rem;
    border-radius: 50%;
    background: #f5a524;
    box-shadow: 0 0 0 0 rgba(245, 165, 36, .6);
    animation: app-pulse 2s infinite;
}
@keyframes app-pulse {
    70% { box-shadow: 0 0 0 .45rem rgba(245, 165, 36, 0); }
    100% { box-shadow: 0 0 0 0 rgba(245, 165, 36, 0); }
}

/* Time page. */
.time-page {
    max-width: 72rem;
}
/* Wide enough for "Wednesday, 30 Sep 2026", so the day buttons beside it don't move. */
.time-heading {
    min-width: 12em;
    font-variant-numeric: tabular-nums;
}
@media (max-width: 575.98px) {
    .time-heading {
        min-width: 0;
    }
}
.week-strip {
    display: flex;
    gap: .25rem;
    border-bottom: 1px solid var(--app-border);
    overflow-x: auto;
}
.week-day {
    display: flex;
    flex-direction: column;
    align-items: center;
    min-width: 5rem;
    padding: .4rem .6rem .55rem;
    color: var(--app-muted);
    text-decoration: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -1px;
}
.week-day:hover {
    color: var(--bs-emphasis-color);
}
.week-day.active {
    color: var(--bs-emphasis-color);
    border-bottom-color: var(--app-accent);
}
.week-day.today .week-day-name {
    color: var(--app-accent);
}
.week-day-name {
    font-size: .8rem;
}
.week-total {
    margin-left: auto;
    color: var(--bs-emphasis-color);
}
.entries {
    border-bottom: 1px solid var(--app-border);
}
.entry {
    border-top: 1px solid var(--app-border);
    padding: .75rem .25rem;
}
.entry:first-child {
    border-top: 0;
}
.entry-row {
    display: flex;
    align-items: center;
    gap: 1rem;
}
.entry-main {
    flex: 1;
    min-width: 0;
}
.entry-project {
    font-size: .8rem;
    color: var(--app-muted);
}
.entry-name {
    color: var(--bs-emphasis-color);
}
.entry-notes {
    font-size: .825rem;
    color: var(--app-muted);
    white-space: pre-line;
}
.entry-time {
    font-size: 1.25rem;
    min-width: 4.5rem;
    text-align: end;
}
.entry.running {
    background: rgba(245, 165, 36, .06);
}
.entry.running .entry-time {
    color: #f5a524;
}
.entry.billed .entry-time {
    color: var(--app-muted);
}
.entry-actions {
    display: flex;
    gap: .35rem;
}
.entry-actions .btn {
    min-width: 4.5rem;
}
.entry-edit {
    margin-top: .75rem;
    padding: .75rem;
    background: var(--app-surface);
    border: 1px solid var(--app-border);
    border-radius: .375rem;
}
.day-total {
    padding: .75rem .25rem;
}
.day-total .entry-time {
    color: var(--bs-emphasis-color);
}
.time-input {
    width: 6.5rem;
    text-align: end;
}
@media (max-width: 767.98px) {
    .entry-row {
        flex-wrap: wrap;
    }
    .entry-main {
        flex-basis: 100%;
    }
    .entry-time {
        text-align: start;
    }
    .time-input {
        width: 100%;
    }
}

/* Client/project picker. */
.picker {
    position: relative;
}
.picker-menu {
    position: absolute;
    z-index: 1050;
    left: 0;
    right: 0;
    top: calc(100% + 2px);
    max-height: 22rem;
    overflow-y: auto;
    background: var(--app-surface);
    border: 1px solid var(--app-border);
    border-radius: .375rem;
    box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, .45);
    padding: .25rem 0;
}
.picker-item {
    padding: .35rem .75rem;
    cursor: pointer;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.picker-item.active,
.picker-item:hover {
    background: rgba(var(--app-accent-rgb), .14);
    color: var(--bs-emphasis-color);
}
.picker-project {
    color: var(--app-muted);
}
.picker-item.active .picker-project {
    color: inherit;
}
.picker-task {
    color: #f0b37e;
}
.picker-new {
    color: var(--app-accent);
    border-top: 1px solid var(--app-border);
}

/* Task list. */
.tasks-page {
    max-width: 72rem;
}
.tasks {
    border-top: 1px solid var(--app-border);
    border-bottom: 1px solid var(--app-border);
}
.task {
    border-top: 1px solid var(--app-border);
    padding: .65rem .25rem;
}
.task:first-child {
    border-top: 0;
}
.task-row {
    display: flex;
    align-items: center;
    gap: .9rem;
}
.task-check {
    width: 1.35rem;
    height: 1.35rem;
    border: 1.5px solid var(--app-muted);
    border-radius: .3rem;
    background: transparent;
    color: var(--app-on-accent);
    font-size: .85rem;
    line-height: 1;
    padding: 0;
    display: grid;
    place-items: center;
}
.task-check:hover {
    border-color: var(--app-accent);
}
.task-check.checked {
    background: var(--app-accent);
    border-color: var(--app-accent);
}
.task-main {
    flex: 1;
    min-width: 0;
}
.task-title {
    color: var(--bs-emphasis-color);
}
.task.done .task-title {
    color: var(--app-muted);
    text-decoration: line-through;
}
.gmail-star {
    vertical-align: -.125em;
    flex-shrink: 0;
}
.task-title .gmail-star {
    margin-right: .35rem;
}
.gmail-stars {
    max-width: 32rem;
}
.task-meta {
    font-size: .8rem;
    color: var(--app-muted);
}
.task-notes {
    font-size: .825rem;
    color: var(--app-muted);
    white-space: pre-line;
}

/* Billing. */
.billing-page {
    max-width: 80rem;
}
.billing-summary {
    display: flex;
    gap: 1.25rem;
    font-size: .9rem;
}
.bill .card-header {
    padding-top: .6rem;
    padding-bottom: .6rem;
}
.bill-settings {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .75rem;
}
.bill-settings .form-select {
    width: auto;
}
.pad-input {
    width: 8.5rem;
}
.bill-lines td,
.bill-lines th {
    padding-left: .5rem;
    padding-right: .5rem;
}
.bill-lines {
    table-layout: fixed;
}
.bill-lines th.num,
.bill-lines td.num {
    width: 6.5rem;
}
.bill-lines td:not(.num) {
    overflow-wrap: anywhere;
}
.bill-lines tfoot th {
    border-bottom: 0;
    color: var(--bs-emphasis-color);
}
.bill-date {
    width: 6.5rem;
}
.bill-project th {
    padding-top: .9rem;
    color: var(--app-accent);
    font-weight: 600;
}
.bill-subtotal td {
    color: var(--app-muted);
    font-style: italic;
}
.bill-snapshot-project {
    padding: .4rem 0 0 1rem;
    font-size: .85rem;
    font-weight: 600;
}
.bill-adjusted {
    color: #f0b37e;
}
.bill-fixed {
    border-left: 2px solid rgba(var(--app-accent-rgb), .5);
    padding-left: 1rem;
}
.bill-fixed-item + .bill-fixed-item {
    margin-top: 1rem;
    padding-top: 1rem;
    border-top: 1px solid var(--app-border);
}
.bill-deferred {
    opacity: .7;
}
.bill-snapshot {
    list-style: none;
    padding: .4rem 0 0 1rem;
    margin: 0;
    font-size: .85rem;
    color: var(--app-muted);
}
.bills-done summary {
    cursor: pointer;
}

/* Access logs. */
.logs-page {
    max-width: 90rem;
}
.cell-truncate {
    display: inline-block;
    max-width: 28rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    vertical-align: bottom;
}
.dropzone {
    display: block;
}
.dropzone-target {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .35rem;
    padding: 2.5rem 1rem;
    border: 1.5px dashed var(--app-border);
    border-radius: .5rem;
    background: var(--app-surface);
    cursor: pointer;
    text-align: center;
}
.dropzone.dragging .dropzone-target,
.dropzone-target:hover {
    border-color: var(--app-accent);
    background: rgba(var(--app-accent-rgb), .05);
}
.stat-row {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem 2.5rem;
}
.stat-label {
    font-size: .8rem;
    color: var(--app-muted);
}
.stat-value {
    font-size: 1.75rem;
    font-weight: 600;
    color: var(--bs-emphasis-color);
    line-height: 1.2;
}
.stat-delta {
    font-size: .8rem;
    color: var(--app-muted);
}
.top-list td {
    vertical-align: top;
}
.top-value {
    max-width: 0;
    width: 100%;
}
.top-value a {
    display: block;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: .85rem;
}
.top-bar {
    height: 4px;
    margin-top: 3px;
    border-radius: 0 2px 2px 0;
    background: var(--app-chart);
}

/* Log chart (logs/_chart, js/chart.js). One series in the accent; grid and ticks recessive. */
.chart {
    margin: 0 0 1rem;
}
.chart-controls {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: .5rem .75rem;
    margin-bottom: .5rem;
}
.chart-title {
    color: var(--app-muted);
    margin-right: auto;
}
.chart-plot {
    position: relative;
    min-height: 220px;
}
.chart-svg {
    width: 100%;
    height: auto;
    display: block;
}
.chart-grid {
    stroke: var(--app-border);
    stroke-width: 1;
    shape-rendering: crispEdges;
}
.chart-axis {
    stroke: #3a4352;
    stroke-width: 1;
    shape-rendering: crispEdges;
}
.chart-tick {
    fill: var(--app-muted);
    font-size: 11px;
    font-family: var(--app-mono);
    font-variant-numeric: tabular-nums;
}
.chart-svg {
    outline: none;
}
.chart-svg:focus-visible {
    outline: 1px solid rgba(var(--app-accent-rgb), .6);
    outline-offset: 2px;
}
.chart-bar {
    fill: var(--app-chart);
}
.chart-bar-hover {
    fill: var(--app-accent);
}
.chart-band {
    fill: rgba(var(--app-accent-rgb), .1);
}
.chart-tip {
    position: absolute;
    pointer-events: none;
    background: var(--app-surface-2);
    border: 1px solid var(--app-border);
    border-radius: .375rem;
    padding: .3rem .6rem;
    font-size: .8rem;
    white-space: nowrap;
    box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .4);
}
.chart-tip strong {
    color: var(--bs-emphasis-color);
    margin-right: .4rem;
    font-variant-numeric: tabular-nums;
}
.chart-tip span {
    color: var(--app-muted);
}
.chart-table summary {
    font-size: .8rem;
    color: var(--app-muted);
    cursor: pointer;
}

/* Section tabs under the nav (layouts.app: Clients, Buckets, Websites, Contacts, Charts). */
.app-tabs .nav-tabs {
    --bs-nav-tabs-link-active-bg: var(--app-bg);
    --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);
    --bs-nav-link-color: var(--app-muted);
    --bs-nav-link-hover-color: var(--app-text);
}

/* Task list: the sender's address beside their name. */
.task-sender-email {
    color: var(--app-muted);
    text-decoration-color: rgba(131, 144, 162, .4);
}

/* Client hours (clients/chart): monthly columns over a one-hue heatmap of clients x months. */
.hours-chart {
    --bs-table-hover-bg: transparent;
    width: auto;
    min-width: 100%;
}
.hours-chart th[scope="row"] {
    font-weight: 400;
    white-space: nowrap;
}
.hours-chart td.num,
.hours-chart th.num {
    min-width: 4.25rem;
}
.hours-chart-columns td,
.hours-chart-columns th {
    border-bottom: 1px solid #3a4352;
    padding-block: 0;
}
.hours-chart-slot {
    height: 6rem;
    display: flex;
    align-items: flex-end;
    justify-content: center;
}
.hours-chart-column {
    width: 60%;
    max-width: 28px;
    min-height: 2px;
    border-radius: 4px 4px 0 0;
    background: var(--app-chart);
}
.hours-chart-columns td:hover .hours-chart-column {
    background: var(--app-accent);
}
.hours-chart-year {
    color: var(--app-muted);
    font-size: .75em;
    margin-left: .2em;
}
.hours-chart-total > * {
    color: var(--bs-emphasis-color);
    font-weight: 600;
}
/* Through Bootstrap's own variable: its .table cell rule outranks a plain background. */
.hours-chart-cell {
    --bs-table-bg: rgba(var(--app-accent-rgb), var(--cell-alpha, 0));
    border: 2px solid var(--app-bg);
    background-clip: padding-box;
}
.hours-chart-cell.on-strong {
    color: var(--app-on-accent);
}
.hours-chart-cell:hover {
    outline: 1px solid var(--app-accent);
    outline-offset: -1px;
}
