/* ==========================================================================
   1. Reset
   ========================================================================== */

* { box-sizing: border-box; }


/* ==========================================================================
   2. Design tokens
   ========================================================================== */

:root {
    --color-text: #222;
    --color-text-muted: #555;
    --color-text-muted-2: #666;
    --color-danger: #b00;
    --color-danger-border: #ffb74d;
    --color-danger-bg: #ffe0b2;
    --color-success: #1b5e20;
    --color-success-bg: #c8e6c9;
    --color-white: #fff;

    --border-color: #999;
    --border-color-light: #ddd;
    --border-color-lighter: #ccc;
    --border-color-xlsx: #c9c6bf;

    --bg-page: #fff;
    --bg-subtle: #fafafa;

    --radius: 6px;
    --radius-small: 4px;

    --gap-small: 0.25rem;
    --gap-medium: 0.4rem;
    --gap-large: 0.5rem;

    --control-min-height: 44px;
    --control-min-height-small: 36px;
}


/* ==========================================================================
   3. Base elements — document, typography, sections
   ========================================================================== */

body {
    font-family: system-ui, sans-serif;
    font-size: 16px;
    max-width: 600px;
    margin: 0 auto;
    padding: 1rem;
    line-height: 1.4;
}

h1 { font-size: 1.3rem; margin: 0 0 1rem; }
h2 { font-size: 1.05rem; margin: 1.25rem 0 0.5rem; }

section {
    border: 1px solid var(--border-color-lighter);
    border-radius: var(--radius);
    padding: 0.75rem;
    margin-bottom: 1rem;
}


/* ==========================================================================
   4. Form controls — inputs, buttons, inline forms
   ========================================================================== */

label { display: block; margin: var(--gap-small) 0; }

input, select, textarea, button {
    font: inherit;
    width: 100%;
    min-height: var(--control-min-height);
    padding: var(--gap-medium) 0.6rem;
    margin: var(--gap-small) 0;
    border-radius: var(--radius-small);
    border: 1px solid var(--border-color);
    background: var(--bg-page);
}

button {
    background: var(--color-text);
    color: var(--color-white);
    border-color: var(--color-text);
    cursor: pointer;
}

button.secondary { background: var(--color-white); color: var(--color-text); }
button.danger { background: var(--color-danger); border-color: var(--color-danger); }

form.inline { display: flex; gap: var(--gap-large); flex-wrap: wrap; }
form.inline input, form.inline select { flex: 1; min-width: 0; }
form.inline button { width: auto; flex: 0 0 auto; }

.entry-form-row {
    display: flex;
    gap: var(--gap-large);
    align-items: flex-start;
}
.entry-form-row #entry-number { width: auto; flex: 0 0 auto; }
.entry-form-row #entry-comment { flex: 1; min-width: 0; }

textarea.autogrow {
    resize: none;
    overflow: hidden;
    line-height: 1.4;
}


/* ==========================================================================
   5. Button layout groups
   ========================================================================== */

.btn-group {
    display: flex;
    flex-direction: column;
    gap: var(--gap-medium);
    margin: var(--gap-small) 0;
}

.btn-row {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gap-medium);
}


/* ==========================================================================
   6. Chips — shared by class buttons and draggable assignment chips
   ========================================================================== */

button.chip,
span.chip.drag-chip {
    width: auto;
    min-height: var(--control-min-height-small);
    padding: 0.3rem 0.8rem;
    margin: 0;
    background: var(--color-white);
    color: var(--color-text);
    border: 1px solid var(--border-color);
}

button.chip.pending {
    background: var(--color-danger-bg);
    border-color: var(--color-danger-border);
    color: var(--color-text);
}

button.chip.active {
    background: var(--color-text);
    color: var(--color-white);
    border-color: var(--color-text);
}

/* A <span> isn't matched by the `input, select, button` base rule, so the
   drag chip restates the radius and adds its own drag affordances. */
