.form { display: flex; flex-direction: column; gap: 1.5rem; } .form-group { display: flex; flex-direction: column; gap: 0.5rem; } .form-group label { font-weight: 500; color: var(--text-color); font-size: 0.875rem; } .form-group input, .form-group select, .form-group textarea { padding: 0.5rem; border: 1px solid var(--border-color); border-radius: 4px; font-size: 1rem; background-color: var(--bg-color); color: var(--text-color); width: 100%; } .form-group input:focus, .form-group select:focus, .form-group textarea:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 2px var(--primary-color-light); } .form-group input:disabled, .form-group select:disabled, .form-group textarea:disabled { background-color: var(--disabled-bg); cursor: not-allowed; } .form-group textarea { min-height: 100px; resize: vertical; } .form-group select { appearance: none; background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E"); background-position: right 0.5rem center; background-repeat: no-repeat; background-size: 1.5em 1.5em; padding-right: 2.5rem; } .form-group-horizontal { flex-direction: row; align-items: center; gap: 1rem; } .form-group-horizontal label { flex: 0 0 200px; } .form-actions { display: flex; justify-content: flex-end; gap: 1rem; margin-top: 1rem; } .form-error { color: var(--error-color); font-size: 0.875rem; margin-top: 0.25rem; } .form-help { color: var(--text-color-light); font-size: 0.875rem; margin-top: 0.25rem; } .form-section { border-bottom: 1px solid var(--border-color); padding-bottom: 1.5rem; } .form-section:last-child { border-bottom: none; padding-bottom: 0; } .form-section-title { font-size: 1.125rem; font-weight: 600; color: var(--text-color); margin-bottom: 1rem; } .form-section-description { color: var(--text-color-light); font-size: 0.875rem; margin-bottom: 1rem; } .checkbox-group { display: flex; align-items: center; gap: 0.5rem; } .checkbox-group input[type="checkbox"] { width: auto; } .radio-group { display: flex; flex-direction: column; gap: 0.5rem; } .radio-option { display: flex; align-items: center; gap: 0.5rem; } .radio-option input[type="radio"] { width: auto; } .input-group { display: flex; gap: 0.5rem; } .input-group input { flex: 1; } .input-group button { flex: 0 0 auto; } /* Placeholder для contenteditable div */ .input[contenteditable="true"]:empty::before { content: attr(data-placeholder); color: #6c757d; font-style: italic; pointer-events: none; } .input[contenteditable="true"]:focus:empty::before { content: ""; } /* Стили для улучшенной формы редактирования пользователя */ .section { margin-bottom: 25px; } .field { margin-bottom: 20px; } .label { display: block; font-weight: 600; color: #333; margin-bottom: 8px; font-size: 14px; } .input { width: 100%; padding: 12px 16px; border: 2px solid #e1e5e9; border-radius: 8px; font-size: 14px; background-color: #fff; color: #333; transition: all 0.2s ease; } .input:focus { outline: none; border-color: #007bff; box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1); } .input:disabled { background-color: #f8f9fa; border-color: #e9ecef; color: #6c757d; cursor: not-allowed; } .inputError { border-color: #dc3545; box-shadow: 0 0 0 3px rgba(220, 53, 69, 0.1); } .fieldError { color: #dc3545; font-size: 12px; margin-top: 6px; font-weight: 500; } .fieldHint { color: #6c757d; font-size: 12px; margin-top: 6px; line-height: 1.4; } .error { background-color: #f8d7da; color: #721c24; padding: 12px 16px; border-radius: 8px; border: 1px solid #f5c6cb; font-size: 14px; } /* Стили для грида ролей */ .rolesGrid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 12px; } .roleCard { border: 2px solid #e1e5e9; border-radius: 8px; padding: 16px; cursor: pointer; transition: all 0.2s ease; background-color: #fff; display: block; } .roleCard:hover { border-color: #007bff; background-color: #f8f9ff; } .roleCardSelected { border-color: #007bff; background-color: #e7f1ff; } .roleHeader { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .roleName { font-weight: 600; color: #333; font-size: 14px; } .roleCheckmark { width: 20px; height: 20px; border-radius: 50%; background-color: #007bff; color: white; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: bold; opacity: 0; transition: opacity 0.2s ease; } .roleCardSelected .roleCheckmark { opacity: 1; } .roleDescription { color: #6c757d; font-size: 12px; line-height: 1.4; } /* Широкое модальное окно для переменных среды */ .modal-wide { width: 100%; max-width: 800px; } /* Улучшенные стили для форм */ .form-label { display: block; margin-bottom: 8px; font-weight: 600; color: #374151; } .form-label-info { font-size: 0.875rem; font-weight: 400; color: #6b7280; margin-left: 8px; } .form-input { width: 100%; padding: 12px; border: 2px solid #e5e7eb; border-radius: 8px; font-size: 14px; transition: border-color 0.2s ease; } .form-input:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .form-input-disabled { width: 100%; padding: 12px; border: 2px solid #e5e7eb; border-radius: 8px; font-size: 14px; background-color: #f9fafb; color: #6b7280; cursor: not-allowed; } /* Контейнер для textarea с кнопками */ .textarea-container { position: relative; } .form-textarea { width: 100%; padding: 12px; border: 2px solid #e5e7eb; border-radius: 8px; font-size: 14px; font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace; line-height: 1.5; resize: vertical; min-height: 120px; transition: border-color 0.2s ease; } .form-textarea:focus { outline: none; border-color: #3b82f6; box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); } .textarea-actions { display: flex; gap: 8px; margin-top: 8px; justify-content: flex-end; } /* Контейнер для превью кода */ .code-preview-container { border: 2px solid #e5e7eb; border-radius: 8px; overflow: hidden; background: #1e1e1e; max-height: 400px; } .code-preview-container pre { margin: 0; padding: 16px; background: transparent; overflow-x: auto; } /* Улучшенная справка */ .form-help { margin-top: 8px; padding: 12px; background-color: #f0f9ff; border: 1px solid #bae6fd; border-radius: 6px; font-size: 14px; color: #0c4a6e; } .form-help strong { color: #075985; } /* Ошибки */ .form-error { margin-top: 8px; padding: 12px; background-color: #fef2f2; border: 1px solid #fecaca; border-radius: 6px; font-size: 14px; color: #dc2626; } /* Действия формы */ .form-actions { display: flex; gap: 12px; margin-top: 24px; justify-content: flex-end; padding-top: 16px; border-top: 1px solid #e5e7eb; } /* Адаптивность для модального окна */ @media (max-width: 768px) { .modal-wide { max-width: 95vw; margin: 0 auto; } .textarea-actions { flex-direction: column; } .form-actions { flex-direction: column-reverse; } } /* Стили для модального окна слияния топиков */ .checkboxList { max-height: 300px; overflow-y: auto; border: 1px solid #e9ecef; border-radius: 6px; padding: 8px; background: #fafafa; } .checkboxItem { display: flex; align-items: flex-start; gap: 12px; padding: 10px; margin-bottom: 8px; border-radius: 4px; cursor: pointer; transition: background-color 0.2s ease; } .checkboxItem:hover { background-color: #f0f0f0; } .checkboxItem:last-child { margin-bottom: 0; } .checkboxContent { flex: 1; } .topicTitle { font-weight: 600; color: #333; margin-bottom: 4px; } .topicInfo { font-size: 13px; color: #666; line-height: 1.4; } .optionTitle { font-weight: 500; color: #333; margin-bottom: 2px; } .optionDescription { font-size: 13px; color: #666; line-height: 1.4; } .summary { background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; padding: 16px; margin: 16px 0; } .summary h4 { margin: 0 0 12px 0; color: #333; font-size: 14px; font-weight: 600; } .summary ul { margin: 0; padding-left: 20px; } .summary li { margin-bottom: 8px; font-size: 13px; line-height: 1.4; } .summary ul ul { margin-top: 4px; } .summary ul ul li { margin-bottom: 4px; color: #666; } .section { margin-bottom: 24px; } .sectionTitle { font-size: 16px; font-weight: 600; color: #333; margin: 0 0 8px 0; } .description { font-size: 14px; color: #666; margin: 0 0 12px 0; line-height: 1.4; } /* Стили для управления иерархией топиков */ .hierarchyContainer { max-width: 800px; margin: 0 auto; padding: 20px; } .instructions { background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; padding: 16px; margin-bottom: 20px; } .instructions h4 { margin: 0 0 12px 0; color: #495057; font-size: 14px; font-weight: 600; } .instructions ul { margin: 0; padding-left: 20px; } .instructions li { margin-bottom: 4px; font-size: 13px; color: #6c757d; } .hierarchyTree { border: 1px solid #e9ecef; border-radius: 6px; background: white; max-height: 400px; overflow-y: auto; padding: 8px; } .treeNode { margin-bottom: 2px; } .treeItem { padding: 8px 12px; border-radius: 4px; cursor: grab; transition: all 0.2s ease; user-select: none; } .treeItem:hover { background-color: #f8f9fa; } .treeItem:active { cursor: grabbing; } .dropTarget { background-color: #e3f2fd !important; border: 2px dashed #2196f3 !important; } .dragHandle { color: #999; font-weight: bold; cursor: grab; padding: 0 4px; } .dragHandle:hover { color: #666; } .topicTitle { font-weight: 500; color: #333; flex: 1; } .topicId { font-size: 12px; color: #999; background: #f8f9fa; padding: 2px 6px; border-radius: 3px; } .treeChildren { margin-left: 0; } .changesSummary { background: #fff3cd; border: 1px solid #ffeaa7; border-radius: 6px; padding: 16px; margin: 20px 0; } .changesSummary h4 { margin: 0 0 12px 0; color: #856404; font-size: 14px; } .changeItem { padding: 6px 0; border-bottom: 1px solid #ffeaa7; font-size: 13px; color: #856404; } .changeItem:last-child { border-bottom: none; } .dropZone { margin: 20px 0; } .rootDropZone { border: 2px dashed #6c757d; border-radius: 8px; padding: 20px; text-align: center; color: #6c757d; background: #f8f9fa; transition: all 0.2s ease; cursor: pointer; } .rootDropZone:hover { border-color: #007bff; color: #007bff; background: #e3f2fd; } /* Дополнительные стили для режима большой модалки */ .modal.large { max-width: 900px; width: 90vw; } .modal.large .modalContent { min-height: 600px; } /* Адаптивность для мобильных */ @media (max-width: 768px) { .hierarchyContainer { padding: 12px; } .treeItem { padding: 6px 8px; font-size: 14px; } .dragHandle { display: none; } .topicTitle { font-size: 14px; } .rootDropZone { padding: 16px; font-size: 14px; } } /* Стили для выбора родительской темы */ .parentSelectorContainer { max-width: 600px; margin: 0 auto; padding: 20px; } .searchSection { margin-bottom: 20px; } .searchInput { width: 100%; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; } .currentSelection { background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; padding: 16px; margin-bottom: 20px; } .currentParent { margin-top: 8px; } .noParent { color: #6c757d; font-style: italic; } .parentPath { font-weight: 500; color: #495057; } .parentOptions { margin-bottom: 20px; } .parentsList { max-height: 300px; overflow-y: auto; border: 1px solid #e9ecef; border-radius: 6px; background: white; } .parentOption { display: flex; align-items: flex-start; padding: 12px; border-bottom: 1px solid #f1f3f4; transition: background-color 0.2s ease; } .parentOption:last-child { border-bottom: none; } .parentOption:hover { background-color: #f8f9fa; } .parentOption input[type="radio"] { margin-right: 12px; margin-top: 4px; } .parentOptionLabel { flex: 1; cursor: pointer; display: block; } .parentDescription { margin-top: 4px; font-size: 12px; color: #6c757d; display: flex; gap: 12px; align-items: center; } .topicId { background: #e9ecef; padding: 2px 6px; border-radius: 3px; font-weight: 500; } .topicSlug { font-family: monospace; background: #f8f9fa; padding: 2px 6px; border-radius: 3px; } .noResults { padding: 20px; text-align: center; color: #6c757d; font-style: italic; } /* Мобильная адаптивность */ @media (max-width: 768px) { .parentSelectorContainer { padding: 12px; } .parentOption { padding: 8px; } .parentDescription { flex-direction: column; align-items: flex-start; gap: 4px; } } /* Стили для массового редактирования родителей */ .bulkParentContainer { max-width: 800px; margin: 0 auto; padding: 20px; } .errorMessage { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; border-radius: 6px; padding: 12px; margin-bottom: 20px; font-size: 14px; } .selectedTopicsPreview { background: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; padding: 16px; margin-bottom: 20px; } .selectedTopicsPreview h4 { margin: 0 0 12px 0; color: #495057; font-size: 14px; } .topicsList { max-height: 150px; overflow-y: auto; } .topicPreviewItem { padding: 8px 12px; border: 1px solid #e9ecef; border-radius: 4px; margin-bottom: 8px; background: white; display: flex; align-items: center; gap: 12px; } .topicPreviewItem:last-child { margin-bottom: 0; } .currentPath { font-size: 12px; color: #6c757d; margin-top: 4px; width: 100%; } .actionSelection { margin-bottom: 20px; } .actionSelection h4 { margin: 0 0 12px 0; color: #495057; font-size: 14px; } .actionOptions { display: flex; flex-direction: column; gap: 12px; } .actionOption { display: flex; align-items: flex-start; padding: 12px; border: 1px solid #e9ecef; border-radius: 6px; background: white; transition: background-color 0.2s ease; } .actionOption:hover { background-color: #f8f9fa; } .actionOption input[type="radio"] { margin-right: 12px; margin-top: 4px; } .actionLabel { flex: 1; cursor: pointer; display: block; } .actionDescription { margin-top: 4px; font-size: 13px; color: #6c757d; } .parentSelection { margin-bottom: 20px; } .parentSelection h4 { margin: 0 0 12px 0; color: #495057; font-size: 14px; } .previewSection { background: #fff3cd; border: 1px solid #ffeaa7; border-radius: 6px; padding: 16px; margin-bottom: 20px; } .previewSection h4 { margin: 0 0 12px 0; color: #856404; font-size: 14px; } .previewChanges { max-height: 200px; overflow-y: auto; } .previewItem { padding: 8px 0; border-bottom: 1px solid #ffeaa7; } .previewItem:last-child { border-bottom: none; } .previewChange { margin-top: 4px; font-size: 13px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .beforeState { color: #6c757d; } .arrow { color: #007bff; font-weight: bold; } .afterState { color: #28a745; font-weight: 500; } /* Адаптивность для мобильных */ @media (max-width: 768px) { .bulkParentContainer { padding: 12px; } .actionOptions { gap: 8px; } .actionOption { padding: 8px; } .topicPreviewItem { flex-direction: column; align-items: flex-start; gap: 4px; } .previewChange { flex-direction: column; align-items: flex-start; gap: 4px; } } /* Новые стили для кликабельного интерфейса */ .selectedForMove { border-color: #007bff !important; background-color: #e3f2fd !important; box-shadow: 0 0 8px rgba(0, 123, 255, 0.3); } .moveTarget { border-color: #28a745 !important; background-color: #d4edda !important; } .selectedIcon, .targetIcon, .clickIcon { font-size: 16px; margin-right: 4px; } .selectedIcon { animation: pulse 1s infinite; } .targetIcon { animation: bounce 0.8s infinite; } .clickIcon { opacity: 0.6; } @keyframes pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } } @keyframes bounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-2px); } } .searchSection { margin: 20px 0; padding: 15px; background: #f8f9fa; border-radius: 8px; border: 1px solid #ddd; } .searchInput { width: 100%; padding: 8px 12px; border: 1px solid #ddd; border-radius: 4px; font-size: 14px; margin-bottom: 8px; } .searchResult { color: #28a745; font-size: 14px; padding: 4px 0; } .searchNoResult { color: #dc3545; font-size: 14px; padding: 4px 0; } .actionZone { margin: 20px 0; padding: 20px; background: #e3f2fd; border: 2px solid #007bff; border-radius: 8px; } .selectedTopicInfo h4 { margin: 0 0 10px 0; color: #007bff; font-size: 16px; } .selectedTopicDisplay { background: white; padding: 10px; border-radius: 4px; margin-bottom: 15px; font-weight: 500; } .actionButtons { display: flex; gap: 10px; flex-wrap: wrap; } .rootButton { background: #28a745; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; font-size: 14px; transition: background 0.2s ease; } .rootButton:hover { background: #218838; } .cancelButton { background: #6c757d; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; font-size: 14px; transition: background 0.2s ease; } .cancelButton:hover { background: #5a6268; }