index.css 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. /* =========
  2. Dark TV Dashboard Theme
  3. Drop this into your <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. --good: #34d399;
  18. --warn: #fbbf24;
  19. /* Layout */
  20. --radius: 18px;
  21. --radius-sm: 12px;
  22. --pad: 18px;
  23. --gap: 16px;
  24. /* Type */
  25. --font: system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, "Noto Sans", Arial, sans-serif;
  26. }
  27. *{ box-sizing:border-box; }
  28. html, body{ height:100%; width:100%; }
  29. body{
  30. margin:0;
  31. font-family: var(--font);
  32. color: var(--text);
  33. background:
  34. radial-gradient(1200px 600px at 20% 10%, rgba(76,201,240,0.12), transparent 60%),
  35. radial-gradient(900px 500px at 85% 20%, rgba(167,139,250,0.10), transparent 55%),
  36. radial-gradient(800px 600px at 50% 100%, rgba(255,255,255,0.06), transparent 55%),
  37. var(--bg);
  38. overflow:hidden; /* TV: never scroll */
  39. }
  40. /* Optional: make text crisp on TVs */
  41. body{
  42. -webkit-font-smoothing: antialiased;
  43. text-rendering: geometricPrecision;
  44. }
  45. /* =========
  46. Grid Layout
  47. ========= */
  48. .grid{
  49. height:100vh;
  50. width:100vw;
  51. padding: 18px;
  52. display:grid;
  53. grid-template-columns: 1.1fr 1.4fr;
  54. grid-template-rows: 1fr 1fr;
  55. gap: var(--gap);
  56. }
  57. .topLeft, .topRight, .bottomLeft, .bottomRight{
  58. position:relative;
  59. min-height: 0; /* important so children can size/clip inside grid */
  60. border-radius: var(--radius);
  61. background: linear-gradient(180deg, rgba(255,255,255,0.06), rgba(255,255,255,0.03));
  62. border: 1px solid var(--border);
  63. box-shadow:
  64. 0 10px 30px rgba(0,0,0,0.35),
  65. inset 0 1px 0 rgba(255,255,255,0.06);
  66. overflow:hidden;
  67. }
  68. /* =========
  69. Top Left: Date/Time + Current Weather
  70. ========= */
  71. .topLeft{
  72. display:flex;
  73. flex-direction:column;
  74. padding: var(--pad);
  75. gap: 14px;
  76. }
  77. /* Date/Time card */
  78. .dateTime{
  79. display:flex;
  80. flex-direction:column;
  81. gap: 6px;
  82. padding: 14px 16px;
  83. border-radius: var(--radius-sm);
  84. background: rgba(0,0,0,0.22);
  85. border: 1px solid rgba(255,255,255,0.08);
  86. }
  87. #date{
  88. margin:0;
  89. font-size: 22px;
  90. letter-spacing: 0.4px;
  91. color: var(--muted);
  92. }
  93. #time{
  94. margin:0;
  95. font-size: 56px;
  96. font-weight: 700;
  97. letter-spacing: 1.2px;
  98. line-height: 1.05;
  99. color: var(--text);
  100. }
  101. /* Weather block */
  102. .weather{
  103. flex: 1;
  104. min-height: 0;
  105. display:flex;
  106. }
  107. .weatherBlock{
  108. flex: 1;
  109. min-height: 0;
  110. padding: 16px;
  111. border-radius: var(--radius-sm);
  112. background:
  113. radial-gradient(600px 240px at 20% 10%, rgba(76,201,240,0.10), transparent 60%),
  114. rgba(0,0,0,0.18);
  115. border: 1px solid rgba(255,255,255,0.08);
  116. display:flex;
  117. flex-direction:column;
  118. gap: 12px;
  119. }
  120. .weatherBlock h2{
  121. margin:0;
  122. font-size: 18px;
  123. font-weight: 700;
  124. letter-spacing: 0.5px;
  125. color: var(--text);
  126. display:flex;
  127. align-items:center;
  128. gap: 10px;
  129. }
  130. .weatherBlock h2::before{
  131. content:"";
  132. width: 10px;
  133. height: 10px;
  134. border-radius: 50%;
  135. background: linear-gradient(135deg, var(--accent), var(--accent-2));
  136. box-shadow: 0 0 18px rgba(76,201,240,0.35);
  137. }
  138. /* Condition row: icon + text */
  139. .condition{
  140. display:flex;
  141. align-items:center;
  142. gap: 12px;
  143. padding: 10px 12px;
  144. border-radius: 14px;
  145. background: rgba(255,255,255,0.04);
  146. border: 1px solid rgba(255,255,255,0.06);
  147. }
  148. .condition img{
  149. width: 54px;
  150. height: 54px;
  151. object-fit: contain;
  152. filter: drop-shadow(0 6px 10px rgba(0,0,0,0.45));
  153. }
  154. .conditionText{
  155. margin:0;
  156. font-size: 22px;
  157. font-weight: 650;
  158. letter-spacing: 0.2px;
  159. color: var(--text);
  160. }
  161. /* Weather info list */
  162. .weatherInfo{
  163. display:grid;
  164. grid-template-columns: 1fr 1fr;
  165. gap: 10px 12px;
  166. margin-top: 2px;
  167. }
  168. .weatherInfo p{
  169. margin:0;
  170. padding: 10px 12px;
  171. border-radius: 14px;
  172. background: rgba(255,255,255,0.035);
  173. border: 1px solid rgba(255,255,255,0.06);
  174. font-size: 18px;
  175. color: var(--muted);
  176. display:flex;
  177. align-items:center;
  178. justify-content:space-between;
  179. }
  180. .weatherInfo p strong{
  181. color: var(--text);
  182. }
  183. /* If you don't wrap labels/values in <strong>, still make the numbers pop a bit */
  184. #temp, #feels, #wind, #humidity{
  185. color: var(--text);
  186. }
  187. #temp{ font-size: 20px; font-weight: 650; }
  188. #feels, #wind, #humidity{ font-weight: 550; }
  189. /* =========
  190. Top Right: Radar Image
  191. ========= */
  192. .topRight{
  193. padding: 12px;
  194. display:flex;
  195. align-items:center;
  196. justify-content:center;
  197. background:
  198. radial-gradient(800px 520px at 70% 10%, rgba(167,139,250,0.09), transparent 55%),
  199. rgba(0,0,0,0.10);
  200. }
  201. #radar{
  202. width:100%;
  203. height:100%;
  204. object-fit: cover;
  205. border-radius: calc(var(--radius) - 6px);
  206. border: 1px solid rgba(255,255,255,0.08);
  207. box-shadow: 0 14px 40px rgba(0,0,0,0.45);
  208. filter: contrast(1.04) saturate(1.05);
  209. }
  210. /* Subtle label overlay (optional, doesn’t require HTML changes) */
  211. .topRight::after{
  212. content:"Radar";
  213. position:absolute;
  214. top: 12px;
  215. left: 14px;
  216. padding: 6px 10px;
  217. font-size: 14px;
  218. letter-spacing: 0.6px;
  219. text-transform: uppercase;
  220. color: rgba(255,255,255,0.72);
  221. background: rgba(0,0,0,0.40);
  222. border: 1px solid rgba(255,255,255,0.08);
  223. border-radius: 999px;
  224. backdrop-filter: blur(8px);
  225. }
  226. /* =========
  227. Bottom Left: Forecast Table
  228. ========= */
  229. .bottomLeft{
  230. padding: 12px;
  231. display:flex;
  232. }
  233. table{
  234. width:100%;
  235. height:100%;
  236. border-collapse: separate;
  237. border-spacing: 0;
  238. overflow:hidden;
  239. border-radius: calc(var(--radius) - 6px);
  240. background: rgba(0,0,0,0.18);
  241. border: 1px solid rgba(255,255,255,0.08);
  242. }
  243. /* Head row */
  244. thead th{
  245. padding: 12px 10px;
  246. font-size: 15px;
  247. color: rgba(255,255,255,0.80);
  248. letter-spacing: 0.4px;
  249. text-transform: uppercase;
  250. background:
  251. linear-gradient(90deg, rgba(76,201,240,0.10), rgba(167,139,250,0.08));
  252. border-bottom: 1px solid rgba(255,255,255,0.10);
  253. }
  254. tbody td{
  255. padding: 12px 10px;
  256. font-size: 16px;
  257. color: var(--muted);
  258. border-bottom: 1px solid rgba(255,255,255,0.06);
  259. }
  260. /* Left column labels */
  261. tbody td:first-child{
  262. width: 38%;
  263. color: rgba(255,255,255,0.86);
  264. font-weight: 650;
  265. letter-spacing: 0.2px;
  266. background: rgba(255,255,255,0.03);
  267. border-right: 1px solid rgba(255,255,255,0.06);
  268. }
  269. /* Center the forecast values */
  270. tbody td:not(:first-child),
  271. thead th:not(:first-child){
  272. text-align:center;
  273. }
  274. /* Zebra rows */
  275. tbody tr:nth-child(odd) td{
  276. background: rgba(255,255,255,0.018);
  277. }
  278. tbody tr:nth-child(even) td{
  279. background: rgba(255,255,255,0.028);
  280. }
  281. tbody tr:nth-child(odd) td:first-child{
  282. background: rgba(255,255,255,0.040);
  283. }
  284. tbody tr:nth-child(even) td:first-child{
  285. background: rgba(255,255,255,0.055);
  286. }
  287. /* Remove bottom border on last row */
  288. tbody tr:last-child td{
  289. border-bottom: none;
  290. }
  291. /* =========
  292. Bottom Right: YouTube iframe
  293. ========= */
  294. .bottomRight{
  295. padding: 10px;
  296. background:
  297. radial-gradient(900px 600px at 20% 20%, rgba(76,201,240,0.08), transparent 55%),
  298. rgba(0,0,0,0.10);
  299. }
  300. .bottomRight iframe{
  301. width:100%;
  302. height:100%;
  303. border: 1px solid rgba(255,255,255,0.10);
  304. border-radius: calc(var(--radius) - 6px);
  305. box-shadow: 0 18px 50px rgba(0,0,0,0.55);
  306. background: #000;
  307. }
  308. /* =========
  309. TV Safety: prevent accidental focus outlines being huge, but keep accessible
  310. ========= */
  311. :focus{
  312. outline: 2px solid rgba(76,201,240,0.55);
  313. outline-offset: 2px;
  314. }
  315. /* =========
  316. Responsive scaling (if you ever use it on smaller screens)
  317. ========= */
  318. @media (max-width: 1100px){
  319. .grid{
  320. grid-template-columns: 1fr;
  321. grid-template-rows: auto auto auto auto;
  322. }
  323. #time{ font-size: 48px; }
  324. .weatherInfo{ grid-template-columns: 1fr; }
  325. }
  326. /* =========
  327. Optional: reduce “burn-in”-like static sharp edges by a tiny overall dim
  328. ========= */
  329. .grid{
  330. filter: brightness(0.98);
  331. }