You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

929 lines
16 KiB

Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
Add Keybase integration (#10297) * create account_identity_proofs table * add endpoint for keybase to check local proofs * add async task to update validity and liveness of proofs from keybase * first pass keybase proof CRUD * second pass keybase proof creation * clean up proof list and add badges * add avatar url to keybase api * Always highlight the “Identity Proofs” navigation item when interacting with proofs. * Update translations. * Add profile URL. * Reorder proofs. * Add proofs to bio. * Update settings/identity_proofs front-end. * Use `link_to`. * Only encode query params if they exist. URLs without params had a trailing `?`. * Only show live proofs. * change valid to active in proof list and update liveness before displaying * minor fixes * add keybase config at well-known path * extremely naive feature flagging off the identity proof UI * fixes for rubocop * make identity proofs page resilient to potential keybase issues * normalize i18n * tweaks for brakeman * remove two unused translations * cleanup and add more localizations * make keybase_contacts an admin setting * fix ExternalProofService my_domain * use Addressable::URI in identity proofs * use active model serializer for keybase proof config * more cleanup of keybase proof config * rename proof is_valid and is_live to proof_valid and proof_live * cleanup * assorted tweaks for more robust communication with keybase * Clean up * Small fixes * Display verified identity identically to verified links * Clean up unused CSS * Add caching for Keybase avatar URLs * Remove keybase_contacts setting
5 years ago
  1. $no-columns-breakpoint: 600px;
  2. code {
  3. font-family: $font-monospace, monospace;
  4. font-weight: 400;
  5. }
  6. .form-container {
  7. max-width: 400px;
  8. padding: 20px;
  9. margin: 0 auto;
  10. }
  11. .simple_form {
  12. .input {
  13. margin-bottom: 15px;
  14. overflow: hidden;
  15. &.hidden {
  16. margin: 0;
  17. }
  18. &.radio_buttons {
  19. .radio {
  20. margin-bottom: 15px;
  21. &:last-child {
  22. margin-bottom: 0;
  23. }
  24. }
  25. .radio > label {
  26. position: relative;
  27. padding-left: 28px;
  28. input {
  29. position: absolute;
  30. top: -2px;
  31. left: 0;
  32. }
  33. }
  34. }
  35. &.boolean {
  36. position: relative;
  37. margin-bottom: 0;
  38. .label_input > label {
  39. font-family: inherit;
  40. font-size: 14px;
  41. padding-top: 5px;
  42. color: $primary-text-color;
  43. display: block;
  44. width: auto;
  45. }
  46. .label_input,
  47. .hint {
  48. padding-left: 28px;
  49. }
  50. .label_input__wrapper {
  51. position: static;
  52. }
  53. label.checkbox {
  54. position: absolute;
  55. top: 2px;
  56. left: 0;
  57. }
  58. label a {
  59. color: $highlight-text-color;
  60. text-decoration: underline;
  61. &:hover,
  62. &:active,
  63. &:focus {
  64. text-decoration: none;
  65. }
  66. }
  67. .recommended {
  68. position: absolute;
  69. margin: 0 4px;
  70. margin-top: -2px;
  71. }
  72. }
  73. }
  74. .row {
  75. display: flex;
  76. margin: 0 -5px;
  77. .input {
  78. box-sizing: border-box;
  79. flex: 1 1 auto;
  80. width: 50%;
  81. padding: 0 5px;
  82. }
  83. }
  84. .hint {
  85. color: $darker-text-color;
  86. a {
  87. color: $highlight-text-color;
  88. }
  89. code {
  90. border-radius: 3px;
  91. padding: 0.2em 0.4em;
  92. background: darken($ui-base-color, 12%);
  93. }
  94. }
  95. span.hint {
  96. display: block;
  97. font-size: 12px;
  98. margin-top: 4px;
  99. }
  100. p.hint {
  101. margin-bottom: 15px;
  102. color: $darker-text-color;
  103. &.subtle-hint {
  104. text-align: center;
  105. font-size: 12px;
  106. line-height: 18px;
  107. margin-top: 15px;
  108. margin-bottom: 0;
  109. }
  110. }
  111. .card {
  112. margin-bottom: 15px;
  113. }
  114. strong {
  115. font-weight: 500;
  116. @each $lang in $cjk-langs {
  117. &:lang(#{$lang}) {
  118. font-weight: 700;
  119. }
  120. }
  121. }
  122. .input.with_floating_label {
  123. .label_input {
  124. display: flex;
  125. & > label {
  126. font-family: inherit;
  127. font-size: 14px;
  128. color: $primary-text-color;
  129. font-weight: 500;
  130. min-width: 150px;
  131. flex: 0 0 auto;
  132. }
  133. input,
  134. select {
  135. flex: 1 1 auto;
  136. }
  137. }
  138. &.select .hint {
  139. margin-top: 6px;
  140. margin-left: 150px;
  141. }
  142. }
  143. .input.with_label {
  144. .label_input > label {
  145. font-family: inherit;
  146. font-size: 14px;
  147. color: $primary-text-color;
  148. display: block;
  149. margin-bottom: 8px;
  150. word-wrap: break-word;
  151. font-weight: 500;
  152. }
  153. .hint {
  154. margin-top: 6px;
  155. }
  156. ul {
  157. flex: 390px;
  158. }
  159. }
  160. .input.with_block_label {
  161. max-width: none;
  162. & > label {
  163. font-family: inherit;
  164. font-size: 16px;
  165. color: $primary-text-color;
  166. display: block;
  167. font-weight: 500;
  168. padding-top: 5px;
  169. }
  170. .hint {
  171. margin-bottom: 15px;
  172. }
  173. ul {
  174. columns: 2;
  175. }
  176. }
  177. .required abbr {
  178. text-decoration: none;
  179. color: lighten($error-value-color, 12%);
  180. }
  181. .fields-group {
  182. margin-bottom: 25px;
  183. .input:last-child {
  184. margin-bottom: 0;
  185. }
  186. }
  187. .fields-row {
  188. display: flex;
  189. margin: 0 -10px;
  190. padding-top: 5px;
  191. margin-bottom: 25px;
  192. .input {
  193. max-width: none;
  194. }
  195. &__column {
  196. box-sizing: border-box;
  197. padding: 0 10px;
  198. flex: 1 1 auto;
  199. min-height: 1px;
  200. &-6 {
  201. max-width: 50%;
  202. }
  203. }
  204. .fields-group:last-child,
  205. .fields-row__column.fields-group {
  206. margin-bottom: 0;
  207. }
  208. @media screen and (max-width: $no-columns-breakpoint) {
  209. display: block;
  210. margin-bottom: 0;
  211. &__column {
  212. max-width: none;
  213. }
  214. .fields-group:last-child,
  215. .fields-row__column.fields-group,
  216. .fields-row__column {
  217. margin-bottom: 25px;
  218. }
  219. }
  220. }
  221. .input.radio_buttons .radio label {
  222. margin-bottom: 5px;
  223. font-family: inherit;
  224. font-size: 14px;
  225. color: $primary-text-color;
  226. display: block;
  227. width: auto;
  228. }
  229. .check_boxes {
  230. .checkbox {
  231. label {
  232. font-family: inherit;
  233. font-size: 14px;
  234. color: $primary-text-color;
  235. display: inline-block;
  236. width: auto;
  237. position: relative;
  238. padding-top: 5px;
  239. padding-left: 25px;
  240. flex: 1 1 auto;
  241. }
  242. input[type=checkbox] {
  243. position: absolute;
  244. left: 0;
  245. top: 5px;
  246. margin: 0;
  247. }
  248. }
  249. }
  250. .input.static .label_input__wrapper {
  251. font-size: 16px;
  252. padding: 10px;
  253. border: 1px solid $dark-text-color;
  254. border-radius: 4px;
  255. }
  256. input[type=text],
  257. input[type=number],
  258. input[type=email],
  259. input[type=password],
  260. textarea {
  261. box-sizing: border-box;
  262. font-size: 16px;
  263. color: $primary-text-color;
  264. display: block;
  265. width: 100%;
  266. outline: 0;
  267. font-family: inherit;
  268. resize: vertical;
  269. background: darken($ui-base-color, 10%);
  270. border: 1px solid darken($ui-base-color, 14%);
  271. border-radius: 4px;
  272. padding: 10px;
  273. &:invalid {
  274. box-shadow: none;
  275. }
  276. &:focus:invalid:not(:placeholder-shown) {
  277. border-color: lighten($error-red, 12%);
  278. }
  279. &:required:valid {
  280. border-color: $valid-value-color;
  281. }
  282. &:hover {
  283. border-color: darken($ui-base-color, 20%);
  284. }
  285. &:active,
  286. &:focus {
  287. border-color: $highlight-text-color;
  288. background: darken($ui-base-color, 8%);
  289. }
  290. }
  291. .input.field_with_errors {
  292. label {
  293. color: lighten($error-red, 12%);
  294. }
  295. input[type=text],
  296. input[type=number],
  297. input[type=email],
  298. input[type=password],
  299. textarea,
  300. select {
  301. border-color: lighten($error-red, 12%);
  302. }
  303. .error {
  304. display: block;
  305. font-weight: 500;
  306. color: lighten($error-red, 12%);
  307. margin-top: 4px;
  308. }
  309. }
  310. .input.disabled {
  311. opacity: 0.5;
  312. }
  313. .actions {
  314. margin-top: 30px;
  315. display: flex;
  316. &.actions--top {
  317. margin-top: 0;
  318. margin-bottom: 30px;
  319. }
  320. }
  321. button,
  322. .button,
  323. .block-button {
  324. display: block;
  325. width: 100%;
  326. border: 0;
  327. border-radius: 4px;
  328. background: $ui-highlight-color;
  329. color: $primary-text-color;
  330. font-size: 18px;
  331. line-height: inherit;
  332. height: auto;
  333. padding: 10px;
  334. text-transform: uppercase;
  335. text-decoration: none;
  336. text-align: center;
  337. box-sizing: border-box;
  338. cursor: pointer;
  339. font-weight: 500;
  340. outline: 0;
  341. margin-bottom: 10px;
  342. margin-right: 10px;
  343. &:last-child {
  344. margin-right: 0;
  345. }
  346. &:hover {
  347. background-color: lighten($ui-highlight-color, 5%);
  348. }
  349. &:active,
  350. &:focus {
  351. background-color: darken($ui-highlight-color, 5%);
  352. }
  353. &:disabled:hover {
  354. background-color: $ui-primary-color;
  355. }
  356. &.negative {
  357. background: $error-value-color;
  358. &:hover {
  359. background-color: lighten($error-value-color, 5%);
  360. }
  361. &:active,
  362. &:focus {
  363. background-color: darken($error-value-color, 5%);
  364. }
  365. }
  366. }
  367. select {
  368. appearance: none;
  369. box-sizing: border-box;
  370. font-size: 16px;
  371. color: $primary-text-color;
  372. display: block;
  373. width: 100%;
  374. outline: 0;
  375. font-family: inherit;
  376. resize: vertical;
  377. background: darken($ui-base-color, 10%) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 14.933 18.467' height='19.698' width='15.929'><path d='M3.467 14.967l-3.393-3.5H14.86l-3.392 3.5c-1.866 1.925-3.666 3.5-4 3.5-.335 0-2.135-1.575-4-3.5zm.266-11.234L7.467 0 11.2 3.733l3.733 3.734H0l3.733-3.734z' fill='#{hex-color(lighten($ui-base-color, 12%))}'/></svg>") no-repeat right 8px center / auto 16px;
  378. border: 1px solid darken($ui-base-color, 14%);
  379. border-radius: 4px;
  380. padding-left: 10px;
  381. padding-right: 30px;
  382. height: 41px;
  383. }
  384. h4 {
  385. margin-bottom: 15px !important;
  386. }
  387. .label_input {
  388. &__wrapper {
  389. position: relative;
  390. }
  391. &__append {
  392. position: absolute;
  393. right: 3px;
  394. top: 1px;
  395. padding: 10px;
  396. padding-bottom: 9px;
  397. font-size: 16px;
  398. color: $dark-text-color;
  399. font-family: inherit;
  400. pointer-events: none;
  401. cursor: default;
  402. max-width: 140px;
  403. white-space: nowrap;
  404. overflow: hidden;
  405. &::after {
  406. content: '';
  407. display: block;
  408. position: absolute;
  409. top: 0;
  410. right: 0;
  411. bottom: 1px;
  412. width: 5px;
  413. background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
  414. }
  415. }
  416. }
  417. &__overlay-area {
  418. position: relative;
  419. &__overlay {
  420. position: absolute;
  421. top: 0;
  422. left: 0;
  423. width: 100%;
  424. height: 100%;
  425. display: flex;
  426. justify-content: center;
  427. align-items: center;
  428. background: rgba($ui-base-color, 0.65);
  429. backdrop-filter: blur(2px);
  430. border-radius: 4px;
  431. &__content {
  432. text-align: center;
  433. &.rich-formatting {
  434. &,
  435. p {
  436. color: $primary-text-color;
  437. }
  438. }
  439. }
  440. }
  441. }
  442. }
  443. .block-icon {
  444. display: block;
  445. margin: 0 auto;
  446. margin-bottom: 10px;
  447. font-size: 24px;
  448. }
  449. .flash-message {
  450. background: lighten($ui-base-color, 8%);
  451. color: $darker-text-color;
  452. border-radius: 4px;
  453. padding: 15px 10px;
  454. margin-bottom: 30px;
  455. text-align: center;
  456. &.notice {
  457. border: 1px solid rgba($valid-value-color, 0.5);
  458. background: rgba($valid-value-color, 0.25);
  459. color: $valid-value-color;
  460. }
  461. &.alert {
  462. border: 1px solid rgba($error-value-color, 0.5);
  463. background: rgba($error-value-color, 0.25);
  464. color: $error-value-color;
  465. }
  466. a {
  467. display: inline-block;
  468. color: $darker-text-color;
  469. text-decoration: none;
  470. &:hover {
  471. color: $primary-text-color;
  472. text-decoration: underline;
  473. }
  474. }
  475. p {
  476. margin-bottom: 15px;
  477. }
  478. .oauth-code {
  479. outline: 0;
  480. box-sizing: border-box;
  481. display: block;
  482. width: 100%;
  483. border: 0;
  484. padding: 10px;
  485. font-family: $font-monospace, monospace;
  486. background: $ui-base-color;
  487. color: $primary-text-color;
  488. font-size: 14px;
  489. margin: 0;
  490. &::-moz-focus-inner {
  491. border: 0;
  492. }
  493. &::-moz-focus-inner,
  494. &:focus,
  495. &:active {
  496. outline: 0 !important;
  497. }
  498. &:focus {
  499. background: lighten($ui-base-color, 4%);
  500. }
  501. }
  502. strong {
  503. font-weight: 500;
  504. @each $lang in $cjk-langs {
  505. &:lang(#{$lang}) {
  506. font-weight: 700;
  507. }
  508. }
  509. }
  510. @media screen and (max-width: 740px) and (min-width: 441px) {
  511. margin-top: 40px;
  512. }
  513. }
  514. .form-footer {
  515. margin-top: 30px;
  516. text-align: center;
  517. a {
  518. color: $darker-text-color;
  519. text-decoration: none;
  520. &:hover {
  521. text-decoration: underline;
  522. }
  523. }
  524. }
  525. .quick-nav {
  526. list-style: none;
  527. margin-bottom: 25px;
  528. font-size: 14px;
  529. li {
  530. display: inline-block;
  531. margin-right: 10px;
  532. }
  533. a {
  534. color: $highlight-text-color;
  535. text-transform: uppercase;
  536. text-decoration: none;
  537. font-weight: 700;
  538. &:hover,
  539. &:focus,
  540. &:active {
  541. color: lighten($highlight-text-color, 8%);
  542. }
  543. }
  544. }
  545. .oauth-prompt,
  546. .follow-prompt {
  547. margin-bottom: 30px;
  548. color: $darker-text-color;
  549. h2 {
  550. font-size: 16px;
  551. margin-bottom: 30px;
  552. text-align: center;
  553. }
  554. strong {
  555. color: $secondary-text-color;
  556. font-weight: 500;
  557. @each $lang in $cjk-langs {
  558. &:lang(#{$lang}) {
  559. font-weight: 700;
  560. }
  561. }
  562. }
  563. @media screen and (max-width: 740px) and (min-width: 441px) {
  564. margin-top: 40px;
  565. }
  566. }
  567. .qr-wrapper {
  568. display: flex;
  569. flex-wrap: wrap;
  570. align-items: flex-start;
  571. }
  572. .qr-code {
  573. flex: 0 0 auto;
  574. background: $simple-background-color;
  575. padding: 4px;
  576. margin: 0 10px 20px 0;
  577. box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
  578. display: inline-block;
  579. svg {
  580. display: block;
  581. margin: 0;
  582. }
  583. }
  584. .qr-alternative {
  585. margin-bottom: 20px;
  586. color: $secondary-text-color;
  587. flex: 150px;
  588. samp {
  589. display: block;
  590. font-size: 14px;
  591. }
  592. }
  593. .table-form {
  594. p {
  595. margin-bottom: 15px;
  596. strong {
  597. font-weight: 500;
  598. @each $lang in $cjk-langs {
  599. &:lang(#{$lang}) {
  600. font-weight: 700;
  601. }
  602. }
  603. }
  604. }
  605. }
  606. .simple_form,
  607. .table-form {
  608. .warning {
  609. box-sizing: border-box;
  610. background: rgba($error-value-color, 0.5);
  611. color: $primary-text-color;
  612. text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);
  613. box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);
  614. border-radius: 4px;
  615. padding: 10px;
  616. margin-bottom: 15px;
  617. a {
  618. color: $primary-text-color;
  619. text-decoration: underline;
  620. &:hover,
  621. &:focus,
  622. &:active {
  623. text-decoration: none;
  624. }
  625. }
  626. strong {
  627. font-weight: 600;
  628. display: block;
  629. margin-bottom: 5px;
  630. @each $lang in $cjk-langs {
  631. &:lang(#{$lang}) {
  632. font-weight: 700;
  633. }
  634. }
  635. .fa {
  636. font-weight: 400;
  637. }
  638. }
  639. }
  640. }
  641. .action-pagination {
  642. display: flex;
  643. flex-wrap: wrap;
  644. align-items: center;
  645. .actions,
  646. .pagination {
  647. flex: 1 1 auto;
  648. }
  649. .actions {
  650. padding: 30px 0;
  651. padding-right: 20px;
  652. flex: 0 0 auto;
  653. }
  654. }
  655. .post-follow-actions {
  656. text-align: center;
  657. color: $darker-text-color;
  658. div {
  659. margin-bottom: 4px;
  660. }
  661. }
  662. .alternative-login {
  663. margin-top: 20px;
  664. margin-bottom: 20px;
  665. h4 {
  666. font-size: 16px;
  667. color: $primary-text-color;
  668. text-align: center;
  669. margin-bottom: 20px;
  670. border: 0;
  671. padding: 0;
  672. }
  673. .button {
  674. display: block;
  675. }
  676. }
  677. .scope-danger {
  678. color: $warning-red;
  679. }
  680. .form_admin_settings_site_short_description,
  681. .form_admin_settings_site_description,
  682. .form_admin_settings_site_extended_description,
  683. .form_admin_settings_site_terms,
  684. .form_admin_settings_custom_css,
  685. .form_admin_settings_closed_registrations_message {
  686. textarea {
  687. font-family: $font-monospace, monospace;
  688. }
  689. }
  690. .input-copy {
  691. background: darken($ui-base-color, 10%);
  692. border: 1px solid darken($ui-base-color, 14%);
  693. border-radius: 4px;
  694. display: flex;
  695. align-items: center;
  696. padding-right: 4px;
  697. position: relative;
  698. top: 1px;
  699. transition: border-color 300ms linear;
  700. &__wrapper {
  701. flex: 1 1 auto;
  702. }
  703. input[type=text] {
  704. background: transparent;
  705. border: 0;
  706. padding: 10px;
  707. font-size: 14px;
  708. font-family: $font-monospace, monospace;
  709. }
  710. button {
  711. flex: 0 0 auto;
  712. margin: 4px;
  713. text-transform: none;
  714. font-weight: 400;
  715. font-size: 14px;
  716. padding: 7px 18px;
  717. padding-bottom: 6px;
  718. width: auto;
  719. transition: background 300ms linear;
  720. }
  721. &.copied {
  722. border-color: $valid-value-color;
  723. transition: none;
  724. button {
  725. background: $valid-value-color;
  726. transition: none;
  727. }
  728. }
  729. }
  730. .connection-prompt {
  731. margin-bottom: 25px;
  732. .fa-link {
  733. background-color: darken($ui-base-color, 4%);
  734. border-radius: 100%;
  735. font-size: 24px;
  736. padding: 10px;
  737. }
  738. &__column {
  739. align-items: center;
  740. display: flex;
  741. flex: 1;
  742. flex-direction: column;
  743. flex-shrink: 1;
  744. max-width: 50%;
  745. &-sep {
  746. align-self: center;
  747. flex-grow: 0;
  748. overflow: visible;
  749. position: relative;
  750. z-index: 1;
  751. }
  752. p {
  753. word-break: break-word;
  754. }
  755. }
  756. .account__avatar {
  757. margin-bottom: 20px;
  758. }
  759. &__connection {
  760. background-color: lighten($ui-base-color, 8%);
  761. box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
  762. border-radius: 4px;
  763. padding: 25px 10px;
  764. position: relative;
  765. text-align: center;
  766. &::after {
  767. background-color: darken($ui-base-color, 4%);
  768. content: '';
  769. display: block;
  770. height: 100%;
  771. left: 50%;
  772. position: absolute;
  773. top: 0;
  774. width: 1px;
  775. }
  776. }
  777. &__row {
  778. align-items: flex-start;
  779. display: flex;
  780. flex-direction: row;
  781. }
  782. }