Player-css-5

CSS ParaNerd 1 Views Size: 25.57 KB Posted on: Dec 10, 25 @ 9:14 PM
  1. 1/* Font imports */
  2. 2@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&display=swap');
  3. 3
  4. 4/* Reset and base styles */
  5. 5* {
  6. 6 box-sizing: border-box;
  7. 7}
  8. 8
  9. 9/* Main radio player styles */
  10. 10.radio-player {
  11. 11 font-family: 'Poppins', sans-serif;
  12. 12 position: relative;
  13. 13 width: 100%;
  14. 14 height: 15%;
  15. 15 background: rgba(0, 0, 0, 0.8);
  16. 16 border-radius: 2px;
  17. 17 border: 0px solid rgba(0, 0, 0, 0.8);
  18. 18 padding: 10px;
  19. 19 margin: 10px;
  20. 20 box-sizing: border-box;
  21. 21 box-shadow: -2.82842712474619px 2.8284271247461903px 15px rgba(0, 0, 0, 0.2);
  22. 22 color: #ffffff;
  23. 23 overflow: hidden;
  24. 24}
  25. 25
  26. 26.player-content {
  27. 27 display: flex;
  28. 28 flex-direction: column;
  29. 29 flex: 1;
  30. 30}
  31. 31
  32. 32.album-artwork {
  33. 33 width: 100%;
  34. 34 aspect-ratio: 1;
  35. 35 position: relative;
  36. 36 overflow: hidden;
  37. 37}
  38. 38
  39. 39.artwork-image {
  40. 40 width: 100%;
  41. 41 height: 100%;
  42. 42 object-fit: cover;
  43. 43 border-radius: 4px;
  44. 44}
  45. 45
  46. 46.artwork-placeholder {
  47. 47 position: absolute;
  48. 48 top: 0;
  49. 49 left: 0;
  50. 50 width: 100%;
  51. 51 height: 100%;
  52. 52 display: flex;
  53. 53 align-items: center;
  54. 54 justify-content: center;
  55. 55 background: rgba(51, 51, 51, 0.2);
  56. 56 color: #ffffff;
  57. 57 font-size: 2rem;
  58. 58 border-radius: 4px;
  59. 59}
  60. 60
  61. 61/* Time bar styles */
  62. 62.time-bar-container {
  63. 63 width: 100%;
  64. 64 padding: 5px 0;
  65. 65 position: relative;
  66. 66}
  67. 67
  68. 68.time-bar {
  69. 69 width: 100%;
  70. 70 height: 4px;
  71. 71 background: #ffffff33;
  72. 72 border-radius: 2px;
  73. 73 overflow: hidden;
  74. 74 position: relative;
  75. 75}
  76. 76
  77. 77.time-bar-progress {
  78. 78 height: 100%;
  79. 79 background: #ffffff;
  80. 80 width: 0;
  81. 81 border-radius: 2px;
  82. 82 transition: width 0.1s linear;
  83. 83}
  84. 84
  85. 85.time-info {
  86. 86 display: flex;
  87. 87 justify-content: space-between;
  88. 88 padding: 5px 0;
  89. 89 font-size: 12px;
  90. 90 color: #ffffff !important;
  91. 91 width: 100%;
  92. 92}
  93. 93
  94. 94.elapsed-time {
  95. 95 text-align: left;
  96. 96}
  97. 97
  98. 98.duration-time {
  99. 99 text-align: right;
  100. 100}
  101. 101
  102. 102/* Station info styles */
  103. 103.station-info {
  104. 104 display: flex;
  105. 105 justify-content: space-between;
  106. 106 align-items: center;
  107. 107 width: 100%;
  108. 108 padding: 10px 0;
  109. 109}
  110. 110
  111. 111.radio-name {
  112. 112 font-size: 12px;
  113. 113 font-weight: 600;
  114. 114 color: #ffffff !important;
  115. 115 letter-spacing: .2px;
  116. 116 line-height: 1.5em;
  117. 117 word-spacing: 1px;
  118. 118}
  119. 119
  120. 120/* Live indicator styles */
  121. 121.live-container {
  122. 122 display: flex;
  123. 123 align-items: center;
  124. 124 gap: 5px;
  125. 125}
  126. 126
  127. 127.live-indicator {
  128. 128 width: 8px;
  129. 129 height: 8px;
  130. 130 border-radius: 50%;
  131. 131 background: #FF0000;
  132. 132 animation: pulse 2s infinite;
  133. 133}
  134. 134
  135. 135.live-text {
  136. 136 font-size: 12px;
  137. 137 color: #ffffff !important;
  138. 138 letter-spacing: .2px;
  139. 139 line-height: 1.5em;
  140. 140 word-spacing: 1px;
  141. 141}
  142. 142
  143. 143/* Song info styles */
  144. 144.song-info {
  145. 145 width: 100%;
  146. 146 padding: 15px 0;
  147. 147 text-align: left;
  148. 148}
  149. 149
  150. 150.song-name {
  151. 151 font-size: 14px;
  152. 152 font-weight: bold;
  153. 153 margin-bottom: 5px;
  154. 154 color: #ffffff !important;
  155. 155 letter-spacing: .2px;
  156. 156 line-height: 1.5em;
  157. 157 word-spacing: 1px;
  158. 158}
  159. 159
  160. 160.artist-name {
  161. 161 font-size: 12px;
  162. 162 opacity: 0.8;
  163. 163 color: #ffffff !important;
  164. 164 letter-spacing: .2px;
  165. 165 line-height: 1.5em;
  166. 166 word-spacing: 1px;
  167. 167}
  168. 168
  169. 169/* Controls styles */
  170. 170.controls-container {
  171. 171 position: relative;
  172. 172 width: 100%;
  173. 173}
  174. 174
  175. 175.controls {
  176. 176 display: flex;
  177. 177 align-items: center;
  178. 178 justify-content: center;
  179. 179 gap: 30px;
  180. 180 padding: 15px 20px;
  181. 181}
  182. 182
  183. 183.control-button {
  184. 184 background: transparent;
  185. 185 border: none;
  186. 186 color: #ffffff !important;
  187. 187 cursor: pointer;
  188. 188 padding: 0.25rem;
  189. 189 display: flex;
  190. 190 align-items: center;
  191. 191 justify-content: center;
  192. 192 font-size: 1rem;
  193. 193 font-weight: normal;
  194. 194 box-shadow: none;
  195. 195 border-radius: 0;
  196. 196 min-width: auto;
  197. 197 width: auto;
  198. 198 height: auto;
  199. 199 aspect-ratio: auto;
  200. 200 text-transform: none;
  201. 201 transition: color 0.1s ease, transform 0.2s ease;
  202. 202}
  203. 203
  204. 204.control-button:hover {
  205. 205 color: #ff6b6b !important;
  206. 206 transform: scale(1.1);
  207. 207}
  208. 208
  209. 209.control-button:active {
  210. 210 transform: scale(0.95);
  211. 211}
  212. 212
  213. 213.control-button:disabled {
  214. 214 opacity: 0.5;
  215. 215 cursor: not-allowed;
  216. 216}
  217. 217
  218. 218/* Volume control styles */
  219. 219.volume-bar-container {
  220. 220 position: absolute;
  221. 221 bottom: calc(100% + 5px);
  222. 222 left: 50%;
  223. 223 transform: translate(170%, 15px);
  224. 224 background: rgba(0, 0, 0, 0.9);
  225. 225 padding: 12px 8px;
  226. 226 border-radius: 8px;
  227. 227 opacity: 0;
  228. 228 visibility: hidden;
  229. 229 transition: all 0.2s ease;
  230. 230 z-index: 100;
  231. 231 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
  232. 232 cursor: default;
  233. 233 height: 100px;
  234. 234 width: 32px;
  235. 235 display: flex;
  236. 236 align-items: center;
  237. 237 justify-content: center;
  238. 238 backdrop-filter: blur(10px);
  239. 239}
  240. 240
  241. 241.volume-bar-container:before {
  242. 242 content: '';
  243. 243 position: absolute;
  244. 244 bottom: -5px;
  245. 245 left: 50%;
  246. 246 transform: translateX(-50%);
  247. 247 width: 0;
  248. 248 height: 0;
  249. 249 border-left: 5px solid transparent;
  250. 250 border-right: 5px solid transparent;
  251. 251 border-top: 5px solid rgba(0, 0, 0, 0.9);
  252. 252}
  253. 253
  254. 254.volume-bar-container.show {
  255. 255 opacity: 1;
  256. 256 visibility: visible;
  257. 257}
  258. 258
  259. 259.volume-slider {
  260. 260 -webkit-appearance: none !important;
  261. 261 appearance: none !important;
  262. 262 width: 80px !important;
  263. 263 height: 4px !important;
  264. 264 background: #ffffff40 !important;
  265. 265 border-radius: 2px !important;
  266. 266 outline: none !important;
  267. 267 transform: rotate(-90deg) !important;
  268. 268 transform-origin: center !important;
  269. 269 margin: 0 !important;
  270. 270 cursor: pointer !important;
  271. 271 position: absolute !important;
  272. 272 border: none !important;
  273. 273 box-shadow: none !important;
  274. 274}
  275. 275
  276. 276.volume-slider::-webkit-slider-thumb {
  277. 277 -webkit-appearance: none !important;
  278. 278 appearance: none !important;
  279. 279 width: 12px !important;
  280. 280 height: 12px !important;
  281. 281 background: #ffffff !important;
  282. 282 border-radius: 50% !important;
  283. 283 cursor: pointer !important;
  284. 284 transition: transform 0.2s ease !important;
  285. 285 transform-origin: center !important;
  286. 286 border: none !important;
  287. 287 margin-top: -4px !important;
  288. 288 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) !important;
  289. 289}
  290. 290
  291. 291.volume-slider::-moz-range-thumb {
  292. 292 width: 12px !important;
  293. 293 height: 12px !important;
  294. 294 background: #ffffff !important;
  295. 295 border-radius: 50% !important;
  296. 296 cursor: pointer !important;
  297. 297 transition: transform 0.2s ease !important;
  298. 298 transform-origin: center !important;
  299. 299 border: none !important;
  300. 300 margin-top: -4px !important;
  301. 301 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3) !important;
  302. 302}
  303. 303
  304. 304.volume-slider::-webkit-slider-runnable-track {
  305. 305 height: 4px !important;
  306. 306 border-radius: 2px !important;
  307. 307 background: inherit !important;
  308. 308 border: none !important;
  309. 309 box-shadow: none !important;
  310. 310}
  311. 311
  312. 312.volume-slider::-moz-range-track {
  313. 313 height: 4px !important;
  314. 314 border-radius: 2px !important;
  315. 315 background: inherit !important;
  316. 316 border: none !important;
  317. 317 box-shadow: none !important;
  318. 318}
  319. 319
  320. 320.volume-slider::-webkit-slider-thumb:hover {
  321. 321 transform: scale(1.2) !important;
  322. 322}
  323. 323
  324. 324.volume-slider::-moz-range-thumb:hover {
  325. 325 transform: scale(1.2) !important;
  326. 326}
  327. 327
  328. 328.volume-button:hover .volume-bar-container,
  329. 329.volume-bar-container:hover {
  330. 330 opacity: 1;
  331. 331 visibility: visible;
  332. 332}
  333. 333
  334. 334/* History Modal Styles */
  335. 335.history-modal {
  336. 336 position: fixed;
  337. 337 top: 0;
  338. 338 left: 0;
  339. 339 right: 0;
  340. 340 bottom: 0;
  341. 341 z-index: 9999;
  342. 342 display: none;
  343. 343}
  344. 344
  345. 345.history-modal-overlay {
  346. 346 position: fixed;
  347. 347 top: 0;
  348. 348 left: 0;
  349. 349 right: 0;
  350. 350 bottom: 0;
  351. 351 background: rgba(0, 0, 0, 0.7);
  352. 352 z-index: 10000;
  353. 353 backdrop-filter: blur(5px);
  354. 354}
  355. 355
  356. 356.history-modal-content {
  357. 357 position: fixed;
  358. 358 top: 50%;
  359. 359 left: 50%;
  360. 360 transform: translate(-50%, -50%);
  361. 361 background: rgba(0, 0, 0, 0.95);
  362. 362 padding: 1.5rem;
  363. 363 border-radius: 12px;
  364. 364 box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.4), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
  365. 365 z-index: 10001;
  366. 366 max-width: 500px;
  367. 367 width: 90%;
  368. 368 max-height: 80vh;
  369. 369 overflow-y: auto;
  370. 370 font-family: 'Poppins', sans-serif;
  371. 371 scrollbar-width: thin;
  372. 372 scrollbar-color: rgba(255, 255, 255, 0.3) transparent;
  373. 373 border: 1px solid rgba(255, 255, 255, 0.1);
  374. 374 backdrop-filter: blur(20px);
  375. 375}
  376. 376
  377. 377/* WebKit scrollbar styles */
  378. 378.history-modal-content::-webkit-scrollbar {
  379. 379 width: 6px;
  380. 380 height: 6px;
  381. 381}
  382. 382
  383. 383.history-modal-content::-webkit-scrollbar-track {
  384. 384 background: transparent;
  385. 385 border-radius: 3px;
  386. 386}
  387. 387
  388. 388.history-modal-content::-webkit-scrollbar-thumb {
  389. 389 background: rgba(255, 255, 255, 0.3);
  390. 390 border-radius: 3px;
  391. 391 transition: background 0.2s;
  392. 392}
  393. 393
  394. 394.history-modal-content::-webkit-scrollbar-thumb:hover {
  395. 395 background: rgba(255, 255, 255, 0.5);
  396. 396}
  397. 397
  398. 398.history-modal-title {
  399. 399 font-size: 1.125rem;
  400. 400 font-weight: 600;
  401. 401 color: #ffffff !important;
  402. 402 margin: 0 0 1rem 0;
  403. 403 padding-right: 1.5rem;
  404. 404 letter-spacing: .2px;
  405. 405 line-height: 1.5em;
  406. 406 word-spacing: 1px;
  407. 407}
  408. 408
  409. 409.history-modal-close {
  410. 410 position: absolute;
  411. 411 top: 1rem;
  412. 412 right: 1rem;
  413. 413 background: none;
  414. 414 border: none;
  415. 415 color: #ffffff !important;
  416. 416 cursor: pointer;
  417. 417 padding: 0.5rem;
  418. 418 display: flex;
  419. 419 align-items: center;
  420. 420 justify-content: center;
  421. 421 border-radius: 7px;
  422. 422 transition: background 0.2s ease;
  423. 423}
  424. 424
  425. 425.history-modal-close:hover {
  426. 426 background: rgba(255, 255, 255, 0.1);
  427. 427}
  428. 428
  429. 429.history-list {
  430. 430 display: flex;
  431. 431 flex-direction: column;
  432. 432 gap: 1rem;
  433. 433}
  434. 434
  435. 435.history-item {
  436. 436 display: flex;
  437. 437 gap: 1rem;
  438. 438 align-items: center;
  439. 439 padding: 0.5rem;
  440. 440 border-radius: 8px;
  441. 441 transition: background-color 0.2s;
  442. 442}
  443. 443
  444. 444.history-item:hover {
  445. 445 background: rgba(255, 255, 255, 0.05);
  446. 446}
  447. 447
  448. 448.history-artwork {
  449. 449 width: 50px;
  450. 450 height: 50px;
  451. 451 border-radius: 4px;
  452. 452 overflow: hidden;
  453. 453 flex-shrink: 0;
  454. 454 background: rgba(255, 255, 255, 0.1);
  455. 455}
  456. 456
  457. 457.history-artwork img {
  458. 458 width: 100%;
  459. 459 height: 100%;
  460. 460 object-fit: cover;
  461. 461}
  462. 462
  463. 463.history-song-info {
  464. 464 display: flex;
  465. 465 flex-direction: column;
  466. 466 gap: 0.25rem;
  467. 467 flex: 1;
  468. 468 min-width: 0;
  469. 469}
  470. 470
  471. 471.history-song-title {
  472. 472 font-size: 0.875rem;
  473. 473 font-weight: 500;
  474. 474 color: #ffffff !important;
  475. 475 letter-spacing: .2px;
  476. 476 line-height: 1.5em;
  477. 477 word-spacing: 1px;
  478. 478 overflow: hidden;
  479. 479 text-overflow: ellipsis;
  480. 480 white-space: nowrap;
  481. 481}
  482. 482
  483. 483.history-artist-name {
  484. 484 font-size: 0.75rem;
  485. 485 color: #ffffff99 !important;
  486. 486 letter-spacing: .2px;
  487. 487 line-height: 1.5em;
  488. 488 word-spacing: 1px;
  489. 489 overflow: hidden;
  490. 490 text-overflow: ellipsis;
  491. 491 white-space: nowrap;
  492. 492}
  493. 493
  494. 494/* Button styles for different sizes */
  495. 495.radio-player .control-button {
  496. 496 padding: 5px;
  497. 497 width: 36px;
  498. 498 height: 36px;
  499. 499 display: flex;
  500. 500 align-items: center;
  501. 501 justify-content: center;
  502. 502 font-size: 1rem;
  503. 503}
  504. 504
  505. 505.radio-player .control-button.play-button {
  506. 506 width: calc(36px * 1.3);
  507. 507 height: calc(36px * 1.3);
  508. 508 font-size: 1.5rem;
  509. 509}
  510. 510
  511. 511.radio-player .control-button .fa-play {
  512. 512 margin-left: 2px;
  513. 513 font-size: inherit;
  514. 514}
  515. 515
  516. 516.radio-player .control-button .fa-pause {
  517. 517 font-size: inherit;
  518. 518}
  519. 519
  520. 520/* Footer layout styles */
  521. 521.radio-player.footer {
  522. 522 position: fixed;
  523. 523 bottom: 0;
  524. 524 left: 0;
  525. 525 right: 0;
  526. 526 width: 100%;
  527. 527 margin: 0;
  528. 528 border-radius: 0;
  529. 529 z-index: 9999;
  530. 530 padding: 15px 20px;
  531. 531 overflow: visible;
  532. 532 backdrop-filter: blur(10px);
  533. 533 border-top: 1px solid rgba(255, 255, 255, 0.1);
  534. 534}
  535. 535
  536. 536.radio-player.footer .player-content {
  537. 537 display: flex;
  538. 538 flex-direction: row;
  539. 539 align-items: center;
  540. 540 justify-content: space-between;
  541. 541 gap: 20px;
  542. 542 margin-bottom: 10px;
  543. 543 position: relative;
  544. 544 overflow: visible;
  545. 545}
  546. 546
  547. 547.radio-player.footer .player-left {
  548. 548 display: flex;
  549. 549 align-items: center;
  550. 550 gap: 15px;
  551. 551 position: relative;
  552. 552 overflow: visible;
  553. 553}
  554. 554
  555. 555.radio-player.footer .controls {
  556. 556 display: flex;
  557. 557 align-items: center;
  558. 558 gap: 15px;
  559. 559 padding: 0;
  560. 560 position: relative;
  561. 561 overflow: visible;
  562. 562}
  563. 563
  564. 564.radio-player.footer .player-center {
  565. 565 display: flex;
  566. 566 align-items: center;
  567. 567 gap: 15px;
  568. 568 flex: 1;
  569. 569 min-width: 0;
  570. 570}
  571. 571
  572. 572.radio-player.footer .album-artwork {
  573. 573 width: 63px;
  574. 574 height: 63px;
  575. 575 flex-shrink: 0;
  576. 576 border-radius: 8px;
  577. 577 overflow: hidden;
  578. 578 box-shadow: 0 4px 8px rgba(0, 0, 0, 0.3);
  579. 579}
  580. 580
  581. 581.radio-player.footer .player-info {
  582. 582 flex: 1;
  583. 583 min-width: 0;
  584. 584}
  585. 585
  586. 586.radio-player.footer .song-info {
  587. 587 padding: 0;
  588. 588}
  589. 589
  590. 590.radio-player.footer .song-name {
  591. 591 font-size: 16px;
  592. 592 margin-bottom: 4px;
  593. 593 white-space: nowrap;
  594. 594 overflow: hidden;
  595. 595 text-overflow: ellipsis;
  596. 596 color: #ffffff !important;
  597. 597 letter-spacing: .2px;
  598. 598 line-height: 1.5em;
  599. 599 word-spacing: 1px;
  600. 600 font-weight: 600;
  601. 601}
  602. 602
  603. 603.radio-player.footer .artist-name {
  604. 604 font-size: 14px;
  605. 605 white-space: nowrap;
  606. 606 overflow: hidden;
  607. 607 text-overflow: ellipsis;
  608. 608 opacity: 0.8;
  609. 609 color: #ffffff !important;
  610. 610 letter-spacing: .2px;
  611. 611 line-height: 1.5em;
  612. 612 word-spacing: 1px;
  613. 613}
  614. 614
  615. 615.radio-player.footer .player-right {
  616. 616 display: flex;
  617. 617 align-items: center;
  618. 618 gap: 15px;
  619. 619}
  620. 620
  621. 621.radio-player.footer .time-info {
  622. 622 display: flex;
  623. 623 align-items: center;
  624. 624 max-width: fit-content;
  625. 625 font-size: 14px;
  626. 626 justify-content: left;
  627. 627 color: #ffffff !important;
  628. 628 font-weight: 500;
  629. 629}
  630. 630
  631. 631.radio-player.footer .radio-name {
  632. 632 font-size: 14px;
  633. 633 max-width: fit-content;
  634. 634 color: #ffffff !important;
  635. 635 letter-spacing: .2px;
  636. 636 line-height: 1.5em;
  637. 637 word-spacing: 1px;
  638. 638}
  639. 639
  640. 640.radio-player.footer .live-container {
  641. 641 display: flex;
  642. 642 align-items: center;
  643. 643 gap: 5px;
  644. 644 max-width: fit-content;
  645. 645 padding: 4px 8px;
  646. 646 border-radius: 12px;
  647. 647 background: rgba(255, 0, 0, 0.2);
  648. 648 border: 1px solid rgba(255, 0, 0, 0.3);
  649. 649}
  650. 650
  651. 651.radio-player.footer .live-text {
  652. 652 font-size: 12px;
  653. 653 color: #ffffff !important;
  654. 654 letter-spacing: .2px;
  655. 655 line-height: 1.5em;
  656. 656 word-spacing: 1px;
  657. 657 font-weight: 600;
  658. 658}
  659. 659
  660. 660.radio-player.footer .time-bar-container {
  661. 661 position: absolute;
  662. 662 bottom: 0;
  663. 663 left: 0;
  664. 664 width: 100%;
  665. 665 height: 4px;
  666. 666}
  667. 667
  668. 668.radio-player.footer .time-bar {
  669. 669 width: 100%;
  670. 670 height: 100%;
  671. 671 background: #ffffff33;
  672. 672 border-radius: 0;
  673. 673}
  674. 674
  675. 675.radio-player.footer .time-bar-progress {
  676. 676 height: 100%;
  677. 677 background: linear-gradient(90deg, #ff6b6b 0%, #ffffff 100%);
  678. 678}
  679. 679
  680. 680.radio-player.footer .volume-bar-container {
  681. 681 position: absolute;
  682. 682 bottom: calc(100% + 5px);
  683. 683 left: 50%;
  684. 684 transform: translateX(-40%);
  685. 685 background: rgba(0, 0, 0, 0.9);
  686. 686 padding: 12px 8px;
  687. 687 border-radius: 8px;
  688. 688 opacity: 0;
  689. 689 visibility: hidden;
  690. 690 transition: all 0.2s ease;
  691. 691 z-index: 10000;
  692. 692 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
  693. 693 cursor: default;
  694. 694 height: 100px;
  695. 695 width: 32px;
  696. 696 display: flex;
  697. 697 align-items: center;
  698. 698 justify-content: center;
  699. 699 backdrop-filter: blur(10px);
  700. 700 border: 1px solid rgba(255, 255, 255, 0.1);
  701. 701}
  702. 702
  703. 703.radio-player.footer .volume-bar-container:before {
  704. 704 content: '';
  705. 705 position: absolute;
  706. 706 bottom: -5px;
  707. 707 left: 50%;
  708. 708 transform: translateX(-50%);
  709. 709 width: 0;
  710. 710 height: 0;
  711. 711 border-left: 5px solid transparent;
  712. 712 border-right: 5px solid transparent;
  713. 713 border-top: 5px solid rgba(0, 0, 0, 0.9);
  714. 714}
  715. 715
  716. 716.radio-player.footer .volume-bar-container.show {
  717. 717 opacity: 1;
  718. 718 visibility: visible;
  719. 719}
  720. 720
  721. 721.radio-player.footer .volume-slider {
  722. 722 -webkit-appearance: none;
  723. 723 width: 80px;
  724. 724 height: 4px;
  725. 725 background: #ffffff40;
  726. 726 border-radius: 2px;
  727. 727 outline: none;
  728. 728 transform: rotate(-90deg);
  729. 729 transform-origin: center;
  730. 730 margin: 0;
  731. 731 cursor: pointer;
  732. 732 position: absolute;
  733. 733}
  734. 734
  735. 735.radio-player.footer .volume-button {
  736. 736 position: relative;
  737. 737 overflow: visible;
  738. 738}
  739. 739
  740. 740/* PWA-specific styles */
  741. 741.pwa-mode .radio-player.footer {
  742. 742 padding-bottom: 20px;
  743. 743}
  744. 744
  745. 745/* Install Banner Styles */
  746. 746.install-banner {
  747. 747 position: absolute;
  748. 748 top: -80px;
  749. 749 left: 0;
  750. 750 right: 0;
  751. 751 background: linear-gradient(135deg, #1a1a1a 0%, #2d2d2d 100%);
  752. 752 border: 1px solid rgba(255, 255, 255, 0.1);
  753. 753 border-radius: 8px 8px 0 0;
  754. 754 padding: 12px 20px;
  755. 755 animation: slideDown 0.3s ease-out;
  756. 756 z-index: 10001;
  757. 757 backdrop-filter: blur(10px);
  758. 758}
  759. 759
  760. 760.install-banner-content {
  761. 761 display: flex;
  762. 762 align-items: center;
  763. 763 gap: 12px;
  764. 764}
  765. 765
  766. 766.install-banner-icon {
  767. 767 font-size: 1.5rem;
  768. 768}
  769. 769
  770. 770.install-banner-text {
  771. 771 flex: 1;
  772. 772}
  773. 773
  774. 774.install-banner-title {
  775. 775 font-weight: 600;
  776. 776 color: #ffffff;
  777. 777 margin-bottom: 2px;
  778. 778 font-size: 14px;
  779. 779}
  780. 780
  781. 781.install-banner-description {
  782. 782 font-size: 12px;
  783. 783 color: rgba(255, 255, 255, 0.7);
  784. 784}
  785. 785
  786. 786.install-banner-actions {
  787. 787 display: flex;
  788. 788 gap: 8px;
  789. 789}
  790. 790
  791. 791.install-banner-button {
  792. 792 padding: 6px 12px;
  793. 793 border: none;
  794. 794 border-radius: 4px;
  795. 795 font-size: 12px;
  796. 796 font-weight: 500;
  797. 797 cursor: pointer;
  798. 798 transition: all 0.2s ease;
  799. 799}
  800. 800
  801. 801.install-banner-button.install-now {
  802. 802 background: #ffffff;
  803. 803 color: #000000;
  804. 804}
  805. 805
  806. 806.install-banner-button.install-now:hover {
  807. 807 background: #f0f0f0;
  808. 808 transform: translateY(-1px);
  809. 809}
  810. 810
  811. 811.install-banner-button.install-later {
  812. 812 background: transparent;
  813. 813 color: rgba(255, 255, 255, 0.7);
  814. 814 border: 1px solid rgba(255, 255, 255, 0.3);
  815. 815}
  816. 816
  817. 817.install-banner-button.install-later:hover {
  818. 818 background: rgba(255, 255, 255, 0.1);
  819. 819 color: #ffffff;
  820. 820}
  821. 821
  822. 822/* Update Banner Styles */
  823. 823.update-banner {
  824. 824 position: absolute;
  825. 825 top: -60px;
  826. 826 left: 0;
  827. 827 right: 0;
  828. 828 background: linear-gradient(135deg, #1e3a8a 0%, #3b82f6 100%);
  829. 829 border-radius: 8px 8px 0 0;
  830. 830 padding: 12px 20px;
  831. 831 animation: slideDown 0.3s ease-out;
  832. 832 z-index: 10001;
  833. 833 backdrop-filter: blur(10px);
  834. 834}
  835. 835
  836. 836.update-banner-content {
  837. 837 display: flex;
  838. 838 align-items: center;
  839. 839 justify-content: space-between;
  840. 840 gap: 12px;
  841. 841}
  842. 842
  843. 843.update-banner-text {
  844. 844 flex: 1;
  845. 845}
  846. 846
  847. 847.update-banner-title {
  848. 848 font-weight: 600;
  849. 849 color: #ffffff;
  850. 850 margin-bottom: 2px;
  851. 851 font-size: 14px;
  852. 852}
  853. 853
  854. 854.update-banner-description {
  855. 855 font-size: 12px;
  856. 856 color: rgba(255, 255, 255, 0.8);
  857. 857}
  858. 858
  859. 859.update-banner-button {
  860. 860 padding: 6px 16px;
  861. 861 border: none;
  862. 862 border-radius: 4px;
  863. 863 font-size: 12px;
  864. 864 font-weight: 500;
  865. 865 cursor: pointer;
  866. 866 background: #ffffff;
  867. 867 color: #1e3a8a;
  868. 868 transition: all 0.2s ease;
  869. 869}
  870. 870
  871. 871.update-banner-button:hover {
  872. 872 background: #f0f0f0;
  873. 873 transform: translateY(-1px);
  874. 874}
  875. 875
  876. 876/* PWA Toast Notifications */
  877. 877.pwa-toast {
  878. 878 position: fixed;
  879. 879 top: 20px;
  880. 880 right: 20px;
  881. 881 background: rgba(45, 45, 45, 0.95);
  882. 882 border: 1px solid rgba(255, 255, 255, 0.1);
  883. 883 border-radius: 8px;
  884. 884 padding: 12px 16px;
  885. 885 color: #ffffff;
  886. 886 z-index: 10002;
  887. 887 transform: translateX(100%);
  888. 888 transition: transform 0.3s ease;
  889. 889 max-width: 300px;
  890. 890 backdrop-filter: blur(10px);
  891. 891 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
  892. 892}
  893. 893
  894. 894.pwa-toast.show {
  895. 895 transform: translateX(0);
  896. 896}
  897. 897
  898. 898.pwa-toast-success {
  899. 899 background: linear-gradient(135deg, rgba(6, 95, 70, 0.95) 0%, rgba(16, 185, 129, 0.95) 100%);
  900. 900 border-color: rgba(16, 185, 129, 0.3);
  901. 901}
  902. 902
  903. 903.pwa-toast-content {
  904. 904 display: flex;
  905. 905 align-items: center;
  906. 906 gap: 8px;
  907. 907}
  908. 908
  909. 909.pwa-toast-content i {
  910. 910 font-size: 1.2rem;
  911. 911}
  912. 912
  913. 913/* Install Button Styling */
  914. 914.install-button {
  915. 915 position: relative;
  916. 916 overflow: visible;
  917. 917}
  918. 918
  919. 919.install-button::after {
  920. 920 content: '';
  921. 921 position: absolute;
  922. 922 top: -2px;
  923. 923 right: -2px;
  924. 924 width: 8px;
  925. 925 height: 8px;
  926. 926 background: #10b981;
  927. 927 border-radius: 50%;
  928. 928 animation: pulse 2s infinite;
  929. 929}
  930. 930
  931. 931/* Loading states */
  932. 932.control-button .fa-spinner {
  933. 933 animation: spin 1s linear infinite;
  934. 934}
  935. 935
  936. 936/* Animations */
  937. 937@keyframes pulse {
  938. 938 0%, 100% {
  939. 939 opacity: 1;
  940. 940 transform: scale(1);
  941. 941 }
  942. 942 50% {
  943. 943 opacity: 0.5;
  944. 944 transform: scale(1.2);
  945. 945 }
  946. 946}
  947. 947
  948. 948@keyframes slideDown {
  949. 949 from {
  950. 950 transform: translateY(-100%);
  951. 951 opacity: 0;
  952. 952 }
  953. 953 to {
  954. 954 transform: translateY(0);
  955. 955 opacity: 1;
  956. 956 }
  957. 957}
  958. 958
  959. 959@keyframes spin {
  960. 960 from {
  961. 961 transform: rotate(0deg);
  962. 962 }
  963. 963 to {
  964. 964 transform: rotate(360deg);
  965. 965 }
  966. 966}
  967. 967
  968. 968/* PWA Mode Adjustments */
  969. 969@media (display-mode: standalone) {
  970. 970 body {
  971. 971 padding-top: env(safe-area-inset-top);
  972. 972 padding-bottom: env(safe-area-inset-bottom);
  973. 973 }
  974. 974
  975. 975 .radio-player.footer {
  976. 976 bottom: env(safe-area-inset-bottom);
  977. 977 }
  978. 978}
  979. 979
  980. 980/* Mobile optimizations */
  981. 981@media (max-width: 768px) {
  982. 982 .radio-player.footer {
  983. 983 padding: 12px 15px;
  984. 984 }
  985. 985
  986. 986 .radio-player.footer .player-content {
  987. 987 gap: 15px;
  988. 988 }
  989. 989
  990. 990 .radio-player.footer .album-artwork {
  991. 991 width: 50px;
  992. 992 height: 50px;
  993. 993 }
  994. 994
  995. 995 .radio-player.footer .song-name {
  996. 996 font-size: 14px;
  997. 997 }
  998. 998
  999. 999 .radio-player.footer .artist-name {
  1000. 1000 font-size: 12px;
  1001. 1001 }
  1002. 1002
  1003. 1003 .radio-player.footer .time-info {
  1004. 1004 font-size: 12px;
  1005. 1005 }
  1006. 1006
  1007. 1007 .radio-player.footer .radio-name {
  1008. 1008 font-size: 12px;
  1009. 1009 }
  1010. 1010
  1011. 1011 .radio-player.footer .live-text {
  1012. 1012 font-size: 10px;
  1013. 1013 }
  1014. 1014
  1015. 1015 .radio-player.footer .controls {
  1016. 1016 gap: 10px;
  1017. 1017 }
  1018. 1018
  1019. 1019 .radio-player.footer .control-button {
  1020. 1020 width: 32px;
  1021. 1021 height: 32px;
  1022. 1022 font-size: 0.9rem;
  1023. 1023 }
  1024. 1024
  1025. 1025 .radio-player.footer .control-button.play-button {
  1026. 1026 width: calc(32px * 1.3);
  1027. 1027 height: calc(32px * 1.3);
  1028. 1028 font-size: 1.3rem;
  1029. 1029 }
  1030. 1030
  1031. 1031 .install-banner {
  1032. 1032 top: -70px;
  1033. 1033 padding: 10px 15px;
  1034. 1034 }
  1035. 1035
  1036. 1036 .install-banner-title {
  1037. 1037 font-size: 13px;
  1038. 1038 }
  1039. 1039
  1040. 1040 .install-banner-description {
  1041. 1041 font-size: 11px;
  1042. 1042 }
  1043. 1043
  1044. 1044 .install-banner-button {
  1045. 1045 padding: 5px 10px;
  1046. 1046 font-size: 11px;
  1047. 1047 }
  1048. 1048
  1049. 1049 .pwa-toast {
  1050. 1050 top: 10px;
  1051. 1051 right: 10px;
  1052. 1052 left: 10px;
  1053. 1053 max-width: none;
  1054. 1054 }
  1055. 1055
  1056. 1056 .history-modal-content {
  1057. 1057 width: 95%;
  1058. 1058 padding: 1rem;
  1059. 1059 max-height: 85vh;
  1060. 1060 }
  1061. 1061
  1062. 1062 .history-item {
  1063. 1063 padding: 0.75rem;
  1064. 1064 }
  1065. 1065
  1066. 1066 .history-artwork {
  1067. 1067 width: 40px;
  1068. 1068 height: 40px;
  1069. 1069 }
  1070. 1070}
  1071. 1071
  1072. 1072/* Small mobile devices */
  1073. 1073@media (max-width: 480px) {
  1074. 1074 .radio-player.footer .player-right {
  1075. 1075 display: none;
  1076. 1076 }
  1077. 1077
  1078. 1078 .radio-player.footer .player-content {
  1079. 1079 flex-direction: column;
  1080. 1080 align-items: stretch;
  1081. 1081 gap: 10px;
  1082. 1082 }
  1083. 1083
  1084. 1084 .radio-player.footer .player-center {
  1085. 1085 order: -1;
  1086. 1086 }
  1087. 1087
  1088. 1088 .radio-player.footer .controls {
  1089. 1089 justify-content: center;
  1090. 1090 gap: 20px;
  1091. 1091 }
  1092. 1092
  1093. 1093 .radio-player.footer {
  1094. 1094 padding: 10px;
  1095. 1095 }
  1096. 1096}
  1097. 1097
  1098. 1098/* High DPI displays */
  1099. 1099@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
  1100. 1100 .artwork-image {
  1101. 1101 image-rendering: -webkit-optimize-contrast;
  1102. 1102 image-rendering: crisp-edges;
  1103. 1103 }
  1104. 1104}
  1105. 1105
  1106. 1106/* Dark theme support */
  1107. 1107@media (prefers-color-scheme: dark) {
  1108. 1108 .radio-player {
  1109. 1109 background: rgba(0, 0, 0, 0.9);
  1110. 1110 }
  1111. 1111
  1112. 1112 .volume-bar-container {
  1113. 1113 background: rgba(0, 0, 0, 0.95);
  1114. 1114 }
  1115. 1115
  1116. 1116 .history-modal-content {
  1117. 1117 background: rgba(0, 0, 0, 0.98);
  1118. 1118 }
  1119. 1119}
  1120. 1120
  1121. 1121/* Reduced motion support */
  1122. 1122@media (prefers-reduced-motion: reduce) {
  1123. 1123 .control-button,
  1124. 1124 .volume-slider::-webkit-slider-thumb,
  1125. 1125 .volume-slider::-moz-range-thumb,
  1126. 1126 .time-bar-progress,
  1127. 1127 .pwa-toast,
  1128. 1128 .install-banner,
  1129. 1129 .update-banner {
  1130. 1130 transition: none;
  1131. 1131 }
  1132. 1132
  1133. 1133 .live-indicator,
  1134. 1134 .install-button::after {
  1135. 1135 animation: none;
  1136. 1136 }
  1137. 1137}
  1138. 1138
  1139. 1139/* Focus states for accessibility */
  1140. 1140.control-button:focus,
  1141. 1141.volume-slider:focus,
  1142. 1142.history-modal-close:focus,
  1143. 1143.install-banner-button:focus,
  1144. 1144.update-banner-button:focus {
  1145. 1145 outline: 2px solid #ffffff;
  1146. 1146 outline-offset: 2px;
  1147. 1147}
  1148. 1148
  1149. 1149/* Print styles */
  1150. 1150@media print {
  1151. 1151 .radio-player {
  1152. 1152 display: none;
  1153. 1153 }
  1154. 1154}

Raw Paste

Comments 0
Login to post a comment.
  • No comments yet. Be the first.
Login to post a comment. Login or Register
We use cookies. To comply with GDPR in the EU and the UK we have to show you these.

We use cookies and similar technologies to keep this website functional (including spam protection via Google reCAPTCHA or Cloudflare Turnstile), and — with your consent — to measure usage and show ads. See Privacy.