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.

styled.js 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. import React from 'react';
  2. import styled from 'styled-components';
  3. import { Icon, IconHorizontalPoints } from '../../../base/icons';
  4. import { ACTION_TRIGGER } from '../../constants';
  5. const MD_BREAKPOINT = '580px';
  6. export const ignoredChildClassName = 'ignore-child';
  7. export const AntiCollapse = styled.br`
  8. font-size: 0;
  9. `;
  10. export const Button = styled.button`
  11. align-items: center;
  12. background-color: ${
  13. // eslint-disable-next-line no-confusing-arrow
  14. props => props.primary ? '#0056E0' : '#3D3D3D'
  15. };
  16. border: 0;
  17. border-radius: 6px;
  18. display: flex;
  19. font-weight: unset;
  20. justify-content: center;
  21. min-height: 32px;
  22. &:hover {
  23. background-color: ${
  24. // eslint-disable-next-line no-confusing-arrow
  25. props => props.primary ? '#246FE5' : '#525252'
  26. };
  27. }
  28. `;
  29. export const QuickActionButton = styled(Button)`
  30. padding: 0 12px;
  31. `;
  32. export const Container = styled.div`
  33. box-sizing: border-box;
  34. flex: 1;
  35. overflow-y: auto;
  36. position: relative;
  37. padding: 0 ${props => props.theme.panePadding}px;
  38. & > * + *:not(.${ignoredChildClassName}) {
  39. margin-top: 16px;
  40. }
  41. &::-webkit-scrollbar {
  42. display: none;
  43. }
  44. `;
  45. export const ContextMenu = styled.div.attrs(props => {
  46. return {
  47. className: props.className
  48. };
  49. })`
  50. background-color: #292929;
  51. border-radius: 3px;
  52. box-shadow: 0px 3px 16px rgba(0, 0, 0, 0.6), 0px 0px 4px 1px rgba(0, 0, 0, 0.25);
  53. color: white;
  54. font-size: ${props => props.theme.contextFontSize}px;
  55. font-weight: ${props => props.theme.contextFontWeight};
  56. margin-top: ${props => {
  57. const {
  58. participantActionButtonHeight,
  59. participantItemHeight
  60. } = props.theme;
  61. return ((3 * participantItemHeight) + participantActionButtonHeight) / 4;
  62. }}px;
  63. position: absolute;
  64. right: ${props => props.theme.panePadding}px;
  65. top: 0;
  66. z-index: 2;
  67. & > li {
  68. list-style: none;
  69. }
  70. ${props => props.isHidden && `
  71. pointer-events: none;
  72. visibility: hidden;
  73. `}
  74. `;
  75. export const ContextMenuIcon = styled(Icon).attrs({
  76. size: 20
  77. })`
  78. & > svg {
  79. fill: #ffffff;
  80. }
  81. `;
  82. export const ContextMenuItem = styled.div`
  83. align-items: center;
  84. box-sizing: border-box;
  85. cursor: pointer;
  86. display: flex;
  87. min-height: 40px;
  88. padding: 10px 16px;
  89. & > *:not(:last-child) {
  90. margin-right: 16px;
  91. }
  92. &:hover {
  93. background-color: #525252;
  94. }
  95. `;
  96. export const ContextMenuItemGroup = styled.div`
  97. &:not(:empty) {
  98. padding: 8px 0;
  99. }
  100. & + &:not(:empty) {
  101. border-top: 1px solid #4C4D50;
  102. }
  103. `;
  104. export const Close = styled.div`
  105. align-items: center;
  106. cursor: pointer;
  107. display: flex;
  108. height: 20px;
  109. justify-content: center;
  110. width: 20px;
  111. &:before, &:after {
  112. content: '';
  113. background-color: #a4b8d1;
  114. border-radius: 2px;
  115. height: 2px;
  116. position: absolute;
  117. transform-origin: center center;
  118. width: 21px;
  119. }
  120. &:before {
  121. transform: rotate(45deg);
  122. }
  123. &:after {
  124. transform: rotate(-45deg);
  125. }
  126. `;
  127. export const Footer = styled.div`
  128. background-color: #141414;
  129. display: flex;
  130. justify-content: flex-end;
  131. padding: 24px ${props => props.theme.panePadding}px;
  132. & > *:not(:last-child) {
  133. margin-right: 16px;
  134. }
  135. `;
  136. export const FooterButton = styled(Button)`
  137. height: 40px;
  138. font-size: 15px;
  139. padding: 0 16px;
  140. @media (max-width: ${MD_BREAKPOINT}) {
  141. font-size: 16px;
  142. height: 48px;
  143. min-width: 48px;
  144. }
  145. `;
  146. export const FooterEllipsisButton = styled(FooterButton).attrs({
  147. children: <Icon src = { IconHorizontalPoints } />
  148. })`
  149. padding: 8px;
  150. `;
  151. export const FooterEllipsisContainer = styled.div`
  152. position: relative;
  153. `;
  154. export const Header = styled.div`
  155. align-items: center;
  156. box-sizing: border-box;
  157. display: flex;
  158. height: ${props => props.theme.headerSize}px;
  159. padding: 0 20px;
  160. `;
  161. export const Heading = styled.div`
  162. color: #d1dbe8;
  163. font-style: normal;
  164. font-size: 15px;
  165. line-height: 24px;
  166. margin: 8px 0 ${props => props.theme.panePadding}px;
  167. @media (max-width: ${MD_BREAKPOINT}) {
  168. font-size: 16px;
  169. }
  170. `;
  171. export const ParticipantActionButton = styled(Button)`
  172. height: ${props => props.theme.participantActionButtonHeight}px;
  173. padding: 6px 10px;
  174. `;
  175. export const ParticipantActionEllipsis = styled(ParticipantActionButton).attrs({
  176. children: <Icon src = { IconHorizontalPoints } />,
  177. primary: true
  178. })`
  179. padding: 6px;
  180. `;
  181. export const ParticipantActions = styled.div`
  182. align-items: center;
  183. z-index: 1;
  184. & > *:not(:last-child) {
  185. margin-right: 8px;
  186. }
  187. `;
  188. export const ParticipantActionsHover = styled(ParticipantActions)`
  189. background-color: #292929;
  190. bottom: 1px;
  191. display: none;
  192. position: absolute;
  193. right: ${props => props.theme.panePadding};
  194. top: 0;
  195. &:after {
  196. content: '';
  197. background: linear-gradient(90deg, rgba(0, 0, 0, 0) 0%, #292929 100%);
  198. bottom: 0;
  199. display: block;
  200. left: 0;
  201. pointer-events: none;
  202. position: absolute;
  203. top: 0;
  204. transform: translateX(-100%);
  205. }
  206. `;
  207. export const ParticipantActionsPermanent = styled(ParticipantActions)`
  208. display: flex;
  209. `;
  210. export const ParticipantContent = styled.div`
  211. align-items: center;
  212. box-shadow: inset 0px -1px 0px rgba(255, 255, 255, 0.15);
  213. display: flex;
  214. flex: 1;
  215. height: 100%;
  216. overflow: hidden;
  217. padding-right: ${props => props.theme.panePadding}px;
  218. `;
  219. export const ParticipantStates = styled.div`
  220. display: flex;
  221. justify-content: flex-end;
  222. & > * {
  223. align-items: center;
  224. display: flex;
  225. justify-content: center;
  226. }
  227. & > *:not(:last-child) {
  228. margin-right: 8px;
  229. }
  230. .jitsi-icon {
  231. padding: 3px;
  232. }
  233. `;
  234. export const ParticipantContainer = styled.div`
  235. align-items: center;
  236. color: white;
  237. display: flex;
  238. font-size: 13px;
  239. height: ${props => props.theme.participantItemHeight}px;
  240. margin: 0 -${props => props.theme.panePadding}px;
  241. padding-left: ${props => props.theme.panePadding}px;
  242. position: relative;
  243. @media (max-width: ${MD_BREAKPOINT}) {
  244. font-size: 16px;
  245. height: 64px;
  246. }
  247. &:hover {
  248. ${ParticipantStates} {
  249. ${props => !props.local && 'display: none'};
  250. }
  251. }
  252. ${props => !props.isHighlighted && '&:hover {'}
  253. background-color: #292929;
  254. & ${ParticipantActions} {
  255. ${props => props.trigger === ACTION_TRIGGER.HOVER && `
  256. display: flex;
  257. `}
  258. }
  259. & ${ParticipantContent} {
  260. box-shadow: none;
  261. }
  262. & ${ParticipantStates} {
  263. display: none;
  264. }
  265. ${props => !props.isHighlighted && '}'}
  266. `;
  267. export const ParticipantInviteButton = styled(Button).attrs({
  268. primary: true
  269. })`
  270. font-size: 15px;
  271. height: 40px;
  272. width: 100%;
  273. & > *:not(:last-child) {
  274. margin-right: 8px;
  275. }
  276. @media (max-width: ${MD_BREAKPOINT}) {
  277. font-size: 16px;
  278. height: 48px;
  279. }
  280. `;
  281. export const ParticipantName = styled.div`
  282. overflow: hidden;
  283. text-overflow: ellipsis;
  284. white-space: nowrap;
  285. `;
  286. export const ParticipantNameContainer = styled.div`
  287. display: flex;
  288. flex: 1;
  289. margin-right: 8px;
  290. overflow: hidden;
  291. `;
  292. export const RaisedHandIndicatorBackground = styled.div`
  293. background-color: #ed9e1b;
  294. border-radius: 3px;
  295. height: 24px;
  296. width: 24px;
  297. `;
  298. export const VolumeInput = styled.input.attrs({
  299. type: 'range'
  300. })`
  301. width: 100%;
  302. `;
  303. export const VolumeInputContainer = styled.div`
  304. position: relative;
  305. width: 100%;
  306. `;
  307. export const VolumeOverlay = styled.div`
  308. background-color: #0376da;
  309. border-radius: 1px 0 0 1px;
  310. height: 100%;
  311. left: 0;
  312. pointer-events: none;
  313. position: absolute;
  314. `;