Refactor project structure and update documentation. Replace PixiJS with plain DOM for UI rendering, enhance README with game features, and revise protocol documentation for HTTP API. Remove unused files and streamline client code for better maintainability.
ci / server (push) Failing after 3m31s
ci / client (push) Successful in 17s

This commit is contained in:
Leonid Pershin
2026-08-18 12:27:30 +03:00
parent e6739e7912
commit b9ddc018d3
73 changed files with 4387 additions and 2930 deletions
+269 -13
View File
@@ -1,6 +1,16 @@
:root {
color-scheme: dark;
font-family: ui-monospace, "Cascadia Mono", "Segoe UI Mono", monospace;
--surface: #10141c;
--surface-raised: #171d28;
--border: #2a3242;
--text: #d7e0ef;
--text-muted: #8b98ad;
--accent: #4cc9f0;
--danger: #f2536d;
font-family: system-ui, "Segoe UI", sans-serif;
color: var(--text);
}
* {
@@ -9,26 +19,272 @@
body {
margin: 0;
overflow: hidden;
background: #10141c;
color: #d7e0ef;
min-height: 100vh;
background: var(--surface);
}
#stage canvas {
display: block;
#app {
max-width: 900px;
margin: 0 auto;
padding: 32px 20px 72px;
}
#hud {
#status {
position: fixed;
top: 12px;
left: 12px;
right: 16px;
bottom: 12px;
display: flex;
gap: 14px;
font-size: 12px;
color: var(--text-muted);
}
/* Screens */
.screen__header {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 20px;
}
.screen__title {
margin: 0;
font-size: 24px;
font-weight: 600;
}
.screen__actions {
margin-left: auto;
}
.hint {
margin: 0 0 16px;
color: var(--text-muted);
font-size: 14px;
}
.hint--error {
color: var(--danger);
}
/* School cards */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 16px;
}
.card {
display: flex;
flex-direction: column;
gap: 8px;
padding: 16px;
border: 1px solid var(--border);
border-radius: 12px;
background: var(--surface-raised);
cursor: pointer;
transition: border-color 120ms ease, transform 120ms ease;
}
.card:hover,
.card:focus-visible {
border-color: var(--accent);
transform: translateY(-2px);
outline: none;
}
.card__title {
margin: 0;
font-size: 17px;
font-weight: 600;
}
.card__meta {
display: flex;
align-items: center;
gap: 10px;
}
.card__time {
margin: 0;
color: var(--text-muted);
font-size: 14px;
font-variant-numeric: tabular-nums;
}
.card__badge {
padding: 2px 8px;
border: 1px solid var(--border);
border-radius: 999px;
color: var(--text-muted);
font-size: 12px;
}
.card__actions {
margin-top: 8px;
}
/* Clock */
.clock {
padding: 28px;
border: 1px solid var(--border);
border-radius: 16px;
background: var(--surface-raised);
text-align: center;
}
.clock__time {
margin: 0;
font-size: 56px;
font-weight: 600;
font-variant-numeric: tabular-nums;
letter-spacing: 0.02em;
}
.clock__date {
margin: 4px 0 0;
font-size: 18px;
}
.clock__weekday {
margin: 2px 0 0;
color: var(--text-muted);
text-transform: capitalize;
}
.clock__controls {
display: flex;
justify-content: center;
flex-wrap: wrap;
gap: 8px;
margin-top: 20px;
}
/* Controls */
.button {
padding: 8px 14px;
border: 1px solid #2a3242;
border: 1px solid var(--border);
border-radius: 8px;
background: transparent;
color: var(--text);
font: inherit;
font-size: 14px;
cursor: pointer;
transition: border-color 120ms ease, background 120ms ease;
}
.button:hover:not([disabled]) {
border-color: var(--accent);
}
.button[disabled] {
opacity: 0.45;
cursor: not-allowed;
}
.button--primary {
border-color: var(--accent);
color: var(--accent);
}
.button--danger {
border-color: var(--danger);
color: var(--danger);
}
.button--small {
padding: 6px 10px;
font-size: 13px;
}
.button--icon {
min-width: 44px;
font-size: 16px;
}
.button--active {
border-color: var(--accent);
background: rgba(76, 201, 240, 0.16);
color: var(--accent);
}
.input {
flex: 1;
padding: 8px 12px;
border: 1px solid var(--border);
border-radius: 8px;
background: rgba(16, 20, 28, 0.72);
background: var(--surface);
color: var(--text);
font: inherit;
font-size: 14px;
}
.input:focus {
border-color: var(--accent);
outline: none;
}
/* Dialogs */
.dialog {
min-width: 340px;
max-width: 440px;
padding: 24px;
border: 1px solid var(--border);
border-radius: 14px;
background: var(--surface-raised);
color: var(--text);
}
.dialog::backdrop {
background: rgba(6, 9, 14, 0.7);
}
.dialog__title {
margin: 0 0 12px;
font-size: 19px;
}
.dialog__message {
margin: 0 0 20px;
color: var(--text-muted);
}
.dialog__error {
margin: 0;
color: var(--danger);
font-size: 14px;
}
.dialog__actions {
display: flex;
justify-content: flex-end;
gap: 8px;
margin-top: 20px;
}
.form {
display: flex;
flex-direction: column;
gap: 16px;
}
.field {
display: flex;
flex-direction: column;
gap: 6px;
}
.field__label {
font-size: 13px;
letter-spacing: 0.02em;
pointer-events: none;
color: var(--text-muted);
}
.field__row {
display: flex;
gap: 8px;
}