Files
Roster/web/styles.css
T

1075 lines
19 KiB
CSS

:root {
--ink: #102d3d;
--ink-soft: #46606d;
--blue: #278fd0;
--blue-dark: #176fa7;
--blue-pale: #eaf6fc;
--paper: #fffdfa;
--canvas: #f2f0ea;
--canvas-top: #f8f7f2;
--canvas-glow: rgba(39, 143, 208, 0.12);
--line: #d9dedc;
--line-dark: #bdc9ca;
--border-subtle: rgba(16, 45, 61, 0.12);
--badge-bg: rgba(255, 255, 255, 0.62);
--fact-bg: rgba(255, 255, 255, 0.5);
--surface: rgba(255, 253, 250, 0.94);
--surface-solid: #fff;
--surface-muted: rgba(245, 247, 245, 0.66);
--surface-hover: #f7f8f6;
--preview-bg: #e8e8e5;
--focus-ring: rgba(39, 143, 208, 0.32);
--input-hover-border: #90a4a8;
--action-bg: #102d3d;
--action-hover: #17445c;
--action-ink: #fff;
--action-shadow: 0 8px 18px rgba(16, 45, 61, 0.2);
--brand-backdrop: transparent;
--theme-track: rgba(255, 255, 255, 0.56);
--theme-active: #fff;
--theme-active-shadow: 0 1px 5px rgba(16, 45, 61, 0.15);
--warning: #92610d;
--success: #23845f;
--success-ink: #fff;
--danger: #a33c37;
--shadow: 0 22px 60px rgba(16, 45, 61, 0.1);
color-scheme: light;
font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
:root[data-theme="dark"] {
--ink: #e7eff3;
--ink-soft: #a8bac3;
--blue: #55b7ee;
--blue-dark: #8bcff5;
--blue-pale: #143246;
--paper: #15252d;
--canvas: #0c151a;
--canvas-top: #111f26;
--canvas-glow: rgba(53, 166, 226, 0.16);
--line: #2b414c;
--line-dark: #405d69;
--border-subtle: rgba(198, 224, 235, 0.13);
--badge-bg: rgba(24, 39, 47, 0.8);
--fact-bg: rgba(25, 42, 51, 0.66);
--surface: rgba(20, 34, 41, 0.95);
--surface-solid: #14242c;
--surface-muted: rgba(15, 29, 36, 0.82);
--surface-hover: #1b303a;
--preview-bg: #25363e;
--focus-ring: rgba(85, 183, 238, 0.42);
--input-hover-border: #6f909e;
--action-bg: #3ba7df;
--action-hover: #62bcef;
--action-ink: #07151c;
--action-shadow: 0 8px 22px rgba(0, 0, 0, 0.32);
--brand-backdrop: rgba(255, 255, 255, 0.92);
--theme-track: rgba(7, 18, 23, 0.58);
--theme-active: #263d48;
--theme-active-shadow: 0 1px 7px rgba(0, 0, 0, 0.34);
--warning: #efbd64;
--success: #62cda3;
--success-ink: #082018;
--danger: #f1948e;
--shadow: 0 22px 60px rgba(0, 0, 0, 0.3);
color-scheme: dark;
}
@media (prefers-color-scheme: dark) {
:root[data-theme="system"] {
--ink: #e7eff3;
--ink-soft: #a8bac3;
--blue: #55b7ee;
--blue-dark: #8bcff5;
--blue-pale: #143246;
--paper: #15252d;
--canvas: #0c151a;
--canvas-top: #111f26;
--canvas-glow: rgba(53, 166, 226, 0.16);
--line: #2b414c;
--line-dark: #405d69;
--border-subtle: rgba(198, 224, 235, 0.13);
--badge-bg: rgba(24, 39, 47, 0.8);
--fact-bg: rgba(25, 42, 51, 0.66);
--surface: rgba(20, 34, 41, 0.95);
--surface-solid: #14242c;
--surface-muted: rgba(15, 29, 36, 0.82);
--surface-hover: #1b303a;
--preview-bg: #25363e;
--focus-ring: rgba(85, 183, 238, 0.42);
--input-hover-border: #6f909e;
--action-bg: #3ba7df;
--action-hover: #62bcef;
--action-ink: #07151c;
--action-shadow: 0 8px 22px rgba(0, 0, 0, 0.32);
--brand-backdrop: rgba(255, 255, 255, 0.92);
--theme-track: rgba(7, 18, 23, 0.58);
--theme-active: #263d48;
--theme-active-shadow: 0 1px 7px rgba(0, 0, 0, 0.34);
--warning: #efbd64;
--success: #62cda3;
--success-ink: #082018;
--danger: #f1948e;
--shadow: 0 22px 60px rgba(0, 0, 0, 0.3);
color-scheme: dark;
}
}
* {
box-sizing: border-box;
}
html {
min-width: 320px;
background: var(--canvas);
}
body {
min-height: 100vh;
margin: 0;
color: var(--ink);
background:
radial-gradient(circle at 84% 9%, var(--canvas-glow), transparent 25rem),
linear-gradient(180deg, var(--canvas-top) 0, var(--canvas) 42rem);
}
button,
input {
font: inherit;
}
button,
a {
-webkit-tap-highlight-color: transparent;
}
button:focus-visible,
a:focus-visible,
input:focus-visible,
summary:focus-visible,
.drop-zone:focus-within {
outline: 3px solid var(--focus-ring);
outline-offset: 3px;
}
[hidden] {
display: none !important;
}
.site-header {
display: flex;
align-items: center;
justify-content: space-between;
width: min(1180px, calc(100% - 40px));
min-height: 104px;
margin: 0 auto;
border-bottom: 1px solid var(--border-subtle);
}
.brand {
display: inline-flex;
align-items: center;
padding: 6px 9px;
margin-left: -9px;
border-radius: 10px;
background: var(--brand-backdrop);
}
.brand img {
display: block;
width: 218px;
height: auto;
}
.header-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 12px;
}
.theme-switch {
display: inline-flex;
align-items: center;
gap: 2px;
padding: 3px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--theme-track);
}
.theme-option {
min-height: 31px;
padding: 5px 10px;
cursor: pointer;
color: var(--ink-soft);
border: 0;
border-radius: 999px;
background: transparent;
font-size: 0.7rem;
font-weight: 780;
line-height: 1;
transition: color 150ms ease, background 150ms ease, box-shadow 150ms ease;
}
.theme-option:hover {
color: var(--ink);
background: var(--surface-hover);
}
.theme-option[aria-pressed="true"],
.theme-option.is-active {
color: var(--ink);
background: var(--theme-active);
box-shadow: var(--theme-active-shadow);
}
.local-badge,
.defaults-status {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 12px;
color: var(--ink-soft);
border: 1px solid var(--line);
border-radius: 999px;
background: var(--badge-bg);
font-size: 0.78rem;
font-weight: 700;
letter-spacing: 0.02em;
}
.local-badge > span {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--success);
box-shadow: 0 0 0 4px rgba(35, 132, 95, 0.12);
}
main {
width: min(1180px, calc(100% - 40px));
margin: 0 auto;
}
.intro {
max-width: 790px;
padding: 74px 0 52px;
}
.eyebrow,
.step-label {
margin: 0 0 12px;
color: var(--blue-dark);
font-size: 0.73rem;
font-weight: 800;
letter-spacing: 0.16em;
text-transform: uppercase;
}
h1,
h2,
p {
text-wrap: pretty;
}
h1 {
max-width: 760px;
margin: 0;
font-family: Georgia, "Times New Roman", serif;
font-size: clamp(2.7rem, 6vw, 5.2rem);
font-weight: 500;
letter-spacing: -0.045em;
line-height: 0.98;
}
.lede {
max-width: 660px;
margin: 26px 0 0;
color: var(--ink-soft);
font-size: 1.08rem;
line-height: 1.7;
}
.format-facts {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 28px;
}
.format-facts span {
padding: 7px 11px;
border: 1px solid var(--border-subtle);
border-radius: 7px;
color: var(--ink-soft);
background: var(--fact-bg);
font-size: 0.78rem;
font-weight: 750;
letter-spacing: 0.025em;
}
.workspace {
display: grid;
grid-template-columns: minmax(0, 1.45fr) minmax(310px, 0.75fr);
gap: 24px;
align-items: start;
padding-bottom: 80px;
}
.side-column {
display: grid;
gap: 24px;
}
.card {
border: 1px solid var(--border-subtle);
border-radius: 20px;
background: var(--surface);
box-shadow: var(--shadow);
}
.form-card {
padding: clamp(24px, 5vw, 44px);
}
.card-heading,
.result-heading,
.advanced-heading {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 18px;
}
.card-heading {
margin-bottom: 30px;
}
.card-heading h2,
.result-heading h2 {
margin: 0;
font-size: 1.45rem;
letter-spacing: -0.025em;
}
.card-heading .step-label,
.result-heading .step-label {
margin-bottom: 7px;
}
.defaults-status {
flex: 0 0 auto;
color: var(--success);
border-color: rgba(35, 132, 95, 0.22);
background: rgba(35, 132, 95, 0.07);
}
.defaults-status.is-custom {
color: var(--warning);
border-color: rgba(146, 97, 13, 0.24);
background: rgba(217, 151, 35, 0.09);
}
.drop-zone {
position: relative;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 228px;
padding: 32px 20px;
overflow: hidden;
cursor: pointer;
text-align: center;
border: 1.5px dashed var(--line-dark);
border-radius: 15px;
background:
linear-gradient(135deg, rgba(39, 143, 208, 0.035), rgba(39, 143, 208, 0.09)),
var(--paper);
transition: border-color 160ms ease, background 160ms ease, transform 160ms ease;
}
.drop-zone::after {
position: absolute;
inset: auto -48px -68px auto;
width: 170px;
height: 170px;
content: "";
border: 24px solid rgba(39, 143, 208, 0.055);
border-radius: 50%;
}
.drop-zone:hover,
.drop-zone.is-dragging {
border-color: var(--blue);
background:
linear-gradient(135deg, rgba(39, 143, 208, 0.08), rgba(39, 143, 208, 0.14)),
var(--paper);
}
.drop-zone.is-dragging {
transform: translateY(-2px);
}
.drop-zone.has-file {
border-style: solid;
border-color: rgba(35, 132, 95, 0.36);
background: rgba(35, 132, 95, 0.055);
}
.drop-zone input {
position: absolute;
width: 1px;
height: 1px;
opacity: 0;
pointer-events: none;
}
.upload-mark {
display: grid;
place-items: center;
width: 50px;
height: 50px;
margin-bottom: 18px;
color: var(--action-ink);
border-radius: 14px;
background: var(--action-bg);
box-shadow: var(--action-shadow);
font-size: 1.45rem;
line-height: 1;
}
.drop-title {
position: relative;
z-index: 1;
max-width: 90%;
overflow: hidden;
font-size: 1.02rem;
font-weight: 800;
text-overflow: ellipsis;
white-space: nowrap;
}
.drop-copy {
position: relative;
z-index: 1;
margin-top: 8px;
color: var(--ink-soft);
font-size: 0.82rem;
line-height: 1.5;
}
.field-block {
margin-top: 30px;
}
.field-block > label,
.setting-grid label {
display: grid;
gap: 8px;
color: var(--ink);
font-size: 0.82rem;
font-weight: 760;
}
.month-row {
display: flex;
align-items: center;
gap: 14px;
margin-top: 9px;
}
input[type="month"],
input[type="number"] {
min-width: 0;
color: var(--ink);
border: 1px solid var(--line-dark);
border-radius: 10px;
background: var(--surface-solid);
}
input[type="month"] {
width: min(260px, 100%);
min-height: 48px;
padding: 10px 13px;
font-weight: 680;
}
input[type="number"] {
width: 100%;
min-height: 43px;
padding: 8px 10px;
font-variant-numeric: tabular-nums;
}
input:hover {
border-color: var(--input-hover-border);
}
.text-button,
.icon-button {
padding: 0;
cursor: pointer;
color: var(--blue-dark);
border: 0;
background: transparent;
font-size: 0.8rem;
font-weight: 800;
}
.text-button:hover {
text-decoration: underline;
text-underline-offset: 3px;
}
.field-help {
margin: 8px 0 0;
color: var(--ink-soft);
font-size: 0.78rem;
}
.advanced {
margin-top: 30px;
border: 1px solid var(--line);
border-radius: 13px;
background: var(--surface-muted);
}
.advanced summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
min-height: 72px;
padding: 16px 18px;
cursor: pointer;
list-style: none;
}
.advanced summary::-webkit-details-marker {
display: none;
}
.advanced summary > span:first-child {
display: grid;
gap: 4px;
}
.advanced summary strong {
font-size: 0.87rem;
}
.advanced summary small {
color: var(--ink-soft);
font-size: 0.74rem;
font-weight: 500;
}
.chevron {
font-size: 1.3rem;
transition: transform 160ms ease;
}
.advanced[open] .chevron {
transform: rotate(180deg);
}
.advanced-body {
padding: 0 18px 20px;
border-top: 1px solid var(--line);
}
.advanced-heading {
align-items: center;
padding: 16px 0 8px;
}
.advanced-heading p {
margin: 0;
color: var(--ink-soft);
font-size: 0.75rem;
line-height: 1.45;
}
.layout-actions {
display: flex;
flex: 0 0 auto;
flex-wrap: wrap;
justify-content: flex-end;
gap: 7px 14px;
}
.layout-actions .text-button {
white-space: nowrap;
}
fieldset {
min-width: 0;
margin: 15px 0 0;
padding: 0;
border: 0;
}
legend {
margin-bottom: 10px;
font-size: 0.74rem;
font-weight: 850;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.setting-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 11px;
}
.setting-grid--three {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.setting-grid label {
color: var(--ink-soft);
font-size: 0.72rem;
}
.canvas-lock {
margin: 18px 0 0;
padding: 11px 13px;
color: var(--ink-soft);
border-left: 3px solid var(--blue);
background: var(--blue-pale);
font-size: 0.73rem;
line-height: 1.5;
}
.save-defaults-row {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 14px;
margin-top: 18px;
}
#layout-message {
flex: 1 1 auto;
margin: 0;
color: var(--success);
font-size: 0.74rem;
line-height: 1.45;
}
#layout-message.is-error {
color: var(--danger);
}
.save-defaults-button {
flex: 0 0 auto;
min-height: 42px;
padding: 9px 14px;
font-size: 0.78rem;
}
.form-message {
margin-top: 22px;
padding: 12px 14px;
color: var(--danger);
border: 1px solid rgba(163, 60, 55, 0.23);
border-radius: 10px;
background: rgba(163, 60, 55, 0.07);
font-size: 0.82rem;
line-height: 1.5;
}
.primary-button,
.secondary-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 51px;
padding: 13px 18px;
cursor: pointer;
border-radius: 10px;
font-size: 0.88rem;
font-weight: 820;
text-decoration: none;
transition: background 150ms ease, border-color 150ms ease, transform 150ms ease;
}
#format-button {
justify-content: space-between;
width: 100%;
margin-top: 24px;
}
.primary-button {
color: var(--action-ink);
border: 1px solid var(--action-bg);
background: var(--action-bg);
}
.primary-button:hover {
border-color: var(--action-hover);
background: var(--action-hover);
transform: translateY(-1px);
}
.primary-button:disabled {
cursor: wait;
opacity: 0.68;
transform: none;
}
.button-arrow {
font-size: 1.3rem;
font-weight: 400;
}
.secondary-button {
color: var(--ink);
border: 1px solid var(--line-dark);
background: var(--surface-solid);
}
.secondary-button:hover {
border-color: var(--ink-soft);
background: var(--surface-hover);
}
.secondary-button:disabled {
cursor: wait;
opacity: 0.65;
}
.result-card,
.history-card {
padding: 26px;
}
.result-card {
border-color: rgba(35, 132, 95, 0.22);
}
.result-heading {
margin-bottom: 20px;
}
.success-mark {
display: grid;
place-items: center;
width: 35px;
height: 35px;
color: var(--success-ink);
border-radius: 50%;
background: var(--success);
font-weight: 900;
}
.preview-shell {
padding: 8px;
overflow: hidden;
border: 1px solid var(--line);
border-radius: 11px;
background: var(--preview-bg);
}
.preview-shell img {
display: block;
width: 100%;
height: auto;
border-radius: 5px;
background: white;
}
.result-name {
margin: 13px 0 0;
overflow-wrap: anywhere;
color: var(--ink-soft);
font-size: 0.78rem;
text-align: center;
}
.result-actions {
display: grid;
grid-template-columns: 1fr;
gap: 9px;
margin-top: 18px;
}
.compact-heading {
align-items: center;
margin-bottom: 18px;
}
.icon-button {
display: grid;
place-items: center;
width: 34px;
height: 34px;
border: 1px solid var(--line);
border-radius: 50%;
font-size: 1.05rem;
}
.icon-button:hover {
background: var(--blue-pale);
}
.history-list {
display: grid;
gap: 8px;
}
.history-item {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
min-width: 0;
padding: 12px;
color: inherit;
border: 1px solid var(--line);
border-radius: 10px;
background: var(--surface-solid);
text-decoration: none;
transition: border-color 150ms ease, background 150ms ease;
}
.history-item:hover {
border-color: rgba(39, 143, 208, 0.48);
background: var(--blue-pale);
}
.history-file {
min-width: 0;
}
.history-file strong,
.history-file small {
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.history-file strong {
font-size: 0.8rem;
}
.history-file small {
margin-top: 3px;
color: var(--ink-soft);
font-size: 0.69rem;
}
.history-download {
flex: 0 0 auto;
color: var(--blue-dark);
font-size: 1.05rem;
}
.empty-state,
.retention-note {
margin: 0;
color: var(--ink-soft);
font-size: 0.74rem;
line-height: 1.55;
}
.empty-state {
padding: 22px 12px;
border: 1px dashed var(--line-dark);
border-radius: 10px;
text-align: center;
}
.retention-note {
margin-top: 15px;
}
.privacy-note {
display: flex;
align-items: flex-start;
gap: 13px;
padding: 0 8px;
color: var(--ink-soft);
}
.privacy-note > span {
display: grid;
place-items: center;
flex: 0 0 auto;
width: 28px;
height: 28px;
border: 1px solid var(--line-dark);
border-radius: 50%;
font-size: 0.82rem;
}
.privacy-note p {
margin: 3px 0 0;
font-size: 0.73rem;
line-height: 1.6;
}
footer {
display: flex;
justify-content: space-between;
gap: 20px;
width: min(1180px, calc(100% - 40px));
margin: 0 auto;
padding: 25px 0 32px;
color: var(--ink-soft);
border-top: 1px solid var(--border-subtle);
font-size: 0.72rem;
}
body.is-busy .drop-zone,
body.is-busy .advanced,
body.is-busy .field-block {
opacity: 0.66;
pointer-events: none;
}
@media (max-width: 860px) {
.workspace {
grid-template-columns: 1fr;
}
.side-column {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.result-card,
.privacy-note {
grid-column: 1 / -1;
}
}
@media (max-width: 620px) {
.site-header,
main,
footer {
width: min(100% - 24px, 1180px);
}
.site-header {
flex-wrap: wrap;
gap: 10px;
min-height: 82px;
padding: 14px 0;
}
.brand img {
width: 165px;
}
.header-actions {
flex: 1 1 100%;
justify-content: space-between;
gap: 8px;
}
.theme-option {
min-height: 29px;
padding: 5px 8px;
font-size: 0.66rem;
}
.local-badge {
padding: 7px 9px;
font-size: 0.68rem;
}
.intro {
padding: 52px 4px 38px;
}
h1 {
font-size: clamp(2.5rem, 13vw, 4rem);
}
.lede {
font-size: 0.98rem;
}
.form-card,
.result-card,
.history-card {
padding: 22px;
border-radius: 16px;
}
.drop-zone {
min-height: 205px;
}
.month-row {
align-items: flex-start;
flex-direction: column;
}
input[type="month"] {
width: 100%;
}
.setting-grid,
.setting-grid--three {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.advanced-heading {
align-items: flex-start;
flex-direction: column;
}
.layout-actions {
justify-content: flex-start;
}
.save-defaults-row {
align-items: stretch;
flex-direction: column;
}
.side-column {
grid-template-columns: 1fr;
}
.result-card,
.privacy-note {
grid-column: auto;
}
footer {
flex-direction: column;
}
}
@media (max-width: 420px) {
.card-heading {
align-items: flex-start;
flex-direction: column;
}
.compact-heading {
align-items: center;
flex-direction: row;
}
.setting-grid,
.setting-grid--three {
grid-template-columns: 1fr;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
}
}