index.css 8.1 KB

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