main.css 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919
  1. /* GrabZilla 2.1 - Exact Figma Design System */
  2. /* Import component styles */
  3. @import url('./components/header.css');
  4. :root {
  5. /* Primary Colors - Exact from Figma */
  6. --primary-blue: #155dfc;
  7. --success-green: #00a63e;
  8. --error-red: #e7000b;
  9. /* Backgrounds - Exact from Figma */
  10. --bg-dark: #1d293d;
  11. --header-dark: #0f172b;
  12. --card-bg: #314158;
  13. --border-color: #45556c;
  14. /* Text Colors - Exact from Figma */
  15. --text-primary: #ffffff;
  16. --text-secondary: #cad5e2;
  17. --text-muted: #90a1b9;
  18. --text-disabled: #62748e;
  19. /* Status Colors */
  20. --status-ready: #00a63e;
  21. --status-downloading: #00a63e;
  22. --status-converting: #155dfc;
  23. --status-completed: #4a5565;
  24. --status-error: #e7000b;
  25. /* macOS Traffic Light Colors */
  26. --macos-red: #ff5f57;
  27. --macos-red-hover: #ff4136;
  28. --macos-yellow: #ffbd2e;
  29. --macos-yellow-hover: #ff9500;
  30. --macos-green: #28ca42;
  31. --macos-green-hover: #00d084;
  32. }
  33. /* Base Styles */
  34. * {
  35. box-sizing: border-box;
  36. }
  37. body {
  38. font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  39. background-color: var(--bg-dark);
  40. color: var(--text-primary);
  41. margin: 0;
  42. padding: 0;
  43. min-height: 100vh;
  44. }
  45. /* Scrollbar Styling */
  46. ::-webkit-scrollbar {
  47. width: 8px;
  48. }
  49. ::-webkit-scrollbar-track {
  50. background: var(--bg-dark);
  51. }
  52. ::-webkit-scrollbar-thumb {
  53. background: var(--border-color);
  54. border-radius: 4px;
  55. }
  56. ::-webkit-scrollbar-thumb:hover {
  57. background: var(--text-muted);
  58. }
  59. /* Button Hover Effects */
  60. button:hover {
  61. transition: all 0.2s ease;
  62. }
  63. button:disabled {
  64. opacity: 0.5;
  65. cursor: not-allowed;
  66. }
  67. /* Input Focus Styles */
  68. input:focus,
  69. textarea:focus,
  70. select:focus {
  71. outline: none;
  72. border-color: var(--primary-blue);
  73. box-shadow: 0 0 0 2px rgba(21, 93, 252, 0.2);
  74. }
  75. /* Enhanced Focus Indicators for Accessibility */
  76. button:focus-visible,
  77. input:focus-visible,
  78. textarea:focus-visible,
  79. select:focus-visible,
  80. [tabindex]:focus-visible {
  81. outline: 3px solid var(--primary-blue) !important;
  82. outline-offset: 2px !important;
  83. box-shadow: 0 0 0 1px rgba(21, 93, 252, 0.3) !important;
  84. position: relative;
  85. z-index: 10;
  86. }
  87. /* Video item focus management */
  88. .video-item {
  89. position: relative;
  90. }
  91. .video-item:focus-within {
  92. outline: 2px solid var(--primary-blue) !important;
  93. outline-offset: 1px !important;
  94. background-color: rgba(21, 93, 252, 0.1) !important;
  95. z-index: 5;
  96. }
  97. .video-item:focus {
  98. outline: 3px solid var(--primary-blue) !important;
  99. outline-offset: 2px !important;
  100. background-color: rgba(21, 93, 252, 0.15) !important;
  101. }
  102. /* Keyboard navigation indicators */
  103. .video-item.keyboard-focused {
  104. background-color: rgba(21, 93, 252, 0.1) !important;
  105. border: 1px solid var(--primary-blue);
  106. }
  107. /* Selection states with accessibility */
  108. .video-item.selected {
  109. background-color: rgba(21, 93, 252, 0.2) !important;
  110. border: 2px solid var(--primary-blue);
  111. box-shadow: 0 0 0 1px rgba(21, 93, 252, 0.3);
  112. }
  113. .video-item.selected:focus {
  114. outline: 3px solid var(--success-green) !important;
  115. outline-offset: 2px !important;
  116. }
  117. /* Screen Reader Only Utility */
  118. .sr-only {
  119. position: absolute;
  120. width: 1px;
  121. height: 1px;
  122. padding: 0;
  123. margin: -1px;
  124. overflow: hidden;
  125. clip: rect(0, 0, 0, 0);
  126. white-space: nowrap;
  127. border: 0;
  128. }
  129. /* High Contrast Mode Support */
  130. @media (prefers-contrast: high) {
  131. :root {
  132. --border-color: #ffffff;
  133. --text-muted: #ffffff;
  134. }
  135. }
  136. /* Reduced Motion Support */
  137. @media (prefers-reduced-motion: reduce) {
  138. *,
  139. *::before,
  140. *::after {
  141. animation-duration: 0.01ms !important;
  142. animation-iteration-count: 1 !important;
  143. transition-duration: 0.01ms !important;
  144. }
  145. }
  146. /* Loading Spinner Animation */
  147. @keyframes spin {
  148. from {
  149. transform: rotate(0deg);
  150. }
  151. to {
  152. transform: rotate(360deg);
  153. }
  154. }
  155. .animate-spin {
  156. animation: spin 1s linear infinite;
  157. }
  158. /* Control Panel Button Styles */
  159. #clearListBtn:hover:not(:disabled) {
  160. background-color: var(--border-color);
  161. border-color: var(--text-muted);
  162. }
  163. #updateDepsBtn:hover:not(:disabled) {
  164. background-color: var(--border-color);
  165. border-color: var(--text-muted);
  166. }
  167. #cancelDownloadsBtn:hover:not(:disabled) {
  168. background-color: #c53030;
  169. }
  170. #downloadVideosBtn:hover:not(:disabled) {
  171. background-color: #38a169;
  172. }
  173. /* Disabled button styles */
  174. button:disabled {
  175. opacity: 0.5;
  176. cursor: not-allowed;
  177. }
  178. button:disabled:hover {
  179. transform: none;
  180. box-shadow: none;
  181. }
  182. /* Utility Classes */
  183. .text-truncate {
  184. overflow: hidden;
  185. text-overflow: ellipsis;
  186. white-space: nowrap;
  187. }
  188. /* Thumbnail Preview Hover Effect */
  189. .video-thumbnail-container {
  190. position: relative;
  191. overflow: visible;
  192. z-index: 1;
  193. }
  194. .video-thumbnail-container:hover {
  195. z-index: 50;
  196. }
  197. .video-thumbnail-container img {
  198. transition: all 200ms ease-out;
  199. }
  200. .video-thumbnail-container:hover img {
  201. transform: scale(2.5);
  202. box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
  203. border-radius: 6px;
  204. position: relative;
  205. z-index: 50;
  206. }
  207. /* Settings Modal Tabs */
  208. .settings-tab.active {
  209. color: white;
  210. border-bottom-color: #155dfc;
  211. }
  212. /* Toast Notifications */
  213. .toast {
  214. pointer-events: auto;
  215. min-width: 300px;
  216. max-width: 400px;
  217. animation: slideIn 0.3s ease-out;
  218. }
  219. .toast.removing {
  220. animation: slideOut 0.3s ease-out forwards;
  221. }
  222. @keyframes slideIn {
  223. from {
  224. transform: translateX(400px);
  225. opacity: 0;
  226. }
  227. to {
  228. transform: translateX(0);
  229. opacity: 1;
  230. }
  231. }
  232. @keyframes slideOut {
  233. from {
  234. transform: translateX(0);
  235. opacity: 1;
  236. }
  237. to {
  238. transform: translateX(400px);
  239. opacity: 0;
  240. }
  241. }
  242. /* Responsive Design */
  243. @media (max-width: 1024px) {
  244. .grid-cols-\[40px_40px_1fr_120px_100px_120px_100px\] {
  245. grid-template-columns: 40px 1fr 80px 80px 80px;
  246. }
  247. /* Hide drag handle and checkbox on smaller screens */
  248. .grid-cols-\[40px_40px_1fr_120px_100px_120px_100px\] > :nth-child(1),
  249. .grid-cols-\[40px_40px_1fr_120px_100px_120px_100px\] > :nth-child(2) {
  250. display: none;
  251. }
  252. }
  253. @media (max-width: 768px) {
  254. .grid-cols-\[40px_40px_1fr_120px_100px_120px_100px\] {
  255. grid-template-columns: 1fr 60px;
  256. gap: 8px;
  257. }
  258. /* Hide some columns on mobile */
  259. .grid-cols-\[40px_40px_1fr_120px_100px_120px_100px\] > :nth-child(4),
  260. .grid-cols-\[40px_40px_1fr_120px_100px_120px_100px\] > :nth-child(5),
  261. .grid-cols-\[40px_40px_1fr_120px_100px_120px_100px\] > :nth-child(6) {
  262. display: none;
  263. }
  264. }
  265. /*
  266. Video List Styles - Exact Figma Implementation */
  267. .video-item {
  268. border-radius: 4px;
  269. cursor: pointer;
  270. }
  271. .video-item:hover {
  272. background-color: #3a4a68 !important;
  273. }
  274. /* Video Item Checkbox Styling */
  275. .video-item button svg rect {
  276. transition: all 0.2s ease;
  277. }
  278. .video-item button:hover svg rect {
  279. stroke: var(--primary-blue);
  280. }
  281. /* Video Item Drag Handle Styling */
  282. .video-item svg circle {
  283. transition: fill 0.2s ease;
  284. }
  285. /* Video Thumbnail Styling */
  286. .video-item .w-16.h-12 {
  287. background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);
  288. border: 1px solid var(--border-color);
  289. }
  290. /* Video Dropdown Styling */
  291. .video-item select {
  292. transition: all 0.2s ease;
  293. appearance: none;
  294. background-image: url("data:image/svg+xml,%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 8 4 4 4-4'/%3e%3c/svg%3e");
  295. background-position: right 8px center;
  296. background-repeat: no-repeat;
  297. background-size: 16px;
  298. padding-right: 32px;
  299. }
  300. .video-item select:hover {
  301. border-color: var(--primary-blue);
  302. background-color: #3a4a68;
  303. }
  304. .video-item select:focus {
  305. outline: none;
  306. border-color: var(--primary-blue);
  307. box-shadow: 0 0 0 2px rgba(21, 93, 252, 0.2);
  308. }
  309. /* Progress Bar Styling */
  310. .video-item .bg-\[\#45556c\] {
  311. background-color: var(--border-color);
  312. border-radius: 6px;
  313. }
  314. .video-item .bg-\[\#00a63e\] {
  315. background-color: var(--success-green);
  316. border-radius: 6px;
  317. }
  318. .video-item .bg-\[\#155dfc\] {
  319. background-color: var(--primary-blue);
  320. border-radius: 6px;
  321. }
  322. /* Status Badge Component - Integrated Progress Design - Exact Figma Implementation */
  323. .status-badge {
  324. display: inline-flex;
  325. align-items: center;
  326. justify-content: center;
  327. padding: 4px 8px;
  328. border-radius: 4px;
  329. font-size: 12px;
  330. font-weight: 500;
  331. line-height: 16px;
  332. letter-spacing: -0.1504px;
  333. min-width: 80px;
  334. max-width: 100px;
  335. text-align: center;
  336. transition: all 0.2s ease;
  337. position: relative;
  338. overflow: hidden;
  339. white-space: nowrap;
  340. text-overflow: ellipsis;
  341. }
  342. /* Ready State - Green Badge */
  343. .status-badge.ready {
  344. background-color: var(--status-ready); /* #00a63e */
  345. color: #ffffff;
  346. font-weight: 500;
  347. }
  348. /* Downloading State - Green Badge with Integrated Progress */
  349. .status-badge.downloading {
  350. background-color: var(--status-downloading); /* #00a63e */
  351. color: #ffffff;
  352. font-weight: 500;
  353. position: relative;
  354. }
  355. /* Converting State - Blue Badge with Integrated Progress */
  356. .status-badge.converting {
  357. background-color: var(--status-converting); /* #155dfc */
  358. color: #ffffff;
  359. font-weight: 500;
  360. position: relative;
  361. }
  362. /* Paused State - Muted Gray Badge */
  363. .status-badge.paused {
  364. background-color: var(--text-muted); /* #90a1b9 */
  365. color: #ffffff;
  366. font-weight: 500;
  367. }
  368. /* Completed State - Gray Badge */
  369. .status-badge.completed {
  370. background-color: var(--status-completed); /* #4a5565 */
  371. color: #ffffff;
  372. font-weight: 500;
  373. }
  374. /* Error State - Red Badge */
  375. .status-badge.error {
  376. background-color: var(--status-error); /* #e7000b */
  377. color: #ffffff;
  378. font-weight: 500;
  379. }
  380. /* Progress Animation for Status Badges - Enhanced Figma-Compliant Design */
  381. .status-badge.downloading::before,
  382. .status-badge.converting::before {
  383. content: '';
  384. position: absolute;
  385. top: 0;
  386. left: -100%;
  387. width: 100%;
  388. height: 100%;
  389. background: linear-gradient(
  390. 90deg,
  391. transparent,
  392. rgba(255, 255, 255, 0.15),
  393. transparent
  394. );
  395. animation: progress-shimmer 2.5s infinite;
  396. z-index: 1;
  397. }
  398. @keyframes progress-shimmer {
  399. 0% {
  400. left: -100%;
  401. }
  402. 100% {
  403. left: 100%;
  404. }
  405. }
  406. /* Subtle pulsing effect for active status badges */
  407. .status-badge.downloading,
  408. .status-badge.converting {
  409. animation: status-pulse 3s ease-in-out infinite;
  410. }
  411. @keyframes status-pulse {
  412. 0%, 100% {
  413. opacity: 1;
  414. transform: scale(1);
  415. }
  416. 50% {
  417. opacity: 0.9;
  418. transform: scale(1.02);
  419. }
  420. }
  421. /* Progress Indicator Overlay for Integrated Progress Display */
  422. .status-badge[data-progress]::after {
  423. content: '';
  424. position: absolute;
  425. bottom: 0;
  426. left: 0;
  427. height: 2px;
  428. background-color: rgba(255, 255, 255, 0.3);
  429. border-radius: 0 0 4px 4px;
  430. transition: width 0.3s ease;
  431. z-index: 2;
  432. }
  433. /* Dynamic progress indicator - will be set via JavaScript */
  434. .status-badge.has-progress::after {
  435. width: var(--progress-width, 0%);
  436. }
  437. /* Legacy Progress Bar Styles - Kept for backward compatibility */
  438. .progress-container {
  439. display: flex;
  440. flex-direction: column;
  441. gap: 4px;
  442. width: 100%;
  443. }
  444. .progress-bar {
  445. width: 100%;
  446. height: 16px;
  447. background-color: var(--border-color);
  448. border-radius: 6px;
  449. overflow: hidden;
  450. position: relative;
  451. }
  452. .progress-fill {
  453. height: 100%;
  454. border-radius: 6px;
  455. transition: width 0.3s ease;
  456. position: relative;
  457. }
  458. .progress-fill.downloading {
  459. background-color: var(--status-downloading);
  460. }
  461. .progress-fill.converting {
  462. background-color: var(--status-converting);
  463. }
  464. .progress-text {
  465. font-size: 12px;
  466. font-weight: 500;
  467. line-height: 16px;
  468. letter-spacing: -0.1504px;
  469. color: var(--text-secondary);
  470. text-align: center;
  471. }
  472. /* Progress Bar with Status Text Combined */
  473. .progress-status {
  474. display: flex;
  475. flex-direction: column;
  476. gap: 2px;
  477. align-items: center;
  478. justify-content: center;
  479. width: 100%;
  480. }
  481. .progress-status .progress-bar {
  482. height: 16px;
  483. margin-bottom: 2px;
  484. }
  485. .progress-status .progress-text {
  486. font-size: 12px;
  487. color: var(--text-secondary);
  488. }
  489. /* Status Badge Hover Effects */
  490. .status-badge:hover {
  491. transform: translateY(-1px);
  492. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
  493. }
  494. /* Accessibility Improvements for Status Components */
  495. .status-badge[aria-live="polite"] {
  496. /* Ensure status changes are announced to screen readers */
  497. }
  498. .progress-container[role="progressbar"] {
  499. /* Ensure progress is accessible */
  500. }
  501. /* High Contrast Mode Support for Status Components */
  502. @media (prefers-contrast: high) {
  503. .status-badge {
  504. border: 1px solid var(--text-primary);
  505. font-weight: 600;
  506. }
  507. .progress-bar {
  508. border: 1px solid var(--text-primary);
  509. }
  510. }
  511. /* Responsive Video List */
  512. @media (max-width: 1024px) {
  513. .video-item {
  514. grid-template-columns: 40px 1fr 80px 80px 80px;
  515. }
  516. /* Hide drag handle on smaller screens */
  517. .video-item > :nth-child(2) {
  518. display: none;
  519. }
  520. }
  521. @media (max-width: 768px) {
  522. .video-item {
  523. grid-template-columns: 1fr 60px;
  524. gap: 8px;
  525. padding: 12px;
  526. }
  527. /* Hide checkbox, duration, quality, format on mobile */
  528. .video-item > :nth-child(1),
  529. .video-item > :nth-child(4),
  530. .video-item > :nth-child(5),
  531. .video-item > :nth-child(6) {
  532. display: none;
  533. }
  534. /* Stack video info vertically on mobile */
  535. .video-item .flex.items-center.gap-3 {
  536. flex-direction: column;
  537. align-items: flex-start;
  538. gap: 8px;
  539. }
  540. .video-item .w-16.h-12 {
  541. width: 48px;
  542. height: 36px;
  543. }
  544. }
  545. /* Video Selection States */
  546. .video-item.selected {
  547. background-color: rgba(21, 93, 252, 0.15) !important;
  548. border: 1px solid var(--primary-blue);
  549. box-shadow: 0 0 0 1px rgba(21, 93, 252, 0.3);
  550. }
  551. .video-item.selected:hover {
  552. background-color: rgba(21, 93, 252, 0.2) !important;
  553. }
  554. /* Enhanced Checkbox States for Accessibility */
  555. .video-checkbox {
  556. position: relative;
  557. cursor: pointer;
  558. border-radius: 4px;
  559. transition: all 0.2s ease;
  560. }
  561. .video-checkbox:focus-visible {
  562. outline: 2px solid var(--primary-blue) !important;
  563. outline-offset: 2px !important;
  564. }
  565. .video-checkbox svg rect {
  566. transition: all 0.2s ease;
  567. }
  568. .video-checkbox:hover svg rect {
  569. stroke: var(--primary-blue);
  570. stroke-width: 2;
  571. }
  572. .video-checkbox.checked svg rect {
  573. fill: var(--primary-blue);
  574. stroke: var(--primary-blue);
  575. }
  576. .video-checkbox.checked svg {
  577. position: relative;
  578. }
  579. .video-checkbox.checked svg::after {
  580. content: '✓';
  581. position: absolute;
  582. top: 50%;
  583. left: 50%;
  584. transform: translate(-50%, -50%);
  585. color: white;
  586. font-size: 12px;
  587. font-weight: bold;
  588. }
  589. /* Keyboard navigation helpers */
  590. .keyboard-navigation-active .video-item:focus {
  591. background-color: rgba(21, 93, 252, 0.15) !important;
  592. }
  593. .keyboard-navigation-active button:focus,
  594. .keyboard-navigation-active select:focus,
  595. .keyboard-navigation-active input:focus,
  596. .keyboard-navigation-active textarea:focus {
  597. box-shadow: 0 0 0 3px rgba(21, 93, 252, 0.3) !important;
  598. }
  599. /* Drag and Drop States */
  600. .video-item.dragging {
  601. opacity: 0.6;
  602. transform: rotate(3deg) scale(1.02);
  603. z-index: 1000;
  604. box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
  605. border: 2px solid var(--primary-blue);
  606. }
  607. .video-item.drop-target {
  608. background-color: rgba(21, 93, 252, 0.1) !important;
  609. border: 2px dashed var(--primary-blue);
  610. transform: scale(1.02);
  611. }
  612. .video-item.drop-target::before {
  613. content: '';
  614. position: absolute;
  615. top: -2px;
  616. left: 0;
  617. right: 0;
  618. height: 4px;
  619. background-color: var(--primary-blue);
  620. border-radius: 2px;
  621. z-index: 10;
  622. }
  623. /* Drag handle cursor */
  624. .video-item [data-drag-handle] {
  625. cursor: grab;
  626. }
  627. .video-item [data-drag-handle]:active {
  628. cursor: grabbing;
  629. }
  630. /* Selection counter in status */
  631. .selection-status {
  632. color: var(--primary-blue);
  633. font-weight: 500;
  634. }
  635. /* Loading States */
  636. .video-item .loading-spinner {
  637. width: 16px;
  638. height: 16px;
  639. border: 2px solid var(--border-color);
  640. border-top: 2px solid var(--primary-blue);
  641. border-radius: 50%;
  642. animation: spin 1s linear infinite;
  643. }
  644. /* Accessibility Improvements */
  645. .video-item:focus-within {
  646. outline: 2px solid var(--primary-blue);
  647. outline-offset: 2px;
  648. }
  649. .video-item button:focus-visible,
  650. .video-item select:focus-visible {
  651. outline: 2px solid var(--primary-blue);
  652. outline-offset: 2px;
  653. }
  654. /* Text Truncation for Long Titles */
  655. .video-item .truncate {
  656. overflow: hidden;
  657. text-overflow: ellipsis;
  658. white-space: nowrap;
  659. }
  660. /* Smooth Transitions */
  661. .video-item * {
  662. transition: all 0.2s ease;
  663. }
  664. /* High Contrast Mode Support for Video List */
  665. @media (prefers-contrast: high) {
  666. .video-item {
  667. border: 1px solid var(--text-primary);
  668. }
  669. .video-item select {
  670. border-color: var(--text-primary);
  671. }
  672. }
  673. /* macOS
  674. Title Bar Styling */
  675. header {
  676. -webkit-app-region: drag;
  677. -webkit-user-select: none;
  678. user-select: none;
  679. }
  680. /* Traffic Light Buttons */
  681. .traffic-light {
  682. width: 12px;
  683. height: 12px;
  684. border-radius: 50%;
  685. transition: all 0.2s ease;
  686. cursor: pointer;
  687. -webkit-app-region: no-drag;
  688. border: none;
  689. outline: none;
  690. }
  691. .traffic-light:focus-visible {
  692. outline: 2px solid var(--primary-blue);
  693. outline-offset: 2px;
  694. }
  695. .traffic-light:active {
  696. transform: scale(0.95);
  697. }
  698. .traffic-light:hover {
  699. transform: scale(1.1);
  700. }
  701. /* Fix Row Selection Cut-off Issue */
  702. #videoList {
  703. padding-top: 8px; /* Add top padding to prevent cut-off */
  704. }
  705. .video-item {
  706. margin-top: 2px; /* Ensure proper spacing */
  707. margin-bottom: 2px;
  708. }
  709. .video-item:first-child {
  710. margin-top: 0; /* Remove extra margin from first item */
  711. }
  712. /* Improve Video Item Hover Effect */
  713. .video-item:hover {
  714. background-color: #3a4a68 !important;
  715. transform: translateY(-1px);
  716. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
  717. }
  718. /* Ensure proper spacing in video list container */
  719. .video-item + .video-item {
  720. margin-top: 8px;
  721. }
  722. /* Fix any potential overflow issues */
  723. main {
  724. overflow: hidden;
  725. }
  726. #videoList {
  727. overflow-y: auto;
  728. overflow-x: hidden;
  729. }
  730. /* Improve scrollbar in video list */
  731. #videoList::-webkit-scrollbar {
  732. width: 6px;
  733. }
  734. #videoList::-webkit-scrollbar-track {
  735. background: transparent;
  736. }
  737. #videoList::-webkit-scrollbar-thumb {
  738. background: var(--border-color);
  739. border-radius: 3px;
  740. }
  741. #videoList::-webkit-scrollbar-thumb:hover {
  742. background: var(--text-muted);
  743. }
  744. /* Ensure proper title bar height and centering */
  745. header {
  746. min-height: 41px;
  747. height: 41px;
  748. -webkit-app-region: drag;
  749. -webkit-user-select: none;
  750. user-select: none;
  751. }
  752. /* Make sure the logo and title are properly centered */
  753. header > div {
  754. -webkit-app-region: no-drag;
  755. }
  756. /* Responsive title bar */
  757. @media (max-width: 768px) {
  758. header {
  759. height: 41px;
  760. min-height: 41px;
  761. }
  762. }
  763. /* Binary Version Statusline */
  764. .update-badge {
  765. color: var(--primary-blue);
  766. font-size: 16px;
  767. line-height: 1;
  768. animation: pulse-badge 2s ease-in-out infinite;
  769. }
  770. @keyframes pulse-badge {
  771. 0%, 100% {
  772. opacity: 1;
  773. }
  774. 50% {
  775. opacity: 0.4;
  776. }
  777. }
  778. #binaryVersions {
  779. font-family: ui-monospace, "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Menlo, Consolas, "Courier New", monospace;
  780. }
  781. #lastUpdateCheck {
  782. font-style: italic;
  783. }