/* 장치 제어 관련 스타일 */ /* 장치 제어 섹션 */ #deviceSection { display: flex; flex-direction: column; gap: 20px; max-width: 1000px; margin: 0 auto; padding: 20px; } /* 장치 연결 컨테이너 */ .device-connection { background-color: var(--bg-color-secondary); border-radius: 8px; padding: 15px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .device-connection h3 { margin-top: 0; margin-bottom: 15px; color: var(--text-color-primary); font-size: 1.2rem; } .device-connection-form { display: flex; gap: 10px; margin-bottom: 15px; } .device-connection-form input { flex: 1; padding: 10px; border: 1px solid var(--border-color); border-radius: 4px; font-size: 0.95rem; } .device-connection-form button { background-color: var(--primary-color); color: white; border: none; border-radius: 4px; padding: 10px 15px; cursor: pointer; font-weight: 500; transition: background-color 0.2s; } .device-connection-form button:hover { background-color: var(--primary-color-dark); } .device-connection-form button:disabled { background-color: var(--disabled-color); cursor: not-allowed; } .connection-status { padding: 10px; border-radius: 4px; font-size: 0.9rem; } .connection-status.connected { background-color: rgba(25, 135, 84, 0.1); color: #198754; border: 1px solid rgba(25, 135, 84, 0.2); } .connection-status.disconnected { background-color: rgba(108, 117, 125, 0.1); color: #6c757d; border: 1px solid rgba(108, 117, 125, 0.2); } .connection-status.error { background-color: rgba(220, 53, 69, 0.1); color: #dc3545; border: 1px solid rgba(220, 53, 69, 0.2); } /* 장치 기능 컨테이너 */ .device-functions { background-color: var(--bg-color-secondary); border-radius: 8px; padding: 15px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); display: none; /* 초기에는 숨김 */ } .device-functions.active { display: block; } .device-functions h3 { margin-top: 0; margin-bottom: 15px; color: var(--text-color-primary); font-size: 1.2rem; } .function-buttons { display: flex; gap: 10px; margin-bottom: 15px; flex-wrap: wrap; } .function-buttons button { background-color: var(--secondary-color); color: white; border: none; border-radius: 4px; padding: 8px 12px; cursor: pointer; font-size: 0.9rem; transition: background-color 0.2s; } .function-buttons button:hover { background-color: var(--secondary-color-dark); } .function-buttons button:disabled { background-color: var(--disabled-color); cursor: not-allowed; } .device-status-result { width: 100%; min-height: 100px; max-height: 200px; padding: 10px; border: 1px solid var(--border-color); border-radius: 4px; font-family: monospace; font-size: 0.9rem; overflow-y: auto; background-color: var(--bg-color-tertiary); margin-bottom: 15px; resize: vertical; } /* 프로그램 실행 컨테이너 */ .program-control { background-color: var(--bg-color-secondary); border-radius: 8px; padding: 15px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); display: none; /* 초기에는 숨김 */ } .program-control.active { display: block; } .program-control h3 { margin-top: 0; margin-bottom: 15px; color: var(--text-color-primary); font-size: 1.2rem; } .program-list-container { margin-bottom: 20px; } .program-list { width: 100%; border-collapse: collapse; margin-bottom: 15px; } .program-list th, .program-list td { padding: 10px; text-align: left; border-bottom: 1px solid var(--border-color); } .program-list th { background-color: var(--bg-color-tertiary); font-weight: 500; } .program-list tr:hover { background-color: var(--bg-color-tertiary); } .program-select-container { margin-bottom: 15px; } .program-select-container select { width: 100%; padding: 10px; border: 1px solid var(--border-color); border-radius: 4px; font-size: 0.95rem; background-color: var(--bg-color-tertiary); } .execute-btn { background-color: var(--primary-color); color: white; border: none; border-radius: 4px; padding: 10px 15px; cursor: pointer; font-weight: 500; transition: background-color 0.2s; width: 100%; margin-bottom: 15px; } .execute-btn:hover { background-color: var(--primary-color-dark); } .execute-btn:disabled { background-color: var(--disabled-color); cursor: not-allowed; } .execute-result { padding: 10px; border-radius: 4px; margin-top: 10px; font-size: 0.9rem; } .execute-result.success { background-color: rgba(25, 135, 84, 0.1); color: #198754; border: 1px solid rgba(25, 135, 84, 0.2); } .execute-result.error { background-color: rgba(220, 53, 69, 0.1); color: #dc3545; border: 1px solid rgba(220, 53, 69, 0.2); } .execute-result.warning { background-color: rgba(255, 193, 7, 0.1); color: #ffc107; border: 1px solid rgba(255, 193, 7, 0.2); } /* 로딩 표시 */ .loading-spinner { display: inline-block; width: 16px; height: 16px; border: 2px solid rgba(0, 0, 0, 0.1); border-radius: 50%; border-top-color: var(--primary-color); animation: spin 1s ease-in-out infinite; margin-right: 8px; vertical-align: middle; } @keyframes spin { to { transform: rotate(360deg); } } .loading-message { display: flex; align-items: center; justify-content: center; padding: 20px; font-size: 0.95rem; color: var(--text-color-secondary); } /* 에러 메시지 */ .error-message { background-color: rgba(220, 53, 69, 0.1); color: #dc3545; border: 1px solid rgba(220, 53, 69, 0.2); padding: 10px; border-radius: 4px; margin-top: 10px; font-size: 0.9rem; } /* 없음 메시지 */ .no-programs-message { text-align: center; padding: 20px; font-size: 0.95rem; color: var(--text-color-secondary); border: 1px dashed var(--border-color); border-radius: 4px; margin-top: 10px; } /* 재시도 버튼 */ .retry-button { background-color: var(--secondary-color); color: white; border: none; border-radius: 4px; padding: 8px 12px; cursor: pointer; font-size: 0.9rem; margin-top: 10px; transition: background-color 0.2s; } .retry-button:hover { background-color: var(--secondary-color-dark); }