/* * components.css - buttons, inputs, tables, status cards, connection * indicator, popups, menu, log lines and badges. Loaded after base.css. * Responsive overrides for these components live in layout.css. */ /* Buttons */ input[type=button], input[type=submit], button { cursor: pointer; border: 1px solid transparent; border-radius: 999px; color: var(--text-on-accent); padding: 10px 18px; margin: 8px 8px 8px 0; font-weight: 700; letter-spacing: 0.03em; background: var(--accent-gradient); box-shadow: 0 10px 22px var(--accent-shadow); transition: transform 0.15s ease, box-shadow 0.2s ease, filter 0.2s ease; } input[type=button]:hover, input[type=submit]:hover, button:hover { transform: translateY(-1px); filter: brightness(1.05); box-shadow: 0 12px 24px var(--accent-shadow-strong); } input[type=button]:active, input[type=submit]:active, button:active { transform: translateY(0); } input[type=button].delete { color: var(--text-on-error); background: linear-gradient(135deg, var(--error-bright) 0%, var(--error-strong) 100%); box-shadow: 0 10px 20px var(--error-shadow); } input[type=button].cancel { color: var(--error-text-soft); border-color: var(--error-soft); background: var(--error-surface); box-shadow: none; } input[type=button].black, input[type=submit].black { color: var(--text-heading); border-color: var(--line); background: var(--surface-raised); box-shadow: none; } input[type=button].center { margin-right: auto; margin-left: auto; } input[type=button].save { margin-left: auto; } /* Checkbox */ input[type=checkbox] { width: 20px; height: 20px; border: 1px solid var(--line); border-radius: 6px; background-color: var(--surface-input); cursor: pointer; position: relative; } input[type=checkbox]:checked { border-color: var(--checkbox-checked-border); background-color: var(--checkbox-checked); } input[type=checkbox]:before { content: ""; } input[type=checkbox]:checked:before { content: "\2713"; color: var(--text-on-accent); font-size: 14px; font-weight: 800; position: absolute; top: -1px; left: 3px; } /* Input states */ .changed { border-color: var(--accent-hover) !important; box-shadow: 0 0 0 3px var(--accent-soft) !important; } .notAvailable { opacity: 0.58; cursor: not-allowed; border-color: var(--error-soft) !important; } .wizard { margin: 10px 0; } /* Sidebar menu */ #branch { min-height: 18px; margin: 2px 0 6px; text-align: center; font-size: 11px; color: var(--error-text); letter-spacing: 0.08em; text-transform: uppercase; } #main-menu { display: flex; flex-direction: column; gap: 7px; overflow: auto; padding-right: 4px; } #main-menu li { display: flex; align-items: center; gap: 10px; min-height: 42px; padding: 8px 11px; border-radius: 12px; border: 1px solid transparent; background: var(--surface-1); } #main-menu li:hover { border-color: var(--accent-soft); transform: translateX(2px); } #main-menu li:focus-visible { border-color: var(--accent-border); transform: translateX(2px); box-shadow: 0 0 0 3px var(--accent-soft); } #main-menu li.menu-active { border-color: var(--accent-border); background: var(--accent-gradient); box-shadow: 0 10px 18px var(--accent-shadow); } #main-menu li.menu-active p { color: var(--text-on-accent); } #main-menu li.menu-active img { filter: brightness(0.04) saturate(120%); } nav img { display: block; width: 18px; height: 18px; max-width: 18px; max-height: 18px; flex: 0 0 auto; } nav p { margin: 0; padding: 0; text-align: left; font-size: 12px; font-weight: 600; color: var(--text-heading); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .menu-active { color: var(--text-on-accent); } .menu { border: 1px solid var(--accent); } /* Connection indicator */ #connection-indicator { margin-left: auto; padding: 5px 11px; border-radius: 999px; font-size: 11px; font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; } #connection-indicator.status-idle { color: var(--text-heading); border: 1px solid var(--line-strong); background: var(--surface-raised); } #connection-indicator.status-busy { color: var(--text-on-accent); border: 1px solid var(--accent-bright); background: var(--accent-gradient); } #connection-indicator.status-online { color: var(--text-on-ok); border: 1px solid var(--ok-border); background: linear-gradient(135deg, var(--ok-bright) 0%, var(--ok-mid) 100%); } #connection-indicator.status-offline { color: var(--text-on-error); border: 1px solid var(--error-border); background: linear-gradient(135deg, var(--error-bright) 0%, var(--error-strong) 100%); } /* Server info and stream tables */ #clientInfo, #activeStreams, #inactiveStreams { width: 100%; border-collapse: separate; border-spacing: 7px; background: var(--surface-0); } #clientInfo { padding: 7px 10px 6px; border-bottom: 1px solid var(--line-soft); } #clientInfo tr { vertical-align: top; } #clientInfo .tdKey, #clientInfo .tdVal, #activeStreams .tdKey, #inactiveStreams .tdKey, #activeStreams .tdVal, #inactiveStreams .tdVal, #logInfo .tdVal, #mappingInfo .tdVal { border: 1px solid var(--line-soft); border-radius: 8px; padding: 7px 8px; vertical-align: middle; font-family: var(--font-mono); } #clientInfo .tdKey, #activeStreams .tdKey, #inactiveStreams .tdKey { color: var(--accent-text); font-size: 10px; text-transform: uppercase; } #clientInfo .tdVal, #activeStreams .tdVal, #inactiveStreams .tdVal { color: var(--text-muted); font-size: 11px; word-break: break-word; } #clientInfo .tdVal a { color: var(--accent-text); text-decoration: none; border-bottom: 1px dotted var(--link-underline); word-break: break-all; } #clientInfo .tdVal a:hover, #clientInfo .tdVal a:focus { color: var(--accent-text-hover); border-bottom-color: var(--accent-text-hover); text-decoration: none; } #myStreamsBox { border-bottom: 1px solid var(--line-soft); background: var(--surface-1); transition: all 0.2s ease; } #allStreams { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 8px; } #activeStreams, #inactiveStreams { max-height: 120px; overflow-y: auto; } #inactiveStreams .tdKey { color: var(--error-text); } /* Status cards */ .dashboard-cards { display: grid; grid-template-columns: repeat(6, minmax(130px, 1fr)); gap: 9px; padding: 10px 14px; border-bottom: 1px solid var(--line-soft); background: var(--surface-0); } .status-card { border: 1px solid var(--line-soft); border-radius: 12px; background: var(--surface-2); padding: 10px; min-height: 74px; display: flex; flex-direction: column; justify-content: center; gap: 4px; } .status-card-label { color: var(--text-soft); font-size: 10px; text-transform: uppercase; letter-spacing: 0.07em; } .status-card-value { color: var(--text); font-size: 14px; font-weight: 700; overflow: hidden; text-overflow: ellipsis; } .status-card.status-card-ok { border-color: var(--ok-soft); background: linear-gradient(180deg, var(--ok-surface-top) 0%, var(--ok-surface-bottom) 100%); } .status-card.status-card-warn { border-color: var(--warn-soft); background: linear-gradient(180deg, var(--warn-surface-top) 0%, var(--warn-surface-bottom) 100%); } .status-card.status-card-error { border-color: var(--error-soft); background: linear-gradient(180deg, var(--error-surface-top) 0%, var(--error-surface-bottom) 100%); } /* Content table */ #box-wrapper { width: 100%; overflow: auto; border: 1px solid var(--line-soft); border-radius: 12px; background: var(--surface-1); } #content_table { width: 100%; border-collapse: collapse; } #content_table .content_table_header { position: sticky; top: 0; z-index: 2; background: linear-gradient(180deg, var(--table-head-top), var(--table-head-bottom)); border-bottom: 1px solid var(--line); } #content_table .content_table_header td { color: var(--accent-text); font-size: 11px; text-transform: uppercase; letter-spacing: 0.07em; padding: 10px 8px; } #content_table tr { border-left: 3px solid transparent; border-bottom: 1px solid var(--row-line); transition: background-color 0.2s ease; } #content_table tr:hover { background-color: var(--row-hover); } #content_table tr[tabindex], #content_table td[tabindex] { cursor: pointer; } #content_table tr[tabindex]:focus-visible, #content_table td[tabindex]:focus-visible, .keyboard-clickable:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: -2px; background-color: var(--row-focus); } #content_table td { padding: 7px 8px; vertical-align: middle; } #content_table img { display: block; width: auto; max-width: 34px; max-height: 30px; margin: 0 auto; } #content_table input[type=text] { min-width: 48px; max-width: 76px; margin: 0; padding: 6px 7px; border-radius: 8px; text-align: left; } #content_table input[type=checkbox] { margin: 0 auto; } #content_table .mapping-edit-button { min-height: 32px; min-width: 64px; margin: 0; padding: 5px 10px; font-size: 11px; line-height: 1; } #content_table tr.activeEPG { border-left-color: var(--ok); } #content_table tr.notActiveEPG { border-left-color: var(--error); } /* Settings */ #settings { padding: 10px; } #content_settings h4 { margin: 15px 0 8px; color: var(--text-heading); } #content_settings table { border: 1px solid var(--line-soft); border-radius: 12px; background: var(--surface-1); overflow: hidden; } #content_settings td { border-bottom: 1px solid var(--row-line); } #content_settings tr:last-child td { border-bottom: 0; } #content_settings pre { color: var(--text-soft); font-size: 11px; } /* Popup and detail tables */ #popup-custom table, #content_settings table, #mapping-detail-table, #user-detail-table { width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0 8px; } #popup-custom td, #content_settings td, #mapping-detail-table td, #user-detail-table td { padding: 2px 6px; vertical-align: middle; } #popup-custom td.left, #mapping-detail-table td.left, #user-detail-table td.left { width: 38%; color: var(--text-muted); } #popup-custom input[type=text], #popup-custom input[type=password], #mapping-detail input[type=text], #content_settings input[type=text], #content_settings input[type=password] { width: 100%; } #mapping-detail img { display: block; max-height: 44px; margin: 8px auto 12px; } #file-detail input[type=text] { width: 100%; } /* Loading and popups */ #loading { position: fixed; inset: 0; z-index: 2000; background-color: var(--overlay); backdrop-filter: blur(1.5px); } .loader { width: 52px; height: 52px; border-radius: 50%; border: 4px solid transparent; border-top-color: var(--loader); border-right-color: var(--accent-strong); animation: spin 0.9s linear infinite; position: fixed; top: 0; right: 0; bottom: 0; left: 0; margin: auto; } #popup { position: fixed; inset: 0; background-color: var(--overlay); backdrop-filter: blur(2px); z-index: 1500; padding: 16px; } #popup-custom, #mapping-detail, #user-detail, #file-detail { margin: 0 auto; max-width: 760px; max-height: calc(100vh - 36px); overflow: auto; border-radius: var(--radius-l); border: 1px solid var(--line); background: linear-gradient(180deg, var(--panel-top) 0%, var(--panel-bottom) 100%); box-shadow: var(--shadow-1); padding: 16px; animation: popupIn 0.2s ease; } #popup-custom h3 { margin-bottom: 8px; text-align: center; color: var(--text-heading); } .popup-title { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; } .popup-title h3 { margin: 0; text-align: left; } #popup-custom .popup-title h3 { margin: 0; text-align: left; } .popup-close { min-width: 40px; min-height: 40px; margin: 0; padding: 0; border-radius: 999px; border: 1px solid var(--line); color: var(--text-heading); background: var(--surface-raised); box-shadow: none; font-size: 20px; line-height: 1; } .popup-close:hover { color: var(--text); border-color: var(--accent); } .interaction, #interaction { margin-top: 16px; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; float: right; } .interaction input[type=button], .interaction input[type=submit] { margin: 0; min-width: 110px; } #popup-interaction { margin-top: 14px; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; } /* Notifications */ #notification { position: fixed; right: 12px; top: 12px; width: 260px; max-height: calc(100vh - 24px); overflow: auto; border-radius: var(--radius-m); border: 1px solid var(--line); background: var(--surface-solid); box-shadow: var(--shadow-2); } #notification .element { margin: 8px; border-radius: 10px; border-left: 4px solid var(--ok); background: var(--surface-3); padding: 8px; } #notification h5 { padding: 0; margin-bottom: 6px; } #notification p { font-size: 11px; } /* Log lines */ #content_log { padding: 8px; } #content_log pre { margin-bottom: 5px; padding: 8px; border-radius: 8px; background: var(--surface-1); white-space: pre-wrap; overflow-wrap: anywhere; word-break: break-word; line-height: 1.45; } #logScreen p { white-space: pre; font-family: var(--font-mono); font-size: 12px; line-height: 1.55; } .screenLogHidden { transform: translate(0, -110px); } .infoMsg { color: var(--info); } .errorMsg { color: var(--error-text); } .warningMsg { color: var(--warn); } .debugMsg { color: var(--debug); } /* Category badges */ .News, .Movie, .Series, .Sports, .Kids { border-left: 3px solid transparent; padding-left: 8px; } .News { border-color: #ff8f6e; } .Movie { border-color: #46a4ff; } .Series { border-color: #ffd267; } .Sports { border-color: #5ee495; } .Kids { border-color: #f6a8ff; }