Files
vna_system/vna_system/web_ui/static/css/components.css
2025-09-26 13:00:05 +03:00

1077 lines
22 KiB
CSS

/* Buttons */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
padding: var(--space-2-5) var(--space-4);
border-radius: var(--radius-lg);
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
line-height: 1;
text-decoration: none;
cursor: pointer;
transition: all var(--transition-fast);
border: 1px solid transparent;
white-space: nowrap;
}
.btn--sm {
padding: var(--space-2) var(--space-3);
font-size: var(--font-size-xs);
}
.btn--lg {
padding: var(--space-3) var(--space-6);
font-size: var(--font-size-base);
}
/* Button Variants */
.btn--primary {
background-color: var(--color-primary-600);
color: white;
}
.btn--primary:hover {
background-color: var(--color-primary-700);
}
.btn--bordered {
border: 2px solid currentColor;
box-shadow: var(--shadow-sm);
}
.btn--primary.btn--bordered {
border-color: var(--color-primary-500);
box-shadow: 0 0 0 1px var(--color-primary-600), var(--shadow-sm);
}
.btn--primary.btn--bordered:hover {
box-shadow: 0 0 0 1px var(--color-primary-500), var(--shadow-md);
transform: translateY(-1px);
}
.btn--secondary {
background-color: var(--bg-tertiary);
color: var(--text-primary);
border-color: var(--border-primary);
}
.btn--secondary:hover {
background-color: var(--bg-surface-hover);
}
.btn--ghost {
background-color: transparent;
color: var(--text-secondary);
}
.btn--ghost:hover {
background-color: var(--bg-surface-hover);
color: var(--text-primary);
}
.btn i {
width: 14px;
height: 14px;
}
.btn--sm i {
width: 12px;
height: 12px;
}
.btn--lg i {
width: 16px;
height: 16px;
}
/* Processor Toggles */
.processor-toggles {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
}
.processor-toggle {
display: flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-2) var(--space-3);
background-color: var(--bg-tertiary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
cursor: pointer;
transition: all var(--transition-fast);
}
.processor-toggle:hover {
background-color: var(--bg-surface-hover);
}
.processor-toggle--active {
background-color: var(--color-primary-900);
border-color: var(--color-primary-600);
color: var(--color-primary-300);
}
.processor-toggle__checkbox {
position: relative;
width: 16px;
height: 16px;
border: 2px solid var(--border-secondary);
border-radius: var(--radius-sm);
transition: all var(--transition-fast);
}
.processor-toggle--active .processor-toggle__checkbox {
background-color: var(--color-primary-500);
border-color: var(--color-primary-500);
}
.processor-toggle__checkbox::after {
content: '';
position: absolute;
top: 1px;
left: 4px;
width: 4px;
height: 8px;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
opacity: 0;
transition: opacity var(--transition-fast);
}
.processor-toggle--active .processor-toggle__checkbox::after {
opacity: 1;
}
.processor-toggle__label {
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
color: var(--text-secondary);
transition: color var(--transition-fast);
}
.processor-toggle--active .processor-toggle__label {
color: var(--color-primary-300);
}
.processor-toggle__count {
font-size: var(--font-size-xs);
color: var(--text-tertiary);
background-color: var(--bg-primary);
padding: var(--space-0-5) var(--space-1-5);
border-radius: var(--radius-full);
min-width: 20px;
text-align: center;
}
/* Display Controls */
.display-controls {
display: flex;
gap: var(--space-2);
}
/* Connection Info */
.connection-info {
display: flex;
gap: var(--space-4);
}
.info-item {
display: flex;
flex-direction: column;
gap: var(--space-1);
align-items: center;
}
.info-label {
font-size: var(--font-size-xs);
color: var(--text-tertiary);
text-transform: uppercase;
letter-spacing: 0.05em;
}
.info-value {
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
color: var(--text-primary);
font-family: var(--font-mono);
}
/* Chart Card */
.chart-card {
background-color: var(--bg-surface);
border: 1px solid var(--border-primary);
border-radius: var(--radius-xl);
overflow: visible;
transition: all var(--transition-fast);
}
.chart-card:hover {
border-color: var(--border-secondary);
box-shadow: var(--shadow-md);
}
.chart-card--hidden {
display: none;
}
.chart-card__header {
display: flex;
align-items: center;
justify-content: space-between;
border-radius: var(--radius-xl);
padding: var(--space-4) var(--space-5);
background-color: var(--bg-tertiary);
border-bottom: 1px solid var(--border-primary);
}
.chart-card__title {
display: flex;
align-items: center;
gap: var(--space-2);
font-size: var(--font-size-base);
font-weight: var(--font-weight-semibold);
color: var(--text-primary);
}
.chart-card__icon {
width: 18px;
height: 18px;
color: var(--color-primary-500);
}
.chart-card__actions {
display: flex;
gap: var(--space-1);
}
.chart-card__action {
padding: var(--space-1-5);
border-radius: var(--radius-default);
color: var(--text-tertiary);
transition: all var(--transition-fast);
opacity: 0.6;
}
.chart-card__action:hover {
color: var(--text-primary);
background-color: var(--bg-surface-hover);
opacity: 1;
}
.chart-card:hover .chart-card__action {
opacity: 0.8;
}
.chart-card__action i {
width: 14px;
height: 14px;
}
.chart-card__content {
display: flex;
position: relative;
padding: var(--space-4);
min-height: 450px;
gap: var(--space-4);
}
.chart-card__plot {
flex: 1;
height: 420px !important;
min-height: 400px;
position: relative;
min-width: 0; /* Allows flex item to shrink */
}
.chart-card__settings {
width: 250px;
flex-shrink: 0;
background-color: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
padding: var(--space-3);
overflow-y: auto;
max-height: 420px;
}
.chart-card__plot .js-plotly-plot {
width: 100% !important;
height: 100% !important;
}
.chart-card__plot .plotly .svg-container {
width: 100% !important;
height: 100% !important;
}
/* Fix Plotly toolbar positioning with project design system */
.chart-card__plot .modebar {
position: absolute !important;
top: var(--space-3) !important;
right: var(--space-3) !important;
z-index: 1000 !important;
background: var(--bg-surface) !important;
border: 1px solid var(--border-primary) !important;
border-radius: var(--radius-lg) !important;
padding: var(--space-1) !important;
box-shadow: var(--shadow-md) !important;
backdrop-filter: blur(8px) !important;
display: flex !important;
flex-direction: row !important;
align-items: center !important;
gap: var(--space-1) !important;
}
.chart-card__plot .modebar-group {
display: flex !important;
flex-direction: row !important;
margin: 0 !important;
padding: 0 !important;
}
.chart-card__plot .modebar-group:not(:last-child)::after {
content: '' !important;
width: 1px !important;
height: 16px !important;
background: var(--border-primary) !important;
margin: 0 var(--space-1) !important;
}
.chart-card__plot .modebar-btn {
width: 28px !important;
height: 28px !important;
margin: 0 !important;
padding: var(--space-1-5) !important;
border: none !important;
background: transparent !important;
border-radius: var(--radius-default) !important;
cursor: pointer !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
transition: all var(--transition-fast) !important;
color: var(--text-secondary) !important;
}
.chart-card__plot .modebar-btn:hover {
background: var(--bg-surface-hover) !important;
color: var(--text-primary) !important;
transform: translateY(-1px) !important;
}
.chart-card__plot .modebar-btn svg {
width: 14px !important;
height: 14px !important;
fill: currentColor !important;
transition: fill var(--transition-fast) !important;
}
.chart-card__plot .modebar-btn--active {
background: var(--color-primary-600) !important;
color: white !important;
}
.chart-card__plot .modebar-btn--active:hover {
background: var(--color-primary-700) !important;
transform: translateY(-1px) !important;
}
.chart-card__meta {
display: flex;
justify-content: space-between;
align-items: center;
padding: var(--space-3) var(--space-5);
background-color: var(--bg-primary);
border-radius: var(--radius-xl);
border-top: 1px solid var(--border-primary);
font-size: var(--font-size-xs);
color: var(--text-tertiary);
}
.chart-card__timestamp {
font-family: var(--font-mono);
}
.chart-card__sweep {
font-family: var(--font-mono);
font-weight: var(--font-weight-medium);
}
/* Notifications */
.notifications {
position: fixed;
top: var(--space-4);
right: var(--space-4);
z-index: var(--z-toast);
display: flex;
flex-direction: column;
gap: var(--space-2);
pointer-events: none;
}
.notification {
display: flex;
align-items: flex-start;
gap: var(--space-3);
padding: var(--space-4) var(--space-5);
background-color: var(--bg-surface);
border: 1px solid var(--border-primary);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-lg);
min-width: 320px;
max-width: 480px;
pointer-events: auto;
animation: slideInRight 0.3s ease;
}
.notification--success {
border-left: 4px solid var(--color-success-500);
}
.notification--error {
border-left: 4px solid var(--color-error-500);
}
.notification--warning {
border-left: 4px solid var(--color-warning-500);
}
.notification--info {
border-left: 4px solid var(--color-primary-500);
}
.notification__icon {
width: 20px;
height: 20px;
margin-top: var(--space-0-5);
flex-shrink: 0;
}
.notification--success .notification__icon {
color: var(--color-success-500);
}
.notification--error .notification__icon {
color: var(--color-error-500);
}
.notification--warning .notification__icon {
color: var(--color-warning-500);
}
.notification--info .notification__icon {
color: var(--color-primary-500);
}
.notification__content {
flex: 1;
min-width: 0;
}
.notification__title {
font-size: var(--font-size-sm);
font-weight: var(--font-weight-semibold);
color: var(--text-primary);
margin-bottom: var(--space-1);
}
.notification__message {
font-size: var(--font-size-sm);
color: var(--text-secondary);
line-height: var(--line-height-relaxed);
}
.notification__close {
padding: var(--space-1);
border-radius: var(--radius-default);
color: var(--text-tertiary);
transition: all var(--transition-fast);
margin: calc(-1 * var(--space-1)) calc(-1 * var(--space-2)) calc(-1 * var(--space-1)) 0;
}
.notification__close:hover {
color: var(--text-primary);
background-color: var(--bg-surface-hover);
}
.notification__close i {
width: 16px;
height: 16px;
}
@keyframes slideInRight {
from {
opacity: 0;
transform: translateX(100px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* Form Elements (for future use) */
.form-group {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.form-label {
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
color: var(--text-primary);
}
.form-input {
padding: var(--space-2-5) var(--space-3);
background-color: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
font-size: var(--font-size-sm);
color: var(--text-primary);
transition: all var(--transition-fast);
}
.form-input:focus {
outline: none;
border-color: var(--color-primary-500);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.form-input::placeholder {
color: var(--text-tertiary);
}
/* Processor Settings */
.processor-settings {
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.processor-settings--empty {
padding: var(--space-4);
text-align: center;
color: var(--text-tertiary);
font-size: var(--font-size-sm);
}
.processor-config {
background-color: var(--bg-secondary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-lg);
padding: var(--space-3);
}
.processor-config__header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: var(--space-3);
cursor: pointer;
user-select: none;
}
.processor-config__title {
display: flex;
align-items: center;
gap: var(--space-2);
font-weight: var(--font-weight-medium);
color: var(--text-primary);
font-size: var(--font-size-sm);
}
.processor-config__icon {
width: 16px;
height: 16px;
color: var(--color-primary-500);
}
.processor-config__toggle {
width: 16px;
height: 16px;
color: var(--text-tertiary);
transition: all var(--transition-fast);
transform: rotate(0deg);
}
.processor-config--expanded .processor-config__toggle {
transform: rotate(180deg);
}
.processor-config__content {
display: none;
grid-template-columns: 1fr;
gap: var(--space-3);
}
.processor-config--expanded .processor-config__content {
display: grid;
}
.processor-param {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.processor-param__label {
font-size: var(--font-size-xs);
font-weight: var(--font-weight-medium);
color: var(--text-secondary);
}
.processor-param__slider {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 6px;
background-color: var(--bg-primary);
border-radius: var(--radius-full);
outline: none;
cursor: pointer;
}
.processor-param__slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 18px;
height: 18px;
background-color: var(--color-primary-500);
border-radius: var(--radius-full);
cursor: pointer;
border: 2px solid var(--bg-primary);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.processor-param__slider::-moz-range-thumb {
width: 18px;
height: 18px;
background-color: var(--color-primary-500);
border-radius: var(--radius-full);
cursor: pointer;
border: 2px solid var(--bg-primary);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.processor-param__toggle {
position: relative;
display: inline-block;
width: 44px;
height: 24px;
}
.processor-param__toggle input {
opacity: 0;
width: 0;
height: 0;
}
.processor-param__toggle-slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: var(--bg-primary);
border: 1px solid var(--border-primary);
transition: var(--transition-fast);
border-radius: var(--radius-full);
}
.processor-param__toggle-slider:before {
position: absolute;
content: "";
height: 16px;
width: 16px;
left: 3px;
bottom: 3px;
background-color: var(--text-tertiary);
transition: var(--transition-fast);
border-radius: var(--radius-full);
}
input:checked + .processor-param__toggle-slider {
background-color: var(--color-primary-500);
border-color: var(--color-primary-500);
}
input:checked + .processor-param__toggle-slider:before {
transform: translateX(20px);
background-color: white;
}
.processor-param__select {
padding: var(--space-2) var(--space-3);
background-color: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-default);
font-size: var(--font-size-sm);
color: var(--text-primary);
cursor: pointer;
transition: all var(--transition-fast);
}
.processor-param__select:focus {
outline: none;
border-color: var(--color-primary-500);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.processor-param__value {
font-size: var(--font-size-xs);
color: var(--text-tertiary);
text-align: right;
}
/* Chart Settings Styles */
.chart-settings {
height: 100%;
display: flex;
flex-direction: column;
}
.chart-settings__header {
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
color: var(--text-primary);
margin-bottom: var(--space-3);
padding-bottom: var(--space-2);
border-bottom: 1px solid var(--border-primary);
}
.chart-settings__controls {
display: flex;
flex-direction: column;
gap: var(--space-3);
flex: 1;
}
.settings-empty {
color: var(--text-tertiary);
font-size: var(--font-size-sm);
text-align: center;
padding: var(--space-4);
}
.chart-setting {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.chart-setting__label {
font-size: var(--font-size-xs);
font-weight: var(--font-weight-medium);
color: var(--text-secondary);
display: flex;
justify-content: space-between;
align-items: center;
}
.chart-setting__value {
font-size: var(--font-size-xs);
color: var(--text-tertiary);
font-weight: var(--font-weight-normal);
}
.chart-setting__slider {
-webkit-appearance: none;
appearance: none;
width: 100%;
height: 6px;
background-color: var(--bg-primary);
border-radius: var(--radius-full);
outline: none;
cursor: pointer;
}
.chart-setting__slider::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 16px;
height: 16px;
background-color: var(--color-primary-500);
border-radius: var(--radius-full);
cursor: pointer;
border: 2px solid var(--bg-secondary);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
}
.chart-setting__toggle {
display: flex;
align-items: center;
gap: var(--space-2);
cursor: pointer;
}
.chart-setting__toggle input {
position: relative;
width: 36px;
height: 20px;
-webkit-appearance: none;
appearance: none;
background-color: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-full);
cursor: pointer;
transition: all var(--transition-fast);
}
.chart-setting__toggle input:before {
content: '';
position: absolute;
width: 16px;
height: 16px;
border-radius: var(--radius-full);
background-color: var(--text-tertiary);
transition: all var(--transition-fast);
top: 1px;
left: 1px;
}
.chart-setting__toggle input:checked {
background-color: var(--color-primary-500);
border-color: var(--color-primary-500);
}
.chart-setting__toggle input:checked:before {
transform: translateX(16px);
background-color: white;
}
.chart-setting__select,
.chart-setting__input {
padding: var(--space-2);
background-color: var(--bg-primary);
border: 1px solid var(--border-primary);
border-radius: var(--radius-default);
font-size: var(--font-size-sm);
color: var(--text-primary);
cursor: pointer;
transition: all var(--transition-fast);
}
.chart-setting__select:focus,
.chart-setting__input:focus {
outline: none;
border-color: var(--color-primary-500);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.chart-setting__button {
padding: var(--space-2) var(--space-3);
font-size: var(--text-sm);
font-weight: 500;
color: var(--color-text-light);
background: var(--color-primary-600);
border: 1px solid var(--color-primary-600);
border-radius: var(--radius-md);
cursor: pointer;
transition: all var(--transition-fast);
width: 100%;
max-width: 200px;
}
.chart-setting__button:hover {
background: var(--color-primary-700);
border-color: var(--color-primary-700);
}
.chart-setting__button:active {
background: var(--color-primary-800);
border-color: var(--color-primary-800);
}
.chart-setting__button:disabled {
background: var(--color-bg-muted);
border-color: var(--color-border-muted);
color: var(--color-text-muted);
cursor: not-allowed;
}
/* Mobile Responsive Styles for Chart Settings */
@media (max-width: 1024px) {
.chart-card__content {
flex-direction: column;
gap: var(--space-3);
}
.chart-card__settings {
width: 100%;
max-height: 200px;
order: 1;
}
.chart-card__plot {
order: 2;
height: 350px !important;
min-height: 300px;
}
}
@media (max-width: 768px) {
.chart-card__content {
padding: var(--space-3);
}
.chart-card__plot {
height: 300px !important;
min-height: 250px;
}
.chart-card__settings {
max-height: 150px;
}
}
/* Modal */
.modal {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1000;
display: none;
align-items: center;
justify-content: center;
padding: var(--space-4);
}
.modal--active {
display: flex;
}
.modal__backdrop {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.75);
backdrop-filter: blur(4px);
cursor: pointer;
}
.modal__content {
position: relative;
background-color: var(--color-surface);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-2xl);
border: 1px solid var(--color-border);
max-width: 90vw;
max-height: 90vh;
width: 600px;
display: flex;
flex-direction: column;
overflow: hidden;
}
.modal__content--large {
width: 1200px;
max-width: 95vw;
height: 80vh;
}
.modal__header {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-6);
border-bottom: 1px solid var(--color-border);
background-color: var(--color-surface-accent);
}
.modal__actions {
display: flex;
align-items: center;
gap: var(--space-2);
}
.modal__title {
display: flex;
align-items: center;
gap: var(--space-2);
margin: 0;
font-size: var(--font-size-lg);
font-weight: var(--font-weight-semibold);
color: var(--color-text);
}
.modal__close {
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border-radius: var(--radius-md);
background: none;
border: none;
color: var(--color-text-secondary);
cursor: pointer;
transition: all var(--transition-fast);
}
.modal__close:hover {
background-color: var(--color-surface-hover);
color: var(--color-text);
}
.modal__body {
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Plots Container */
.plots-container {
flex: 1;
display: flex;
flex-direction: column;
height: 100%;
}
.plots-content {
flex: 1;
overflow: auto;
padding: var(--space-4);
}
.plots-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(500px, 1fr));
gap: var(--space-4);
min-height: 100%;
}
/* Calibration Actions */
.calibration-actions {
display: flex;
gap: var(--space-2);
margin-top: var(--space-3);
}
/* Plot Error Styles */
.plot-error {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
min-height: 200px;
color: var(--color-text-secondary);
font-style: italic;
text-align: center;
padding: var(--space-4);
background-color: var(--color-surface-accent);
border-radius: var(--radius-lg);
border: 1px dashed var(--color-border);
}