Initial commit: site monorepo with API, web, and infra.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,644 @@
|
||||
/**
|
||||
* Общая оболочка зоотех-страниц: тёмная палитра как у страницы входа,
|
||||
* футер, модалка настроек, базовые тёмные стили Bootstrap.
|
||||
* Подключать после bootstrap.min.css.
|
||||
* Токены и навбар — wesp-zootech-layout.css (подключать после этого файла).
|
||||
*/
|
||||
|
||||
/* Светлая тема: единый фон страницы */
|
||||
body {
|
||||
background-color: var(--bg-page, #f5f7fa);
|
||||
}
|
||||
|
||||
/* Клик по логотипу в шапке → страница рецептов */
|
||||
.nav-brand .nav-logo-link,
|
||||
.mobile-brand .nav-logo-link {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
line-height: 0;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] {
|
||||
--wesp-accent: var(--primary-color, #2196f3);
|
||||
--dm-bg: var(--bg-page, #12181b);
|
||||
--dm-surface: var(--surface, #2c3338);
|
||||
--dm-field: var(--field, #3e444a);
|
||||
--dm-field-disabled: #353a40;
|
||||
--dm-field-hover: #4a525a;
|
||||
--dm-text: var(--text, #f5f5f5);
|
||||
--dm-muted: var(--muted, #a8b0b8);
|
||||
--dm-border: var(--border-light, rgba(255, 255, 255, 0.12));
|
||||
--dm-border-hover: rgba(255, 255, 255, 0.25);
|
||||
--locked-field-bg: var(--dm-field-disabled);
|
||||
--locked-field-border: rgba(255, 255, 255, 0.22);
|
||||
--locked-field-text: var(--dm-text);
|
||||
--locked-field-stripe: rgba(255, 255, 255, 0.07);
|
||||
}
|
||||
|
||||
@keyframes slideDown {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
html[data-theme="dark"] body {
|
||||
background-color: var(--dm-bg) !important;
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .app-footer {
|
||||
color: var(--dm-muted) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .app-footer .text-muted {
|
||||
color: var(--dm-muted) !important;
|
||||
}
|
||||
|
||||
/* Bootstrap-модалки и формы в тёмной теме (не shell/settings — у них свои поверхности) */
|
||||
html[data-theme="dark"] body {
|
||||
background-color: var(--dm-bg) !important;
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .modal:not(.wesp-shell-modal) .modal-content,
|
||||
html[data-theme="dark"] .modal:not(.wesp-shell-modal) .modal-body {
|
||||
background-color: var(--dm-bg) !important;
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .modal:not(.wesp-shell-modal) .modal-content {
|
||||
border-color: var(--dm-border) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .modal-header,
|
||||
html[data-theme="dark"] .modal-footer {
|
||||
border-color: var(--dm-border) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .modal-footer {
|
||||
background-color: var(--dm-surface) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .form-control,
|
||||
html[data-theme="dark"] input:not([readonly]),
|
||||
html[data-theme="dark"] select,
|
||||
html[data-theme="dark"] textarea {
|
||||
background-color: var(--dm-field) !important;
|
||||
color: var(--dm-text) !important;
|
||||
border-color: var(--dm-border) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .form-control[readonly] {
|
||||
background-color: var(--dm-field-disabled) !important;
|
||||
color: var(--dm-muted) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .text-muted,
|
||||
html[data-theme="dark"] .modal-body label {
|
||||
color: var(--dm-muted) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] ::placeholder {
|
||||
color: rgba(245, 245, 245, 0.65) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .btn {
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .btn-secondary {
|
||||
background-color: var(--dm-field) !important;
|
||||
border-color: var(--dm-border) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .btn-secondary:hover {
|
||||
background-color: var(--dm-field-hover) !important;
|
||||
border-color: var(--dm-border-hover) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .modal-footer .btn-secondary {
|
||||
background-color: var(--dm-field) !important;
|
||||
border-color: var(--dm-border) !important;
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .modal-footer .btn-secondary:hover {
|
||||
background-color: var(--dm-field-hover) !important;
|
||||
border-color: var(--dm-border-hover) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .btn-primary,
|
||||
html[data-theme="dark"] .modal-footer .btn-primary {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
var(--primary-color, #2196f3),
|
||||
var(--primary-dark, #1976d2)
|
||||
) !important;
|
||||
border: none !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .btn-primary:hover,
|
||||
html[data-theme="dark"] .modal-footer .btn-primary:hover {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
var(--primary-dark, #1976d2),
|
||||
var(--primary-darker, #1565c0)
|
||||
) !important;
|
||||
}
|
||||
|
||||
/* Модалка настроек */
|
||||
.settings-modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
z-index: 3000;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.5);
|
||||
backdrop-filter: blur(5px);
|
||||
}
|
||||
|
||||
.settings-modal-content {
|
||||
background-color: #fff;
|
||||
margin: 3vh auto;
|
||||
padding: 0;
|
||||
border-radius: 12px;
|
||||
width: 90%;
|
||||
max-width: 520px;
|
||||
max-height: min(92vh, 720px);
|
||||
box-shadow: 0 8px 18px rgba(17, 24, 39, 0.16), 0 0 0 1px rgba(17, 24, 39, 0.06);
|
||||
overflow: hidden;
|
||||
font-family: var(--zootech-font);
|
||||
font-size: var(--zt-font-body, 0.9375rem);
|
||||
line-height: 1.55;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.settings-modal-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 1rem 1.25rem;
|
||||
border-bottom: 1px solid var(--border-light, #e2e8f0);
|
||||
background: var(--surface, #ffffff);
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.settings-modal-header h3 {
|
||||
margin: 0;
|
||||
font-size: 1.1rem;
|
||||
font-weight: 700;
|
||||
color: var(--text, #1e293b);
|
||||
}
|
||||
|
||||
.settings-modal-header h3 i {
|
||||
margin-right: 0.5rem;
|
||||
color: var(--primary-color, #2196f3);
|
||||
}
|
||||
|
||||
.settings-close {
|
||||
cursor: pointer;
|
||||
font-size: 1.8rem;
|
||||
line-height: 1;
|
||||
opacity: 0.7;
|
||||
user-select: none;
|
||||
color: var(--text, #1e293b);
|
||||
}
|
||||
|
||||
.settings-close:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.settings-modal-body {
|
||||
padding: 1rem 1.25rem;
|
||||
flex: 1 1 auto;
|
||||
min-height: 0;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
.settings-field-hint {
|
||||
margin: 0 0 0.75rem;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.settings-modal-body .form-group {
|
||||
margin-bottom: 0.75rem;
|
||||
}
|
||||
|
||||
.settings-user-card {
|
||||
background: var(--surface-muted, #f8fafc);
|
||||
border-radius: 12px;
|
||||
padding: 1rem 1.25rem;
|
||||
margin-bottom: 0.75rem;
|
||||
border: 1px solid var(--border-light, #e2e8f0);
|
||||
}
|
||||
|
||||
.settings-user-card--clickable {
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.settings-user-card--clickable:hover {
|
||||
background: rgba(var(--primary-rgb, 33, 150, 243), 0.05);
|
||||
border-color: var(--primary-color, #2196f3);
|
||||
}
|
||||
|
||||
.settings-user-card--clickable .settings-card-title {
|
||||
margin: 0;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.settings-chevron {
|
||||
transition: transform 0.3s ease;
|
||||
font-size: 0.8rem;
|
||||
color: var(--muted, #64748b);
|
||||
}
|
||||
|
||||
.settings-user-card--clickable.open .settings-chevron {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.settings-credentials-form {
|
||||
background: var(--surface-muted, #f8fafc);
|
||||
border-radius: 12px;
|
||||
padding: 1rem 1.25rem;
|
||||
margin-bottom: 1.25rem;
|
||||
border: 1px solid var(--border-light, #e2e8f0);
|
||||
animation: wespSlideDown 0.3s ease;
|
||||
}
|
||||
|
||||
@keyframes wespSlideDown {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
.settings-card-title {
|
||||
font-size: 0.95rem;
|
||||
font-weight: 600;
|
||||
margin: 0 0 1rem 0;
|
||||
color: var(--text, #1e293b);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.settings-card-title i {
|
||||
color: var(--primary-color, #2196f3);
|
||||
}
|
||||
|
||||
.settings-theme-card {
|
||||
background: var(--surface-muted, #f8fafc);
|
||||
border-radius: 12px;
|
||||
padding: 1rem 1.25rem;
|
||||
border: 1px solid var(--border-light, #e2e8f0);
|
||||
min-width: 380px;
|
||||
}
|
||||
|
||||
.settings-theme-card .settings-card-title {
|
||||
margin: 0 0 0.75rem 0;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.settings-theme-card .settings-card-title > i:first-child {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.theme-toggle-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.theme-label {
|
||||
font-size: 0.9rem;
|
||||
color: var(--muted, #64748b);
|
||||
}
|
||||
|
||||
.theme-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 48px;
|
||||
height: 26px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.theme-switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.theme-slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: #e2e8f0;
|
||||
border-radius: 26px;
|
||||
transition: 0.3s;
|
||||
}
|
||||
|
||||
.theme-slider::before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
left: 3px;
|
||||
bottom: 3px;
|
||||
background: white;
|
||||
border-radius: 50%;
|
||||
transition: 0.3s;
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.theme-switch input:checked + .theme-slider {
|
||||
background: var(--primary-color, #2196f3);
|
||||
}
|
||||
|
||||
.theme-switch input:checked + .theme-slider::before {
|
||||
transform: translateX(22px);
|
||||
}
|
||||
|
||||
.settings-contrast-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 1rem;
|
||||
margin-top: 1rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid var(--border-light, #e2e8f0);
|
||||
}
|
||||
|
||||
.settings-contrast-row__label {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 500;
|
||||
color: var(--text, #1e293b);
|
||||
}
|
||||
|
||||
.settings-modal-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 0.75rem;
|
||||
padding: 1rem 1.25rem;
|
||||
border-top: 1px solid var(--border-light, #e2e8f0);
|
||||
flex-shrink: 0;
|
||||
background: var(--surface, #ffffff);
|
||||
}
|
||||
|
||||
.settings-sync-card {
|
||||
background: var(--surface-muted, #f8fafc);
|
||||
border-radius: 12px;
|
||||
padding: 1rem 1.25rem;
|
||||
margin-bottom: 0.75rem;
|
||||
border: 1px solid var(--border-light, #e2e8f0);
|
||||
}
|
||||
|
||||
.settings-sync-card.settings-sync-card--clickable {
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
}
|
||||
|
||||
.settings-sync-card.settings-sync-card--clickable:hover {
|
||||
background: rgba(var(--primary-rgb, 33, 150, 243), 0.05);
|
||||
border-color: var(--primary-color, #2196f3);
|
||||
}
|
||||
|
||||
.settings-sync-card.settings-sync-card--clickable.open .settings-chevron {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
||||
.settings-sync-card .settings-card-title {
|
||||
margin: 0;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.settings-sync-card .settings-card-title > i:first-child {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.settings-sync-card .settings-card-title .settings-chevron {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.settings-sync-form {
|
||||
background: var(--surface-muted, #f8fafc);
|
||||
border-radius: 12px;
|
||||
padding: 1rem 1.25rem;
|
||||
margin-bottom: 1.25rem;
|
||||
border: 1px solid var(--border-light, #e2e8f0);
|
||||
animation: wespSlideDown 0.3s ease;
|
||||
}
|
||||
|
||||
.settings-sync-client-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5rem;
|
||||
padding: 0.6rem 0;
|
||||
border-bottom: 1px solid var(--border-light, #e2e8f0);
|
||||
}
|
||||
|
||||
.settings-sync-client-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.settings-sync-client-name {
|
||||
font-weight: 500;
|
||||
color: var(--text, #1e293b);
|
||||
}
|
||||
|
||||
.settings-sync-client-actions {
|
||||
display: flex;
|
||||
gap: 0.4rem;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.settings-sync-client-actions .btn-sm {
|
||||
padding: 0.25rem 0.5rem;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.settings-sync-edit-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.settings-sync-edit-row select {
|
||||
min-width: 140px;
|
||||
}
|
||||
|
||||
/* Тёмная тема: модалка настроек и карточки */
|
||||
html[data-theme="dark"] .settings-user-card--clickable:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
border-color: var(--dm-border-hover);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-credentials-form {
|
||||
background: rgba(255, 255, 255, 0.06);
|
||||
border-color: var(--dm-border);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-content {
|
||||
background-color: var(--dm-surface) !important;
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-header {
|
||||
background: var(--dm-field) !important;
|
||||
border-color: var(--dm-border) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-header h3 {
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-header h3 i {
|
||||
color: var(--primary-color, #2196f3) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-card-title i {
|
||||
color: var(--primary-color, #2196f3);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-close {
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-sync-client-name {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-sync-card,
|
||||
html[data-theme="dark"] .settings-sync-form {
|
||||
background: rgba(255, 255, 255, 0.06);
|
||||
border-color: var(--dm-border);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-sync-card--clickable:hover {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
border-color: rgba(255, 255, 255, 0.25);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-user-card,
|
||||
html[data-theme="dark"] .settings-theme-card {
|
||||
background: rgba(255, 255, 255, 0.06);
|
||||
border-color: var(--dm-border);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-card-title {
|
||||
color: var(--dm-text);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-body label,
|
||||
html[data-theme="dark"] .settings-modal-body .form-label,
|
||||
html[data-theme="dark"] .settings-credentials-form label,
|
||||
html[data-theme="dark"] .settings-sync-form label {
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-body .text-muted,
|
||||
html[data-theme="dark"] .settings-chevron {
|
||||
color: var(--dm-muted) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .theme-label {
|
||||
color: var(--dm-muted);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .theme-switch input:checked + .theme-slider {
|
||||
background: var(--primary-color, #2196f3) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-footer {
|
||||
border-color: var(--dm-border);
|
||||
background: var(--dm-field);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-footer .btn-secondary {
|
||||
background-color: var(--dm-field) !important;
|
||||
border-color: var(--dm-border) !important;
|
||||
color: var(--dm-text) !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-footer .btn-primary {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
var(--primary-color, #2196f3),
|
||||
var(--primary-dark, #1976d2)
|
||||
) !important;
|
||||
border: none !important;
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .settings-modal-footer .btn-primary:hover {
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
var(--primary-dark, #1976d2),
|
||||
var(--primary-darker, #1565c0)
|
||||
) !important;
|
||||
filter: brightness(1.05);
|
||||
}
|
||||
|
||||
/* Верхняя панель и мобильное меню: в тёмной теме без яркого синего (как фон/карточки) */
|
||||
html[data-theme="dark"] .mobile-navbar {
|
||||
background: linear-gradient(180deg, #2c3338 0%, #1e2529 100%) !important;
|
||||
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.45) !important;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
|
||||
}
|
||||
|
||||
html[data-theme="dark"] .mobile-menu {
|
||||
background: linear-gradient(180deg, #2c3338 0%, #252b30 100%) !important;
|
||||
box-shadow: -4px 0 28px rgba(0, 0, 0, 0.55) !important;
|
||||
}
|
||||
|
||||
#wesp-recipes-boot {
|
||||
position: fixed;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
top: 0;
|
||||
z-index: 900;
|
||||
background: #f5f7fa;
|
||||
pointer-events: none;
|
||||
opacity: 1;
|
||||
transition: opacity 0.28s ease;
|
||||
}
|
||||
|
||||
html[data-theme="dark"] #wesp-recipes-boot {
|
||||
background: #12181b;
|
||||
}
|
||||
|
||||
#wesp-recipes-boot.wesp-recipes-boot--hide {
|
||||
opacity: 0;
|
||||
}
|
||||
Reference in New Issue
Block a user