闭社主体 forked from https://github.com/tootsuite/mastodon
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.

4752 lines
80 KiB

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