boot.css 9.1 KB

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