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.

4345 lines
72 KiB

7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
Web Push Notifications (#3243) * feat: Register push subscription * feat: Notify when mentioned * feat: Boost, favourite, reply, follow, follow request * feat: Notification interaction * feat: Handle change of public key * feat: Unsubscribe if things go wrong * feat: Do not send normal notifications if push is enabled * feat: Focus client if open * refactor: Move push logic to WebPushSubscription * feat: Better title and body * feat: Localize messages * chore: Fix lint errors * feat: Settings * refactor: Lazy load * fix: Check if push settings exist * feat: Device-based preferences * refactor: Simplify logic * refactor: Pull request feedback * refactor: Pull request feedback * refactor: Create /api/web/push_subscriptions endpoint * feat: Spec PushSubscriptionController * refactor: WebPushSubscription => Web::PushSubscription * feat: Spec Web::PushSubscription * feat: Display first media attachment * feat: Support direction * fix: Stuff broken while rebasing * refactor: Integration with session activations * refactor: Cleanup * refactor: Simplify implementation * feat: Set VAPID keys via environment * chore: Comments * fix: Crash when no alerts * fix: Set VAPID keys in testing environment * fix: Follow link * feat: Notification actions * fix: Delete previous subscription * chore: Temporary logs * refactor: Move migration to a later date * fix: Fetch the correct session activation and misc bugs * refactor: Move migration to a later date * fix: Remove follow request (no notifications) * feat: Send administrator contact to push service * feat: Set time-to-live * fix: Do not show sensitive images * fix: Reducer crash in error handling * feat: Add badge * chore: Fix lint error * fix: Checkbox label overlap * fix: Check for payload support * fix: Rename action "type" (crash in latest Chrome) * feat: Action to expand notification * fix: Lint errors * fix: Unescape notification body * fix: Do not allow boosting if the status is hidden * feat: Add VAPID keys to the production sample environment * fix: Strip HTML tags from status * refactor: Better error messages * refactor: Handle browser not implementing the VAPID protocol (Samsung Internet) * fix: Error when target_status is nil * fix: Handle lack of image * fix: Delete reference to invalid subscriptions * feat: Better error handling * fix: Unescape HTML characters after tags are striped * refactor: Simpify code * fix: Modify to work with #4091 * Sort strings alphabetically * i18n: Updated Polish translation it annoys me that it's not fully localized :P * refactor: Use current_session in PushSubscriptionController * fix: Rebase mistake * fix: Set cacheName to mastodon * refactor: Pull request feedback * refactor: Remove logging statements * chore(yarn): Fix conflicts with master * chore(yarn): Copy latest from master * chore(yarn): Readd offline-plugin * refactor: Use save! and update! * refactor: Send notifications async * fix: Allow retry when push fails * fix: Save track for failed pushes * fix: Minify sw.js * fix: Remove account_id from fabricator
6 years ago
Web Push Notifications (#3243) * feat: Register push subscription * feat: Notify when mentioned * feat: Boost, favourite, reply, follow, follow request * feat: Notification interaction * feat: Handle change of public key * feat: Unsubscribe if things go wrong * feat: Do not send normal notifications if push is enabled * feat: Focus client if open * refactor: Move push logic to WebPushSubscription * feat: Better title and body * feat: Localize messages * chore: Fix lint errors * feat: Settings * refactor: Lazy load * fix: Check if push settings exist * feat: Device-based preferences * refactor: Simplify logic * refactor: Pull request feedback * refactor: Pull request feedback * refactor: Create /api/web/push_subscriptions endpoint * feat: Spec PushSubscriptionController * refactor: WebPushSubscription => Web::PushSubscription * feat: Spec Web::PushSubscription * feat: Display first media attachment * feat: Support direction * fix: Stuff broken while rebasing * refactor: Integration with session activations * refactor: Cleanup * refactor: Simplify implementation * feat: Set VAPID keys via environment * chore: Comments * fix: Crash when no alerts * fix: Set VAPID keys in testing environment * fix: Follow link * feat: Notification actions * fix: Delete previous subscription * chore: Temporary logs * refactor: Move migration to a later date * fix: Fetch the correct session activation and misc bugs * refactor: Move migration to a later date * fix: Remove follow request (no notifications) * feat: Send administrator contact to push service * feat: Set time-to-live * fix: Do not show sensitive images * fix: Reducer crash in error handling * feat: Add badge * chore: Fix lint error * fix: Checkbox label overlap * fix: Check for payload support * fix: Rename action "type" (crash in latest Chrome) * feat: Action to expand notification * fix: Lint errors * fix: Unescape notification body * fix: Do not allow boosting if the status is hidden * feat: Add VAPID keys to the production sample environment * fix: Strip HTML tags from status * refactor: Better error messages * refactor: Handle browser not implementing the VAPID protocol (Samsung Internet) * fix: Error when target_status is nil * fix: Handle lack of image * fix: Delete reference to invalid subscriptions * feat: Better error handling * fix: Unescape HTML characters after tags are striped * refactor: Simpify code * fix: Modify to work with #4091 * Sort strings alphabetically * i18n: Updated Polish translation it annoys me that it's not fully localized :P * refactor: Use current_session in PushSubscriptionController * fix: Rebase mistake * fix: Set cacheName to mastodon * refactor: Pull request feedback * refactor: Remove logging statements * chore(yarn): Fix conflicts with master * chore(yarn): Copy latest from master * chore(yarn): Readd offline-plugin * refactor: Use save! and update! * refactor: Send notifications async * fix: Allow retry when push fails * fix: Save track for failed pushes * fix: Minify sw.js * fix: Remove account_id from fabricator
6 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
7 years ago
  1. @import 'variables';
  2. .app-body {
  3. -webkit-overflow-scrolling: touch;
  4. -ms-overflow-style: -ms-autohiding-scrollbar;
  5. }
  6. .button {
  7. background-color: darken($ui-highlight-color, 3%);
  8. border: 10px none;
  9. border-radius: 4px;
  10. box-sizing: border-box;
  11. color: $primary-text-color;
  12. cursor: pointer;
  13. display: inline-block;
  14. font-family: inherit;
  15. font-size: 14px;
  16. font-weight: 500;
  17. height: 36px;
  18. letter-spacing: 0;
  19. line-height: 36px;
  20. overflow: hidden;
  21. padding: 0 16px;
  22. position: relative;
  23. text-align: center;
  24. text-transform: uppercase;
  25. text-decoration: none;
  26. text-overflow: ellipsis;
  27. transition: all 100ms ease-in;
  28. white-space: nowrap;
  29. width: auto;
  30. &:active,
  31. &:focus,
  32. &:hover {
  33. background-color: lighten($ui-highlight-color, 7%);
  34. transition: all 200ms ease-out;
  35. }
  36. &:disabled {
  37. background-color: $ui-primary-color;
  38. cursor: default;
  39. }
  40. &.button-alternative {
  41. font-size: 16px;
  42. line-height: 36px;
  43. height: auto;
  44. color: $ui-base-color;
  45. background: $ui-primary-color;
  46. text-transform: none;
  47. padding: 4px 16px;
  48. &:active,
  49. &:focus,
  50. &:hover {
  51. background-color: lighten($ui-primary-color, 4%);
  52. }
  53. }
  54. &.button-secondary {
  55. font-size: 16px;
  56. line-height: 36px;
  57. height: auto;
  58. color: $ui-primary-color;
  59. text-transform: none;
  60. background: transparent;
  61. padding: 3px 15px;
  62. border-radius: 4px;
  63. border: 1px solid $ui-primary-color;
  64. &:active,
  65. &:focus,
  66. &:hover {
  67. border-color: lighten($ui-primary-color, 4%);
  68. color: lighten($ui-primary-color, 4%);
  69. }
  70. }
  71. &.button--block {
  72. display: block;
  73. width: 100%;
  74. }
  75. }
  76. .column__wrapper {
  77. display: flex;
  78. flex: 1 1 auto;
  79. position: relative;
  80. }
  81. .column-icon {
  82. background: lighten($ui-base-color, 4%);
  83. color: $ui-primary-color;
  84. cursor: pointer;
  85. font-size: 16px;
  86. padding: 15px;
  87. position: absolute;
  88. right: 0;
  89. top: -48px;
  90. z-index: 3;
  91. &:hover {
  92. color: lighten($ui-primary-color, 7%);
  93. }
  94. }
  95. .icon-button {
  96. display: inline-block;
  97. padding: 0;
  98. color: $ui-base-lighter-color;
  99. border: none;
  100. background: transparent;
  101. cursor: pointer;
  102. transition: color 100ms ease-in;
  103. &:hover,
  104. &:active,
  105. &:focus {
  106. color: lighten($ui-base-color, 33%);
  107. transition: color 200ms ease-out;
  108. }
  109. &.disabled {
  110. color: lighten($ui-base-color, 13%);
  111. cursor: default;
  112. }
  113. &.active {
  114. color: $ui-highlight-color;
  115. }
  116. &::-moz-focus-inner {
  117. border: 0;
  118. }
  119. &::-moz-focus-inner,
  120. &:focus,
  121. &:active {
  122. outline: 0 !important;
  123. }
  124. &.inverted {
  125. color: lighten($ui-base-color, 33%);
  126. &:hover,
  127. &:active,
  128. &:focus {
  129. color: $ui-base-lighter-color;
  130. }
  131. &.disabled {
  132. color: $ui-primary-color;
  133. }
  134. &.active {
  135. color: $ui-highlight-color;
  136. &.disabled {
  137. color: lighten($ui-highlight-color, 13%);
  138. }
  139. }
  140. }
  141. &.overlayed {
  142. box-sizing: content-box;
  143. background: rgba($base-overlay-background, 0.6);
  144. color: rgba($primary-text-color, 0.7);
  145. border-radius: 4px;
  146. padding: 2px;
  147. &:hover {
  148. background: rgba($base-overlay-background, 0.9);
  149. }
  150. }
  151. }
  152. .text-icon-button {
  153. color: lighten($ui-base-color, 33%);
  154. border: none;
  155. background: transparent;
  156. cursor: pointer;
  157. font-weight: 600;
  158. font-size: 11px;
  159. padding: 0 3px;
  160. line-height: 27px;
  161. outline: 0;
  162. transition: color 100ms ease-in;
  163. &:hover,
  164. &:active,
  165. &:focus {
  166. color: $ui-base-lighter-color;
  167. transition: color 200ms ease-out;
  168. }
  169. &.disabled {
  170. color: lighten($ui-base-color, 13%);
  171. cursor: default;
  172. }
  173. &.active {
  174. color: $ui-highlight-color;
  175. }
  176. &::-moz-focus-inner {
  177. border: 0;
  178. }
  179. &::-moz-focus-inner,
  180. &:focus,
  181. &:active {
  182. outline: 0 !important;
  183. }
  184. }
  185. .dropdown-menu {
  186. position: absolute;
  187. }
  188. .dropdown--active .icon-button {
  189. color: $ui-highlight-color;
  190. }
  191. .dropdown--active::after {
  192. @media screen and (min-width: 631px) {
  193. content: "";
  194. display: block;
  195. position: absolute;
  196. width: 0;
  197. height: 0;
  198. border-style: solid;
  199. border-width: 0 4.5px 7.8px;
  200. border-color: transparent transparent $ui-secondary-color;
  201. bottom: 8px;
  202. right: 104px;
  203. }
  204. }
  205. .invisible {
  206. font-size: 0;
  207. line-height: 0;
  208. display: inline-block;
  209. width: 0;
  210. height: 0;
  211. position: absolute;
  212. }
  213. .ellipsis {
  214. &::after {
  215. content: "";
  216. }
  217. }
  218. .lightbox .icon-button {
  219. color: $ui-base-color;
  220. }
  221. .compose-form {
  222. padding: 10px;
  223. }
  224. .compose-form__warning {
  225. color: darken($ui-secondary-color, 65%);
  226. margin-bottom: 15px;
  227. background: $ui-primary-color;
  228. box-shadow: 0 2px 6px rgba($base-shadow-color, 0.3);
  229. padding: 8px 10px;
  230. border-radius: 4px;
  231. font-size: 13px;
  232. font-weight: 400;
  233. strong {
  234. color: darken($ui-secondary-color, 65%);
  235. font-weight: 500;
  236. }
  237. a {
  238. color: darken($ui-primary-color, 33%);
  239. font-weight: 500;
  240. text-decoration: underline;
  241. &:hover,
  242. &:active,
  243. &:focus {
  244. text-decoration: none;
  245. }
  246. }
  247. }
  248. .compose-form__modifiers {
  249. color: $ui-base-color;
  250. font-family: inherit;
  251. font-size: 14px;
  252. background: $simple-background-color;
  253. border-radius: 0 0 4px;
  254. }
  255. .compose-form__buttons-wrapper {
  256. display: flex;
  257. justify-content: space-between;
  258. }
  259. .compose-form__buttons {
  260. padding: 10px;
  261. background: darken($simple-background-color, 8%);
  262. box-shadow: inset 0 5px 5px rgba($base-shadow-color, 0.05);
  263. border-radius: 0 0 4px 4px;
  264. display: flex;
  265. .icon-button {
  266. box-sizing: content-box;
  267. padding: 0 3px;
  268. }
  269. }
  270. .compose-form__upload-button-icon {
  271. line-height: 27px;
  272. }
  273. .compose-form__sensitive-button {
  274. display: none;
  275. &.compose-form__sensitive-button--visible {
  276. display: block;
  277. }
  278. .compose-form__sensitive-button__icon {
  279. line-height: 27px;
  280. }
  281. }
  282. .compose-form__upload-wrapper {
  283. overflow: hidden;
  284. }
  285. .compose-form__uploads-wrapper {
  286. display: flex;
  287. flex-direction: row;
  288. padding: 5px;
  289. flex-wrap: wrap;
  290. }
  291. .compose-form__upload {
  292. flex: 1 1 0;
  293. min-width: 40%;
  294. margin: 5px;
  295. &-description {
  296. position: absolute;
  297. z-index: 2;
  298. bottom: 0;
  299. left: 0;
  300. right: 0;
  301. box-sizing: border-box;
  302. background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 80%, transparent);
  303. padding: 10px;
  304. opacity: 0;
  305. transition: opacity .1s ease;
  306. input {
  307. background: transparent;
  308. color: $ui-secondary-color;
  309. border: 0;
  310. padding: 0;
  311. margin: 0;
  312. width: 100%;
  313. font-family: inherit;
  314. font-size: 14px;
  315. font-weight: 500;
  316. &:focus {
  317. color: $white;
  318. }
  319. &::placeholder {
  320. opacity: 0.54;
  321. color: $ui-secondary-color;
  322. }
  323. }
  324. &.active {
  325. opacity: 1;
  326. }
  327. }
  328. .icon-button {
  329. mix-blend-mode: difference;
  330. }
  331. }
  332. .compose-form__upload-thumbnail {
  333. border-radius: 4px;
  334. background-position: center;
  335. background-size: cover;
  336. background-repeat: no-repeat;
  337. height: 100px;
  338. width: 100%;
  339. }
  340. .compose-form__label {
  341. display: block;
  342. line-height: 24px;
  343. vertical-align: middle;
  344. &.with-border {
  345. border-top: 1px solid $ui-base-color;
  346. padding-top: 10px;
  347. }
  348. .compose-form__label__text {
  349. display: inline-block;
  350. vertical-align: middle;
  351. margin-bottom: 14px;
  352. margin-left: 8px;
  353. color: $ui-primary-color;
  354. }
  355. }
  356. .compose-form__textarea,
  357. .follow-form__input {
  358. background: $simple-background-color;
  359. &:disabled {
  360. background: $ui-secondary-color;
  361. }
  362. }
  363. .compose-form__autosuggest-wrapper {
  364. position: relative;
  365. .emoji-picker-dropdown {
  366. position: absolute;
  367. right: 5px;
  368. top: 5px;
  369. ::-webkit-scrollbar-track:hover,
  370. ::-webkit-scrollbar-track:active {
  371. background-color: rgba($base-overlay-background, 0.3);
  372. }
  373. }
  374. }
  375. .compose-form__publish {
  376. display: flex;
  377. min-width: 0;
  378. }
  379. .compose-form__publish-button-wrapper {
  380. overflow: hidden;
  381. padding-top: 10px;
  382. }
  383. .emojione {
  384. display: inline-block;
  385. font-size: inherit;
  386. vertical-align: middle;
  387. object-fit: contain;
  388. margin: -.2ex .15em .2ex;
  389. width: 16px;
  390. height: 16px;
  391. img {
  392. width: auto;
  393. }
  394. }
  395. .reply-indicator {
  396. border-radius: 4px 4px 0 0;
  397. position: relative;
  398. bottom: -2px;
  399. background: $ui-primary-color;
  400. padding: 10px;
  401. }
  402. .reply-indicator__header {
  403. margin-bottom: 5px;
  404. overflow: hidden;
  405. }
  406. .reply-indicator__cancel {
  407. float: right;
  408. line-height: 24px;
  409. }
  410. .reply-indicator__display-name {
  411. color: $ui-base-color;
  412. display: block;
  413. max-width: 100%;
  414. line-height: 24px;
  415. overflow: hidden;
  416. padding-right: 25px;
  417. text-decoration: none;
  418. }
  419. .reply-indicator__display-avatar {
  420. float: left;
  421. margin-right: 5px;
  422. }
  423. .status__content--with-action {
  424. cursor: pointer;
  425. }
  426. .status__content,
  427. .reply-indicator__content {
  428. font-size: 15px;
  429. line-height: 20px;
  430. word-wrap: break-word;
  431. font-weight: 400;
  432. overflow: hidden;
  433. white-space: pre-wrap;
  434. &.status__content--with-spoiler {
  435. white-space: normal;
  436. .status__content__text {
  437. white-space: pre-wrap;
  438. }
  439. }
  440. .emojione {
  441. width: 18px;
  442. height: 18px;
  443. }
  444. p {
  445. margin-bottom: 20px;
  446. &:last-child {
  447. margin-bottom: 0;
  448. }
  449. }
  450. a {
  451. color: $ui-secondary-color;
  452. text-decoration: none;
  453. &:hover {
  454. text-decoration: underline;
  455. .fa {
  456. color: lighten($ui-base-color, 40%);
  457. }
  458. }
  459. &.mention {
  460. &:hover {
  461. text-decoration: none;
  462. span {
  463. text-decoration: underline;
  464. }
  465. }
  466. }
  467. .fa {
  468. color: lighten($ui-base-color, 30%);
  469. }
  470. }
  471. .status__content__spoiler-link {
  472. background: lighten($ui-base-color, 30%);
  473. &:hover {
  474. background: lighten($ui-base-color, 33%);
  475. text-decoration: none;
  476. }
  477. }
  478. .status__content__text {
  479. display: none;
  480. &.status__content__text--visible {
  481. display: block;
  482. }
  483. }
  484. }
  485. .status__content__spoiler-link {
  486. display: inline-block;
  487. border-radius: 2px;
  488. background: transparent;
  489. border: 0;
  490. color: lighten($ui-base-color, 8%);
  491. font-weight: 500;
  492. font-size: 11px;
  493. padding: 0 6px;
  494. text-transform: uppercase;
  495. line-height: inherit;
  496. cursor: pointer;
  497. }
  498. .status__prepend-icon-wrapper {
  499. left: -26px;
  500. position: absolute;
  501. }
  502. .focusable {
  503. &:focus {
  504. outline: 0;
  505. background: lighten($ui-base-color, 4%);
  506. &.status-direct {
  507. background: lighten($ui-base-color, 12%);
  508. }
  509. .detailed-status,
  510. .detailed-status__action-bar {
  511. background: lighten($ui-base-color, 8%);
  512. }
  513. }
  514. }
  515. .status {
  516. padding: 8px 10px;
  517. padding-left: 68px;
  518. position: relative;
  519. min-height: 48px;
  520. border-bottom: 1px solid lighten($ui-base-color, 8%);
  521. cursor: default;
  522. @keyframes fade {
  523. 0% { opacity: 0; }
  524. 100% { opacity: 1; }
  525. }
  526. opacity: 1;
  527. animation: fade 150ms linear;
  528. .video-player {
  529. margin-top: 8px;
  530. }
  531. &.status-direct {
  532. background: lighten($ui-base-color, 8%);
  533. .icon-button.disabled {
  534. color: lighten($ui-base-color, 16%);
  535. }
  536. }
  537. &.light {
  538. .status__relative-time {
  539. color: $ui-primary-color;
  540. }
  541. .status__display-name {
  542. color: $ui-base-color;
  543. }
  544. .display-name {
  545. strong {
  546. color: $ui-base-color;
  547. }
  548. span {
  549. color: $ui-primary-color;
  550. }
  551. }
  552. .status__content {
  553. color: $ui-base-color;
  554. a {
  555. color: $ui-highlight-color;
  556. }
  557. a.status__content__spoiler-link {
  558. color: $primary-text-color;
  559. background: $ui-primary-color;
  560. &:hover {
  561. background: lighten($ui-primary-color, 8%);
  562. }
  563. }
  564. }
  565. }
  566. }
  567. .notification-favourite {
  568. .status.status-direct {
  569. background: transparent;
  570. .icon-button.disabled {
  571. color: lighten($ui-base-color, 13%);
  572. }
  573. }
  574. }
  575. .status__relative-time {
  576. color: $ui-base-lighter-color;
  577. float: right;
  578. font-size: 14px;
  579. }
  580. .status__display-name {
  581. color: $ui-base-lighter-color;
  582. }
  583. .status__info .status__display-name {
  584. display: block;
  585. max-width: 100%;
  586. padding-right: 25px;
  587. }
  588. .status__info {
  589. font-size: 15px;
  590. }
  591. .status-check-box {
  592. border-bottom: 1px solid $ui-secondary-color;
  593. display: flex;
  594. .status__content {
  595. flex: 1 1 auto;
  596. padding: 10px;
  597. overflow: hidden;
  598. text-overflow: ellipsis;
  599. white-space: nowrap;
  600. }
  601. }
  602. .status-check-box-toggle {
  603. align-items: center;
  604. display: flex;
  605. flex: 0 0 auto;
  606. justify-content: center;
  607. padding: 10px;
  608. }
  609. .status__prepend {
  610. margin-left: 68px;
  611. color: $ui-base-lighter-color;
  612. padding: 8px 0;
  613. padding-bottom: 2px;
  614. font-size: 14px;
  615. position: relative;
  616. .status__display-name strong {
  617. color: $ui-base-lighter-color;
  618. }
  619. > span {
  620. display: block;
  621. overflow: hidden;
  622. text-overflow: ellipsis;
  623. }
  624. }
  625. .status__action-bar {
  626. align-items: center;
  627. display: flex;
  628. margin-top: 10px;
  629. }
  630. .status__action-bar-button {
  631. float: left;
  632. margin-right: 18px;
  633. }
  634. .status__action-bar-dropdown {
  635. float: left;
  636. height: 23.15px;
  637. width: 23.15px;
  638. }
  639. .detailed-status__action-bar-dropdown {
  640. flex: 1 1 auto;
  641. display: flex;
  642. align-items: center;
  643. justify-content: center;
  644. position: relative;
  645. }
  646. .detailed-status {
  647. background: lighten($ui-base-color, 4%);
  648. padding: 14px 10px;
  649. .status__content {
  650. font-size: 19px;
  651. line-height: 24px;
  652. .emojione {
  653. width: 22px;
  654. height: 22px;
  655. }
  656. }
  657. .video-player {
  658. margin-top: 8px;
  659. }
  660. }
  661. .detailed-status__meta {
  662. margin-top: 15px;
  663. color: $ui-base-lighter-color;
  664. font-size: 14px;
  665. line-height: 18px;
  666. }
  667. .detailed-status__action-bar {
  668. background: lighten($ui-base-color, 4%);
  669. border-top: 1px solid lighten($ui-base-color, 8%);
  670. border-bottom: 1px solid lighten($ui-base-color, 8%);
  671. display: flex;
  672. flex-direction: row;
  673. padding: 10px 0;
  674. }
  675. .detailed-status__link {
  676. color: inherit;
  677. text-decoration: none;
  678. }
  679. .detailed-status__favorites,
  680. .detailed-status__reblogs {
  681. display: inline-block;
  682. font-weight: 500;
  683. font-size: 12px;
  684. margin-left: 6px;
  685. }
  686. .reply-indicator__content {
  687. color: $ui-base-color;
  688. font-size: 14px;
  689. a {
  690. color: lighten($ui-base-color, 20%);
  691. }
  692. }
  693. .account {
  694. padding: 10px;
  695. border-bottom: 1px solid lighten($ui-base-color, 8%);
  696. .account__display-name {
  697. flex: 1 1 auto;
  698. display: block;
  699. color: $ui-primary-color;
  700. overflow: hidden;
  701. text-decoration: none;
  702. font-size: 14px;
  703. }
  704. }
  705. .account__wrapper {
  706. display: flex;
  707. }
  708. .account__avatar-wrapper {
  709. float: left;
  710. margin-left: 12px;
  711. margin-right: 12px;
  712. }
  713. .account__avatar {
  714. @include avatar-radius();
  715. position: relative;
  716. cursor: pointer;
  717. &-inline {
  718. display: inline-block;
  719. vertical-align: middle;
  720. margin-right: 5px;
  721. }
  722. }
  723. .account__avatar-overlay {
  724. @include avatar-size(48px);
  725. &-base {
  726. @include avatar-radius();
  727. @include avatar-size(36px);
  728. }
  729. &-overlay {
  730. @include avatar-radius();
  731. @include avatar-size(24px);
  732. position: absolute;
  733. bottom: 0;
  734. right: 0;
  735. z-index: 1;
  736. }
  737. }
  738. .account__relationship {
  739. height: 18px;
  740. padding: 10px;
  741. }
  742. .account__header {
  743. flex: 0 0 auto;
  744. background: lighten($ui-base-color, 4%);
  745. text-align: center;
  746. background-size: cover;
  747. background-position: center;
  748. position: relative;
  749. & > div {
  750. background: rgba(lighten($ui-base-color, 4%), 0.9);
  751. padding: 20px 10px;
  752. }
  753. .account__header__content {
  754. color: $ui-secondary-color;
  755. }
  756. .account__header__display-name {
  757. color: $primary-text-color;
  758. display: inline-block;
  759. width: 100%;
  760. font-size: 20px;
  761. line-height: 27px;
  762. font-weight: 500;
  763. overflow: hidden;
  764. text-overflow: ellipsis;
  765. }
  766. .account__header__username {
  767. color: $ui-highlight-color;
  768. font-size: 14px;
  769. font-weight: 400;
  770. display: block;
  771. margin-bottom: 10px;
  772. overflow: hidden;
  773. text-overflow: ellipsis;
  774. }
  775. }
  776. .account__disclaimer {
  777. padding: 10px;
  778. border-top: 1px solid lighten($ui-base-color, 8%);
  779. color: $ui-base-lighter-color;
  780. strong {
  781. font-weight: 500;
  782. }
  783. a {
  784. font-weight: 500;
  785. color: inherit;
  786. text-decoration: underline;
  787. &:hover,
  788. &:focus,
  789. &:active {
  790. text-decoration: none;
  791. }
  792. }
  793. }
  794. .account__header__content {
  795. color: $ui-primary-color;
  796. font-size: 14px;
  797. font-weight: 400;
  798. overflow: hidden;
  799. word-break: normal;
  800. word-wrap: break-word;
  801. p {
  802. margin-bottom: 20px;
  803. &:last-child {
  804. margin-bottom: 0;
  805. }
  806. }
  807. a {
  808. color: inherit;
  809. text-decoration: underline;
  810. &:hover {
  811. text-decoration: none;
  812. }
  813. }
  814. }
  815. .account__header__display-name {
  816. .emojione {
  817. width: 25px;
  818. height: 25px;
  819. }
  820. }
  821. .account__action-bar {
  822. border-top: 1px solid lighten($ui-base-color, 8%);
  823. border-bottom: 1px solid lighten($ui-base-color, 8%);
  824. line-height: 36px;
  825. overflow: hidden;
  826. flex: 0 0 auto;
  827. display: flex;
  828. }
  829. .account__action-bar-dropdown {
  830. flex: 0 1 calc(50% - 140px);
  831. padding: 10px;
  832. .dropdown--active {
  833. .dropdown__content.dropdown__right {
  834. left: 6px;
  835. right: initial;
  836. }
  837. &::after {
  838. bottom: initial;
  839. margin-left: 11px;
  840. margin-top: -7px;
  841. right: initial;
  842. }
  843. }
  844. }
  845. .account__action-bar-links {
  846. display: flex;
  847. flex: 1 1 auto;
  848. line-height: 18px;
  849. }
  850. .account__action-bar__tab {
  851. text-decoration: none;
  852. overflow: hidden;
  853. flex: 0 1 80px;
  854. border-left: 1px solid lighten($ui-base-color, 8%);
  855. padding: 10px 5px;
  856. & > span {
  857. display: block;
  858. text-transform: uppercase;
  859. font-size: 11px;
  860. color: $ui-primary-color;
  861. }
  862. strong {
  863. display: block;
  864. font-size: 15px;
  865. font-weight: 500;
  866. color: $primary-text-color;
  867. }
  868. abbr {
  869. color: $ui-base-lighter-color;
  870. }
  871. }
  872. .account__header__avatar {
  873. background-size: 90px 90px;
  874. display: block;
  875. height: 90px;
  876. margin: 0 auto 10px;
  877. overflow: hidden;
  878. width: 90px;
  879. }
  880. .account-authorize {
  881. padding: 14px 10px;
  882. .detailed-status__display-name {
  883. display: block;
  884. margin-bottom: 15px;
  885. overflow: hidden;
  886. }
  887. }
  888. .account-authorize__avatar {
  889. float: left;
  890. margin-right: 10px;
  891. }
  892. .status__display-name,
  893. .status__relative-time,
  894. .detailed-status__display-name,
  895. .detailed-status__datetime,
  896. .detailed-status__application,
  897. .account__display-name {
  898. text-decoration: none;
  899. }
  900. .status__display-name,
  901. .account__display-name {
  902. strong {
  903. color: $primary-text-color;
  904. }
  905. }
  906. .muted {
  907. .emojione {
  908. opacity: 0.5;
  909. }
  910. }
  911. .status__display-name,
  912. .reply-indicator__display-name,
  913. .detailed-status__display-name,
  914. .account__display-name {
  915. &:hover strong {
  916. text-decoration: underline;
  917. }
  918. }
  919. .account__display-name strong {
  920. display: block;
  921. overflow: hidden;
  922. text-overflow: ellipsis;
  923. }
  924. .detailed-status__application,
  925. .detailed-status__datetime {
  926. color: inherit;
  927. }
  928. .detailed-status__display-name {
  929. color: $ui-secondary-color;
  930. display: block;
  931. line-height: 24px;
  932. margin-bottom: 15px;
  933. overflow: hidden;
  934. strong,
  935. span {
  936. display: block;
  937. text-overflow: ellipsis;
  938. overflow: hidden;
  939. }
  940. strong {
  941. font-size: 16px;
  942. color: $primary-text-color;
  943. }
  944. }
  945. .detailed-status__display-avatar {
  946. float: left;
  947. margin-right: 10px;
  948. }
  949. .status__avatar {
  950. height: 48px;
  951. left: 10px;
  952. position: absolute;
  953. top: 10px;
  954. width: 48px;
  955. }
  956. .muted {
  957. .status__content p,
  958. .status__content a {
  959. color: $ui-base-lighter-color;
  960. }
  961. .status__display-name strong {
  962. color: $ui-base-lighter-color;
  963. }
  964. .status__avatar {
  965. opacity: 0.5;
  966. }
  967. a.status__content__spoiler-link {
  968. background: $ui-base-lighter-color;
  969. color: lighten($ui-base-color, 4%);
  970. &:hover {
  971. background: lighten($ui-base-color, 29%);
  972. text-decoration: none;
  973. }
  974. }
  975. }
  976. .notification__message {
  977. margin-left: 68px;
  978. padding: 8px 0;
  979. padding-bottom: 0;
  980. cursor: default;
  981. color: $ui-primary-color;
  982. font-size: 15px;
  983. position: relative;
  984. .fa {
  985. color: $ui-highlight-color;
  986. }
  987. > span {
  988. display: block;
  989. overflow: hidden;
  990. text-overflow: ellipsis;
  991. }
  992. }
  993. .notification__favourite-icon-wrapper {
  994. left: -26px;
  995. position: absolute;
  996. .star-icon {
  997. color: $gold-star;
  998. }
  999. }
  1000. .star-icon.active {
  1001. color: $gold-star;
  1002. }
  1003. .notification__display-name {
  1004. color: inherit;
  1005. font-weight: 500;
  1006. text-decoration: none;
  1007. &:hover {
  1008. color: $primary-text-color;
  1009. text-decoration: underline;
  1010. }
  1011. }
  1012. .display-name {
  1013. display: block;
  1014. max-width: 100%;
  1015. overflow: hidden;
  1016. text-overflow: ellipsis;
  1017. white-space: nowrap;
  1018. }
  1019. .display-name__html {
  1020. font-weight: 500;
  1021. }
  1022. .display-name__account {
  1023. font-size: 14px;
  1024. }
  1025. .status__relative-time,
  1026. .detailed-status__datetime {
  1027. &:hover {
  1028. text-decoration: underline;
  1029. }
  1030. }
  1031. .image-loader {
  1032. position: relative;
  1033. &.image-loader--loading {
  1034. .image-loader__preview-canvas {
  1035. filter: blur(2px);
  1036. }
  1037. }
  1038. .image-loader__img {
  1039. position: absolute;
  1040. top: 0;
  1041. left: 0;
  1042. right: 0;
  1043. max-width: 100%;
  1044. max-height: 100%;
  1045. background-image: none;
  1046. }
  1047. &.image-loader--amorphous {
  1048. position: static;
  1049. .image-loader__preview-canvas {
  1050. display: none;
  1051. }
  1052. .image-loader__img {
  1053. position: static;
  1054. width: auto;
  1055. height: auto;
  1056. }
  1057. }
  1058. }
  1059. .navigation-bar {
  1060. padding: 10px;
  1061. display: flex;
  1062. flex-shrink: 0;
  1063. cursor: default;
  1064. color: $ui-primary-color;
  1065. strong {
  1066. color: $primary-text-color;
  1067. }
  1068. .permalink {
  1069. text-decoration: none;
  1070. }
  1071. .icon-button {
  1072. pointer-events: none;
  1073. opacity: 0;
  1074. }
  1075. }
  1076. .navigation-bar__profile {
  1077. flex: 1 1 auto;
  1078. margin-left: 8px;
  1079. overflow: hidden;
  1080. }
  1081. .navigation-bar__profile-account {
  1082. display: block;
  1083. font-weight: 500;
  1084. overflow: hidden;
  1085. text-overflow: ellipsis;
  1086. }
  1087. .navigation-bar__profile-edit {
  1088. color: inherit;
  1089. text-decoration: none;
  1090. }
  1091. .dropdown {
  1092. display: inline-block;
  1093. }
  1094. .dropdown__content {
  1095. display: none;
  1096. position: absolute;
  1097. }
  1098. .dropdown-menu__separator {
  1099. border-bottom: 1px solid darken($ui-secondary-color, 8%);
  1100. margin: 5px 7px 6px;
  1101. height: 0;
  1102. }
  1103. .dropdown-menu {
  1104. background: $ui-secondary-color;
  1105. padding: 4px 0;
  1106. border-radius: 4px;
  1107. box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
  1108. ul {
  1109. list-style: none;
  1110. }
  1111. }
  1112. .dropdown-menu__arrow {
  1113. position: absolute;
  1114. width: 0;
  1115. height: 0;
  1116. border: 0 solid transparent;
  1117. &.left {
  1118. right: -5px;
  1119. margin-top: -5px;
  1120. border-width: 5px 0 5px 5px;
  1121. border-left-color: $ui-secondary-color;
  1122. }
  1123. &.top {
  1124. bottom: -5px;
  1125. margin-left: -13px;
  1126. border-width: 5px 7px 0;
  1127. border-top-color: $ui-secondary-color;
  1128. }
  1129. &.bottom {
  1130. top: -5px;
  1131. margin-left: -13px;
  1132. border-width: 0 7px 5px;
  1133. border-bottom-color: $ui-secondary-color;
  1134. }
  1135. &.right {
  1136. left: -5px;
  1137. margin-top: -5px;
  1138. border-width: 5px 5px 5px 0;
  1139. border-right-color: $ui-secondary-color;
  1140. }
  1141. }
  1142. .dropdown-menu__item {
  1143. a {
  1144. font-size: 13px;
  1145. line-height: 18px;
  1146. display: block;
  1147. padding: 4px 14px;
  1148. box-sizing: border-box;
  1149. text-decoration: none;
  1150. background: $ui-secondary-color;
  1151. color: $ui-base-color;
  1152. overflow: hidden;
  1153. text-overflow: ellipsis;
  1154. white-space: nowrap;
  1155. &:focus,
  1156. &:hover,
  1157. &:active {
  1158. background: $ui-highlight-color;
  1159. color: $ui-secondary-color;
  1160. outline: 0;
  1161. }
  1162. }
  1163. }
  1164. .dropdown--active .dropdown__content {
  1165. display: block;
  1166. line-height: 18px;
  1167. max-width: 311px;
  1168. right: 0;
  1169. text-align: left;
  1170. z-index: 9999;
  1171. & > ul {
  1172. list-style: none;
  1173. background: $ui-secondary-color;
  1174. padding: 4px 0;
  1175. border-radius: 4px;
  1176. box-shadow: 0 0 15px rgba($base-shadow-color, 0.4);
  1177. min-width: 140px;
  1178. position: relative;
  1179. }
  1180. &.dropdown__right {
  1181. right: 0;
  1182. }
  1183. &.dropdown__left {
  1184. & > ul {
  1185. left: -98px;
  1186. }
  1187. }
  1188. & > ul > li > a {
  1189. font-size: 13px;
  1190. line-height: 18px;
  1191. display: block;
  1192. padding: 4px 14px;
  1193. box-sizing: border-box;
  1194. text-decoration: none;
  1195. background: $ui-secondary-color;
  1196. color: $ui-base-color;
  1197. overflow: hidden;
  1198. text-overflow: ellipsis;
  1199. white-space: nowrap;
  1200. &:focus {
  1201. outline: 0;
  1202. }
  1203. &:hover {
  1204. background: $ui-highlight-color;
  1205. color: $ui-secondary-color;
  1206. }
  1207. }
  1208. }
  1209. .dropdown__icon {
  1210. vertical-align: middle;
  1211. }
  1212. .static-content {
  1213. padding: 10px;
  1214. padding-top: 20px;
  1215. color: $ui-base-lighter-color;
  1216. h1 {
  1217. font-size: 16px;
  1218. font-weight: 500;
  1219. margin-bottom: 40px;
  1220. text-align: center;
  1221. }
  1222. p {
  1223. font-size: 13px;
  1224. margin-bottom: 20px;
  1225. }
  1226. }
  1227. .columns-area {
  1228. display: flex;
  1229. flex: 1 1 auto;
  1230. flex-direction: row;
  1231. justify-content: flex-start;
  1232. overflow-x: auto;
  1233. position: relative;
  1234. }
  1235. @media screen and (min-width: 360px) {
  1236. .columns-area {
  1237. padding: 10px;
  1238. }
  1239. .react-swipeable-view-container .columns-area {
  1240. height: calc(100% - 20px) !important;
  1241. }
  1242. }
  1243. .react-swipeable-view-container {
  1244. &,
  1245. .columns-area,
  1246. .drawer,
  1247. .column {
  1248. height: 100%;
  1249. }
  1250. }
  1251. .react-swipeable-view-container > * {
  1252. display: flex;
  1253. align-items: center;
  1254. justify-content: center;
  1255. height: 100%;
  1256. }
  1257. .column {
  1258. width: 330px;
  1259. position: relative;
  1260. box-sizing: border-box;
  1261. display: flex;
  1262. flex-direction: column;
  1263. > .scrollable {
  1264. background: $ui-base-color;
  1265. }
  1266. }
  1267. .ui {
  1268. flex: 0 0 auto;
  1269. display: flex;
  1270. flex-direction: column;
  1271. width: 100%;
  1272. height: 100%;
  1273. background: darken($ui-base-color, 7%);
  1274. }
  1275. .drawer {
  1276. width: 300px;
  1277. box-sizing: border-box;
  1278. display: flex;
  1279. flex-direction: column;
  1280. overflow-y: hidden;
  1281. }
  1282. .drawer__tab {
  1283. display: block;
  1284. flex: 1 1 auto;
  1285. padding: 15px 5px 13px;
  1286. color: $ui-primary-color;
  1287. text-decoration: none;
  1288. text-align: center;
  1289. font-size: 16px;
  1290. border-bottom: 2px solid transparent;
  1291. }
  1292. .column,
  1293. .drawer {
  1294. flex: 1 1 100%;
  1295. overflow: hidden;
  1296. }
  1297. @media screen and (min-width: 360px) {
  1298. .tabs-bar {
  1299. margin: 10px;
  1300. margin-bottom: 0;
  1301. }
  1302. .search {
  1303. margin-bottom: 10px;
  1304. }
  1305. }
  1306. @media screen and (max-width: 630px) {
  1307. .column,
  1308. .drawer {
  1309. width: 100%;
  1310. padding: 0;
  1311. }
  1312. .columns-area {
  1313. flex-direction: column;
  1314. }
  1315. .search__input,
  1316. .autosuggest-textarea__textarea {
  1317. font-size: 16px;
  1318. }
  1319. }
  1320. @media screen and (min-width: 631px) {
  1321. .columns-area {
  1322. padding: 0;
  1323. }
  1324. .column,
  1325. .drawer {
  1326. flex: 0 0 auto;
  1327. padding: 10px;
  1328. padding-left: 5px;
  1329. padding-right: 5px;
  1330. &:first-child {
  1331. padding-left: 10px;
  1332. }
  1333. &:last-child {
  1334. padding-right: 10px;
  1335. }
  1336. }
  1337. .columns-area > div {
  1338. .column,
  1339. .drawer {
  1340. padding-left: 5px;
  1341. padding-right: 5px;
  1342. }
  1343. }
  1344. }
  1345. .drawer__pager {
  1346. box-sizing: border-box;
  1347. padding: 0;
  1348. flex-grow: 1;
  1349. position: relative;
  1350. overflow: hidden;
  1351. display: flex;
  1352. }
  1353. .drawer__inner {
  1354. position: absolute;
  1355. top: 0;
  1356. left: 0;
  1357. background: lighten($ui-base-color, 13%);
  1358. box-sizing: border-box;
  1359. padding: 0;
  1360. display: flex;
  1361. flex-direction: column;
  1362. overflow: hidden;
  1363. overflow-y: auto;
  1364. width: 100%;
  1365. height: 100%;
  1366. &.darker {
  1367. background: $ui-base-color;
  1368. }
  1369. }
  1370. .pseudo-drawer {
  1371. background: lighten($ui-base-color, 13%);
  1372. font-size: 13px;
  1373. text-align: left;
  1374. }
  1375. .drawer__header {
  1376. flex: 0 0 auto;
  1377. font-size: 16px;
  1378. background: lighten($ui-base-color, 8%);
  1379. margin-bottom: 10px;
  1380. display: flex;
  1381. flex-direction: row;
  1382. a {
  1383. transition: background 100ms ease-in;
  1384. &:hover {
  1385. background: lighten($ui-base-color, 3%);
  1386. transition: background 200ms ease-out;
  1387. }
  1388. }
  1389. }
  1390. .tabs-bar {
  1391. display: flex;
  1392. background: lighten($ui-base-color, 8%);
  1393. flex: 0 0 auto;
  1394. overflow-y: auto;
  1395. }
  1396. .tabs-bar__link {
  1397. display: block;
  1398. flex: 1 1 auto;
  1399. padding: 15px 10px;
  1400. color: $primary-text-color;
  1401. text-decoration: none;
  1402. text-align: center;
  1403. font-size: 14px;
  1404. font-weight: 500;
  1405. border-bottom: 2px solid lighten($ui-base-color, 8%);
  1406. transition: all 200ms linear;
  1407. .fa {
  1408. font-weight: 400;
  1409. font-size: 16px;
  1410. }
  1411. &.active {
  1412. border-bottom: 2px solid $ui-highlight-color;
  1413. color: $ui-highlight-color;
  1414. }
  1415. &:hover,
  1416. &:focus,
  1417. &:active {
  1418. @media screen and (min-width: 631px) {
  1419. background: lighten($ui-base-color, 14%);
  1420. transition: all 100ms linear;
  1421. }
  1422. }
  1423. span {
  1424. margin-left: 5px;
  1425. display: none;
  1426. }
  1427. }
  1428. @media screen and (min-width: 600px) {
  1429. .tabs-bar__link {
  1430. span {
  1431. display: inline;
  1432. }
  1433. }
  1434. }
  1435. @media screen and (min-width: 631px) {
  1436. .tabs-bar {
  1437. display: none;
  1438. }
  1439. }
  1440. .scrollable {
  1441. overflow-y: scroll;
  1442. overflow-x: hidden;
  1443. flex: 1 1 auto;
  1444. -webkit-overflow-scrolling: touch;
  1445. will-change: transform; // improves perf in mobile Chrome
  1446. &.optionally-scrollable {
  1447. overflow-y: auto;
  1448. }
  1449. @supports(display: grid) { // hack to fix Chrome <57
  1450. contain: strict;
  1451. }
  1452. }
  1453. .scrollable.fullscreen {
  1454. @supports(display: grid) { // hack to fix Chrome <57
  1455. contain: none;
  1456. }
  1457. }
  1458. .column-back-button {
  1459. background: lighten($ui-base-color, 4%);
  1460. color: $ui-highlight-color;
  1461. cursor: pointer;
  1462. flex: 0 0 auto;
  1463. font-size: 16px;
  1464. border: 0;
  1465. text-align: unset;
  1466. padding: 15px;
  1467. margin: 0;
  1468. z-index: 3;
  1469. &:hover {
  1470. text-decoration: underline;
  1471. }
  1472. }
  1473. .column-header__back-button {
  1474. background: lighten($ui-base-color, 4%);
  1475. border: 0;
  1476. font-family: inherit;
  1477. color: $ui-highlight-color;
  1478. cursor: pointer;
  1479. flex: 0 0 auto;
  1480. font-size: 16px;
  1481. padding: 0 5px 0 0;
  1482. z-index: 3;
  1483. &:hover {
  1484. text-decoration: underline;
  1485. }
  1486. &:last-child {
  1487. padding: 0 15px 0 0;
  1488. }
  1489. }
  1490. .column-back-button__icon {
  1491. display: inline-block;
  1492. margin-right: 5px;
  1493. }
  1494. .column-back-button--slim {
  1495. position: relative;
  1496. }
  1497. .column-back-button--slim-button {
  1498. cursor: pointer;
  1499. flex: 0 0 auto;
  1500. font-size: 16px;
  1501. padding: 15px;
  1502. position: absolute;
  1503. right: 0;
  1504. top: -48px;
  1505. }
  1506. .react-toggle {
  1507. display: inline-block;
  1508. position: relative;
  1509. cursor: pointer;
  1510. background-color: transparent;
  1511. border: 0;
  1512. padding: 0;
  1513. user-select: none;
  1514. -webkit-tap-highlight-color: rgba($base-overlay-background, 0);
  1515. -webkit-tap-highlight-color: transparent;
  1516. }
  1517. .react-toggle-screenreader-only {
  1518. border: 0;
  1519. clip: rect(0 0 0 0);
  1520. height: 1px;
  1521. margin: -1px;
  1522. overflow: hidden;
  1523. padding: 0;
  1524. position: absolute;
  1525. width: 1px;
  1526. }
  1527. .react-toggle--disabled {
  1528. cursor: not-allowed;
  1529. opacity: 0.5;
  1530. transition: opacity 0.25s;
  1531. }
  1532. .react-toggle-track {
  1533. width: 50px;
  1534. height: 24px;
  1535. padding: 0;
  1536. border-radius: 30px;
  1537. background-color: $ui-base-color;
  1538. transition: all 0.2s ease;
  1539. }
  1540. .react-toggle:hover:not(.react-toggle--disabled) .react-toggle-track {
  1541. background-color: darken($ui-base-color, 10%);
  1542. }
  1543. .react-toggle--checked .react-toggle-track {
  1544. background-color: $ui-highlight-color;
  1545. }
  1546. .react-toggle--checked:hover:not(.react-toggle--disabled) .react-toggle-track {
  1547. background-color: lighten($ui-highlight-color, 10%);
  1548. }
  1549. .react-toggle-track-check {
  1550. position: absolute;
  1551. width: 14px;
  1552. height: 10px;
  1553. top: 0;
  1554. bottom: 0;
  1555. margin-top: auto;
  1556. margin-bottom: auto;
  1557. line-height: 0;
  1558. left: 8px;
  1559. opacity: 0;
  1560. transition: opacity 0.25s ease;
  1561. }
  1562. .react-toggle--checked .react-toggle-track-check {
  1563. opacity: 1;
  1564. transition: opacity 0.25s ease;
  1565. }
  1566. .react-toggle-track-x {
  1567. position: absolute;
  1568. width: 10px;
  1569. height: 10px;
  1570. top: 0;
  1571. bottom: 0;
  1572. margin-top: auto;
  1573. margin-bottom: auto;
  1574. line-height: 0;
  1575. right: 10px;
  1576. opacity: 1;
  1577. transition: opacity 0.25s ease;
  1578. }
  1579. .react-toggle--checked .react-toggle-track-x {
  1580. opacity: 0;
  1581. }
  1582. .react-toggle-thumb {
  1583. transition: all 0.5s cubic-bezier(0.23, 1, 0.32, 1) 0ms;
  1584. position: absolute;
  1585. top: 1px;
  1586. left: 1px;
  1587. width: 22px;
  1588. height: 22px;
  1589. border: 1px solid $ui-base-color;
  1590. border-radius: 50%;
  1591. background-color: darken($simple-background-color, 2%);
  1592. box-sizing: border-box;
  1593. transition: all 0.25s ease;
  1594. }
  1595. .react-toggle--checked .react-toggle-thumb {
  1596. left: 27px;
  1597. border-color: $ui-highlight-color;
  1598. }
  1599. .column-link {
  1600. background: lighten($ui-base-color, 8%);
  1601. color: $primary-text-color;
  1602. display: block;
  1603. font-size: 16px;
  1604. padding: 15px;
  1605. text-decoration: none;
  1606. &:hover {
  1607. background: lighten($ui-base-color, 11%);
  1608. }
  1609. }
  1610. .column-link__icon {
  1611. display: inline-block;
  1612. margin-right: 5px;
  1613. }
  1614. .column-subheading {
  1615. background: $ui-base-color;
  1616. color: $ui-base-lighter-color;
  1617. padding: 8px 20px;
  1618. font-size: 12px;
  1619. font-weight: 500;
  1620. text-transform: uppercase;
  1621. cursor: default;
  1622. }
  1623. .autosuggest-textarea,
  1624. .spoiler-input {
  1625. position: relative;
  1626. }
  1627. .autosuggest-textarea__textarea,
  1628. .spoiler-input__input {
  1629. display: block;
  1630. box-sizing: border-box;
  1631. width: 100%;
  1632. margin: 0;
  1633. color: $ui-base-color;
  1634. background: $simple-background-color;
  1635. padding: 10px;
  1636. font-family: inherit;
  1637. font-size: 14px;
  1638. resize: vertical;
  1639. border: 0;
  1640. outline: 0;
  1641. &:focus {
  1642. outline: 0;
  1643. }
  1644. @media screen and (max-width: 600px) {
  1645. font-size: 16px;
  1646. }
  1647. }
  1648. .spoiler-input__input {
  1649. border-radius: 4px;
  1650. }
  1651. .autosuggest-textarea__textarea {
  1652. min-height: 100px;
  1653. border-radius: 4px 4px 0 0;
  1654. padding-bottom: 0;
  1655. padding-right: 10px + 22px;
  1656. resize: none;
  1657. @media screen and (max-width: 600px) {
  1658. height: 100px !important; // prevent auto-resize textarea
  1659. resize: vertical;
  1660. }
  1661. }
  1662. .autosuggest-textarea__suggestions {
  1663. box-sizing: border-box;
  1664. display: none;
  1665. position: absolute;
  1666. top: 100%;
  1667. width: 100%;
  1668. z-index: 99;
  1669. box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);
  1670. background: $ui-secondary-color;
  1671. border-radius: 0 0 4px 4px;
  1672. color: $ui-base-color;
  1673. font-size: 14px;
  1674. padding: 6px;
  1675. &.autosuggest-textarea__suggestions--visible {
  1676. display: block;
  1677. }
  1678. }
  1679. .autosuggest-textarea__suggestions__item {
  1680. padding: 10px;
  1681. cursor: pointer;
  1682. border-radius: 4px;
  1683. &:hover,
  1684. &:focus,
  1685. &:active,
  1686. &.selected {
  1687. background: darken($ui-secondary-color, 10%);
  1688. }
  1689. }
  1690. .autosuggest-account,
  1691. .autosuggest-emoji {
  1692. display: flex;
  1693. flex-direction: row;
  1694. align-items: center;
  1695. justify-content: flex-start;
  1696. line-height: 18px;
  1697. font-size: 14px;
  1698. }
  1699. .autosuggest-account-icon,
  1700. .autosuggest-emoji img {
  1701. display: block;
  1702. margin-right: 8px;
  1703. width: 16px;
  1704. height: 16px;
  1705. }
  1706. .autosuggest-account .display-name__account {
  1707. color: lighten($ui-base-color, 36%);
  1708. }
  1709. .character-counter__wrapper {
  1710. line-height: 36px;
  1711. margin: 0 16px 0 8px;
  1712. padding-top: 10px;
  1713. }
  1714. .character-counter {
  1715. cursor: default;
  1716. font-size: 16px;
  1717. }
  1718. .character-counter--over {
  1719. color: $warning-red;
  1720. }
  1721. .getting-started__wrapper {
  1722. position: relative;
  1723. overflow-y: auto;
  1724. }
  1725. .getting-started__footer {
  1726. display: flex;
  1727. flex-direction: column;
  1728. }
  1729. .getting-started {
  1730. box-sizing: border-box;
  1731. padding-bottom: 235px;
  1732. background: url('../images/mastodon-getting-started.png') no-repeat 0 100%;
  1733. flex: 1 0 auto;
  1734. p {
  1735. color: $ui-secondary-color;
  1736. }
  1737. a {
  1738. color: $ui-base-lighter-color;
  1739. }
  1740. }
  1741. .setting-text {
  1742. color: $ui-primary-color;
  1743. background: transparent;
  1744. border: none;
  1745. border-bottom: 2px solid $ui-primary-color;
  1746. box-sizing: border-box;
  1747. display: block;
  1748. font-family: inherit;
  1749. margin-bottom: 10px;
  1750. padding: 7px 0;
  1751. width: 100%;
  1752. &:focus,
  1753. &:active {
  1754. color: $primary-text-color;
  1755. border-bottom-color: $ui-highlight-color;
  1756. }
  1757. @media screen and (max-width: 600px) {
  1758. font-size: 16px;
  1759. }
  1760. &.light {
  1761. color: $ui-base-color;
  1762. border-bottom: 2px solid lighten($ui-base-color, 27%);
  1763. &:focus,
  1764. &:active {
  1765. color: $ui-base-color;
  1766. border-bottom-color: $ui-highlight-color;
  1767. }
  1768. }
  1769. }
  1770. @import 'boost';
  1771. button.icon-button i.fa-retweet {
  1772. background-position: 0 0;
  1773. height: 19px;
  1774. transition: background-position 0.9s steps(10);
  1775. transition-duration: 0s;
  1776. vertical-align: middle;
  1777. width: 22px;
  1778. &::before {
  1779. display: none !important;
  1780. }
  1781. }
  1782. button.icon-button.active i.fa-retweet {
  1783. transition-duration: 0.9s;
  1784. background-position: 0 100%;
  1785. }
  1786. .status-card {
  1787. display: flex;
  1788. cursor: pointer;
  1789. font-size: 14px;
  1790. border: 1px solid lighten($ui-base-color, 8%);
  1791. border-radius: 4px;
  1792. color: $ui-base-lighter-color;
  1793. margin-top: 14px;
  1794. text-decoration: none;
  1795. overflow: hidden;
  1796. &:hover {
  1797. background: lighten($ui-base-color, 8%);
  1798. }
  1799. }
  1800. .status-card-video,
  1801. .status-card-rich,
  1802. .status-card-photo {
  1803. margin-top: 14px;
  1804. overflow: hidden;
  1805. iframe {
  1806. width: 100%;
  1807. height: auto;
  1808. }
  1809. }
  1810. .status-card-photo {
  1811. display: block;
  1812. text-decoration: none;
  1813. img {
  1814. display: block;
  1815. width: 100%;
  1816. height: auto;
  1817. margin: 0;
  1818. }
  1819. }
  1820. .status-card-video {
  1821. iframe {
  1822. width: 100%;
  1823. height: 100%;
  1824. }
  1825. }
  1826. .status-card__title {
  1827. display: block;
  1828. font-weight: 500;
  1829. margin-bottom: 5px;
  1830. color: $ui-primary-color;
  1831. overflow: hidden;
  1832. text-overflow: ellipsis;
  1833. white-space: nowrap;
  1834. }
  1835. .status-card__content {
  1836. flex: 1 1 auto;
  1837. overflow: hidden;
  1838. padding: 14px 14px 14px 8px;
  1839. }
  1840. .status-card__description {
  1841. color: $ui-primary-color;
  1842. }
  1843. .status-card__host {
  1844. display: block;
  1845. margin-top: 5px;
  1846. font-size: 13px;
  1847. }
  1848. .status-card__image {
  1849. flex: 0 0 100px;
  1850. background: lighten($ui-base-color, 8%);
  1851. }
  1852. .status-card.horizontal {
  1853. display: block;
  1854. .status-card__image {
  1855. width: 100%;
  1856. }
  1857. .status-card__image-image {
  1858. border-radius: 4px 4px 0 0;
  1859. }
  1860. }
  1861. .status-card__image-image {
  1862. border-radius: 4px 0 0 4px;
  1863. display: block;
  1864. height: auto;
  1865. margin: 0;
  1866. width: 100%;
  1867. }
  1868. .load-more {
  1869. display: block;
  1870. color: $ui-base-lighter-color;
  1871. background-color: transparent;
  1872. border: 0;
  1873. font-size: inherit;
  1874. text-align: center;
  1875. line-height: inherit;
  1876. margin: 0;
  1877. padding: 15px;
  1878. width: 100%;
  1879. clear: both;
  1880. &:hover {
  1881. background: lighten($ui-base-color, 2%);
  1882. }
  1883. }
  1884. .missing-indicator {
  1885. text-align: center;
  1886. font-size: 16px;
  1887. font-weight: 500;
  1888. color: lighten($ui-base-color, 16%);
  1889. background: $ui-base-color;
  1890. cursor: default;
  1891. display: flex;
  1892. flex: 1 1 auto;
  1893. align-items: center;
  1894. justify-content: center;
  1895. & > div {
  1896. background: url('../images/mastodon-not-found.png') no-repeat center -50px;
  1897. padding-top: 210px;
  1898. width: 100%;
  1899. }
  1900. }
  1901. .column-header__wrapper {
  1902. position: relative;
  1903. flex: 0 0 auto;
  1904. &.active {
  1905. &::before {
  1906. display: block;
  1907. content: "";
  1908. position: absolute;
  1909. top: 35px;
  1910. left: 0;
  1911. right: 0;
  1912. margin: 0 auto;
  1913. width: 60%;
  1914. pointer-events: none;
  1915. height: 28px;
  1916. z-index: 1;
  1917. background: radial-gradient(ellipse, rgba($ui-highlight-color, 0.23) 0%, rgba($ui-highlight-color, 0) 60%);
  1918. }
  1919. }
  1920. }
  1921. .column-header {
  1922. display: flex;
  1923. padding: 15px;
  1924. font-size: 16px;
  1925. background: lighten($ui-base-color, 4%);
  1926. flex: 0 0 auto;
  1927. cursor: pointer;
  1928. position: relative;
  1929. z-index: 2;
  1930. outline: 0;
  1931. &.active {
  1932. box-shadow: 0 1px 0 rgba($ui-highlight-color, 0.3);
  1933. .column-header__icon {
  1934. color: $ui-highlight-color;
  1935. text-shadow: 0 0 10px rgba($ui-highlight-color, 0.4);
  1936. }
  1937. }
  1938. &:focus,
  1939. &:active {
  1940. outline: 0;
  1941. }
  1942. }
  1943. .column-header__buttons {
  1944. height: 48px;
  1945. display: flex;
  1946. margin: -15px;
  1947. margin-left: 0;
  1948. }
  1949. .column-header__button {
  1950. background: lighten($ui-base-color, 4%);
  1951. border: 0;
  1952. color: $ui-primary-color;
  1953. cursor: pointer;
  1954. font-size: 16px;
  1955. padding: 0 15px;
  1956. &:hover {
  1957. color: lighten($ui-primary-color, 7%);
  1958. }
  1959. &.active {
  1960. color: $primary-text-color;
  1961. background: lighten($ui-base-color, 8%);
  1962. &:hover {
  1963. color: $primary-text-color;
  1964. background: lighten($ui-base-color, 8%);
  1965. }
  1966. }
  1967. }
  1968. .column-header__collapsible {
  1969. max-height: 70vh;
  1970. overflow: hidden;
  1971. overflow-y: auto;
  1972. color: $ui-primary-color;
  1973. transition: max-height 150ms ease-in-out, opacity 300ms linear;
  1974. opacity: 1;
  1975. &.collapsed {
  1976. max-height: 0;
  1977. opacity: 0.5;
  1978. }
  1979. &.animating {
  1980. overflow-y: hidden;
  1981. }
  1982. }
  1983. .column-header__collapsible-inner {
  1984. background: lighten($ui-base-color, 8%);
  1985. padding: 15px;
  1986. }
  1987. .column-header__setting-btn {
  1988. &:hover {
  1989. color: lighten($ui-primary-color, 4%);
  1990. text-decoration: underline;
  1991. }
  1992. }
  1993. .column-header__setting-arrows {
  1994. float: right;
  1995. .column-header__setting-btn {
  1996. padding: 0 10px;
  1997. &:last-child {
  1998. padding-right: 0;
  1999. }
  2000. }
  2001. }
  2002. .column-header__title {
  2003. display: inline-block;
  2004. text-overflow: ellipsis;
  2005. overflow: hidden;
  2006. white-space: nowrap;
  2007. flex: 1;
  2008. }
  2009. .text-btn {
  2010. display: inline-block;
  2011. padding: 0;
  2012. font-family: inherit;
  2013. font-size: inherit;
  2014. color: inherit;
  2015. border: 0;
  2016. background: transparent;
  2017. cursor: pointer;
  2018. }
  2019. .column-header__icon {
  2020. display: inline-block;
  2021. margin-right: 5px;
  2022. }
  2023. .loading-indicator {
  2024. color: lighten($ui-base-color, 26%);
  2025. font-size: 12px;
  2026. font-weight: 400;
  2027. text-transform: uppercase;
  2028. overflow: visible;
  2029. position: absolute;
  2030. top: 50%;
  2031. left: 50%;
  2032. transform: translate(-50%, -50%);
  2033. span {
  2034. display: block;
  2035. float: left;
  2036. margin-left: 50%;
  2037. transform: translateX(-50%);
  2038. margin: 82px 0 0 50%;
  2039. white-space: nowrap;
  2040. animation: loader-label 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
  2041. }
  2042. }
  2043. .loading-indicator__figure {
  2044. position: absolute;
  2045. top: 50%;
  2046. left: 50%;
  2047. transform: translate(-50%, -50%);
  2048. width: 0;
  2049. height: 0;
  2050. box-sizing: border-box;
  2051. border: 0 solid lighten($ui-base-color, 26%);
  2052. border-radius: 50%;
  2053. animation: loader-figure 1.15s infinite cubic-bezier(0.215, 0.610, 0.355, 1.000);
  2054. }
  2055. @keyframes loader-figure {
  2056. 0% {
  2057. width: 0;
  2058. height: 0;
  2059. background-color: lighten($ui-base-color, 26%);
  2060. }
  2061. 29% {
  2062. background-color: lighten($ui-base-color, 26%);
  2063. }
  2064. 30% {
  2065. width: 42px;
  2066. height: 42px;
  2067. background-color: transparent;
  2068. border-width: 21px;
  2069. opacity: 1;
  2070. }
  2071. 100% {
  2072. width: 42px;
  2073. height: 42px;
  2074. border-width: 0;
  2075. opacity: 0;
  2076. background-color: transparent;
  2077. }
  2078. }
  2079. @keyframes loader-label {
  2080. 0% { opacity: 0.25; }
  2081. 30% { opacity: 1; }
  2082. 100% { opacity: 0.25; }
  2083. }
  2084. .video-error-cover {
  2085. align-items: center;
  2086. background: $base-overlay-background;
  2087. color: $primary-text-color;
  2088. cursor: pointer;
  2089. display: flex;
  2090. flex-direction: column;
  2091. height: 100%;
  2092. justify-content: center;
  2093. margin-top: 8px;
  2094. position: relative;
  2095. text-align: center;
  2096. z-index: 100;
  2097. }
  2098. .media-spoiler {
  2099. background: $base-overlay-background;
  2100. color: $ui-primary-color;
  2101. border: 0;
  2102. width: 100%;
  2103. height: 100%;
  2104. &:hover,
  2105. &:active,
  2106. &:focus {
  2107. color: lighten($ui-primary-color, 8%);
  2108. }
  2109. }
  2110. .media-spoiler__warning {
  2111. display: block;
  2112. font-size: 14px;
  2113. }
  2114. .media-spoiler__trigger {
  2115. display: block;
  2116. font-size: 11px;
  2117. font-weight: 500;
  2118. }
  2119. .spoiler-button {
  2120. display: none;
  2121. left: 4px;
  2122. position: absolute;
  2123. text-shadow: 0 1px 1px $base-shadow-color, 1px 0 1px $base-shadow-color;
  2124. top: 4px;
  2125. z-index: 100;
  2126. &.spoiler-button--visible {
  2127. display: block;
  2128. }
  2129. }
  2130. .modal-container--preloader {
  2131. background: lighten($ui-base-color, 8%);
  2132. }
  2133. .account--panel {
  2134. background: lighten($ui-base-color, 4%);
  2135. border-top: 1px solid lighten($ui-base-color, 8%);
  2136. border-bottom: 1px solid lighten($ui-base-color, 8%);
  2137. display: flex;
  2138. flex-direction: row;
  2139. padding: 10px 0;
  2140. }
  2141. .account--panel__button,
  2142. .detailed-status__button {
  2143. flex: 1 1 auto;
  2144. text-align: center;
  2145. }
  2146. .column-settings__outer {
  2147. background: lighten($ui-base-color, 8%);
  2148. padding: 15px;
  2149. }
  2150. .column-settings__section {
  2151. color: $ui-primary-color;
  2152. cursor: default;
  2153. display: block;
  2154. font-weight: 500;
  2155. margin-bottom: 10px;
  2156. }
  2157. .column-settings__row {
  2158. .text-btn {
  2159. margin-bottom: 15px;
  2160. }
  2161. }
  2162. .modal-container__nav {
  2163. align-items: center;
  2164. background: rgba($base-overlay-background, 0.5);
  2165. box-sizing: border-box;
  2166. border: 0;
  2167. color: $primary-text-color;
  2168. cursor: pointer;
  2169. display: flex;
  2170. font-size: 24px;
  2171. height: 100%;
  2172. padding: 30px 15px;
  2173. position: absolute;
  2174. top: 0;
  2175. }
  2176. .modal-container__nav--left {
  2177. left: -61px;
  2178. }
  2179. .modal-container__nav--right {
  2180. right: -61px;
  2181. }
  2182. .account--follows-info {
  2183. color: $primary-text-color;
  2184. position: absolute;
  2185. top: 10px;
  2186. left: 10px;
  2187. opacity: 0.7;
  2188. display: inline-block;
  2189. vertical-align: top;
  2190. background-color: rgba($base-overlay-background, 0.4);
  2191. text-transform: uppercase;
  2192. font-size: 11px;
  2193. font-weight: 500;
  2194. padding: 4px;
  2195. border-radius: 4px;
  2196. }
  2197. .account--action-button {
  2198. position: absolute;
  2199. top: 10px;
  2200. right: 20px;
  2201. }
  2202. .setting-toggle {
  2203. display: block;
  2204. line-height: 24px;
  2205. }
  2206. .setting-toggle__label,
  2207. .setting-meta__label {
  2208. color: $ui-primary-color;
  2209. display: inline-block;
  2210. margin-bottom: 14px;
  2211. margin-left: 8px;
  2212. vertical-align: middle;
  2213. }
  2214. .setting-meta__label {
  2215. color: $ui-primary-color;
  2216. float: right;
  2217. }
  2218. .empty-column-indicator,
  2219. .error-column {
  2220. color: lighten($ui-base-color, 20%);
  2221. background: $ui-base-color;
  2222. text-align: center;
  2223. padding: 20px;
  2224. font-size: 15px;
  2225. font-weight: 400;
  2226. cursor: default;
  2227. display: flex;
  2228. flex: 1 1 auto;
  2229. align-items: center;
  2230. justify-content: center;
  2231. @supports(display: grid) { // hack to fix Chrome <57
  2232. contain: strict;
  2233. }
  2234. a {
  2235. color: $ui-highlight-color;
  2236. text-decoration: none;
  2237. &:hover {
  2238. text-decoration: underline;
  2239. }
  2240. }
  2241. }
  2242. .error-column {
  2243. flex-direction: column;
  2244. }
  2245. @keyframes heartbeat {
  2246. from {
  2247. transform: scale(1);
  2248. transform-origin: center center;
  2249. animation-timing-function: ease-out;
  2250. }
  2251. 10% {
  2252. transform: scale(0.91);
  2253. animation-timing-function: ease-in;
  2254. }
  2255. 17% {
  2256. transform: scale(0.98);
  2257. animation-timing-function: ease-out;
  2258. }
  2259. 33% {
  2260. transform: scale(0.87);
  2261. animation-timing-function: ease-in;
  2262. }
  2263. 45% {
  2264. transform: scale(1);
  2265. animation-timing-function: ease-out;
  2266. }
  2267. }
  2268. .pulse-loading {
  2269. animation: heartbeat 1.5s ease-in-out infinite both;
  2270. }
  2271. .emoji-picker-dropdown__menu {
  2272. background: $simple-background-color;
  2273. position: absolute;
  2274. box-shadow: 4px 4px 6px rgba($base-shadow-color, 0.4);
  2275. border-radius: 4px;
  2276. margin-top: 5px;
  2277. .emoji-mart-scroll {
  2278. transition: opacity 200ms ease;
  2279. }
  2280. &.selecting .emoji-mart-scroll {
  2281. opacity: 0.5;
  2282. }
  2283. }
  2284. .emoji-picker-dropdown__modifiers {
  2285. position: absolute;
  2286. top: 60px;
  2287. right: 11px;
  2288. cursor: pointer;
  2289. }
  2290. .emoji-picker-dropdown__modifiers__menu {
  2291. position: absolute;
  2292. z-index: 4;
  2293. top: -4px;
  2294. left: -8px;
  2295. background: $simple-background-color;
  2296. border-radius: 4px;
  2297. box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.2);
  2298. overflow: hidden;
  2299. button {
  2300. display: block;
  2301. cursor: pointer;
  2302. border: 0;
  2303. padding: 4px 8px;
  2304. background: transparent;
  2305. &:hover,
  2306. &:focus,
  2307. &:active {
  2308. background: rgba($ui-secondary-color, 0.4);
  2309. }
  2310. }
  2311. .emoji-mart-emoji {
  2312. height: 22px;
  2313. }
  2314. }
  2315. .emoji-mart-emoji {
  2316. span {
  2317. background-repeat: no-repeat;
  2318. }
  2319. }
  2320. .upload-area {
  2321. align-items: center;
  2322. background: rgba($base-overlay-background, 0.8);
  2323. display: flex;
  2324. height: 100%;
  2325. justify-content: center;
  2326. left: 0;
  2327. opacity: 0;
  2328. position: absolute;
  2329. top: 0;
  2330. visibility: hidden;
  2331. width: 100%;
  2332. z-index: 2000;
  2333. * {
  2334. pointer-events: none;
  2335. }
  2336. }
  2337. .upload-area__drop {
  2338. width: 320px;
  2339. height: 160px;
  2340. display: flex;
  2341. box-sizing: border-box;
  2342. position: relative;
  2343. padding: 8px;
  2344. }
  2345. .upload-area__background {
  2346. position: absolute;
  2347. top: 0;
  2348. right: 0;
  2349. bottom: 0;
  2350. left: 0;
  2351. z-index: -1;
  2352. border-radius: 4px;
  2353. background: $ui-base-color;
  2354. box-shadow: 0 0 5px rgba($base-shadow-color, 0.2);
  2355. }
  2356. .upload-area__content {
  2357. flex: 1;
  2358. display: flex;
  2359. align-items: center;
  2360. justify-content: center;
  2361. color: $ui-secondary-color;
  2362. font-size: 18px;
  2363. font-weight: 500;
  2364. border: 2px dashed $ui-base-lighter-color;
  2365. border-radius: 4px;
  2366. }
  2367. .upload-progress {
  2368. padding: 10px;
  2369. color: $ui-base-lighter-color;
  2370. overflow: hidden;
  2371. display: flex;
  2372. .fa {
  2373. font-size: 34px;
  2374. margin-right: 10px;
  2375. }
  2376. span {
  2377. font-size: 12px;
  2378. text-transform: uppercase;
  2379. font-weight: 500;
  2380. display: block;
  2381. }
  2382. }
  2383. .upload-progess__message {
  2384. flex: 1 1 auto;
  2385. }
  2386. .upload-progress__backdrop {
  2387. width: 100%;
  2388. height: 6px;
  2389. border-radius: 6px;
  2390. background: $ui-base-lighter-color;
  2391. position: relative;
  2392. margin-top: 5px;
  2393. }
  2394. .upload-progress__tracker {
  2395. position: absolute;
  2396. left: 0;
  2397. top: 0;
  2398. height: 6px;
  2399. background: $ui-highlight-color;
  2400. border-radius: 6px;
  2401. }
  2402. .emoji-button {
  2403. display: block;
  2404. font-size: 24px;
  2405. line-height: 24px;
  2406. margin-left: 2px;
  2407. width: 24px;
  2408. outline: 0;
  2409. cursor: pointer;
  2410. &:active,
  2411. &:focus {
  2412. outline: 0 !important;
  2413. }
  2414. img {
  2415. filter: grayscale(100%);
  2416. opacity: 0.8;
  2417. display: block;
  2418. margin: 0;
  2419. width: 22px;
  2420. height: 22px;
  2421. margin-top: 2px;
  2422. }
  2423. &:hover,
  2424. &:active,
  2425. &:focus {
  2426. img {
  2427. opacity: 1;
  2428. filter: none;
  2429. }
  2430. }
  2431. }
  2432. .dropdown--active .emoji-button img {
  2433. opacity: 1;
  2434. filter: none;
  2435. }
  2436. .privacy-dropdown__dropdown {
  2437. position: absolute;
  2438. background: $simple-background-color;
  2439. box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
  2440. border-radius: 4px;
  2441. margin-left: 40px;
  2442. overflow: hidden;
  2443. }
  2444. .privacy-dropdown__option {
  2445. color: $ui-base-color;
  2446. padding: 10px;
  2447. cursor: pointer;
  2448. display: flex;
  2449. &:hover,
  2450. &.active {
  2451. background: $ui-highlight-color;
  2452. color: $primary-text-color;
  2453. .privacy-dropdown__option__content {
  2454. color: $primary-text-color;
  2455. strong {
  2456. color: $primary-text-color;
  2457. }
  2458. }
  2459. }
  2460. &.active:hover {
  2461. background: lighten($ui-highlight-color, 4%);
  2462. }
  2463. }
  2464. .privacy-dropdown__option__icon {
  2465. display: flex;
  2466. align-items: center;
  2467. justify-content: center;
  2468. margin-right: 10px;
  2469. }
  2470. .privacy-dropdown__option__content {
  2471. flex: 1 1 auto;
  2472. color: darken($ui-primary-color, 24%);
  2473. strong {
  2474. font-weight: 500;
  2475. display: block;
  2476. color: $ui-base-color;
  2477. }
  2478. }
  2479. .privacy-dropdown.active {
  2480. .privacy-dropdown__value {
  2481. background: $simple-background-color;
  2482. border-radius: 4px 4px 0 0;
  2483. box-shadow: 0 -4px 4px rgba($base-shadow-color, 0.1);
  2484. .icon-button {
  2485. transition: none;
  2486. }
  2487. &.active {
  2488. background: $ui-highlight-color;
  2489. .icon-button {
  2490. color: $primary-text-color;
  2491. }
  2492. }
  2493. }
  2494. .privacy-dropdown__dropdown {
  2495. display: block;
  2496. box-shadow: 2px 4px 6px rgba($base-shadow-color, 0.1);
  2497. }
  2498. }
  2499. .search {
  2500. position: relative;
  2501. }
  2502. .search__input {
  2503. outline: 0;
  2504. box-sizing: border-box;
  2505. display: block;
  2506. width: 100%;
  2507. border: none;
  2508. padding: 10px;
  2509. padding-right: 30px;
  2510. font-family: inherit;
  2511. background: $ui-base-color;
  2512. color: $ui-primary-color;
  2513. font-size: 14px;
  2514. margin: 0;
  2515. &::-moz-focus-inner {
  2516. border: 0;
  2517. }
  2518. &::-moz-focus-inner,
  2519. &:focus,
  2520. &:active {
  2521. outline: 0 !important;
  2522. }
  2523. &:focus {
  2524. background: lighten($ui-base-color, 4%);
  2525. }
  2526. @media screen and (max-width: 600px) {
  2527. font-size: 16px;
  2528. }
  2529. }
  2530. .search__icon {
  2531. .fa {
  2532. position: absolute;
  2533. top: 10px;
  2534. right: 10px;
  2535. z-index: 2;
  2536. display: inline-block;
  2537. opacity: 0;
  2538. transition: all 100ms linear;
  2539. font-size: 18px;
  2540. width: 18px;
  2541. height: 18px;
  2542. color: $ui-secondary-color;
  2543. cursor: default;
  2544. pointer-events: none;
  2545. &.active {
  2546. pointer-events: auto;
  2547. opacity: 0.3;
  2548. }
  2549. }
  2550. .fa-search {
  2551. transform: rotate(90deg);
  2552. &.active {
  2553. pointer-events: none;
  2554. transform: rotate(0deg);
  2555. }
  2556. }
  2557. .fa-times-circle {
  2558. top: 11px;
  2559. transform: rotate(0deg);
  2560. cursor: pointer;
  2561. &.active {
  2562. transform: rotate(90deg);
  2563. }
  2564. &:hover {
  2565. color: $primary-text-color;
  2566. }
  2567. }
  2568. }
  2569. .search-results__header {
  2570. color: $ui-base-lighter-color;
  2571. background: lighten($ui-base-color, 2%);
  2572. border-bottom: 1px solid darken($ui-base-color, 4%);
  2573. padding: 15px 10px;
  2574. font-size: 14px;
  2575. font-weight: 500;
  2576. }
  2577. .search-results__hashtag {
  2578. display: block;
  2579. padding: 10px;
  2580. color: $ui-secondary-color;
  2581. text-decoration: none;
  2582. &:hover,
  2583. &:active,
  2584. &:focus {
  2585. color: lighten($ui-secondary-color, 4%);
  2586. text-decoration: underline;
  2587. }
  2588. }
  2589. .modal-root {
  2590. transition: opacity 0.3s linear;
  2591. will-change: opacity;
  2592. z-index: 9999;
  2593. }
  2594. .modal-root__overlay {
  2595. position: absolute;
  2596. top: 0;
  2597. left: 0;
  2598. right: 0;
  2599. bottom: 0;
  2600. background: rgba($base-overlay-background, 0.7);
  2601. }
  2602. .modal-root__container {
  2603. position: absolute;
  2604. top: 0;
  2605. left: 0;
  2606. width: 100%;
  2607. height: 100%;
  2608. display: flex;
  2609. flex-direction: column;
  2610. align-items: center;
  2611. justify-content: center;
  2612. align-content: space-around;
  2613. z-index: 9999;
  2614. pointer-events: none;
  2615. user-select: none;
  2616. }
  2617. .modal-root__modal {
  2618. pointer-events: auto;
  2619. display: flex;
  2620. z-index: 9999;
  2621. }
  2622. .media-modal {
  2623. max-width: 80vw;
  2624. max-height: 80vh;
  2625. position: relative;
  2626. .extended-video-player,
  2627. img,
  2628. canvas,
  2629. video {
  2630. max-width: 80vw;
  2631. max-height: 80vh;
  2632. width: auto;
  2633. height: auto;
  2634. margin: auto;
  2635. }
  2636. .extended-video-player,
  2637. video {
  2638. display: flex;
  2639. width: 80vw;
  2640. height: 80vh;
  2641. }
  2642. img,
  2643. canvas {
  2644. display: block;
  2645. background: url('../images/void.png') repeat;
  2646. object-fit: contain;
  2647. }
  2648. .react-swipeable-view-container {
  2649. max-width: 80vw;
  2650. }
  2651. }
  2652. .media-modal__content {
  2653. background: $base-overlay-background;
  2654. }
  2655. .media-modal__pagination {
  2656. width: 100%;
  2657. text-align: center;
  2658. position: absolute;
  2659. left: 0;
  2660. bottom: -40px;
  2661. }
  2662. .media-modal__page-dot {
  2663. display: inline-block;
  2664. }
  2665. .media-modal__button {
  2666. background-color: $white;
  2667. height: 12px;
  2668. width: 12px;
  2669. border-radius: 6px;
  2670. margin: 10px;
  2671. padding: 0;
  2672. border: 0;
  2673. font-size: 0;
  2674. }
  2675. .media-modal__button--active {
  2676. background-color: $ui-highlight-color;
  2677. }
  2678. .media-modal__close {
  2679. position: absolute;
  2680. right: 4px;
  2681. top: 4px;
  2682. z-index: 100;
  2683. }
  2684. .onboarding-modal,
  2685. .error-modal,
  2686. .embed-modal {
  2687. background: $ui-secondary-color;
  2688. color: $ui-base-color;
  2689. border-radius: 8px;
  2690. overflow: hidden;
  2691. display: flex;
  2692. flex-direction: column;
  2693. }
  2694. .onboarding-modal__pager {
  2695. height: 80vh;
  2696. width: 80vw;
  2697. max-width: 520px;
  2698. max-height: 420px;
  2699. .react-swipeable-view-container > div {
  2700. width: 100%;
  2701. height: 100%;
  2702. box-sizing: border-box;
  2703. padding: 25px;
  2704. display: none;
  2705. flex-direction: column;
  2706. align-items: center;
  2707. justify-content: center;
  2708. display: flex;
  2709. user-select: text;
  2710. }
  2711. }
  2712. .error-modal__body {
  2713. height: 80vh;
  2714. width: 80vw;
  2715. max-width: 520px;
  2716. max-height: 420px;
  2717. position: relative;
  2718. & > div {
  2719. position: absolute;
  2720. top: 0;
  2721. left: 0;
  2722. width: 100%;
  2723. height: 100%;
  2724. box-sizing: border-box;
  2725. padding: 25px;
  2726. display: none;
  2727. flex-direction: column;
  2728. align-items: center;
  2729. justify-content: center;
  2730. display: flex;
  2731. opacity: 0;
  2732. user-select: text;
  2733. }
  2734. }
  2735. .error-modal__body {
  2736. display: flex;
  2737. flex-direction: column;
  2738. justify-content: center;
  2739. align-items: center;
  2740. text-align: center;
  2741. }
  2742. @media screen and (max-width: 550px) {
  2743. .onboarding-modal {
  2744. width: 100%;
  2745. height: 100%;
  2746. border-radius: 0;
  2747. }
  2748. .onboarding-modal__pager {
  2749. width: 100%;
  2750. height: auto;
  2751. max-width: none;
  2752. max-height: none;
  2753. flex: 1 1 auto;
  2754. }
  2755. }
  2756. .onboarding-modal__paginator,
  2757. .error-modal__footer {
  2758. flex: 0 0 auto;
  2759. background: darken($ui-secondary-color, 8%);
  2760. display: flex;
  2761. padding: 25px;
  2762. & > div {
  2763. min-width: 33px;
  2764. }
  2765. .onboarding-modal__nav,
  2766. .error-modal__nav {
  2767. color: darken($ui-secondary-color, 34%);
  2768. background-color: transparent;
  2769. border: 0;
  2770. font-size: 14px;
  2771. font-weight: 500;
  2772. padding: 0;
  2773. line-height: inherit;
  2774. height: auto;
  2775. &:hover,
  2776. &:focus,
  2777. &:active {
  2778. color: darken($ui-secondary-color, 38%);
  2779. }
  2780. &.onboarding-modal__done,
  2781. &.onboarding-modal__next {
  2782. color: $ui-highlight-color;
  2783. }
  2784. }
  2785. }
  2786. .error-modal__footer {
  2787. justify-content: center;
  2788. }
  2789. .onboarding-modal__dots {
  2790. flex: 1 1 auto;
  2791. display: flex;
  2792. align-items: center;
  2793. justify-content: center;
  2794. }
  2795. .onboarding-modal__dot {
  2796. width: 14px;
  2797. height: 14px;
  2798. border-radius: 14px;
  2799. background: darken($ui-secondary-color, 16%);
  2800. margin: 0 3px;
  2801. cursor: pointer;
  2802. &:hover {
  2803. background: darken($ui-secondary-color, 18%);
  2804. }
  2805. &.active {
  2806. cursor: default;
  2807. background: darken($ui-secondary-color, 24%);
  2808. }
  2809. }
  2810. .onboarding-modal__page__wrapper {
  2811. pointer-events: none;
  2812. &.onboarding-modal__page__wrapper--active {
  2813. pointer-events: auto;
  2814. }
  2815. }
  2816. .onboarding-modal__page {
  2817. cursor: default;
  2818. line-height: 21px;
  2819. h1 {
  2820. font-size: 18px;
  2821. font-weight: 500;
  2822. color: $ui-base-color;
  2823. margin-bottom: 20px;
  2824. }
  2825. a {
  2826. color: $ui-highlight-color;
  2827. &:hover,
  2828. &:focus,
  2829. &:active {
  2830. color: lighten($ui-highlight-color, 4%);
  2831. }
  2832. }
  2833. p {
  2834. font-size: 16px;
  2835. color: lighten($ui-base-color, 8%);
  2836. margin-top: 10px;
  2837. margin-bottom: 10px;
  2838. &:last-child {
  2839. margin-bottom: 0;
  2840. }
  2841. strong {
  2842. font-weight: 500;
  2843. background: $ui-base-color;
  2844. color: $ui-secondary-color;
  2845. border-radius: 4px;
  2846. font-size: 14px;
  2847. padding: 3px 6px;
  2848. }
  2849. }
  2850. }
  2851. .onboarding-modal__page-one {
  2852. display: flex;
  2853. align-items: center;
  2854. }
  2855. .onboarding-modal__page-one__elephant-friend {
  2856. background: url('../images/elephant-friend-1.png') no-repeat center center / contain;
  2857. width: 155px;
  2858. height: 193px;
  2859. margin-right: 15px;
  2860. }
  2861. @media screen and (max-width: 400px) {
  2862. .onboarding-modal__page-one {
  2863. flex-direction: column;
  2864. align-items: normal;
  2865. }
  2866. .onboarding-modal__page-one__elephant-friend {
  2867. width: 100%;
  2868. height: 30vh;
  2869. max-height: 160px;
  2870. margin-bottom: 5vh;
  2871. }
  2872. }
  2873. .onboarding-modal__page-two,
  2874. .onboarding-modal__page-three,
  2875. .onboarding-modal__page-four,
  2876. .onboarding-modal__page-five {
  2877. p {
  2878. text-align: left;
  2879. }
  2880. .figure {
  2881. background: darken($ui-base-color, 8%);
  2882. color: $ui-secondary-color;
  2883. margin-bottom: 20px;
  2884. border-radius: 4px;
  2885. padding: 10px;
  2886. text-align: center;
  2887. font-size: 14px;
  2888. box-shadow: 1px 2px 6px rgba($base-shadow-color, 0.3);
  2889. .onboarding-modal__image {
  2890. border-radius: 4px;
  2891. margin-bottom: 10px;
  2892. }
  2893. &.non-interactive {
  2894. pointer-events: none;
  2895. text-align: left;
  2896. }
  2897. }
  2898. }
  2899. .onboarding-modal__page-four__columns {
  2900. .row {
  2901. display: flex;
  2902. margin-bottom: 20px;
  2903. & > div {
  2904. flex: 1 1 0;
  2905. margin: 0 10px;
  2906. &:first-child {
  2907. margin-left: 0;
  2908. }
  2909. &:last-child {
  2910. margin-right: 0;
  2911. }
  2912. p {
  2913. text-align: center;
  2914. }
  2915. }
  2916. &:last-child {
  2917. margin-bottom: 0;
  2918. }
  2919. }
  2920. .column-header {
  2921. color: $primary-text-color;
  2922. }
  2923. }
  2924. @media screen and (max-width: 320px) and (max-height: 600px) {
  2925. .onboarding-modal__page p {
  2926. font-size: 14px;
  2927. line-height: 20px;
  2928. }
  2929. .onboarding-modal__page-two .figure,
  2930. .onboarding-modal__page-three .figure,
  2931. .onboarding-modal__page-four .figure,
  2932. .onboarding-modal__page-five .figure {
  2933. font-size: 12px;
  2934. margin-bottom: 10px;
  2935. }
  2936. .onboarding-modal__page-four__columns .row {
  2937. margin-bottom: 10px;
  2938. }
  2939. .onboarding-modal__page-four__columns .column-header {
  2940. padding: 5px;
  2941. font-size: 12px;
  2942. }
  2943. }
  2944. .onboarding-modal__image {
  2945. border-radius: 8px;
  2946. width: 70vw;
  2947. max-width: 450px;
  2948. max-height: auto;
  2949. display: block;
  2950. margin: auto;
  2951. margin-bottom: 20px;
  2952. }
  2953. .onboard-sliders {
  2954. display: inline-block;
  2955. max-width: 30px;
  2956. max-height: auto;
  2957. margin-left: 10px;
  2958. }
  2959. .boost-modal,
  2960. .confirmation-modal,
  2961. .report-modal,
  2962. .actions-modal {
  2963. background: lighten($ui-secondary-color, 8%);
  2964. color: $ui-base-color;
  2965. border-radius: 8px;
  2966. overflow: hidden;
  2967. max-width: 90vw;
  2968. width: 480px;
  2969. position: relative;
  2970. flex-direction: column;
  2971. .status__display-name {
  2972. display: block;
  2973. max-width: 100%;
  2974. padding-right: 25px;
  2975. }
  2976. .status__avatar {
  2977. height: 28px;
  2978. left: 10px;
  2979. position: absolute;
  2980. top: 10px;
  2981. width: 48px;
  2982. }
  2983. }
  2984. .actions-modal {
  2985. .status {
  2986. background: $white;
  2987. border-bottom-color: $ui-secondary-color;
  2988. padding-top: 10px;
  2989. padding-bottom: 10px;
  2990. }
  2991. .dropdown-menu__separator {
  2992. border-bottom-color: $ui-secondary-color;
  2993. }
  2994. }
  2995. .boost-modal__container {
  2996. overflow-x: scroll;
  2997. padding: 10px;
  2998. .status {
  2999. user-select: text;
  3000. border-bottom: 0;
  3001. }
  3002. }
  3003. .boost-modal__action-bar,
  3004. .confirmation-modal__action-bar,
  3005. .report-modal__action-bar {
  3006. display: flex;
  3007. justify-content: space-between;
  3008. background: $ui-secondary-color;
  3009. padding: 10px;
  3010. line-height: 36px;
  3011. & > div {
  3012. flex: 1 1 auto;
  3013. text-align: right;
  3014. color: lighten($ui-base-color, 33%);
  3015. padding-right: 10px;
  3016. }
  3017. .button {
  3018. flex: 0 0 auto;
  3019. }
  3020. }
  3021. .boost-modal__status-header {
  3022. font-size: 15px;
  3023. }
  3024. .boost-modal__status-time {
  3025. float: right;
  3026. font-size: 14px;
  3027. }
  3028. .confirmation-modal {
  3029. max-width: 85vw;
  3030. @media screen and (min-width: 480px) {
  3031. max-width: 380px;
  3032. }
  3033. }
  3034. .report-modal__statuses,
  3035. .report-modal__comment {
  3036. padding: 10px;
  3037. }
  3038. .report-modal__statuses {
  3039. min-height: 20vh;
  3040. max-height: 40vh;
  3041. overflow-y: auto;
  3042. overflow-x: hidden;
  3043. }
  3044. .report-modal__comment {
  3045. .setting-text {
  3046. margin-top: 10px;
  3047. }
  3048. }
  3049. .actions-modal {
  3050. .status {
  3051. overflow-y: auto;
  3052. max-height: 300px;
  3053. }
  3054. max-height: 80vh;
  3055. max-width: 80vw;
  3056. .actions-modal__item-label {
  3057. font-weight: 500;
  3058. }
  3059. ul {
  3060. overflow-y: auto;
  3061. flex-shrink: 0;
  3062. li:empty {
  3063. margin: 0;
  3064. }
  3065. li:not(:empty) {
  3066. a {
  3067. color: $ui-base-color;
  3068. display: flex;
  3069. padding: 12px 16px;
  3070. font-size: 15px;
  3071. align-items: center;
  3072. text-decoration: none;
  3073. &,
  3074. button {
  3075. transition: none;
  3076. }
  3077. &.active,
  3078. &:hover,
  3079. &:active,
  3080. &:focus {
  3081. &,
  3082. button {
  3083. background: $ui-highlight-color;
  3084. color: $primary-text-color;
  3085. }
  3086. }
  3087. button:first-child {
  3088. margin-right: 10px;
  3089. }
  3090. }
  3091. }
  3092. }
  3093. }
  3094. .confirmation-modal__action-bar {
  3095. .confirmation-modal__cancel-button {
  3096. background-color: transparent;
  3097. color: darken($ui-secondary-color, 34%);
  3098. font-size: 14px;
  3099. font-weight: 500;
  3100. &:hover,
  3101. &:focus,
  3102. &:active {
  3103. color: darken($ui-secondary-color, 38%);
  3104. }
  3105. }
  3106. }
  3107. .confirmation-modal__container,
  3108. .report-modal__target {
  3109. padding: 30px;
  3110. font-size: 16px;
  3111. text-align: center;
  3112. strong {
  3113. font-weight: 500;
  3114. }
  3115. }
  3116. .loading-bar {
  3117. background-color: $ui-highlight-color;
  3118. height: 3px;
  3119. position: absolute;
  3120. top: 0;
  3121. left: 0;
  3122. }
  3123. .media-gallery__gifv__label {
  3124. display: block;
  3125. position: absolute;
  3126. color: $primary-text-color;
  3127. background: rgba($base-overlay-background, 0.5);
  3128. bottom: 6px;
  3129. left: 6px;
  3130. padding: 2px 6px;
  3131. border-radius: 2px;
  3132. font-size: 11px;
  3133. font-weight: 600;
  3134. z-index: 1;
  3135. pointer-events: none;
  3136. opacity: 0.9;
  3137. transition: opacity 0.1s ease;
  3138. }
  3139. .media-gallery__gifv {
  3140. &.autoplay {
  3141. .media-gallery__gifv__label {
  3142. display: none;
  3143. }
  3144. }
  3145. &:hover {
  3146. .media-gallery__gifv__label {
  3147. opacity: 1;
  3148. }
  3149. }
  3150. }
  3151. .attachment-list {
  3152. display: flex;
  3153. font-size: 14px;
  3154. border: 1px solid lighten($ui-base-color, 8%);
  3155. border-radius: 4px;
  3156. margin-top: 14px;
  3157. overflow: hidden;
  3158. }
  3159. .attachment-list__icon {
  3160. flex: 0 0 auto;
  3161. color: $ui-base-lighter-color;
  3162. padding: 8px 18px;
  3163. cursor: default;
  3164. border-right: 1px solid lighten($ui-base-color, 8%);
  3165. display: flex;
  3166. flex-direction: column;
  3167. align-items: center;
  3168. justify-content: center;
  3169. font-size: 26px;
  3170. .fa {
  3171. display: block;
  3172. }
  3173. }
  3174. .attachment-list__list {
  3175. list-style: none;
  3176. padding: 4px 0;
  3177. padding-left: 8px;
  3178. display: flex;
  3179. flex-direction: column;
  3180. justify-content: center;
  3181. li {
  3182. display: block;
  3183. padding: 4px 0;
  3184. }
  3185. a {
  3186. text-decoration: none;
  3187. color: $ui-base-lighter-color;
  3188. font-weight: 500;
  3189. &:hover {
  3190. text-decoration: underline;
  3191. }
  3192. }
  3193. }
  3194. /* Media Gallery */
  3195. .media-gallery {
  3196. box-sizing: border-box;
  3197. margin-top: 8px;
  3198. overflow: hidden;
  3199. position: relative;
  3200. width: 100%;
  3201. }
  3202. .media-gallery__item {
  3203. border: none;
  3204. box-sizing: border-box;
  3205. display: block;
  3206. float: left;
  3207. position: relative;
  3208. &.standalone {
  3209. .media-gallery__item-gifv-thumbnail {
  3210. transform: none;
  3211. }
  3212. }
  3213. }
  3214. .media-gallery__item-thumbnail {
  3215. cursor: zoom-in;
  3216. display: block;
  3217. text-decoration: none;
  3218. height: 100%;
  3219. line-height: 0;
  3220. &,
  3221. img {
  3222. width: 100%;
  3223. height: 100%;
  3224. object-fit: cover;
  3225. }
  3226. }
  3227. .media-gallery__gifv {
  3228. height: 100%;
  3229. overflow: hidden;
  3230. position: relative;
  3231. width: 100%;
  3232. }
  3233. .media-gallery__item-gifv-thumbnail {
  3234. cursor: zoom-in;
  3235. height: 100%;
  3236. object-fit: cover;
  3237. position: relative;
  3238. top: 50%;
  3239. transform: translateY(-50%);
  3240. width: 100%;
  3241. z-index: 1;
  3242. }
  3243. .media-gallery__item-thumbnail-label {
  3244. clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
  3245. clip: rect(1px, 1px, 1px, 1px);
  3246. overflow: hidden;
  3247. position: absolute;
  3248. }
  3249. /* End Media Gallery */
  3250. /* Status Video Player */
  3251. .status__video-player {
  3252. background: $base-overlay-background;
  3253. box-sizing: border-box;
  3254. cursor: default; /* May not be needed */
  3255. margin-top: 8px;
  3256. overflow: hidden;
  3257. position: relative;
  3258. }
  3259. .status__video-player-video {
  3260. height: 100%;
  3261. object-fit: cover;
  3262. position: relative;
  3263. top: 50%;
  3264. transform: translateY(-50%);
  3265. width: 100%;
  3266. z-index: 1;
  3267. }
  3268. .status__video-player-expand,
  3269. .status__video-player-mute {
  3270. color: $primary-text-color;
  3271. opacity: 0.8;
  3272. position: absolute;
  3273. right: 4px;
  3274. text-shadow: 0 1px 1px $base-shadow-color, 1px 0 1px $base-shadow-color;
  3275. }
  3276. .status__video-player-spoiler {
  3277. display: none;
  3278. color: $primary-text-color;
  3279. left: 4px;
  3280. position: absolute;
  3281. text-shadow: 0 1px 1px $base-shadow-color, 1px 0 1px $base-shadow-color;
  3282. top: 4px;
  3283. z-index: 100;
  3284. &.status__video-player-spoiler--visible {
  3285. display: block;
  3286. }
  3287. }
  3288. .status__video-player-expand {
  3289. bottom: 4px;
  3290. z-index: 100;
  3291. }
  3292. .status__video-player-mute {
  3293. top: 4px;
  3294. z-index: 5;
  3295. }
  3296. .video-player {
  3297. overflow: hidden;
  3298. position: relative;
  3299. background: $base-shadow-color;
  3300. max-width: 100%;
  3301. video {
  3302. height: 100%;
  3303. width: 100%;
  3304. z-index: 1;
  3305. }
  3306. &.fullscreen {
  3307. width: 100% !important;
  3308. height: 100% !important;
  3309. margin: 0;
  3310. video {
  3311. max-width: 100% !important;
  3312. max-height: 100% !important;
  3313. }
  3314. }
  3315. &.inline {
  3316. video {
  3317. object-fit: cover;
  3318. position: relative;
  3319. top: 50%;
  3320. transform: translateY(-50%);
  3321. }
  3322. }
  3323. &__controls {
  3324. position: absolute;
  3325. z-index: 2;
  3326. bottom: 0;
  3327. left: 0;
  3328. right: 0;
  3329. box-sizing: border-box;
  3330. background: linear-gradient(0deg, rgba($base-shadow-color, 0.8) 0, rgba($base-shadow-color, 0.35) 60%, transparent);
  3331. padding: 0 10px;
  3332. opacity: 0;
  3333. transition: opacity .1s ease;
  3334. &.active {
  3335. opacity: 1;
  3336. }
  3337. }
  3338. &.inactive {
  3339. video,
  3340. .video-player__controls {
  3341. visibility: hidden;
  3342. }
  3343. }
  3344. &__spoiler {
  3345. display: none;
  3346. position: absolute;
  3347. top: 0;
  3348. left: 0;
  3349. width: 100%;
  3350. height: 100%;
  3351. z-index: 4;
  3352. border: 0;
  3353. background: $base-shadow-color;
  3354. color: $ui-primary-color;
  3355. transition: none;
  3356. pointer-events: none;
  3357. &.active {
  3358. display: block;
  3359. pointer-events: auto;
  3360. &:hover,
  3361. &:active,
  3362. &:focus {
  3363. color: lighten($ui-primary-color, 8%);
  3364. }
  3365. }
  3366. &__title {
  3367. display: block;
  3368. font-size: 14px;
  3369. }
  3370. &__subtitle {
  3371. display: block;
  3372. font-size: 11px;
  3373. font-weight: 500;
  3374. }
  3375. }
  3376. &__buttons {
  3377. padding-bottom: 10px;
  3378. font-size: 16px;
  3379. &.left {
  3380. float: left;
  3381. button {
  3382. padding-right: 10px;
  3383. }
  3384. }
  3385. &.right {
  3386. float: right;
  3387. button {
  3388. padding-left: 10px;
  3389. }
  3390. }
  3391. button {
  3392. background: transparent;
  3393. padding: 0;
  3394. border: 0;
  3395. color: $white;
  3396. &:active,
  3397. &:hover,
  3398. &:focus {
  3399. color: $ui-highlight-color;
  3400. }
  3401. }
  3402. }
  3403. &__seek {
  3404. cursor: pointer;
  3405. height: 24px;
  3406. position: relative;
  3407. &::before {
  3408. content: "";
  3409. width: 100%;
  3410. background: rgba($white, 0.35);
  3411. display: block;
  3412. position: absolute;
  3413. height: 4px;
  3414. top: 10px;
  3415. }
  3416. &__progress,
  3417. &__buffer {
  3418. display: block;
  3419. position: absolute;
  3420. height: 4px;
  3421. top: 10px;
  3422. background: $ui-highlight-color;
  3423. }
  3424. &__buffer {
  3425. background: rgba($white, 0.2);
  3426. }
  3427. &__handle {
  3428. position: absolute;
  3429. z-index: 3;
  3430. opacity: 0;
  3431. border-radius: 50%;
  3432. width: 12px;
  3433. height: 12px;
  3434. top: 6px;
  3435. margin-left: -6px;
  3436. transition: opacity .1s ease;
  3437. background: $ui-highlight-color;
  3438. pointer-events: none;
  3439. &.active {
  3440. opacity: 1;
  3441. }
  3442. }
  3443. &:hover {
  3444. .video-player__seek__handle {
  3445. opacity: 1;
  3446. }
  3447. }
  3448. }
  3449. }
  3450. .media-spoiler-video {
  3451. background-size: cover;
  3452. background-repeat: no-repeat;
  3453. background-position: center;
  3454. cursor: pointer;
  3455. margin-top: 8px;
  3456. position: relative;
  3457. border: 0;
  3458. display: block;
  3459. }
  3460. .media-spoiler-video-play-icon {
  3461. border-radius: 100px;
  3462. color: rgba($primary-text-color, 0.8);
  3463. font-size: 36px;
  3464. left: 50%;
  3465. padding: 5px;
  3466. position: absolute;
  3467. top: 50%;
  3468. transform: translate(-50%, -50%);
  3469. }
  3470. /* End Video Player */
  3471. .account-gallery__container {
  3472. margin: -2px;
  3473. padding: 4px;
  3474. display: flex;
  3475. flex-wrap: wrap;
  3476. }
  3477. .account-gallery__item {
  3478. flex: 1 1 auto;
  3479. width: calc(100% / 3 - 4px);
  3480. height: 95px;
  3481. margin: 2px;
  3482. a {
  3483. display: block;
  3484. width: 100%;
  3485. height: 100%;
  3486. background-color: $base-overlay-background;
  3487. background-size: cover;
  3488. background-position: center;
  3489. position: relative;
  3490. color: inherit;
  3491. text-decoration: none;
  3492. &:hover,
  3493. &:active,
  3494. &:focus {
  3495. outline: 0;
  3496. }
  3497. }
  3498. }
  3499. .account-section-headline {
  3500. color: $ui-base-lighter-color;
  3501. background: lighten($ui-base-color, 2%);
  3502. border-bottom: 1px solid lighten($ui-base-color, 4%);
  3503. padding: 15px 10px;
  3504. font-size: 14px;
  3505. font-weight: 500;
  3506. position: relative;
  3507. cursor: default;
  3508. &::before,
  3509. &::after {
  3510. display: block;
  3511. content: "";
  3512. position: absolute;
  3513. bottom: 0;
  3514. left: 18px;
  3515. width: 0;
  3516. height: 0;
  3517. border-style: solid;
  3518. border-width: 0 10px 10px;
  3519. border-color: transparent transparent lighten($ui-base-color, 4%);
  3520. }
  3521. &::after {
  3522. bottom: -1px;
  3523. border-color: transparent transparent $ui-base-color;
  3524. }
  3525. }
  3526. ::-webkit-scrollbar-thumb {
  3527. border-radius: 0;
  3528. }
  3529. .search-popout {
  3530. background: $simple-background-color;
  3531. border-radius: 4px;
  3532. padding: 10px 14px;
  3533. padding-bottom: 14px;
  3534. margin-top: 10px;
  3535. color: $ui-primary-color;
  3536. box-shadow: 2px 4px 15px rgba($base-shadow-color, 0.4);
  3537. h4 {
  3538. text-transform: uppercase;
  3539. color: $ui-primary-color;
  3540. font-size: 13px;
  3541. font-weight: 500;
  3542. margin-bottom: 10px;
  3543. }
  3544. li {
  3545. padding: 4px 0;
  3546. }
  3547. ul {
  3548. margin-bottom: 10px;
  3549. }
  3550. em {
  3551. font-weight: 500;
  3552. color: $ui-base-color;
  3553. }
  3554. }
  3555. noscript {
  3556. text-align: center;
  3557. img {
  3558. width: 200px;
  3559. opacity: 0.5;
  3560. animation: flicker 4s infinite;
  3561. }
  3562. div {
  3563. font-size: 14px;
  3564. margin: 30px auto;
  3565. color: $ui-secondary-color;
  3566. max-width: 400px;
  3567. a {
  3568. color: $ui-highlight-color;
  3569. text-decoration: underline;
  3570. &:hover {
  3571. text-decoration: none;
  3572. }
  3573. }
  3574. }
  3575. }
  3576. @keyframes flicker {
  3577. 0% { opacity: 1; }
  3578. 30% { opacity: 0.75; }
  3579. 100% { opacity: 1; }
  3580. }
  3581. @media screen and (max-width: 630px) and (max-height: 400px) {
  3582. $duration: 400ms;
  3583. $delay: 100ms;
  3584. .tabs-bar,
  3585. .search {
  3586. will-change: margin-top;
  3587. transition: margin-top $duration $delay;
  3588. }
  3589. .navigation-bar {
  3590. will-change: padding-bottom;
  3591. transition: padding-bottom $duration $delay;
  3592. }
  3593. .navigation-bar {
  3594. & > a:first-child {
  3595. will-change: margin-top, margin-left, width;
  3596. transition: margin-top $duration $delay, margin-left $duration ($duration + $delay);
  3597. }
  3598. & > .navigation-bar__profile-edit {
  3599. will-change: margin-top;
  3600. transition: margin-top $duration $delay;
  3601. }
  3602. & > .icon-button {
  3603. will-change: opacity;
  3604. transition: opacity $duration $delay;
  3605. }
  3606. }
  3607. .is-composing {
  3608. .tabs-bar,
  3609. .search {
  3610. margin-top: -50px;
  3611. }
  3612. .navigation-bar {
  3613. padding-bottom: 0;
  3614. & > a:first-child {
  3615. margin-top: -50px;
  3616. margin-left: -40px;
  3617. }
  3618. .navigation-bar__profile {
  3619. padding-top: 2px;
  3620. }
  3621. .navigation-bar__profile-edit {
  3622. position: absolute;
  3623. margin-top: -50px;
  3624. }
  3625. .icon-button {
  3626. pointer-events: auto;
  3627. opacity: 1;
  3628. }
  3629. }
  3630. }
  3631. }
  3632. .embed-modal {
  3633. max-width: 80vw;
  3634. max-height: 80vh;
  3635. h4 {
  3636. padding: 30px;
  3637. font-weight: 500;
  3638. font-size: 16px;
  3639. text-align: center;
  3640. }
  3641. .embed-modal__container {
  3642. padding: 10px;
  3643. .hint {
  3644. margin-bottom: 15px;
  3645. }
  3646. .embed-modal__html {
  3647. color: $ui-secondary-color;
  3648. outline: 0;
  3649. box-sizing: border-box;
  3650. display: block;
  3651. width: 100%;
  3652. border: none;
  3653. padding: 10px;
  3654. font-family: 'mastodon-font-monospace', monospace;
  3655. background: $ui-base-color;
  3656. color: $ui-primary-color;
  3657. font-size: 14px;
  3658. margin: 0;
  3659. margin-bottom: 15px;
  3660. &::-moz-focus-inner {
  3661. border: 0;
  3662. }
  3663. &::-moz-focus-inner,
  3664. &:focus,
  3665. &:active {
  3666. outline: 0 !important;
  3667. }
  3668. &:focus {
  3669. background: lighten($ui-base-color, 4%);
  3670. }
  3671. @media screen and (max-width: 600px) {
  3672. font-size: 16px;
  3673. }
  3674. }
  3675. .embed-modal__iframe {
  3676. width: 400px;
  3677. max-width: 100%;
  3678. overflow: hidden;
  3679. border: 0;
  3680. }
  3681. }
  3682. }