styles.css 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. :root {
  2. --ink: #1d1e1a;
  3. --paper: #f6f1e8;
  4. --sand: #d8c6a5;
  5. --amber: #e0a33b;
  6. --amber-deep: #b86915;
  7. --teal: #0f6c78;
  8. --teal-soft: #8fd4d2;
  9. --alert: #b3362d;
  10. --ok: #2f7d4d;
  11. --panel: rgba(255, 248, 237, 0.84);
  12. --line: rgba(29, 30, 26, 0.12);
  13. --shadow: 0 24px 60px rgba(60, 42, 12, 0.18);
  14. }
  15. * {
  16. box-sizing: border-box;
  17. }
  18. body {
  19. margin: 0;
  20. min-height: 100vh;
  21. color: var(--ink);
  22. font-family: "Avenir Next", "Segoe UI", "Trebuchet MS", sans-serif;
  23. background:
  24. radial-gradient(circle at top left, rgba(224, 163, 59, 0.32), transparent 28%),
  25. radial-gradient(circle at right 20%, rgba(15, 108, 120, 0.18), transparent 24%),
  26. linear-gradient(180deg, #efe4cf 0%, #f7f2ea 38%, #f3ebdf 100%);
  27. }
  28. body::before {
  29. content: "";
  30. position: fixed;
  31. inset: 0;
  32. pointer-events: none;
  33. background-image:
  34. linear-gradient(rgba(29, 30, 26, 0.03) 1px, transparent 1px),
  35. linear-gradient(90deg, rgba(29, 30, 26, 0.03) 1px, transparent 1px);
  36. background-size: 28px 28px;
  37. mask-image: radial-gradient(circle at center, black 45%, transparent 100%);
  38. }
  39. a {
  40. color: inherit;
  41. }
  42. .page-shell {
  43. width: min(1240px, calc(100% - 2rem));
  44. margin: 0 auto;
  45. padding: 2rem 0 3rem;
  46. }
  47. .hero,
  48. .panel,
  49. .machine-panel,
  50. .auth-card,
  51. .admin-shell {
  52. position: relative;
  53. overflow: hidden;
  54. background: var(--panel);
  55. border: 1px solid rgba(255, 255, 255, 0.55);
  56. border-radius: 28px;
  57. box-shadow: var(--shadow);
  58. backdrop-filter: blur(16px);
  59. }
  60. .hero {
  61. display: grid;
  62. grid-template-columns: minmax(0, 2fr) minmax(260px, 1fr);
  63. gap: 1.5rem;
  64. padding: 2rem;
  65. margin-bottom: 1.5rem;
  66. }
  67. .hero__actions {
  68. grid-column: 1 / -1;
  69. display: flex;
  70. gap: 0.75rem;
  71. flex-wrap: wrap;
  72. }
  73. .hero__lede,
  74. .panel p,
  75. .slot-card__metrics p,
  76. .admin-shell p,
  77. .field-help,
  78. .auth-card p {
  79. color: rgba(29, 30, 26, 0.72);
  80. line-height: 1.55;
  81. }
  82. .eyebrow {
  83. margin: 0 0 0.35rem;
  84. letter-spacing: 0.14em;
  85. text-transform: uppercase;
  86. font-size: 0.75rem;
  87. color: rgba(29, 30, 26, 0.52);
  88. }
  89. h1,
  90. h2,
  91. h3 {
  92. margin: 0;
  93. font-family: "Gill Sans", "Trebuchet MS", sans-serif;
  94. font-weight: 700;
  95. }
  96. h1 {
  97. font-size: clamp(2.3rem, 5vw, 4.4rem);
  98. line-height: 0.95;
  99. max-width: 11ch;
  100. }
  101. h2 {
  102. font-size: 1.45rem;
  103. }
  104. .hero__stats {
  105. display: grid;
  106. grid-template-columns: repeat(3, 1fr);
  107. gap: 0.75rem;
  108. align-content: start;
  109. }
  110. .stat-card {
  111. padding: 1rem;
  112. border-radius: 22px;
  113. background: linear-gradient(180deg, rgba(255, 255, 255, 0.78), rgba(255, 255, 255, 0.35));
  114. border: 1px solid rgba(29, 30, 26, 0.08);
  115. }
  116. .stat-card strong {
  117. display: block;
  118. margin-top: 0.35rem;
  119. font-size: 2rem;
  120. }
  121. .stat-card--alert strong {
  122. color: var(--alert);
  123. }
  124. .button,
  125. button {
  126. appearance: none;
  127. border: 0;
  128. cursor: pointer;
  129. text-decoration: none;
  130. font: inherit;
  131. }
  132. .button {
  133. display: inline-flex;
  134. align-items: center;
  135. justify-content: center;
  136. min-height: 46px;
  137. padding: 0.8rem 1.15rem;
  138. border-radius: 999px;
  139. transition: transform 140ms ease, box-shadow 140ms ease, background 140ms ease;
  140. }
  141. .button:hover,
  142. button:hover {
  143. transform: translateY(-1px);
  144. }
  145. .button--primary {
  146. color: white;
  147. background: linear-gradient(135deg, var(--amber-deep), var(--amber));
  148. box-shadow: 0 12px 22px rgba(184, 105, 21, 0.28);
  149. }
  150. .button--ghost {
  151. background: rgba(255, 255, 255, 0.52);
  152. border: 1px solid rgba(29, 30, 26, 0.08);
  153. }
  154. .dashboard {
  155. display: grid;
  156. gap: 1.5rem;
  157. }
  158. .panel {
  159. padding: 1.5rem;
  160. }
  161. .panel__header,
  162. .machine-panel__head,
  163. .admin-header {
  164. display: flex;
  165. align-items: flex-start;
  166. justify-content: space-between;
  167. gap: 1rem;
  168. }
  169. .panel--controls {
  170. display: flex;
  171. align-items: center;
  172. justify-content: space-between;
  173. gap: 1rem;
  174. flex-wrap: wrap;
  175. }
  176. .chip-row {
  177. display: flex;
  178. gap: 0.6rem;
  179. flex-wrap: wrap;
  180. }
  181. .chip {
  182. min-height: 40px;
  183. padding: 0.65rem 0.95rem;
  184. border-radius: 999px;
  185. background: rgba(255, 255, 255, 0.68);
  186. color: rgba(29, 30, 26, 0.72);
  187. border: 1px solid rgba(29, 30, 26, 0.08);
  188. }
  189. .chip--active {
  190. background: linear-gradient(135deg, var(--teal), #124f58);
  191. color: white;
  192. }
  193. .machine-grid,
  194. .slot-grid {
  195. display: grid;
  196. gap: 1rem;
  197. }
  198. .machine-grid {
  199. grid-template-columns: 1fr;
  200. }
  201. .machine-panel {
  202. padding: 1.4rem;
  203. background: linear-gradient(180deg, rgba(255, 255, 255, 0.85), rgba(239, 228, 207, 0.55));
  204. }
  205. .slot-grid {
  206. margin-top: 1rem;
  207. grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  208. }
  209. .slot-card {
  210. display: grid;
  211. gap: 1rem;
  212. padding: 1rem;
  213. border-radius: 24px;
  214. border: 1px solid var(--line);
  215. background: rgba(255, 255, 255, 0.72);
  216. }
  217. .slot-card--critical {
  218. background: linear-gradient(180deg, rgba(255, 234, 233, 0.96), rgba(255, 246, 238, 0.9));
  219. border-color: rgba(179, 54, 45, 0.18);
  220. }
  221. .slot-card--ok {
  222. background: linear-gradient(180deg, rgba(237, 252, 245, 0.92), rgba(255, 255, 255, 0.78));
  223. border-color: rgba(47, 125, 77, 0.14);
  224. }
  225. .slot-card__head,
  226. .slot-card__body {
  227. display: flex;
  228. gap: 1rem;
  229. justify-content: space-between;
  230. }
  231. .slot-card__label {
  232. margin: 0 0 0.25rem;
  233. font-size: 0.76rem;
  234. text-transform: uppercase;
  235. letter-spacing: 0.12em;
  236. color: rgba(29, 30, 26, 0.5);
  237. }
  238. .status-pill {
  239. display: inline-flex;
  240. align-items: center;
  241. height: fit-content;
  242. padding: 0.4rem 0.7rem;
  243. border-radius: 999px;
  244. font-size: 0.85rem;
  245. }
  246. .status-pill--critical {
  247. background: rgba(179, 54, 45, 0.14);
  248. color: var(--alert);
  249. }
  250. .status-pill--ok {
  251. background: rgba(47, 125, 77, 0.14);
  252. color: var(--ok);
  253. }
  254. .status-pill--unknown {
  255. background: rgba(29, 30, 26, 0.08);
  256. color: rgba(29, 30, 26, 0.62);
  257. }
  258. .fill-tube {
  259. position: relative;
  260. width: 82px;
  261. min-width: 82px;
  262. height: 190px;
  263. border-radius: 32px;
  264. padding: 8px;
  265. background: linear-gradient(180deg, rgba(29, 30, 26, 0.08), rgba(255, 255, 255, 0.72));
  266. border: 1px solid rgba(29, 30, 26, 0.08);
  267. overflow: hidden;
  268. }
  269. .fill-tube__liquid {
  270. position: absolute;
  271. inset: auto 8px 8px;
  272. border-radius: 24px;
  273. background: linear-gradient(180deg, var(--amber), #f2d785 60%, #fee6b7);
  274. box-shadow: inset 0 12px 24px rgba(255, 255, 255, 0.34);
  275. }
  276. .slot-card--critical .fill-tube__liquid {
  277. background: linear-gradient(180deg, #d55b51, #f4a38e 62%, #ffd8d1);
  278. }
  279. .slot-card--ok .fill-tube__liquid {
  280. background: linear-gradient(180deg, var(--teal), var(--teal-soft) 62%, #e2f7f5);
  281. }
  282. .fill-tube__gloss {
  283. position: absolute;
  284. top: 14px;
  285. left: 16px;
  286. width: 18px;
  287. height: 120px;
  288. border-radius: 999px;
  289. background: linear-gradient(180deg, rgba(255, 255, 255, 0.75), transparent);
  290. }
  291. .slot-card__metrics {
  292. display: grid;
  293. gap: 0.25rem;
  294. align-content: start;
  295. }
  296. .slot-card__metrics strong,
  297. .timestamp {
  298. color: var(--ink);
  299. }
  300. .alert-list {
  301. display: grid;
  302. gap: 0.8rem;
  303. }
  304. .alert-entry {
  305. display: flex;
  306. justify-content: space-between;
  307. gap: 1rem;
  308. align-items: center;
  309. padding: 1rem 1.15rem;
  310. border-radius: 20px;
  311. background: rgba(255, 255, 255, 0.64);
  312. border: 1px solid var(--line);
  313. }
  314. .alert-entry--critical {
  315. border-color: rgba(179, 54, 45, 0.2);
  316. }
  317. .alert-entry--ok {
  318. border-color: rgba(47, 125, 77, 0.18);
  319. }
  320. .alert-entry__title {
  321. margin: 0 0 0.2rem;
  322. font-weight: 700;
  323. }
  324. .empty-state {
  325. margin: 0;
  326. padding: 1rem;
  327. border-radius: 18px;
  328. background: rgba(255, 255, 255, 0.55);
  329. }
  330. .auth-page,
  331. .admin-page {
  332. width: min(1180px, calc(100% - 2rem));
  333. margin: 0 auto;
  334. padding: 2rem 0 3rem;
  335. }
  336. .auth-card {
  337. width: min(520px, 100%);
  338. margin: 8vh auto 0;
  339. padding: 2rem;
  340. }
  341. .auth-card form,
  342. .admin-form {
  343. display: grid;
  344. gap: 1rem;
  345. }
  346. .admin-shell {
  347. padding: 1.5rem;
  348. display: grid;
  349. gap: 1.5rem;
  350. }
  351. .admin-grid {
  352. display: grid;
  353. gap: 1rem;
  354. grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  355. }
  356. .form-section {
  357. padding: 1.2rem;
  358. border-radius: 22px;
  359. background: rgba(255, 255, 255, 0.64);
  360. border: 1px solid var(--line);
  361. }
  362. .field-grid {
  363. display: grid;
  364. gap: 0.9rem;
  365. grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  366. }
  367. label {
  368. display: grid;
  369. gap: 0.35rem;
  370. font-weight: 600;
  371. font-size: 0.95rem;
  372. }
  373. input,
  374. textarea,
  375. select {
  376. width: 100%;
  377. min-height: 44px;
  378. padding: 0.7rem 0.85rem;
  379. border-radius: 14px;
  380. border: 1px solid rgba(29, 30, 26, 0.14);
  381. background: rgba(255, 255, 255, 0.85);
  382. color: var(--ink);
  383. font: inherit;
  384. }
  385. textarea {
  386. min-height: 90px;
  387. resize: vertical;
  388. }
  389. .config-textarea {
  390. min-height: 420px;
  391. font-family: "Courier New", "SFMono-Regular", Consolas, monospace;
  392. line-height: 1.45;
  393. white-space: pre;
  394. }
  395. .inline-actions,
  396. .section-actions {
  397. display: flex;
  398. gap: 0.75rem;
  399. flex-wrap: wrap;
  400. align-items: center;
  401. }
  402. .button--secondary {
  403. background: rgba(15, 108, 120, 0.14);
  404. color: var(--teal);
  405. }
  406. .button--danger {
  407. background: rgba(179, 54, 45, 0.12);
  408. color: var(--alert);
  409. }
  410. .message {
  411. padding: 0.9rem 1rem;
  412. border-radius: 18px;
  413. font-weight: 600;
  414. }
  415. .message--success {
  416. background: rgba(47, 125, 77, 0.12);
  417. color: var(--ok);
  418. }
  419. .message--error {
  420. background: rgba(179, 54, 45, 0.12);
  421. color: var(--alert);
  422. }
  423. .repeat-stack {
  424. display: grid;
  425. gap: 1rem;
  426. }
  427. .repeat-card,
  428. .slot-editor {
  429. padding: 1rem;
  430. border-radius: 18px;
  431. background: rgba(255, 255, 255, 0.76);
  432. border: 1px solid var(--line);
  433. }
  434. .repeat-card h4,
  435. .slot-editor h5 {
  436. margin: 0 0 0.85rem;
  437. font-family: "Gill Sans", "Trebuchet MS", sans-serif;
  438. }
  439. .slot-editor h5 {
  440. font-size: 1rem;
  441. }
  442. .field-help code {
  443. font-family: "Courier New", monospace;
  444. }
  445. @media (max-width: 820px) {
  446. .hero,
  447. .panel__header,
  448. .machine-panel__head,
  449. .admin-header,
  450. .alert-entry,
  451. .slot-card__body {
  452. grid-template-columns: 1fr;
  453. flex-direction: column;
  454. }
  455. .hero__stats {
  456. grid-template-columns: 1fr;
  457. }
  458. .fill-tube {
  459. width: 100%;
  460. height: 42px;
  461. min-width: 0;
  462. }
  463. .fill-tube__liquid {
  464. inset: 8px auto 8px 8px;
  465. height: auto !important;
  466. width: max(0px, calc(var(--fill, 0%) - 16px));
  467. }
  468. .fill-tube__gloss {
  469. display: none;
  470. }
  471. }