boot.css 14 KB

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