toolkit.less 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663
  1. // other solution : http://stackoverflow.com/questions/1577598/how-to-hide-parts-of-html-when-javascript-is-disabled/13857783#13857783
  2. // stylelint-disable no-descending-specificity
  3. html.no-js .hide_if_nojs {
  4. display: none;
  5. }
  6. html.js .show_if_nojs {
  7. display: none;
  8. }
  9. .center {
  10. text-align: center;
  11. }
  12. .right {
  13. float: right;
  14. }
  15. .left {
  16. float: left;
  17. }
  18. .invisible {
  19. display: none !important;
  20. }
  21. .list-unstyled {
  22. list-style-type: none;
  23. li {
  24. margin-top: 4px;
  25. margin-bottom: 4px;
  26. }
  27. }
  28. .danger {
  29. background-color: var(--color-error-background);
  30. }
  31. .warning {
  32. background: var(--color-warning-background);
  33. }
  34. .success {
  35. background: var(--color-success-background);
  36. }
  37. .badge {
  38. display: inline-block;
  39. color: var(--color-toolkit-badge-font);
  40. background-color: var(--color-toolkit-badge-background);
  41. text-align: center;
  42. white-space: nowrap;
  43. vertical-align: baseline;
  44. min-width: 10px;
  45. padding: 1px 5px;
  46. border-radius: 5px;
  47. }
  48. // kbd
  49. kbd {
  50. padding: 2px 4px;
  51. margin: 1px;
  52. font-size: 90%;
  53. color: var(--color-toolkit-kbd-font);
  54. background: var(--color-toolkit-kbd-background);
  55. }
  56. // table
  57. table {
  58. width: 100%;
  59. &.striped {
  60. tr {
  61. border-bottom: 1px solid var(--color-settings-tr-hover);
  62. }
  63. }
  64. }
  65. th {
  66. padding: 0.4em;
  67. }
  68. td {
  69. padding: 0 4px;
  70. }
  71. tr {
  72. &:hover {
  73. background: var(--color-settings-tr-hover) !important;
  74. }
  75. }
  76. // pre
  77. .pre() {
  78. display: block;
  79. font-size: 0.8em;
  80. word-break: break-all;
  81. margin: 0.1em;
  82. user-select: all;
  83. }
  84. div.selectable_url {
  85. display: block;
  86. border: 1px solid var(--color-result-search-url-border);
  87. padding: 4px;
  88. color: var(--color-result-search-url-font);
  89. margin: 0.1em;
  90. overflow: hidden;
  91. height: 1.2em;
  92. line-height: 1.2em;
  93. .rounded-corners-tiny;
  94. pre {
  95. .pre();
  96. }
  97. }
  98. // dialog
  99. .dialog() {
  100. position: relative;
  101. display: flex;
  102. padding: 1rem;
  103. margin: 0 0 1em 0;
  104. border: 1px solid var(--color-toolkit-dialog-border);
  105. .ltr-text-align-left();
  106. .rounded-corners;
  107. .close {
  108. .ltr-float-right();
  109. position: relative;
  110. top: -3px;
  111. color: inherit;
  112. font-size: 1.5em;
  113. }
  114. ul,
  115. ol,
  116. p {
  117. margin: 1px 0 0 0;
  118. }
  119. table {
  120. width: auto;
  121. }
  122. tr {
  123. vertical-align: text-top;
  124. &:hover {
  125. background: transparent !important;
  126. }
  127. }
  128. td {
  129. padding: 0 1em 0 0;
  130. padding-top: 0;
  131. .ltr-padding-right(1rem);
  132. padding-bottom: 0;
  133. .ltr-padding-left(0);
  134. }
  135. h4 {
  136. margin-top: 0.3em;
  137. margin-bottom: 0.3em;
  138. }
  139. }
  140. .dialog-error {
  141. .dialog();
  142. color: var(--color-error);
  143. background: var(--color-error-background);
  144. border-color: var(--color-error);
  145. }
  146. .dialog-error-block {
  147. .dialog();
  148. display: block;
  149. color: var(--color-error);
  150. background: var(--color-error-background);
  151. border-color: var(--color-error);
  152. }
  153. .dialog-warning {
  154. .dialog();
  155. color: var(--color-warning);
  156. background: var(--color-warning-background);
  157. border-color: var(--color-warning);
  158. }
  159. .dialog-modal {
  160. .dialog();
  161. display: block;
  162. background: var(--color-toolkit-dialog-background);
  163. position: fixed;
  164. top: 50%;
  165. left: 50%;
  166. margin: 0 auto;
  167. transform: translate(-50%, -50%);
  168. z-index: 5000;
  169. h3 {
  170. margin-top: 0;
  171. }
  172. }
  173. // btn-collapse
  174. .btn-collapse {
  175. cursor: pointer;
  176. }
  177. //
  178. .scrollx {
  179. overflow: auto hidden;
  180. display: block;
  181. padding: 0;
  182. margin: 0;
  183. border: none;
  184. }
  185. /* -- tabs -- */
  186. .tabs .tabs > label {
  187. font-size: 90%;
  188. }
  189. ul.tabs {
  190. border-bottom: 1px solid var(--color-toolkit-tabs-section-border);
  191. list-style: none;
  192. padding-left: 0;
  193. li {
  194. display: flex;
  195. }
  196. }
  197. .tabs {
  198. display: flex;
  199. flex-wrap: wrap;
  200. width: 100%;
  201. min-width: 100%;
  202. & > * {
  203. order: 2;
  204. }
  205. & > input[type="radio"] {
  206. display: none;
  207. }
  208. & > label,
  209. & > li > a {
  210. order: 1;
  211. padding: 0.7em;
  212. margin: 0 0.7em;
  213. letter-spacing: 0.5px;
  214. text-transform: uppercase;
  215. border: solid var(--color-toolkit-tabs-label-border);
  216. border-width: 0 0 2px 0;
  217. color: unset;
  218. .disable-user-select();
  219. cursor: pointer;
  220. &.active {
  221. border-bottom: 2px solid var(--color-categories-item-border-selected);
  222. background: var(--color-categories-item-selected);
  223. color: var(--color-categories-item-selected-font);
  224. }
  225. }
  226. & > label:hover,
  227. & > li > a:hover {
  228. border-bottom: 2px solid var(--color-categories-item-border-selected);
  229. }
  230. & > section {
  231. min-width: 100%;
  232. padding: 0.7rem 0;
  233. box-sizing: border-box;
  234. border-top: 1px solid var(--color-toolkit-tabs-section-border);
  235. display: none;
  236. }
  237. // default selection
  238. & > label:last-of-type {
  239. border-bottom: 2px solid var(--color-categories-item-border-selected);
  240. background: var(--color-categories-item-selected);
  241. color: var(--color-categories-item-selected-font);
  242. letter-spacing: -0.1px;
  243. }
  244. & > section:last-of-type {
  245. display: block;
  246. }
  247. }
  248. html body .tabs > input:checked {
  249. ~ section {
  250. display: none;
  251. }
  252. ~ label {
  253. position: inherited;
  254. background: inherit;
  255. border-bottom: 2px solid transparent;
  256. font-weight: normal;
  257. color: inherit;
  258. &:hover {
  259. border-bottom: 2px solid var(--color-categories-item-border-selected);
  260. }
  261. }
  262. + label {
  263. border-bottom: 2px solid var(--color-categories-item-border-selected);
  264. background: var(--color-categories-item-selected);
  265. color: var(--color-categories-item-selected-font);
  266. }
  267. + label + section {
  268. display: block;
  269. }
  270. }
  271. /* -- select -- */
  272. select {
  273. height: 2.4rem;
  274. margin-top: 0;
  275. .ltr-margin-right(1rem);
  276. margin-bottom: 0;
  277. .ltr-margin-left(0);
  278. padding: 0.2rem !important;
  279. color: var(--color-search-font);
  280. font-size: 0.9rem;
  281. z-index: 100;
  282. &:hover,
  283. &:focus {
  284. cursor: pointer;
  285. }
  286. }
  287. @supports (
  288. (background-position-x: 100%) and
  289. (
  290. (appearance: none) or (-webkit-appearance: none) or
  291. (-moz-appearance: none)
  292. )
  293. ) {
  294. select {
  295. appearance: none;
  296. -webkit-appearance: none;
  297. -moz-appearance: none;
  298. border-width: 0 2rem 0 0;
  299. border-color: transparent;
  300. background: data-uri("image/svg+xml;charset=UTF-8", @select-light-svg-path)
  301. no-repeat;
  302. background-position-x: calc(100% + 2rem);
  303. background-size: 2rem;
  304. background-origin: content-box;
  305. background-color: var(--color-toolkit-select-background);
  306. outline: medium none;
  307. text-overflow: ellipsis;
  308. .rounded-corners-tiny;
  309. &:hover,
  310. &:focus {
  311. background-color: var(--color-toolkit-select-background-hover);
  312. }
  313. option {
  314. background-color: var(--color-base-background);
  315. }
  316. }
  317. @media (prefers-color-scheme: dark) {
  318. html.theme-auto select,
  319. html.theme-dark select {
  320. background-image: data-uri(
  321. "image/svg+xml;charset=UTF-8",
  322. @select-dark-svg-path
  323. );
  324. }
  325. }
  326. html.theme-dark select {
  327. background-image: data-uri(
  328. "image/svg+xml;charset=UTF-8",
  329. @select-dark-svg-path
  330. );
  331. }
  332. }
  333. /* -- checkbox-onoff -- */
  334. input.checkbox-onoff[type="checkbox"] {
  335. -webkit-appearance: none;
  336. -moz-appearance: none;
  337. appearance: none;
  338. cursor: pointer;
  339. display: inline-block;
  340. width: 2.5em;
  341. height: 0.7em;
  342. box-shadow: none !important;
  343. margin: 0 16px;
  344. border-radius: 10px;
  345. position: relative;
  346. /* focus & hover */
  347. &:focus,
  348. &:hover {
  349. outline: none;
  350. }
  351. &:focus::after {
  352. content: "";
  353. position: absolute;
  354. width: 3.5em;
  355. height: 1.65em;
  356. border: 1px solid var(--color-btn-background);
  357. border-radius: 12px;
  358. box-shadow: var(--color-btn-background) 0 0 3px;
  359. z-index: 1200;
  360. top: -0.55em;
  361. left: -0.6em;
  362. }
  363. &::before {
  364. position: absolute;
  365. top: -0.5em;
  366. display: flex;
  367. justify-content: center;
  368. align-items: center;
  369. font-size: 0.75em;
  370. width: 1.875em;
  371. height: 1.875em;
  372. border-radius: 50%;
  373. }
  374. }
  375. /* check mark
  376. reversed-checkbox displays unchecked checkedboxes as checked, and vice versa.
  377. see https://github.com/searxng/searxng/blob/3408d061aab9abc6168fec9bbc6deab71b236dac/searx/templates/simple/preferences.html#L313
  378. */
  379. input.checkbox-onoff[type="checkbox"],
  380. input.checkbox-onoff.reversed-checkbox[type="checkbox"]:checked {
  381. background: var(--color-toolkit-checkbox-onoff-off-background);
  382. &::before {
  383. left: -0.5em;
  384. content: "\2715";
  385. color: var(--color-toolkit-checkbox-onoff-off-mark-color);
  386. background: var(--color-toolkit-checkbox-onoff-off-mark-background);
  387. }
  388. }
  389. input.checkbox-onoff[type="checkbox"]:checked,
  390. input.checkbox-onoff.reversed-checkbox[type="checkbox"] {
  391. background: var(--color-toolkit-checkbox-onoff-on-background);
  392. &::before {
  393. left: calc(100% - 1.5em);
  394. content: "\2713";
  395. color: var(--color-toolkit-checkbox-onoff-on-mark-color);
  396. background: var(--color-toolkit-checkbox-onoff-on-mark-background);
  397. }
  398. }
  399. /* -- checkbox -- */
  400. @supports (transform: rotate(-45deg)) {
  401. input[type="checkbox"]:not(.checkbox-onoff) {
  402. -webkit-appearance: none;
  403. -moz-appearance: none;
  404. appearance: none;
  405. width: 20px;
  406. height: 20px;
  407. cursor: pointer;
  408. position: relative;
  409. top: 0;
  410. left: 0;
  411. border: 2px solid var(--color-toolkit-checkbox-input-border);
  412. .rounded-corners(0.3em);
  413. &::after {
  414. content: "";
  415. width: 9px;
  416. height: 5px;
  417. position: absolute;
  418. top: 3px;
  419. left: 2px;
  420. border: 3px solid var(--color-toolkit-checkbox-label-border);
  421. border-top: none;
  422. border-right: none;
  423. background: transparent;
  424. opacity: 0;
  425. transform: rotate(-45deg);
  426. }
  427. &:checked::after {
  428. border-color: var(--color-toolkit-checkbox-input-border);
  429. opacity: 1;
  430. }
  431. }
  432. // disabled : can't be focused, show only the check mark
  433. input[type="checkbox"][disabled]:not(.checkbox-onoff) {
  434. border: inherit;
  435. background-color: transparent !important;
  436. cursor: inherit;
  437. }
  438. // if not checked and possible to checked then display a "light" check mark on hover
  439. input.checkbox[type="checkbox"]:not(
  440. :checked,
  441. [disabled],
  442. .checkbox-onoff
  443. ):hover::after {
  444. opacity: 0.5;
  445. }
  446. }
  447. @media screen and (max-width: @phone) {
  448. .tabs > label {
  449. width: 100%;
  450. }
  451. }
  452. /* -- loader -- */
  453. .loader,
  454. .loader::after {
  455. border-radius: 50%;
  456. width: 2em;
  457. height: 2em;
  458. }
  459. .loader {
  460. margin: 1em auto;
  461. font-size: 10px;
  462. position: relative;
  463. text-indent: -9999em;
  464. border-top: 0.5em solid var(--color-toolkit-loader-border);
  465. border-right: 0.5em solid var(--color-toolkit-loader-border);
  466. border-bottom: 0.5em solid var(--color-toolkit-loader-border);
  467. border-left: 0.5em solid var(--color-toolkit-loader-borderleft);
  468. -webkit-transform: translateZ(0);
  469. -ms-transform: translateZ(0);
  470. transform: translateZ(0);
  471. -webkit-animation: load8 1.2s infinite linear;
  472. animation: load8 1.2s infinite linear;
  473. }
  474. @-webkit-keyframes load8 {
  475. 0% {
  476. -webkit-transform: rotate(0deg);
  477. transform: rotate(0deg);
  478. }
  479. 100% {
  480. -webkit-transform: rotate(360deg);
  481. transform: rotate(360deg);
  482. }
  483. }
  484. @keyframes load8 {
  485. 0% {
  486. -webkit-transform: rotate(0deg);
  487. transform: rotate(0deg);
  488. }
  489. 100% {
  490. -webkit-transform: rotate(360deg);
  491. transform: rotate(360deg);
  492. }
  493. }
  494. /* -- engine-tooltip -- */
  495. .engine-tooltip {
  496. display: none;
  497. position: absolute;
  498. padding: 0.5rem 1rem;
  499. margin: 0 0 0 2rem;
  500. border: 1px solid var(--color-toolkit-engine-tooltip-border);
  501. background: var(--color-toolkit-engine-tooltip-background);
  502. font-size: 14px;
  503. font-weight: normal;
  504. z-index: 5000;
  505. text-align: left;
  506. .rounded-corners;
  507. }
  508. th:hover .engine-tooltip,
  509. td:hover .engine-tooltip,
  510. .engine-tooltip:hover {
  511. display: inline-block;
  512. }
  513. /* -- stacked bar chart -- */
  514. .stacked-bar-chart {
  515. margin: 0;
  516. padding: 0 0.125rem 0 4rem;
  517. width: 100%;
  518. width: -moz-available;
  519. width: -webkit-fill-available;
  520. width: fill;
  521. flex-flow: row nowrap;
  522. align-items: center;
  523. display: inline-flex;
  524. }
  525. .stacked-bar-chart-value {
  526. width: 3rem;
  527. display: inline-block;
  528. position: absolute;
  529. padding: 0 0.5rem;
  530. text-align: right;
  531. }
  532. .stacked-bar-chart-base {
  533. display: flex;
  534. flex-shrink: 0;
  535. flex-grow: 0;
  536. flex-basis: unset;
  537. }
  538. .stacked-bar-chart-median {
  539. .stacked-bar-chart-base();
  540. background: var(--color-base-font);
  541. border: 1px solid rgba(var(--color-base-font-rgb), 0.9);
  542. padding: 0.3rem 0;
  543. }
  544. .stacked-bar-chart-rate80 {
  545. .stacked-bar-chart-base();
  546. background: transparent;
  547. border: 1px solid rgba(var(--color-base-font-rgb), 0.3);
  548. padding: 0.3rem 0;
  549. }
  550. .stacked-bar-chart-rate95 {
  551. .stacked-bar-chart-base();
  552. background: transparent;
  553. border-bottom: 1px dotted rgba(var(--color-base-font-rgb), 0.5);
  554. padding: 0;
  555. }
  556. .stacked-bar-chart-rate100 {
  557. .stacked-bar-chart-base();
  558. background: transparent;
  559. border-left: 1px solid rgba(var(--color-base-font-rgb), 0.9);
  560. padding: 0.4rem 0;
  561. width: 1px;
  562. }