jeongsoo's picture
init
1c2d73c
/* ์žฅ์น˜ ์ œ์–ด ๊ด€๋ จ ์Šคํƒ€์ผ */
/* ์žฅ์น˜ ์ œ์–ด ์„น์…˜ */
#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,
.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; /* ์ดˆ๊ธฐ์—๋Š” ์ˆจ๊น€ */
}
.device-functions.active,
.program-control.active {
display: block; /* ํ™œ์„ฑํ™” ์‹œ ๋ณด์ž„ */
}
.device-functions h3,
.program-control 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-list-container {
margin-bottom: 20px;
/* ์Šคํฌ๋กค์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ */
max-height: 300px;
overflow-y: auto;
border: 1px solid var(--border-color);
border-radius: 4px;
padding: 10px;
}
.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);
font-size: 0.9rem;
}
.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;
min-height: 20px; /* ๊ฒฐ๊ณผ ์—†์„ ๋•Œ๋„ ์ตœ์†Œ ๋†’์ด ์œ ์ง€ */
}
.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);
}
/* ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ */
.custom-command-container {
display: flex;
gap: 10px;
margin-bottom: 15px;
}
.custom-command-container input {
flex: 1;
padding: 10px;
border: 1px solid var(--border-color);
border-radius: 4px;
font-size: 0.95rem;
}
.custom-command-container 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;
}
.custom-command-container button:hover {
background-color: var(--primary-color-dark);
}
.custom-command-container button:disabled {
background-color: var(--disabled-color);
cursor: not-allowed;
}
/* ๋ช…๋ น์–ด ์‹คํ–‰ ๊ฒฐ๊ณผ ์Šคํƒ€์ผ */
.command-output, .command-error {
margin-top: 10px;
padding: 10px;
background-color: var(--bg-color-tertiary);
border-radius: 4px;
border: 1px solid var(--border-color);
}
.command-output pre, .command-error pre {
white-space: pre-wrap;
word-wrap: break-word;
font-size: 0.85rem;
margin: 0;
}
.command-error pre {
color: #dc3545; /* ์˜ค๋ฅ˜ ํ…์ŠคํŠธ ์ƒ‰์ƒ */
}
/* ๋กœ๋”ฉ ํ‘œ์‹œ */
.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; /* ํ•„์š”์‹œ ์กฐ์ • */
margin-left: 10px; /* ์•ž ์š”์†Œ์™€ ๊ฐ„๊ฒฉ */
transition: background-color 0.2s;
}
.retry-button:hover {
background-color: var(--secondary-color-dark);
}
/* ================== ์žฅ์น˜ ํฌํŠธ ์กฐํšŒ ์Šคํƒ€์ผ ์ถ”๊ฐ€ ================== */
.ports-status {
margin: 10px 0;
padding: 10px;
border-radius: 5px;
min-height: 20px;
font-size: 0.9rem; /* ๋‹ค๋ฅธ ์ƒํƒœ ๋ฉ”์‹œ์ง€์™€ ์ผ๊ด€์„ฑ */
}
.ports-status.success {
background-color: rgba(0, 200, 83, 0.1); /* ๊ธฐ์กด .success ์Šคํƒ€์ผ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ */
color: #00c853; /* ์ข€ ๋” ๋ฐ์€ ๋…น์ƒ‰ */
border: 1px solid #00c853;
}
.ports-status.error {
background-color: rgba(244, 67, 54, 0.1); /* ๊ธฐ์กด .error ์Šคํƒ€์ผ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ */
color: #f44336; /* ์ข€ ๋” ๋ฐ์€ ๋นจ๊ฐ• */
border: 1px solid #f44336;
}
.ports-status.warning {
background-color: rgba(255, 152, 0, 0.1); /* ๊ธฐ์กด .warning ์Šคํƒ€์ผ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ */
color: #ff9800; /* ์ข€ ๋” ๋ฐ์€ ์ฃผํ™ฉ */
border: 1px solid #ff9800;
}
.ports-results {
margin-top: 15px;
border: 1px solid var(--border-color); /* ๋ณ€์ˆ˜ ์‚ฌ์šฉ */
border-radius: 5px;
padding: 0; /* ๋‚ด๋ถ€ ์„น์…˜ ํŒจ๋”ฉ์œผ๋กœ ์กฐ์ • */
max-height: 500px; /* ์ตœ๋Œ€ ๋†’์ด ์ œํ•œ */
overflow-y: auto; /* ๋‚ด์šฉ ๋งŽ์œผ๋ฉด ์Šคํฌ๋กค */
background-color: var(--bg-color-tertiary); /* ์•ฝ๊ฐ„์˜ ๋ฐฐ๊ฒฝ์ƒ‰ */
}
/* ํฌํŠธ ๊ฒฐ๊ณผ ์ปจํ…Œ์ด๋„ˆ (๋‚ด๋ถ€ ํŒจ๋”ฉ์šฉ) */
.ports-results-container {
padding: 15px;
}
.ports-section {
margin-bottom: 20px;
}
/* ๋งˆ์ง€๋ง‰ ์„น์…˜์˜ ํ•˜๋‹จ ๋งˆ์ง„ ์ œ๊ฑฐ */
.ports-section:last-child {
margin-bottom: 0;
}
.ports-section h4 {
margin-top: 0;
margin-bottom: 10px;
font-size: 1rem; /* ๋‹ค๋ฅธ h3 ์™€ ์œ ์‚ฌํ•˜๊ฒŒ */
color: var(--text-color-primary); /* ๋ณ€์ˆ˜ ์‚ฌ์šฉ */
border-bottom: 1px solid var(--border-color); /* ๋ณ€์ˆ˜ ์‚ฌ์šฉ */
padding-bottom: 5px;
}
.info-row {
display: flex;
margin-bottom: 5px;
font-size: 0.9rem; /* ๊ธ€์ž ํฌ๊ธฐ ํ†ต์ผ */
}
.info-label {
font-weight: bold;
width: 100px;
flex-shrink: 0; /* ๋ผ๋ฒจ ๋„ˆ๋น„ ๊ณ ์ • */
color: var(--text-color-secondary); /* ์•ฝ๊ฐ„ ์—ฐํ•œ ์ƒ‰ */
}
.info-value {
color: var(--text-color-primary);
}
.ports-table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
font-size: 0.85rem; /* ํ…Œ์ด๋ธ” ๊ธ€์ž ์•ฝ๊ฐ„ ์ž‘๊ฒŒ */
}
.ports-table th,
.ports-table td {
padding: 8px 10px; /* ํŒจ๋”ฉ ์กฐ์ • */
text-align: left;
border-bottom: 1px solid var(--border-color-lighter, #eee); /* ๋” ์—ฐํ•œ ๊ตฌ๋ถ„์„ , ๋ณ€์ˆ˜ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ */
vertical-align: top; /* ์—ฌ๋Ÿฌ ์ค„์ผ ๊ฒฝ์šฐ ์œ„ ์ •๋ ฌ */
}
.ports-table th {
background-color: var(--bg-color-secondary); /* ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฐฐ๊ฒฝ */
font-weight: 500; /* ๋ณดํ†ต ๋‘๊ป˜ */
color: var(--text-color-primary);
}
.ports-table tbody tr:hover {
background-color: var(--bg-color-hover, #f9f9f9); /* ๋ณ€์ˆ˜ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ */
}
.no-ports-message {
color: var(--text-color-secondary); /* ๋ณ€์ˆ˜ ์‚ฌ์šฉ */
font-style: italic;
padding: 10px 0;
font-size: 0.9rem;
}
/* ================== ์ถ”๊ฐ€ ๋ ================================= */