span.chip.drag-chip {
    display: inline-flex;
    align-items: center;
    border-radius: var(--radius-small);
    cursor: grab;
    user-select: none;
}

/* Rename/delete mode toggles for the class pool: lemon-green while rename is
   armed, danger-red while delete is armed, so it's obvious a click will act
   instead of drag. */
button.chip.pen-toggle.active {
    background: #e3f76b;
    border-color: #c7dd3f;
    color: var(--color-text);
}

.chip-icon {
    vertical-align: -2px;
}

button.chip.trash-toggle.active {
    background: var(--color-danger-bg);
    border-color: var(--color-danger-border);
    color: var(--color-text);
}


/* ==========================================================================
   7. Session header & login
   ========================================================================== */

#whoami {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--gap-large);
}
#whoami button { width: auto; }
#login-error { color: var(--color-danger); }


/* ==========================================================================
   8. Entry cards — the logged-entry list and its per-card actions
   ========================================================================== */

.entries-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: var(--gap-large);
    margin-top: var(--gap-large);
}

.entry-card {
    display: grid;
    grid-template-rows: auto auto;
    gap: var(--gap-medium);
    border: 1px solid var(--border-color-light);
    border-radius: var(--radius);
    padding: 0.5rem 0.6rem;
    background: var(--bg-subtle);
}

.entry-card-body { min-width: 0; }

.entry-meta {
    display: flex;
    gap: var(--gap-large);
    align-items: baseline;
    font-size: 0.9rem;
    color: var(--color-text-muted);
}
.entry-meta .num { font-weight: bold; color: var(--color-text); }

.entry-card .comment,
.entry-card .homework {
    margin-top: 0.2rem;
    word-break: break-word;
    overflow-wrap: anywhere;
}
.entry-card .homework { font-size: 0.95rem; }
.entry-card .comment:empty,
.entry-card .homework.empty { display: none; }
.entry-card .homework-label { color: var(--color-text-muted); font-weight: bold; }

.entry-card-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gap-medium);
    justify-content: space-between;
    align-items: center;
}
.entry-card-actions .actions-left,
.entry-card-actions .actions-right {
    display: flex;
    gap: var(--gap-small);
    flex-wrap: wrap;
}
.entry-card-actions button {
    width: auto;
    min-height: var(--control-min-height-small);
    padding: 0.2rem 0.6rem;
    margin: 0;
}


/* ==========================================================================
   9. History filter
   ========================================================================== */

#history-class-filter {
    margin-top: 0.75rem;
    padding-top: var(--gap-large);
    border-top: 1px solid var(--border-color-light);
}


/* ==========================================================================
   10. Class assignment — drop zones and dragula drag state
   ========================================================================== */

.assign-zone {
    display: flex;
    flex-wrap: wrap;
    gap: var(--gap-medium);
    min-height: var(--control-min-height);
    padding: var(--gap-medium);
    border: 1px dashed var(--border-color);
    border-radius: var(--radius);
    background: var(--bg-subtle);
}

.assign-pool-break { flex-basis: 100%; height: 0; }

.assign-teacher { margin-top: 0.75rem; }
.assign-teacher-name { font-weight: bold; margin-bottom: var(--gap-small); }
.assign-teacher .assign-zone { background: var(--color-white); }

/* dragula in-flight styles (its stylesheet isn't loaded via the ESM import) */
.gu-mirror {
    position: fixed !important;
    margin: 0 !important;
    z-index: 9999 !important;
    opacity: 0.8;
    pointer-events: none;
}
.gu-hide { display: none !important; }
.gu-unselectable { user-select: none !important; }
.gu-transit { opacity: 0.3; }


/* ==========================================================================
   11. Review grid (admin/viewer) — sticky class rows and date columns
   ========================================================================== */

#review-section h3 { font-size: 1rem; margin: 1.25rem 0 0.5rem; }

