boot.css 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. :root {
  2. color-scheme:light dark;
  3. --canvas:#fff;
  4. --soft:#f2f2ef;
  5. --text:#1f1f1d;
  6. --muted:#656560;
  7. --line:#ddddda;
  8. --solid:#20201e;
  9. --on-solid:#fff;
  10. --success:#377a54;
  11. --danger:#b33d33;
  12. --focus:rgba(31,31,29,.16);
  13. font:14px/1.5 -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  14. color:var(--text);
  15. background:var(--canvas)
  16. }
  17. * {
  18. box-sizing:border-box
  19. }
  20. body {
  21. margin:0
  22. }
  23. button,input {
  24. font:inherit;
  25. color:inherit
  26. }
  27. button {
  28. cursor:pointer
  29. }
  30. button:disabled {
  31. cursor:default;
  32. opacity:.52
  33. }
  34. input[type=radio],input[type=checkbox] {
  35. accent-color:var(--solid);
  36. width:16px;
  37. height:16px;
  38. margin:0;
  39. flex:none
  40. }
  41. button:focus-visible,input:focus-visible,summary:focus-visible {
  42. outline:2px solid var(--solid);
  43. outline-offset:3px
  44. }
  45. [hidden] {
  46. display:none!important
  47. }
  48. .sr-only {
  49. position:absolute;
  50. width:1px;
  51. height:1px;
  52. overflow:hidden;
  53. clip-path:inset(50%);
  54. white-space:nowrap
  55. }
  56. svg {
  57. width:20px;
  58. height:20px;
  59. flex:none
  60. }
  61. h1,h2,p {
  62. margin:0
  63. }
  64. .page {
  65. width:min(820px,calc(100% - 80px));
  66. margin:20px auto 20px
  67. }
  68. .session-loading {
  69. min-height:100vh;
  70. display:flex;
  71. flex-direction:column;
  72. align-items:center;
  73. justify-content:center;
  74. gap:16px;
  75. color:var(--muted)
  76. }
  77. .session-loading img {
  78. object-fit:contain
  79. }
  80. .brand {
  81. display:flex;
  82. align-items:center;
  83. justify-content:space-between
  84. }
  85. .brand>div {
  86. display:flex;
  87. align-items:center;
  88. gap:10px
  89. }
  90. .brand img {
  91. object-fit:contain
  92. }
  93. .brand strong {
  94. font-size:24px;
  95. font-weight:650
  96. }
  97. .brand>span {
  98. font-size:12px;
  99. color:var(--muted)
  100. }
  101. .intro {
  102. margin-top:16px
  103. }
  104. .intro h1 {
  105. font-size:26px;
  106. line-height:1.4;
  107. letter-spacing:-.035em;
  108. font-weight:650
  109. }
  110. .intro p {
  111. margin-top:4px;
  112. color:var(--muted)
  113. }
  114. .steps {
  115. display:flex;
  116. align-items:center;
  117. justify-content:center;
  118. gap:0;
  119. list-style:none;
  120. margin:20px 0 18px;
  121. padding:0;
  122. font-size:13px
  123. }
  124. .steps li {
  125. display:flex;
  126. align-items:center;
  127. gap:10px;
  128. color:var(--muted)
  129. }
  130. .steps li+li:before {
  131. content:"";
  132. width:72px;
  133. height:1px;
  134. background:var(--line);
  135. margin:0 20px 0 10px
  136. }
  137. .step-dot {
  138. width:28px;
  139. height:28px;
  140. border-radius:50%;
  141. display:grid;
  142. place-items:center;
  143. background:var(--soft);
  144. color:var(--muted)
  145. }
  146. .step-dot b {
  147. font-weight:500
  148. }
  149. .step-dot svg {
  150. display:none;
  151. width:18px;
  152. height:18px
  153. }
  154. .steps [aria-current=step] {
  155. color:var(--text)
  156. }
  157. .steps [aria-current=step] .step-dot {
  158. color:var(--on-solid);
  159. background:var(--solid)
  160. }
  161. .steps .complete .step-dot {
  162. background:var(--success);
  163. color:#fff
  164. }
  165. .steps .complete b {
  166. display:none
  167. }
  168. .steps .complete svg {
  169. display:block
  170. }
  171. .section {
  172. padding:14px 0;
  173. border-top:1px solid var(--line)
  174. }
  175. .choice-section {
  176. border-top:0;
  177. padding-top:0
  178. }
  179. h2 {
  180. display:flex;
  181. gap:20px;
  182. align-items:baseline;
  183. font-size:17px;
  184. font-weight:630;
  185. line-height:1.5
  186. }
  187. h2>span:first-child {
  188. font-variant-numeric:tabular-nums
  189. }
  190. .inset {
  191. margin-left:42px
  192. }
  193. .muted {
  194. color:var(--muted);
  195. font-size:13px;
  196. margin-top:4px
  197. }
  198. .pending h2 {
  199. color:var(--muted)
  200. }
  201. .mode-options {
  202. display:grid;
  203. grid-template-columns:1fr 1fr;
  204. gap:14px;
  205. border:0;
  206. margin:12px 0 0;
  207. padding:0;
  208. min-width:0
  209. }
  210. .mode-option {
  211. display:flex;
  212. align-items:center;
  213. gap:16px;
  214. min-height:74px;
  215. padding:15px 18px;
  216. border:1px solid var(--line);
  217. border-radius:10px;
  218. cursor:pointer
  219. }
  220. .mode-option:has(:checked) {
  221. border-color:var(--solid);
  222. background:var(--soft);
  223. box-shadow:inset 0 0 0 .5px var(--solid)
  224. }
  225. .mode-option:has(:focus-visible) {
  226. outline:2px solid var(--solid);
  227. outline-offset:3px
  228. }
  229. .mode-option:has(:disabled) {
  230. cursor:default
  231. }
  232. .mode-option span {
  233. min-width:0
  234. }
  235. .mode-option strong {
  236. display:block;
  237. font-size:14px;
  238. font-weight:600
  239. }
  240. .mode-option small {
  241. display:block;
  242. color:var(--muted);
  243. font-size:12px;
  244. margin-top:4px
  245. }
  246. .mode-icon {
  247. width:27px;
  248. height:27px
  249. }
  250. .installation {
  251. background:var(--soft);
  252. border-radius:10px;
  253. padding:4px 20px;
  254. margin-top:12px
  255. }
  256. .install-steps {
  257. list-style:none;
  258. margin:0;
  259. padding:0
  260. }
  261. .install-steps li {
  262. display:flex;
  263. align-items:center;
  264. gap:14px;
  265. padding:8px 0;
  266. font-size:14px
  267. }
  268. .install-steps li+li {
  269. border-top:1px solid var(--line)
  270. }
  271. .install-steps small {
  272. margin-left:auto;
  273. color:var(--muted);
  274. font-size:12px
  275. }
  276. .install-steps svg {
  277. width:18px;
  278. height:18px;
  279. color:var(--muted)
  280. }
  281. .install-steps .complete svg,.install-steps .complete small {
  282. color:var(--success)
  283. }
  284. .install-steps .active svg {
  285. color:var(--text);
  286. animation:spin 1.2s linear infinite
  287. }
  288. .install-steps .active small {
  289. color:var(--text)
  290. }
  291. progress {
  292. display:block;
  293. width:100%;
  294. height:7px;
  295. margin:10px 0 12px;
  296. accent-color:var(--solid)
  297. }
  298. summary {
  299. display:flex;
  300. align-items:center;
  301. gap:7px;
  302. list-style:none;
  303. cursor:pointer;
  304. color:var(--muted);
  305. font-size:12px;
  306. min-height:32px
  307. }
  308. summary::-webkit-details-marker {
  309. display:none
  310. }
  311. summary svg {
  312. width:16px;
  313. height:16px
  314. }
  315. details[open] summary svg {
  316. transform:rotate(90deg)
  317. }
  318. pre {
  319. font:12px/1.65 ui-monospace,monospace;
  320. white-space:pre-wrap;
  321. overflow-wrap:anywhere;
  322. max-height:130px;
  323. overflow:auto;
  324. color:var(--muted);
  325. margin:2px 0 10px
  326. }
  327. label[for] {
  328. font-size:13px
  329. }
  330. .connection-row {
  331. display:flex;
  332. gap:10px;
  333. margin-top:6px
  334. }
  335. .connection-row input {
  336. flex:1;
  337. min-width:0
  338. }
  339. #connection-form {
  340. margin-top:8px
  341. }
  342. input:not([type=checkbox],[type=radio]) {
  343. width:100%;
  344. height:44px;
  345. padding:0 13px;
  346. border:1px solid var(--line);
  347. border-radius:9px;
  348. background:var(--canvas);
  349. min-width:0
  350. }
  351. input::placeholder {
  352. color:var(--muted);
  353. opacity:.85
  354. }
  355. input:not([type=checkbox],[type=radio]):focus {
  356. border-color:var(--solid);
  357. box-shadow:0 0 0 3px var(--focus);
  358. outline:0
  359. }
  360. input[aria-invalid=true] {
  361. border-color:var(--danger)
  362. }
  363. .secondary {
  364. min-height:44px;
  365. padding:9px 16px;
  366. border:1px solid var(--line);
  367. border-radius:9px;
  368. background:var(--canvas);
  369. white-space:nowrap
  370. }
  371. .secondary:hover {
  372. background:var(--soft)
  373. }
  374. .primary {
  375. display:flex;
  376. align-items:center;
  377. justify-content:center;
  378. position:relative;
  379. width:100%;
  380. min-height:46px;
  381. padding:10px 40px;
  382. background:var(--solid);
  383. color:var(--on-solid);
  384. border:1px solid var(--solid);
  385. border-radius:10px;
  386. font-weight:550
  387. }
  388. .primary svg {
  389. position:absolute;
  390. right:18px
  391. }
  392. .primary:hover:not(:disabled) {
  393. opacity:.9
  394. }
  395. #prepare-local {
  396. margin-top:14px
  397. }
  398. #login-form {
  399. margin-top:12px
  400. }
  401. #credentials {
  402. display:grid;
  403. gap:12px
  404. }
  405. .field {
  406. display:grid;
  407. grid-template-columns:60px minmax(0,1fr);
  408. align-items:center;
  409. gap:12px
  410. }
  411. .password-input {
  412. position:relative
  413. }
  414. .password-input input {
  415. padding-right:48px
  416. }
  417. .eye-button {
  418. position:absolute;
  419. right:0;
  420. top:0;
  421. display:grid;
  422. place-items:center;
  423. width:44px;
  424. height:44px;
  425. background:transparent;
  426. border:0;
  427. color:var(--muted);
  428. border-radius:9px
  429. }
  430. #submit {
  431. margin-top:14px
  432. }
  433. #waiting {
  434. margin-top:14px;
  435. background:var(--soft);
  436. color:var(--muted);
  437. border-color:var(--soft);
  438. opacity:1
  439. }
  440. .status {
  441. font-size:13px;
  442. margin-top:10px;
  443. overflow-wrap:anywhere
  444. }
  445. .status:empty {
  446. display:none
  447. }
  448. .status.success {
  449. color:var(--success)
  450. }
  451. .status[role=alert],.error {
  452. color:var(--danger)
  453. }
  454. .error {
  455. font-size:13px;
  456. margin:12px 0;
  457. overflow-wrap:anywhere
  458. }
  459. .actions {
  460. display:flex;
  461. gap:10px;
  462. margin-top:12px;
  463. flex-wrap:wrap
  464. }
  465. footer {
  466. display:flex;
  467. align-items:center;
  468. justify-content:space-between;
  469. margin-top:0;
  470. font-size:13px;
  471. color:var(--muted)
  472. }
  473. .remember {
  474. display:flex;
  475. align-items:center;
  476. gap:8px;
  477. min-height:44px;
  478. cursor:pointer
  479. }
  480. .text-button {
  481. background:transparent;
  482. border:0;
  483. padding:8px 0;
  484. min-height:44px;
  485. color:var(--muted);
  486. text-decoration:underline;
  487. text-underline-offset:3px;
  488. font-size:13px
  489. }
  490. .help {
  491. margin-top:8px;
  492. border-top:1px solid var(--line);
  493. padding-top:16px;
  494. color:var(--muted);
  495. font-size:13px
  496. }
  497. .help p+p {
  498. margin-top:8px
  499. }
  500. @keyframes spin {
  501. to {
  502. transform:rotate(360deg)
  503. }
  504. }
  505. @media(prefers-reduced-motion:reduce) {
  506. .install-steps .active svg {
  507. animation:none
  508. }
  509. }
  510. @media(max-width:760px) {
  511. .page {
  512. width:calc(100% - 48px);
  513. margin-top:20px
  514. }
  515. .mode-option {
  516. gap:10px;
  517. padding:12px
  518. }
  519. .mode-icon {
  520. width:22px;
  521. height:22px
  522. }
  523. .steps li+li:before {
  524. width:30px;
  525. margin:0 10px
  526. }
  527. .inset {
  528. margin-left:0
  529. }
  530. .intro {
  531. margin-top:20px
  532. }
  533. }
  534. @media(max-width:540px) {
  535. .page {
  536. width:calc(100% - 36px)
  537. }
  538. .mode-options {
  539. grid-template-columns:1fr
  540. }
  541. .steps {
  542. font-size:12px
  543. }
  544. .steps li {
  545. gap:5px
  546. }
  547. .steps li+li:before {
  548. width:14px;
  549. margin:0 6px
  550. }
  551. .step-dot {
  552. width:24px;
  553. height:24px
  554. }
  555. .field {
  556. grid-template-columns:1fr;
  557. gap:6px
  558. }
  559. .connection-row {
  560. flex-wrap:wrap
  561. }
  562. .connection-row input {
  563. flex-basis:100%
  564. }
  565. .intro h1 {
  566. font-size:24px
  567. }
  568. h2 {
  569. gap:14px
  570. }
  571. }
  572. @media(prefers-color-scheme:dark) {
  573. :root {
  574. --canvas:#181817;
  575. --soft:#282827;
  576. --text:#efefec;
  577. --muted:#b2b2ad;
  578. --line:#41413e;
  579. --solid:#efefec;
  580. --on-solid:#151514;
  581. --success:#77b88e;
  582. --danger:#ed786f;
  583. --focus:rgba(255,255,255,.12)
  584. }
  585. .brand img {
  586. filter:invert(1)
  587. }
  588. .steps .complete .step-dot {
  589. color:#151514
  590. }
  591. }
  592. .field label {
  593. white-space:nowrap
  594. }
  595. .local-ready #local-panel>.muted {
  596. display:none
  597. }
  598. .local-ready .installation {
  599. margin-top:6px
  600. }