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.

956 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. li {
  95. list-style: disc;
  96. margin-left: 18px;
  97. }
  98. }
  99. ul.hint {
  100. margin-bottom: 15px;
  101. }
  102. span.hint {
  103. display: block;
  104. font-size: 12px;
  105. margin-top: 4px;
  106. }
  107. p.hint {
  108. margin-bottom: 15px;
  109. color: $darker-text-color;
  110. &.subtle-hint {
  111. text-align: center;
  112. font-size: 12px;
  113. line-height: 18px;
  114. margin-top: 15px;
  115. margin-bottom: 0;
  116. }
  117. }
  118. .card {
  119. margin-bottom: 15px;
  120. }
  121. strong {
  122. font-weight: 500;
  123. @each $lang in $cjk-langs {
  124. &:lang(#{$lang}) {
  125. font-weight: 700;
  126. }
  127. }
  128. }
  129. .input.with_floating_label {
  130. .label_input {
  131. display: flex;
  132. & > label {
  133. font-family: inherit;
  134. font-size: 14px;
  135. color: $primary-text-color;
  136. font-weight: 500;
  137. min-width: 150px;
  138. flex: 0 0 auto;
  139. }
  140. input,
  141. select {
  142. flex: 1 1 auto;
  143. }
  144. }
  145. &.select .hint {
  146. margin-top: 6px;
  147. margin-left: 150px;
  148. }
  149. }
  150. .input.with_label {
  151. .label_input > label {
  152. font-family: inherit;
  153. font-size: 14px;
  154. color: $primary-text-color;
  155. display: block;
  156. margin-bottom: 8px;
  157. word-wrap: break-word;
  158. font-weight: 500;
  159. }
  160. .hint {
  161. margin-top: 6px;
  162. }
  163. ul {
  164. flex: 390px;
  165. }
  166. }
  167. .input.with_block_label {
  168. max-width: none;
  169. & > label {
  170. font-family: inherit;
  171. font-size: 16px;
  172. color: $primary-text-color;
  173. display: block;
  174. font-weight: 500;
  175. padding-top: 5px;
  176. }
  177. .hint {
  178. margin-bottom: 15px;
  179. }
  180. ul {
  181. columns: 2;
  182. }
  183. }
  184. .input.datetime .label_input select {
  185. display: inline-block;
  186. width: auto;
  187. flex: 0;
  188. }
  189. .required abbr {
  190. text-decoration: none;
  191. color: lighten($error-value-color, 12%);
  192. }
  193. .fields-group {
  194. margin-bottom: 25px;
  195. .input:last-child {
  196. margin-bottom: 0;
  197. }
  198. }
  199. .fields-row {
  200. display: flex;
  201. margin: 0 -10px;
  202. padding-top: 5px;
  203. margin-bottom: 25px;
  204. .input {
  205. max-width: none;
  206. }
  207. &__column {
  208. box-sizing: border-box;
  209. padding: 0 10px;
  210. flex: 1 1 auto;
  211. min-height: 1px;
  212. &-6 {
  213. max-width: 50%;
  214. }
  215. .actions {
  216. margin-top: 27px;
  217. }
  218. }
  219. .fields-group:last-child,
  220. .fields-row__column.fields-group {
  221. margin-bottom: 0;
  222. }
  223. @media screen and (max-width: $no-columns-breakpoint) {
  224. display: block;
  225. margin-bottom: 0;
  226. &__column {
  227. max-width: none;
  228. }
  229. .fields-group:last-child,
  230. .fields-row__column.fields-group,
  231. .fields-row__column {
  232. margin-bottom: 25px;
  233. }
  234. }
  235. }
  236. .input.radio_buttons .radio label {
  237. margin-bottom: 5px;
  238. font-family: inherit;
  239. font-size: 14px;
  240. color: $primary-text-color;
  241. display: block;
  242. width: auto;
  243. }
  244. .check_boxes {
  245. .checkbox {
  246. label {
  247. font-family: inherit;
  248. font-size: 14px;
  249. color: $primary-text-color;
  250. display: inline-block;
  251. width: auto;
  252. position: relative;
  253. padding-top: 5px;
  254. padding-left: 25px;
  255. flex: 1 1 auto;
  256. }
  257. input[type=checkbox] {
  258. position: absolute;
  259. left: 0;
  260. top: 5px;
  261. margin: 0;
  262. }
  263. }
  264. }
  265. .input.static .label_input__wrapper {
  266. font-size: 16px;
  267. padding: 10px;
  268. border: 1px solid $dark-text-color;
  269. border-radius: 4px;
  270. }
  271. input[type=text],
  272. input[type=number],
  273. input[type=email],
  274. input[type=password],
  275. textarea {
  276. box-sizing: border-box;
  277. font-size: 16px;
  278. color: $primary-text-color;
  279. display: block;
  280. width: 100%;
  281. outline: 0;
  282. font-family: inherit;
  283. resize: vertical;
  284. background: darken($ui-base-color, 10%);
  285. border: 1px solid darken($ui-base-color, 14%);
  286. border-radius: 4px;
  287. padding: 10px;
  288. &::placeholder {
  289. color: lighten($darker-text-color, 4%);
  290. }
  291. &:invalid {
  292. box-shadow: none;
  293. }
  294. &:focus:invalid:not(:placeholder-shown) {
  295. border-color: lighten($error-red, 12%);
  296. }
  297. &:required:valid {
  298. border-color: $valid-value-color;
  299. }
  300. &:hover {
  301. border-color: darken($ui-base-color, 20%);
  302. }
  303. &:active,
  304. &:focus {
  305. border-color: $highlight-text-color;
  306. background: darken($ui-base-color, 8%);
  307. }
  308. }
  309. .input.field_with_errors {
  310. label {
  311. color: lighten($error-red, 12%);
  312. }
  313. input[type=text],
  314. input[type=number],
  315. input[type=email],
  316. input[type=password],
  317. textarea,
  318. select {
  319. border-color: lighten($error-red, 12%);
  320. }
  321. .error {
  322. display: block;
  323. font-weight: 500;
  324. color: lighten($error-red, 12%);
  325. margin-top: 4px;
  326. }
  327. }
  328. .input.disabled {
  329. opacity: 0.5;
  330. }
  331. .actions {
  332. margin-top: 30px;
  333. display: flex;
  334. &.actions--top {
  335. margin-top: 0;
  336. margin-bottom: 30px;
  337. }
  338. }
  339. button,
  340. .button,
  341. .block-button {
  342. display: block;
  343. width: 100%;
  344. border: 0;
  345. border-radius: 4px;
  346. background: $ui-highlight-color;
  347. color: $primary-text-color;
  348. font-size: 18px;
  349. line-height: inherit;
  350. height: auto;
  351. padding: 10px;
  352. text-decoration: none;
  353. text-align: center;
  354. box-sizing: border-box;
  355. cursor: pointer;
  356. font-weight: 500;
  357. outline: 0;
  358. margin-bottom: 10px;
  359. margin-right: 10px;
  360. &:last-child {
  361. margin-right: 0;
  362. }
  363. &:hover {
  364. background-color: lighten($ui-highlight-color, 5%);
  365. }
  366. &:active,
  367. &:focus {
  368. background-color: darken($ui-highlight-color, 5%);
  369. }
  370. &:disabled:hover {
  371. background-color: $ui-primary-color;
  372. }
  373. &.negative {
  374. background: $error-value-color;
  375. &:hover {
  376. background-color: lighten($error-value-color, 5%);
  377. }
  378. &:active,
  379. &:focus {
  380. background-color: darken($error-value-color, 5%);
  381. }
  382. }
  383. }
  384. select {
  385. appearance: none;
  386. box-sizing: border-box;
  387. font-size: 16px;
  388. color: $primary-text-color;
  389. display: block;
  390. width: 100%;
  391. outline: 0;
  392. font-family: inherit;
  393. resize: vertical;
  394. 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;
  395. border: 1px solid darken($ui-base-color, 14%);
  396. border-radius: 4px;
  397. padding-left: 10px;
  398. padding-right: 30px;
  399. height: 41px;
  400. }
  401. h4 {
  402. margin-bottom: 15px !important;
  403. }
  404. .label_input {
  405. &__wrapper {
  406. position: relative;
  407. }
  408. &__append {
  409. position: absolute;
  410. right: 3px;
  411. top: 1px;
  412. padding: 10px;
  413. padding-bottom: 9px;
  414. font-size: 16px;
  415. color: $dark-text-color;
  416. font-family: inherit;
  417. pointer-events: none;
  418. cursor: default;
  419. max-width: 140px;
  420. white-space: nowrap;
  421. overflow: hidden;
  422. &::after {
  423. content: '';
  424. display: block;
  425. position: absolute;
  426. top: 0;
  427. right: 0;
  428. bottom: 1px;
  429. width: 5px;
  430. background-image: linear-gradient(to right, rgba(darken($ui-base-color, 10%), 0), darken($ui-base-color, 10%));
  431. }
  432. }
  433. }
  434. &__overlay-area {
  435. position: relative;
  436. &__blurred form {
  437. filter: blur(2px);
  438. }
  439. &__overlay {
  440. position: absolute;
  441. top: 0;
  442. left: 0;
  443. width: 100%;
  444. height: 100%;
  445. display: flex;
  446. justify-content: center;
  447. align-items: center;
  448. background: rgba($ui-base-color, 0.65);
  449. border-radius: 4px;
  450. margin-left: -4px;
  451. margin-top: -4px;
  452. padding: 4px;
  453. &__content {
  454. text-align: center;
  455. &.rich-formatting {
  456. &,
  457. p {
  458. color: $primary-text-color;
  459. }
  460. }
  461. }
  462. }
  463. }
  464. }
  465. .block-icon {
  466. display: block;
  467. margin: 0 auto;
  468. margin-bottom: 10px;
  469. font-size: 24px;
  470. }
  471. .flash-message {
  472. background: lighten($ui-base-color, 8%);
  473. color: $darker-text-color;
  474. border-radius: 4px;
  475. padding: 15px 10px;
  476. margin-bottom: 30px;
  477. text-align: center;
  478. &.notice {
  479. border: 1px solid rgba($valid-value-color, 0.5);
  480. background: rgba($valid-value-color, 0.25);
  481. color: $valid-value-color;
  482. }
  483. &.alert {
  484. border: 1px solid rgba($error-value-color, 0.5);
  485. background: rgba($error-value-color, 0.25);
  486. color: $error-value-color;
  487. }
  488. a {
  489. display: inline-block;
  490. color: $darker-text-color;
  491. text-decoration: none;
  492. &:hover {
  493. color: $primary-text-color;
  494. text-decoration: underline;
  495. }
  496. }
  497. p {
  498. margin-bottom: 15px;
  499. }
  500. .oauth-code {
  501. outline: 0;
  502. box-sizing: border-box;
  503. display: block;
  504. width: 100%;
  505. border: 0;
  506. padding: 10px;
  507. font-family: $font-monospace, monospace;
  508. background: $ui-base-color;
  509. color: $primary-text-color;
  510. font-size: 14px;
  511. margin: 0;
  512. &::-moz-focus-inner {
  513. border: 0;
  514. }
  515. &::-moz-focus-inner,
  516. &:focus,
  517. &:active {
  518. outline: 0 !important;
  519. }
  520. &:focus {
  521. background: lighten($ui-base-color, 4%);
  522. }
  523. }
  524. strong {
  525. font-weight: 500;
  526. @each $lang in $cjk-langs {
  527. &:lang(#{$lang}) {
  528. font-weight: 700;
  529. }
  530. }
  531. }
  532. @media screen and (max-width: 740px) and (min-width: 441px) {
  533. margin-top: 40px;
  534. }
  535. }
  536. .form-footer {
  537. margin-top: 30px;
  538. text-align: center;
  539. a {
  540. color: $darker-text-color;
  541. text-decoration: none;
  542. &:hover {
  543. text-decoration: underline;
  544. }
  545. }
  546. }
  547. .quick-nav {
  548. list-style: none;
  549. margin-bottom: 25px;
  550. font-size: 14px;
  551. li {
  552. display: inline-block;
  553. margin-right: 10px;
  554. }
  555. a {
  556. color: $highlight-text-color;
  557. text-decoration: none;
  558. font-weight: 700;
  559. &:hover,
  560. &:focus,
  561. &:active {
  562. color: lighten($highlight-text-color, 8%);
  563. }
  564. }
  565. }
  566. .oauth-prompt,
  567. .follow-prompt {
  568. margin-bottom: 30px;
  569. color: $darker-text-color;
  570. h2 {
  571. font-size: 16px;
  572. margin-bottom: 30px;
  573. text-align: center;
  574. }
  575. strong {
  576. color: $secondary-text-color;
  577. font-weight: 500;
  578. @each $lang in $cjk-langs {
  579. &:lang(#{$lang}) {
  580. font-weight: 700;
  581. }
  582. }
  583. }
  584. @media screen and (max-width: 740px) and (min-width: 441px) {
  585. margin-top: 40px;
  586. }
  587. }
  588. .qr-wrapper {
  589. display: flex;
  590. flex-wrap: wrap;
  591. align-items: flex-start;
  592. }
  593. .qr-code {
  594. flex: 0 0 auto;
  595. background: $simple-background-color;
  596. padding: 4px;
  597. margin: 0 10px 20px 0;
  598. box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
  599. display: inline-block;
  600. svg {
  601. display: block;
  602. margin: 0;
  603. }
  604. }
  605. .qr-alternative {
  606. margin-bottom: 20px;
  607. color: $secondary-text-color;
  608. flex: 150px;
  609. samp {
  610. display: block;
  611. font-size: 14px;
  612. }
  613. }
  614. .table-form {
  615. p {
  616. margin-bottom: 15px;
  617. strong {
  618. font-weight: 500;
  619. @each $lang in $cjk-langs {
  620. &:lang(#{$lang}) {
  621. font-weight: 700;
  622. }
  623. }
  624. }
  625. }
  626. }
  627. .simple_form,
  628. .table-form {
  629. .warning {
  630. box-sizing: border-box;
  631. background: rgba($error-value-color, 0.5);
  632. color: $primary-text-color;
  633. text-shadow: 1px 1px 0 rgba($base-shadow-color, 0.3);
  634. box-shadow: 0 2px 6px rgba($base-shadow-color, 0.4);
  635. border-radius: 4px;
  636. padding: 10px;
  637. margin-bottom: 15px;
  638. a {
  639. color: $primary-text-color;
  640. text-decoration: underline;
  641. &:hover,
  642. &:focus,
  643. &:active {
  644. text-decoration: none;
  645. }
  646. }
  647. strong {
  648. font-weight: 600;
  649. display: block;
  650. margin-bottom: 5px;
  651. @each $lang in $cjk-langs {
  652. &:lang(#{$lang}) {
  653. font-weight: 700;
  654. }
  655. }
  656. .fa {
  657. font-weight: 400;
  658. }
  659. }
  660. }
  661. }
  662. .action-pagination {
  663. display: flex;
  664. flex-wrap: wrap;
  665. align-items: center;
  666. .actions,
  667. .pagination {
  668. flex: 1 1 auto;
  669. }
  670. .actions {
  671. padding: 30px 0;
  672. padding-right: 20px;
  673. flex: 0 0 auto;
  674. }
  675. }
  676. .post-follow-actions {
  677. text-align: center;
  678. color: $darker-text-color;
  679. div {
  680. margin-bottom: 4px;
  681. }
  682. }
  683. .alternative-login {
  684. margin-top: 20px;
  685. margin-bottom: 20px;
  686. h4 {
  687. font-size: 16px;
  688. color: $primary-text-color;
  689. text-align: center;
  690. margin-bottom: 20px;
  691. border: 0;
  692. padding: 0;
  693. }
  694. .button {
  695. display: block;
  696. }
  697. }
  698. .scope-danger {
  699. color: $warning-red;
  700. }
  701. .form_admin_settings_site_short_description,
  702. .form_admin_settings_site_description,
  703. .form_admin_settings_site_extended_description,
  704. .form_admin_settings_site_terms,
  705. .form_admin_settings_custom_css,
  706. .form_admin_settings_closed_registrations_message {
  707. textarea {
  708. font-family: $font-monospace, monospace;
  709. }
  710. }
  711. .input-copy {
  712. background: darken($ui-base-color, 10%);
  713. border: 1px solid darken($ui-base-color, 14%);
  714. border-radius: 4px;
  715. display: flex;
  716. align-items: center;
  717. padding-right: 4px;
  718. position: relative;
  719. top: 1px;
  720. transition: border-color 300ms linear;
  721. &__wrapper {
  722. flex: 1 1 auto;
  723. }
  724. input[type=text] {
  725. background: transparent;
  726. border: 0;
  727. padding: 10px;
  728. font-size: 14px;
  729. font-family: $font-monospace, monospace;
  730. }
  731. button {
  732. flex: 0 0 auto;
  733. margin: 4px;
  734. text-transform: none;
  735. font-weight: 400;
  736. font-size: 14px;
  737. padding: 7px 18px;
  738. padding-bottom: 6px;
  739. width: auto;
  740. transition: background 300ms linear;
  741. }
  742. &.copied {
  743. border-color: $valid-value-color;
  744. transition: none;
  745. button {
  746. background: $valid-value-color;
  747. transition: none;
  748. }
  749. }
  750. }
  751. .connection-prompt {
  752. margin-bottom: 25px;
  753. .fa-link {
  754. background-color: darken($ui-base-color, 4%);
  755. border-radius: 100%;
  756. font-size: 24px;
  757. padding: 10px;
  758. }
  759. &__column {
  760. align-items: center;
  761. display: flex;
  762. flex: 1;
  763. flex-direction: column;
  764. flex-shrink: 1;
  765. max-width: 50%;
  766. &-sep {
  767. align-self: center;
  768. flex-grow: 0;
  769. overflow: visible;
  770. position: relative;
  771. z-index: 1;
  772. }
  773. p {
  774. word-break: break-word;
  775. }
  776. }
  777. .account__avatar {
  778. margin-bottom: 20px;
  779. }
  780. &__connection {
  781. background-color: lighten($ui-base-color, 8%);
  782. box-shadow: 0 0 15px rgba($base-shadow-color, 0.2);
  783. border-radius: 4px;
  784. padding: 25px 10px;
  785. position: relative;
  786. text-align: center;
  787. &::after {
  788. background-color: darken($ui-base-color, 4%);
  789. content: '';
  790. display: block;
  791. height: 100%;
  792. left: 50%;
  793. position: absolute;
  794. top: 0;
  795. width: 1px;
  796. }
  797. }
  798. &__row {
  799. align-items: flex-start;
  800. display: flex;
  801. flex-direction: row;
  802. }
  803. }