App.scss 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. @import './_variables.scss';
  2. #app {
  3. min-height: 100vh;
  4. max-width: 100%;
  5. overflow: hidden;
  6. }
  7. .app-bg-wrapper {
  8. position: fixed;
  9. z-index: -1;
  10. height: 100%;
  11. width: 100%;
  12. background-size: cover;
  13. background-repeat: no-repeat;
  14. background-position: 0 50%;
  15. }
  16. i {
  17. user-select: none;
  18. }
  19. h4 {
  20. margin: 0;
  21. }
  22. #content {
  23. box-sizing: border-box;
  24. padding-top: 60px;
  25. margin: auto;
  26. min-height: 100vh;
  27. max-width: 980px;
  28. background-color: rgba(0,0,0,0.15);
  29. align-content: flex-start;
  30. }
  31. .text-center {
  32. text-align: center;
  33. }
  34. body {
  35. font-family: sans-serif;
  36. font-family: var(--interfaceFont, sans-serif);
  37. font-size: 14px;
  38. margin: 0;
  39. color: $fallback--text;
  40. color: var(--text, $fallback--text);
  41. max-width: 100vw;
  42. overflow-x: hidden;
  43. }
  44. a {
  45. text-decoration: none;
  46. color: $fallback--link;
  47. color: var(--link, $fallback--link);
  48. }
  49. button {
  50. user-select: none;
  51. color: $fallback--text;
  52. color: var(--btnText, $fallback--text);
  53. background-color: $fallback--fg;
  54. background-color: var(--btn, $fallback--fg);
  55. border: none;
  56. border-radius: $fallback--btnRadius;
  57. border-radius: var(--btnRadius, $fallback--btnRadius);
  58. cursor: pointer;
  59. box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 1), 0px 1px 0px 0px rgba(255, 255, 255, 0.2) inset, 0px -1px 0px 0px rgba(0, 0, 0, 0.2) inset;
  60. box-shadow: var(--buttonShadow);
  61. font-size: 14px;
  62. font-family: sans-serif;
  63. font-family: var(--interfaceFont, sans-serif);
  64. i[class*=icon-] {
  65. color: $fallback--text;
  66. color: var(--btnText, $fallback--text);
  67. }
  68. &::-moz-focus-inner {
  69. border: none;
  70. }
  71. &:hover {
  72. box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
  73. box-shadow: var(--buttonHoverShadow);
  74. }
  75. &:active {
  76. box-shadow: 0px 0px 4px 0px rgba(255, 255, 255, 0.3), 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset;
  77. box-shadow: var(--buttonPressedShadow);
  78. }
  79. &:disabled {
  80. cursor: not-allowed;
  81. opacity: 0.5;
  82. }
  83. &.pressed {
  84. color: $fallback--faint;
  85. color: var(--faint, $fallback--faint);
  86. background-color: $fallback--bg;
  87. background-color: var(--bg, $fallback--bg)
  88. }
  89. }
  90. label.select {
  91. padding: 0;
  92. }
  93. input, textarea, .select {
  94. border: none;
  95. border-radius: $fallback--inputRadius;
  96. border-radius: var(--inputRadius, $fallback--inputRadius);
  97. box-shadow: 0px 1px 0px 0px rgba(0, 0, 0, 0.2) inset, 0px -1px 0px 0px rgba(255, 255, 255, 0.2) inset, 0px 0px 2px 0px rgba(0, 0, 0, 1) inset;
  98. box-shadow: var(--inputShadow);
  99. background-color: $fallback--fg;
  100. background-color: var(--input, $fallback--fg);
  101. color: $fallback--lightText;
  102. color: var(--inputText, $fallback--lightText);
  103. font-family: sans-serif;
  104. font-family: var(--inputFont, sans-serif);
  105. font-size: 14px;
  106. padding: 8px .5em;
  107. box-sizing: border-box;
  108. display: inline-block;
  109. position: relative;
  110. height: 28px;
  111. line-height: 16px;
  112. hyphens: none;
  113. &:disabled, &[disabled=disabled] {
  114. cursor: not-allowed;
  115. opacity: 0.5;
  116. }
  117. .icon-down-open {
  118. position: absolute;
  119. top: 0;
  120. bottom: 0;
  121. right: 5px;
  122. height: 100%;
  123. color: $fallback--text;
  124. color: var(--text, $fallback--text);
  125. line-height: 28px;
  126. z-index: 0;
  127. pointer-events: none;
  128. }
  129. select {
  130. -webkit-appearance: none;
  131. -moz-appearance: none;
  132. appearance: none;
  133. background: transparent;
  134. border: none;
  135. color: $fallback--text;
  136. color: var(--text, $fallback--text);
  137. margin: 0;
  138. padding: 0 2em 0 .2em;
  139. font-family: sans-serif;
  140. font-family: var(--inputFont, sans-serif);
  141. font-size: 14px;
  142. width: 100%;
  143. z-index: 1;
  144. height: 28px;
  145. line-height: 16px;
  146. }
  147. &[type=range] {
  148. background: none;
  149. border: none;
  150. margin: 0;
  151. box-shadow: none;
  152. flex: 1;
  153. }
  154. &[type=radio],
  155. &[type=checkbox] {
  156. display: none;
  157. &:checked + label::before {
  158. color: $fallback--text;
  159. color: var(--text, $fallback--text);
  160. }
  161. &:disabled {
  162. &,
  163. & + label,
  164. & + label::before {
  165. opacity: .5;
  166. }
  167. }
  168. + label::before {
  169. display: inline-block;
  170. content: '✔';
  171. transition: color 200ms;
  172. width: 1.1em;
  173. height: 1.1em;
  174. border-radius: $fallback--checkboxRadius;
  175. border-radius: var(--checkboxRadius, $fallback--checkboxRadius);
  176. box-shadow: 0px 0px 2px black inset;
  177. box-shadow: var(--inputShadow);
  178. margin-right: .5em;
  179. background-color: $fallback--fg;
  180. background-color: var(--input, $fallback--fg);
  181. vertical-align: top;
  182. text-align: center;
  183. line-height: 1.1em;
  184. font-size: 1.1em;
  185. box-sizing: border-box;
  186. color: transparent;
  187. overflow: hidden;
  188. box-sizing: border-box;
  189. }
  190. }
  191. }
  192. option {
  193. color: $fallback--text;
  194. color: var(--text, $fallback--text);
  195. background-color: $fallback--bg;
  196. background-color: var(--bg, $fallback--bg);
  197. }
  198. i[class*=icon-] {
  199. color: $fallback--icon;
  200. color: var(--icon, $fallback--icon)
  201. }
  202. .container {
  203. display: flex;
  204. flex-wrap: wrap;
  205. margin: 0;
  206. padding: 0 10px 0 10px;
  207. }
  208. .item {
  209. flex: 1;
  210. line-height: 50px;
  211. height: 50px;
  212. overflow: hidden;
  213. display: flex;
  214. flex-wrap: wrap;
  215. .nav-icon {
  216. margin-left: 0.4em;
  217. }
  218. &.right {
  219. justify-content: flex-end;
  220. }
  221. }
  222. .auto-size {
  223. flex: 1
  224. }
  225. .nav-bar {
  226. padding: 0;
  227. width: 100%;
  228. align-items: center;
  229. position: fixed;
  230. height: 50px;
  231. .logo {
  232. display: flex;
  233. position: absolute;
  234. top: 0;
  235. bottom: 0;
  236. left: 0;
  237. right: 0;
  238. align-items: stretch;
  239. justify-content: center;
  240. flex: 0 0 auto;
  241. z-index: -1;
  242. transition: opacity;
  243. transition-timing-function: ease-out;
  244. transition-duration: 100ms;
  245. .mask {
  246. mask-repeat: no-repeat;
  247. mask-position: center;
  248. mask-size: contain;
  249. background-color: $fallback--fg;
  250. background-color: var(--topBarText, $fallback--fg);
  251. position: absolute;
  252. top: 0;
  253. bottom: 0;
  254. left: 0;
  255. right: 0;
  256. }
  257. img {
  258. height: 100%;
  259. object-fit: contain;
  260. display: block;
  261. flex: 0;
  262. }
  263. }
  264. .inner-nav {
  265. margin: auto;
  266. box-sizing: border-box;
  267. padding-left: 10px;
  268. padding-right: 10px;
  269. display: flex;
  270. align-items: center;
  271. flex-basis: 970px;
  272. height: 50px;
  273. a, a i {
  274. color: $fallback--link;
  275. color: var(--topBarLink, $fallback--link);
  276. }
  277. }
  278. }
  279. main-router {
  280. flex: 1;
  281. }
  282. .status.compact {
  283. color: rgba(0, 0, 0, 0.42);
  284. font-weight: 300;
  285. p {
  286. margin: 0;
  287. font-size: 0.8em
  288. }
  289. }
  290. /* Panel */
  291. .panel {
  292. display: flex;
  293. position: relative;
  294. flex-direction: column;
  295. margin: 0.5em;
  296. background-color: $fallback--bg;
  297. background-color: var(--bg, $fallback--bg);
  298. &::after, & {
  299. border-radius: $fallback--panelRadius;
  300. border-radius: var(--panelRadius, $fallback--panelRadius);
  301. }
  302. &::after {
  303. content: '';
  304. position: absolute;
  305. top: 0;
  306. bottom: 0;
  307. left: 0;
  308. right: 0;
  309. pointer-events: none;
  310. box-shadow: 1px 1px 4px rgba(0,0,0,.6);
  311. box-shadow: var(--panelShadow);
  312. }
  313. }
  314. .panel-body:empty::before {
  315. content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
  316. display: block;
  317. margin: 1em;
  318. text-align: center;
  319. }
  320. .panel-heading {
  321. display: flex;
  322. border-radius: $fallback--panelRadius $fallback--panelRadius 0 0;
  323. border-radius: var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius) 0 0;
  324. background-size: cover;
  325. padding: .6em .6em;
  326. text-align: left;
  327. line-height: 28px;
  328. color: var(--panelText);
  329. background-color: $fallback--fg;
  330. background-color: var(--panel, $fallback--fg);
  331. align-items: baseline;
  332. box-shadow: var(--panelHeaderShadow);
  333. .title {
  334. flex: 1 0 auto;
  335. font-size: 1.3em;
  336. }
  337. .faint {
  338. background-color: transparent;
  339. color: $fallback--faint;
  340. color: var(--panelFaint, $fallback--faint);
  341. }
  342. .alert {
  343. white-space: nowrap;
  344. text-overflow: ellipsis;
  345. overflow-x: hidden;
  346. }
  347. button {
  348. flex-shrink: 0;
  349. }
  350. button, .alert {
  351. // height: 100%;
  352. line-height: 21px;
  353. min-height: 0;
  354. box-sizing: border-box;
  355. margin: 0;
  356. margin-left: .25em;
  357. min-width: 1px;
  358. align-self: stretch;
  359. }
  360. a {
  361. color: $fallback--link;
  362. color: var(--panelLink, $fallback--link)
  363. }
  364. }
  365. .panel-heading.stub {
  366. border-radius: $fallback--panelRadius;
  367. border-radius: var(--panelRadius, $fallback--panelRadius);
  368. }
  369. .panel-footer {
  370. border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
  371. border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
  372. .faint {
  373. color: $fallback--faint;
  374. color: var(--panelFaint, $fallback--faint);
  375. }
  376. a {
  377. color: $fallback--link;
  378. color: var(--panelLink, $fallback--link)
  379. }
  380. }
  381. .panel-body > p {
  382. line-height: 18px;
  383. padding: 1em;
  384. margin: 0;
  385. }
  386. .container > * {
  387. min-width: 0px;
  388. }
  389. .fa {
  390. color: grey;
  391. }
  392. nav {
  393. z-index: 1000;
  394. color: var(--topBarText);
  395. background-color: $fallback--fg;
  396. background-color: var(--topBar, $fallback--fg);
  397. color: $fallback--faint;
  398. color: var(--faint, $fallback--faint);
  399. box-shadow: 0px 0px 4px rgba(0,0,0,.6);
  400. box-shadow: var(--topBarShadow);
  401. .back-button {
  402. display: block;
  403. max-width: 99px;
  404. transition-property: opacity, max-width;
  405. transition-duration: 300ms;
  406. transition-timing-function: ease-out;
  407. i {
  408. margin: 0 1em;
  409. }
  410. &.hidden {
  411. opacity: 0;
  412. max-width: 5px;
  413. }
  414. }
  415. }
  416. .menu-button {
  417. display: none;
  418. position: relative;
  419. }
  420. .alert-dot {
  421. border-radius: 100%;
  422. height: 8px;
  423. width: 8px;
  424. position: absolute;
  425. left: calc(50% - 4px);
  426. top: calc(50% - 4px);
  427. margin-left: 6px;
  428. margin-top: -6px;
  429. background-color: $fallback--cRed;
  430. background-color: var(--badgeNotification, $fallback--cRed);
  431. }
  432. .fade-enter-active, .fade-leave-active {
  433. transition: opacity .2s
  434. }
  435. .fade-enter, .fade-leave-active {
  436. opacity: 0
  437. }
  438. .main {
  439. flex-basis: 50%;
  440. flex-grow: 1;
  441. flex-shrink: 1;
  442. }
  443. .sidebar-bounds {
  444. flex: 0;
  445. flex-basis: 35%;
  446. }
  447. .sidebar-flexer {
  448. flex: 1;
  449. flex-basis: 345px;
  450. width: 365px;
  451. }
  452. .mobile-shown {
  453. display: none;
  454. }
  455. .panel-switcher {
  456. display: none;
  457. width: 100%;
  458. height: 46px;
  459. button {
  460. display: block;
  461. flex: 1;
  462. max-height: 32px;
  463. margin: 0.5em;
  464. padding: 0.5em;
  465. }
  466. }
  467. @media all and (min-width: 800px) {
  468. body {
  469. overflow-y: scroll;
  470. }
  471. nav {
  472. .back-button {
  473. display: none;
  474. }
  475. }
  476. .sidebar-bounds {
  477. overflow: hidden;
  478. max-height: 100vh;
  479. width: 345px;
  480. position: fixed;
  481. margin-top: -10px;
  482. .sidebar-scroller {
  483. height: 96vh;
  484. width: 365px;
  485. padding-top: 10px;
  486. padding-right: 50px;
  487. overflow-x: hidden;
  488. overflow-y: scroll;
  489. }
  490. .sidebar {
  491. width: 345px;
  492. }
  493. }
  494. .sidebar-flexer {
  495. max-height: 96vh;
  496. flex-shrink: 0;
  497. flex-grow: 0;
  498. }
  499. }
  500. .badge {
  501. display: inline-block;
  502. border-radius: 99px;
  503. min-width: 22px;
  504. max-width: 22px;
  505. min-height: 22px;
  506. max-height: 22px;
  507. font-size: 15px;
  508. line-height: 22px;
  509. text-align: center;
  510. vertical-align: middle;
  511. white-space: nowrap;
  512. padding: 0;
  513. &.badge-notification {
  514. background-color: $fallback--cRed;
  515. background-color: var(--badgeNotification, $fallback--cRed);
  516. color: white;
  517. color: var(--badgeNotificationText, white);
  518. }
  519. }
  520. .alert {
  521. margin: 0.35em;
  522. padding: 0.25em;
  523. border-radius: $fallback--tooltipRadius;
  524. border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
  525. min-height: 28px;
  526. line-height: 28px;
  527. &.error {
  528. background-color: $fallback--alertError;
  529. background-color: var(--alertError, $fallback--alertError);
  530. color: $fallback--text;
  531. color: var(--alertErrorText, $fallback--text);
  532. .panel-heading & {
  533. color: $fallback--text;
  534. color: var(--alertErrorPanelText, $fallback--text);
  535. }
  536. }
  537. }
  538. .faint {
  539. color: $fallback--faint;
  540. color: var(--faint, $fallback--faint);
  541. }
  542. .faint-link {
  543. color: $fallback--faint;
  544. color: var(--faint, $fallback--faint);
  545. &:hover {
  546. text-decoration: underline;
  547. }
  548. }
  549. @media all and (min-width: 800px) {
  550. .logo {
  551. opacity: 1 !important;
  552. }
  553. }
  554. .item.right {
  555. text-align: right;
  556. }
  557. .visibility-tray {
  558. font-size: 1.2em;
  559. padding: 3px;
  560. cursor: pointer;
  561. .selected {
  562. color: $fallback--lightText;
  563. color: var(--lightText, $fallback--lightText);
  564. }
  565. div {
  566. padding-top: 5px;
  567. }
  568. }
  569. .visibility-notice {
  570. padding: .5em;
  571. border: 1px solid $fallback--faint;
  572. border: 1px solid var(--faint, $fallback--faint);
  573. border-radius: $fallback--inputRadius;
  574. border-radius: var(--inputRadius, $fallback--inputRadius);
  575. }
  576. .button-icon {
  577. font-size: 1.2em;
  578. }
  579. @keyframes shakeError {
  580. 0% {
  581. transform: translateX(0);
  582. }
  583. 15% {
  584. transform: translateX(0.375rem);
  585. }
  586. 30% {
  587. transform: translateX(-0.375rem);
  588. }
  589. 45% {
  590. transform: translateX(0.375rem);
  591. }
  592. 60% {
  593. transform: translateX(-0.375rem);
  594. }
  595. 75% {
  596. transform: translateX(0.375rem);
  597. }
  598. 90% {
  599. transform: translateX(-0.375rem);
  600. }
  601. 100% {
  602. transform: translateX(0);
  603. }
  604. }
  605. @media all and (max-width: 800px) {
  606. .mobile-hidden {
  607. display: none;
  608. }
  609. .panel-switcher {
  610. display: flex;
  611. }
  612. .container {
  613. padding: 0;
  614. }
  615. .panel {
  616. margin: 0.5em 0 0.5em 0;
  617. }
  618. .menu-button {
  619. display: block;
  620. margin-right: 0.8em;
  621. }
  622. }
  623. .login-hint {
  624. text-align: center;
  625. @media all and (min-width: 801px) {
  626. display: none;
  627. }
  628. a {
  629. display: inline-block;
  630. padding: 1em 0px;
  631. width: 100%;
  632. }
  633. }
  634. .btn.btn-default {
  635. min-height: 28px;
  636. }