#review-grid-wrap {
    overflow: auto;
    max-height: 70vh;
    border: 1px solid var(--border-color-lighter);
    border-radius: var(--radius);
    background: var(--bg-page);
    -webkit-overflow-scrolling: touch;
}
#review-grid { border-collapse: collapse; }
#review-grid th,
#review-grid td { border: 1px solid var(--border-color-light); text-align: center; }
#review-grid td { padding: 0; }

#review-grid thead th {
    position: sticky;
    top: 0;
    z-index: 2;
    background: var(--bg-page);
    vertical-align: bottom;
    padding: var(--gap-small) 0;
}
#review-grid th.corner {
    left: 0;
    z-index: 3;
}
#review-grid th.date-col { height: 6.5rem; }
#review-grid th.date-col > span {
    writing-mode: vertical-rl;
    transform: rotate(180deg);
    white-space: nowrap;
    font-weight: normal;
    font-size: 0.8rem;
    color: var(--color-text-muted);
}
#review-grid th.class-row {
    position: sticky;
    left: 0;
    z-index: 1;
    background: var(--bg-page);
    text-align: right;
    white-space: nowrap;
    padding: 0.2rem var(--gap-large);
    font-size: 0.9rem;
}

#review-grid td .review-box {
    width: 18px;
    height: 18px;
    min-height: 0;
    margin: var(--gap-small);
    padding: 0;
    cursor: pointer;
    accent-color: var(--color-text);
}
#review-grid td .review-box.has-note { accent-color: var(--color-danger); }
#review-grid td .review-box.has-note.resolved { accent-color: var(--color-success); }

#review-grid tr.teacher-group-header th {
    text-align: right;
    background: var(--bg-page);
    font-size: 0.85rem;
    color: var(--color-text-muted);
    padding: var(--gap-small) var(--gap-large);
}
#review-grid tr.teacher-group-spacer td { border: none; height: var(--gap-large); }

#review-notes .entry-card.resolved { background: var(--color-success-bg); }


/* ==========================================================================
   12. Curriculum workbook viewer — sheet tabs and drag-to-pan grid
   ========================================================================== */

#xlsx-tabs { margin: var(--gap-large) 0; }
#xlsx-tabs:empty { display: none; }
#xlsx-tabs button {
    width: auto;
    min-height: var(--control-min-height-small);
    margin: 0;
    padding: 0.3rem 0.8rem;
    background: var(--color-white);
    color: var(--color-text);
    border: 1px solid var(--border-color);
}
#xlsx-tabs button[aria-selected="true"] {
    background: var(--color-text);
    color: var(--color-white);
    border-color: var(--color-text);
}

#xlsx-wrap {
    overflow: auto;
    max-height: 60vh;
    margin-top: var(--gap-large);
    border: 1px solid var(--border-color-lighter);
    border-radius: var(--radius);
    background: var(--bg-page);
    cursor: grab;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
}
#xlsx-wrap.dragging { cursor: grabbing; user-select: none; }

#xlsx-grid {
    border-collapse: collapse;
    width: max-content;
    min-width: 100%;
    font-family: Arial, sans-serif;
    table-layout: fixed;
}
#xlsx-grid td {
    border: 1px solid var(--border-color-xlsx);
    padding: 5px 8px;
    vertical-align: top;
}

/* Touch devices can't hover, so the grab cursor is meaningless there. */
@media (hover: none) { #xlsx-wrap { cursor: auto; } }


/* ==========================================================================
   13. Utilities
   ========================================================================== */

.hidden { display: none; }
.disabled { opacity: 0.5; pointer-events: none; }
.muted { color: var(--color-text-muted-2); font-size: 0.9rem; }


/* ==========================================================================
   14. Desktop layout
      The base styles above target mobile (single narrow column). On wider
      viewports the container grows and card grids flow into multiple columns.
   ========================================================================== */

@media (min-width: 900px) {
    body {
        max-width: 1080px;
        padding: 1.5rem 2rem;
    }
    h1 { font-size: 1.6rem; }
    h2 { font-size: 1.15rem; }

    #xlsx-wrap { max-height: 72vh; }
}

