Files
sanasto-app/src/style.css
2026-02-06 01:43:51 +01:00

566 lines
8.9 KiB
CSS

@import url('https://fonts.googleapis.com/css2?family=Manrope:wght@300;500;600;700&display=swap');
:root {
color-scheme: light;
font-family: 'Manrope', 'Segoe UI', sans-serif;
line-height: 1.5;
font-weight: 500;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
--slate-50: #f8fafc;
--slate-100: #f1f5f9;
--slate-200: #e2e8f0;
--slate-300: #cbd5e1;
--slate-600: #475569;
--slate-700: #334155;
--slate-900: #0f172a;
--indigo-600: #4f46e5;
--indigo-700: #4338ca;
--emerald-600: #059669;
--amber-500: #f59e0b;
--red-100: #fee2e2;
--red-500: #ef4444;
--shadow-sm: 0 4px 16px rgba(15, 23, 42, 0.06);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
min-height: 100vh;
background: radial-gradient(circle at 10% 20%, #eef2ff 0%, #f8fafc 45%, #f1f5f9 100%);
color: var(--slate-900);
overflow-x: hidden;
}
#app {
min-height: 100vh;
}
.app {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.header {
background: #ffffff;
border-bottom: 1px solid var(--slate-200);
box-shadow: var(--shadow-sm);
}
.header-inner {
max-width: 1200px;
margin: 0 auto;
padding: 16px 20px 10px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
}
.header-sub {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px 12px;
display: flex;
justify-content: space-between;
align-items: center;
gap: 12px;
}
.brand {
display: flex;
align-items: baseline;
gap: 8px;
font-size: 20px;
letter-spacing: -0.02em;
}
.brand-strong {
font-weight: 700;
color: var(--indigo-600);
}
.brand-light {
font-weight: 300;
color: var(--slate-300);
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
flex-wrap: wrap;
justify-content: flex-end;
}
.meta-row {
display: flex;
align-items: center;
gap: 8px;
font-size: 12px;
color: var(--slate-600);
}
.meta-label {
text-transform: uppercase;
letter-spacing: 0.12em;
font-weight: 700;
font-size: 10px;
}
.meta-error {
color: var(--red-500);
font-size: 12px;
}
.content {
flex: 1;
max-width: 1200px;
width: 100%;
margin: 0 auto;
padding: 24px 20px 40px;
display: flex;
flex-direction: column;
gap: 24px;
}
@media (orientation: landscape) and (max-width: 1023px) {
.header-inner,
.header-sub,
.content {
max-width: 500px;
}
}
@media (min-width: 1024px) {
.header-inner,
.header-sub,
.content {
max-width: 1200px;
}
}
.search-area {
display: flex;
flex-direction: column;
gap: 16px;
width: 100%;
}
.search-field {
position: relative;
}
.search-icon {
position: absolute;
left: 16px;
top: 50%;
transform: translateY(-50%);
width: 20px;
height: 20px;
color: #94a3b8;
}
.search-icon svg {
width: 100%;
height: 100%;
}
.search-input {
width: 100%;
min-width: 0;
padding: 18px 44px 18px 50px;
border-radius: 18px;
border: 1px solid var(--slate-200);
background: #ffffff;
font-size: 16px;
color: var(--slate-700);
box-shadow: var(--shadow-sm);
}
.search-input[type='search']::-webkit-search-cancel-button,
.search-input[type='search']::-webkit-search-decoration {
-webkit-appearance: none;
appearance: none;
}
.search-input:focus {
outline: 2px solid rgba(79, 70, 229, 0.2);
border-color: var(--indigo-600);
}
.search-clear {
position: absolute;
right: 16px;
top: 50%;
transform: translateY(-50%);
border: none;
background: transparent;
font-size: 24px;
color: #94a3b8;
cursor: pointer;
}
.filters-row {
display: flex;
flex-wrap: wrap;
gap: 12px 20px;
align-items: center;
width: 100%;
}
.filter-group {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
.filter-label {
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--slate-600);
font-weight: 700;
}
.chip {
border-radius: 999px;
border: 1px solid var(--slate-200);
background: #ffffff;
color: var(--slate-600);
font-size: 11px;
font-weight: 700;
padding: 6px 14px;
text-transform: uppercase;
letter-spacing: 0.08em;
cursor: pointer;
}
.chip.active {
background: #e0e7ff;
border-color: #c7d2fe;
color: var(--indigo-700);
}
.chip.dark {
text-transform: none;
font-size: 12px;
letter-spacing: 0.02em;
font-weight: 600;
}
.chip.dark.active {
background: var(--slate-900);
color: #ffffff;
border-color: var(--slate-900);
}
.chip.mini {
padding: 4px 10px;
font-size: 10px;
}
.alphabet-row {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.select {
padding: 8px 12px;
border-radius: 10px;
border: 1px solid var(--slate-200);
background: #ffffff;
font-weight: 600;
color: var(--slate-700);
}
.btn {
border-radius: 12px;
border: 1px solid transparent;
padding: 8px 16px;
font-size: 12px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
cursor: pointer;
}
.btn-primary {
background: var(--indigo-600);
color: #ffffff;
}
.btn-primary:disabled {
opacity: 0.6;
cursor: not-allowed;
}
.btn-ghost {
background: transparent;
border-color: var(--slate-200);
color: var(--slate-600);
}
.stats-row {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
}
.language-controls {
display: flex;
align-items: center;
gap: 10px;
flex-wrap: wrap;
}
.language-control {
display: flex;
align-items: center;
gap: 6px;
justify-content: flex-start;
}
.language-control.secondary {
margin-left: auto;
justify-content: flex-end;
}
.swap-link {
border: 1px solid var(--slate-200);
background: transparent;
color: var(--slate-600);
border-radius: 10px;
width: 34px;
height: 34px;
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
text-decoration: none;
}
.swap-link svg {
width: 16px;
height: 16px;
fill: none;
stroke: currentColor;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
}
.section-title {
margin: 0;
font-size: 18px;
font-weight: 700;
color: var(--slate-900);
}
.section-heading {
display: flex;
align-items: baseline;
gap: 8px;
}
.section-subtitle {
margin: 0;
font-size: 12px;
color: var(--slate-600);
}
.stats {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.badge {
border-radius: 999px;
border: 1px solid var(--slate-200);
background: #ffffff;
padding: 6px 12px;
font-size: 12px;
font-weight: 700;
color: var(--slate-600);
}
.badge.success {
border-color: #bbf7d0;
color: var(--emerald-600);
}
.table-shell {
background: #ffffff;
border-radius: 16px;
border: 1px solid var(--slate-200);
box-shadow: var(--shadow-sm);
overflow: hidden;
width: 100%;
}
.table-scroll {
max-height: 68vh;
overflow: auto;
max-width: 100%;
}
.glossary {
width: 100%;
border-collapse: separate;
border-spacing: 0;
font-size: 13px;
color: var(--slate-700);
}
.glossary thead th {
position: sticky;
top: 0;
background: var(--slate-50);
border-bottom: 1px solid var(--slate-200);
z-index: 2;
text-align: left;
padding: 12px 16px;
min-width: 160px;
}
.glossary tbody td {
padding: 14px 16px;
border-bottom: 1px solid var(--slate-100);
background: #ffffff;
min-width: 160px;
}
.glossary .sticky-col {
position: sticky;
left: 0;
z-index: 3;
background: #ffffff;
min-width: 240px;
border-right: 1px solid var(--slate-100);
}
.glossary thead .sticky-col {
background: var(--slate-50);
z-index: 4;
}
.row-missing td {
background: rgba(254, 226, 226, 0.45);
}
.th-title {
display: flex;
align-items: baseline;
gap: 6px;
font-size: 12px;
font-weight: 700;
color: var(--slate-700);
}
.th-code {
font-size: 10px;
letter-spacing: 0.2em;
color: #94a3b8;
}
.th-sub {
margin-top: 4px;
font-size: 10px;
color: #94a3b8;
}
.th-sub.completion {
color: var(--emerald-600);
font-weight: 700;
}
.entry-title {
font-weight: 700;
color: var(--slate-900);
}
.empty-cell {
padding: 24px;
color: var(--slate-600);
}
.missing {
color: #94a3b8;
}
@media (max-width: 900px) {
.header-inner,
.header-sub,
.content {
padding-left: 16px;
padding-right: 16px;
}
.header-sub {
flex-direction: column;
align-items: flex-start;
}
.filters-row {
flex-direction: column;
align-items: flex-start;
}
.language-controls {
width: 100%;
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
gap: 8px;
}
.language-control {
width: 100%;
}
.language-control.secondary {
margin-left: 0;
}
.language-control .select {
width: 100%;
}
.table-scroll {
max-height: none;
}
}
@media (max-width: 640px) {
.header-inner {
flex-direction: column;
align-items: flex-start;
}
.header-actions {
width: 100%;
justify-content: space-between;
}
.search-input {
font-size: 14px;
}
.glossary thead th,
.glossary tbody td {
min-width: 140px;
}
.glossary .sticky-col {
min-width: 200px;
}
}