index.css 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. /* =========
  2. Dark 4K TV Dashboard Theme (grid-only, no media queries)
  3. Copy/paste into <style>...</style>
  4. ========= */
  5. :root{
  6. /* Core palette */
  7. --bg: #0b0f16;
  8. --surface: rgba(255,255,255,0.06);
  9. --surface-2: rgba(255,255,255,0.09);
  10. --border: rgba(255,255,255,0.10);
  11. --text: rgba(255,255,255,0.92);
  12. --muted: rgba(255,255,255,0.68);
  13. --faint: rgba(255,255,255,0.52);
  14. /* Accents */
  15. --accent: #4cc9f0; /* cool cyan */
  16. --accent-2: #a78bfa; /* soft purple */
  17. /* 4K layout tuning */
  18. --pad: 26px;
  19. --gap: 22px;
  20. --radius: 22px;
  21. --radius-sm: 14px;
  22. /* Type */
  23. --font: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, "Noto Sans", Arial, sans-serif;
  24. }
  25. *{ box-sizing:border-box; }
  26. html, body{ height:100%; width:100%; }
  27. body{
  28. margin:0;
  29. font-family: var(--font);
  30. color: var(--text);
  31. background:
  32. radial-gradient(1600px 800px at 20% 10%, rgba(76,201,240,0.12), transparent 60%),
  33. radial-gradient(1200px 700px at 85% 20%, rgba(167,139,250,0.10), transparent 55%),
  34. radial-gradient(1200px 900px at 50% 100%, rgba(255,255,255,0.06), transparent 55%),
  35. var(--bg);
  36. overflow:hidden; /* never scroll on TV */
  37. -webkit-font-smoothing: antialiased;
  38. text-rendering: geometricPrecision;
  39. }
  40. /* =========
  41. Grid Layout (2x2 always)
  42. ========= */
  43. .grid{
  44. height:100vh;
  45. width:100vw;
  46. padding: var(--pad);
  47. display:grid;
  48. grid-template-columns: minmax(0, 1.05fr) minmax(0, 1.45fr);
  49. grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
  50. gap: var(--gap);
  51. filter: brightness(0.98);
  52. }
  53. /* Ensure grid children can shrink and never overflow their column */
  54. .topLeft, .topRight, .bottomLeft, .bottomRight{
  55. position:relative;
  56. min-width: 0;
  57. min-height: 0;
  58. border-radius: var(--radius);
  59. background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03));
  60. border: 1px solid var(--border);
  61. box-shadow:
  62. 0 14px 40px rgba(0,0,0,0.38),
  63. inset 0 1px 0 rgba(255,255,255,0.06);
  64. overflow:hidden;
  65. }
  66. /* =========
  67. Top Left: Date/Time + Current Weather
  68. ========= */
  69. .topLeft{
  70. display:flex;
  71. flex-direction:column;
  72. padding: var(--pad);
  73. gap: 18px;
  74. min-width: 0;
  75. min-height: 0;
  76. }
  77. /* Date/Time card */
  78. .dateTime{
  79. flex: 0 0 auto;
  80. display:flex;
  81. flex-direction:column;
  82. gap: 8px;
  83. padding: 16px 18px;
  84. border-radius: var(--radius-sm);
  85. background: rgba(0,0,0,0.22);
  86. border: 1px solid rgba(255,255,255,0.08);
  87. }
  88. #date{
  89. margin:0;
  90. font-size: clamp(20px, 1.05vw, 34px);
  91. letter-spacing: 0.4px;
  92. color: var(--muted);
  93. }
  94. #time{
  95. margin:0;
  96. font-size: clamp(52px, 2.6vw, 104px);
  97. font-weight: 720;
  98. letter-spacing: 1.2px;
  99. line-height: 1.02;
  100. color: var(--text);
  101. }
  102. /* Weather block */
  103. .weather{
  104. flex: 1 1 auto;
  105. min-height: 0;
  106. min-width: 0;
  107. display:flex;
  108. }
  109. .weatherBlock{
  110. flex: 1 1 auto;
  111. min-height: 0;
  112. min-width: 0;
  113. padding: 18px;
  114. border-radius: var(--radius-sm);
  115. background:
  116. radial-gradient(900px 320px at 20% 10%, rgba(76,201,240,0.10), transparent 60%),
  117. rgba(0,0,0,0.18);
  118. border: 1px solid rgba(255,255,255,0.08);
  119. display:flex;
  120. flex-direction:column;
  121. gap: 14px;
  122. }
  123. .weatherBlock h2{
  124. margin:0;
  125. font-size: clamp(18px, 0.9vw, 26px);
  126. font-weight: 750;
  127. letter-spacing: 0.6px;
  128. color: var(--text);
  129. display:flex;
  130. align-items:center;
  131. gap: 10px;
  132. }
  133. .weatherBlock h2::before{
  134. content:"";
  135. width: 10px;
  136. height: 10px;
  137. border-radius: 50%;
  138. background: linear-gradient(135deg, var(--accent), var(--accent-2));
  139. box-shadow: 0 0 18px rgba(76,201,240,0.35);
  140. }
  141. /* Condition row: icon + text */
  142. .condition{
  143. display:flex;
  144. align-items:center;
  145. gap: 14px;
  146. padding: 12px 14px;
  147. border-radius: 16px;
  148. background: rgba(255,255,255,0.04);
  149. border: 1px solid rgba(255,255,255,0.06);
  150. min-width: 0;
  151. }
  152. .condition img{
  153. width: clamp(48px, 2.0vw, 72px);
  154. height: clamp(48px, 2.0vw, 72px);
  155. object-fit: contain;
  156. filter: drop-shadow(0 8px 14px rgba(0,0,0,0.45));
  157. flex: 0 0 auto;
  158. }
  159. .conditionText{
  160. margin:0;
  161. font-size: clamp(20px, 1.05vw, 34px);
  162. font-weight: 680;
  163. letter-spacing: 0.2px;
  164. color: var(--text);
  165. overflow:hidden;
  166. text-overflow: ellipsis;
  167. white-space: nowrap;
  168. }
  169. /* Weather info list */
  170. .weatherInfo{
  171. display:grid;
  172. grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  173. gap: 12px 14px;
  174. margin-top: 2px;
  175. min-width: 0;
  176. }
  177. .weatherInfo p{
  178. margin:0;
  179. padding: 12px 14px;
  180. border-radius: 16px;
  181. background: rgba(255,255,255,0.035);
  182. border: 1px solid rgba(255,255,255,0.06);
  183. font-size: clamp(16px, 0.85vw, 26px);
  184. color: var(--muted);
  185. display:flex;
  186. align-items:center;
  187. justify-content:space-between;
  188. min-width: 0;
  189. }
  190. .weatherInfo p strong{
  191. color: var(--text);
  192. }
  193. #temp, #feels, #wind, #humidity{ color: var(--text); }
  194. #temp{ font-weight: 750; }
  195. #feels, #wind, #humidity{ font-weight: 600; }
  196. /* =========
  197. Top Right: Radar Image
  198. ========= */
  199. .topRight{
  200. padding: 14px;
  201. display:flex;
  202. align-items:center;
  203. justify-content:center;
  204. background:
  205. radial-gradient(1200px 800px at 70% 10%, rgba(167,139,250,0.09), transparent 55%),
  206. rgba(0,0,0,0.10);
  207. min-width: 0;
  208. min-height: 0;
  209. }
  210. #radar{
  211. width:100%;
  212. height:100%;
  213. object-fit: cover;
  214. border-radius: calc(var(--radius) - 8px);
  215. border: 1px solid rgba(255,255,255,0.08);
  216. box-shadow: 0 18px 55px rgba(0,0,0,0.50);
  217. filter: contrast(1.04) saturate(1.05);
  218. display:block;
  219. }
  220. /* Label overlay */
  221. .topRight::after{
  222. content:"Radar";
  223. position:absolute;
  224. top: 14px;
  225. left: 16px;
  226. padding: 8px 12px;
  227. font-size: clamp(12px, 0.65vw, 18px);
  228. letter-spacing: 0.8px;
  229. text-transform: uppercase;
  230. color: rgba(255,255,255,0.74);
  231. background: rgba(0,0,0,0.40);
  232. border: 1px solid rgba(255,255,255,0.08);
  233. border-radius: 999px;
  234. backdrop-filter: blur(8px);
  235. }
  236. /* =========
  237. Bottom Left: Forecast Table
  238. ========= */
  239. .bottomLeft{
  240. padding: 14px;
  241. display:flex;
  242. min-width: 0;
  243. min-height: 0;
  244. }
  245. table{
  246. width:100%;
  247. height:100%;
  248. border-collapse: separate;
  249. border-spacing: 0;
  250. overflow:hidden;
  251. border-radius: calc(var(--radius) - 8px);
  252. background: rgba(0,0,0,0.18);
  253. border: 1px solid rgba(255,255,255,0.08);
  254. table-layout: fixed; /* prevents the left column from blowing out widths */
  255. }
  256. /* Head row */
  257. thead th{
  258. padding: 14px 10px;
  259. font-size: clamp(13px, 0.70vw, 18px);
  260. color: rgba(255,255,255,0.82);
  261. letter-spacing: 0.7px;
  262. text-transform: uppercase;
  263. background: linear-gradient(90deg, rgba(76,201,240,0.10), rgba(167,139,250,0.08));
  264. border-bottom: 1px solid rgba(255,255,255,0.10);
  265. overflow:hidden;
  266. text-overflow: ellipsis;
  267. white-space: nowrap;
  268. }
  269. tbody td{
  270. padding: 14px 10px;
  271. font-size: clamp(14px, 0.78vw, 20px);
  272. color: var(--muted);
  273. border-bottom: 1px solid rgba(255,255,255,0.06);
  274. overflow:hidden;
  275. text-overflow: ellipsis;
  276. white-space: nowrap;
  277. }
  278. /* Left column labels */
  279. tbody td:first-child{
  280. width: 42%;
  281. color: rgba(255,255,255,0.88);
  282. font-weight: 720;
  283. letter-spacing: 0.2px;
  284. background: rgba(255,255,255,0.03);
  285. border-right: 1px solid rgba(255,255,255,0.06);
  286. }
  287. /* Center values */
  288. tbody td:not(:first-child),
  289. thead th:not(:first-child){
  290. text-align:center;
  291. }
  292. /* Zebra rows */
  293. tbody tr:nth-child(odd) td{ background: rgba(255,255,255,0.018); }
  294. tbody tr:nth-child(even) td{ background: rgba(255,255,255,0.028); }
  295. tbody tr:nth-child(odd) td:first-child{ background: rgba(255,255,255,0.040); }
  296. tbody tr:nth-child(even) td:first-child{ background: rgba(255,255,255,0.055); }
  297. tbody tr:last-child td{ border-bottom: none; }
  298. /* =========
  299. Bottom Right: YouTube iframe
  300. ========= */
  301. .bottomRight{
  302. padding: 14px;
  303. background:
  304. radial-gradient(1400px 900px at 20% 20%, rgba(76,201,240,0.08), transparent 55%),
  305. rgba(0,0,0,0.10);
  306. min-width: 0;
  307. min-height: 0;
  308. }
  309. .bottomRight iframe{
  310. width:100%;
  311. height:100%;
  312. border: 1px solid rgba(255,255,255,0.10);
  313. border-radius: calc(var(--radius) - 8px);
  314. box-shadow: 0 22px 70px rgba(0,0,0,0.58);
  315. background: #000;
  316. display:block;
  317. }
  318. /* =========
  319. Focus styling (TV remotes / keyboards)
  320. ========= */
  321. :focus{
  322. outline: 2px solid rgba(76,201,240,0.55);
  323. outline-offset: 2px;
  324. }