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.

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