Skip to content
This repository was archived by the owner on Dec 11, 2019. It is now read-only.

Commit 94ba1a1

Browse files
committed
UI bug fixing
- tabs can now respond beautifully to intersections - Also BEMify tabs Auditors: @bsclifton, @luixxiul fix #6716 fix #7301 fix #7730 fix #7765 fix #7925 fix #10123 fix #10509 fix #10544 fix #10582 fix #10611 fix #10838
1 parent e405759 commit 94ba1a1

File tree

5 files changed

+102
-88
lines changed

5 files changed

+102
-88
lines changed

app/renderer/components/styles/commonStyles.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ const styles = StyleSheet.create({
161161
notificationBar__notificationItem: {
162162
backgroundColor: globalStyles.color.notificationItemColor,
163163
boxSizing: 'border-box',
164-
borderTop: `1px solid ${globalStyles.color.tabsToolbarBorderColor}`,
164+
boxShadow: `0 -1px 0 ${globalStyles.color.tabsToolbarBorderColor}`,
165165
lineHeight: '24px',
166166
padding: '8px 20px'
167167
},

app/renderer/components/styles/global.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ const globalStyles = {
162162
aboutPageDetailsPageWidth: '704px',
163163
aboutPageSectionPadding: '24px',
164164
aboutPageSectionMargin: '10px',
165-
defaultTabPadding: '0 4px',
165+
defaultTabMargin: '6px',
166166
defaultIconPadding: '2px',
167167
iconSize: '16px',
168168
sessionIconSize: '15px',
@@ -214,6 +214,7 @@ const globalStyles = {
214214
zindexWindowIsPreview: '1100',
215215
zindexDownloadsBar: '1000',
216216
zindexTabs: '1000',
217+
zindexTabsAudioTopBorder: '10001',
217218
zindexTabsThumbnail: '1100',
218219
zindexTabsDragIndicator: '1100',
219220
zindexNavigationBar: '2000',

app/renderer/components/tabs/tab.js

+89-82
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
/* This Source Code Form is subject to the terms of the Mozilla Public
2-
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
3-
* You can obtain one at http://mozilla.org/MPL/2.0/. */
2+
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
3+
* You can obtain one at http://mozilla.org/MPL/2.0/. */
44

55
const React = require('react')
6-
const {StyleSheet, css} = require('aphrodite')
6+
const {StyleSheet, css} = require('aphrodite/no-important')
77
const Immutable = require('immutable')
88

99
// Components
@@ -23,7 +23,8 @@ const windowActions = require('../../../../js/actions/windowActions')
2323
// Store
2424
const windowStore = require('../../../../js/stores/windowStore')
2525

26-
// State
26+
// State helpers
27+
const privateState = require('../../../common/state/tabContentState/privateState')
2728
const audioState = require('../../../common/state/tabContentState/audioState')
2829
const tabUIState = require('../../../common/state/tabUIState')
2930
const tabState = require('../../../common/state/tabState')
@@ -33,6 +34,7 @@ const dragTypes = require('../../../../js/constants/dragTypes')
3334

3435
// Styles
3536
const globalStyles = require('../styles/global')
37+
const {theme} = require('../styles/theme')
3638

3739
// Utils
3840
const cx = require('../../../../js/lib/classSet')
@@ -186,9 +188,11 @@ class Tab extends React.Component {
186188
}
187189

188190
componentDidMount () {
189-
// do not observe pinned tabs
191+
// unobserve tabs that we don't need. This will
192+
// likely be made by onObserve method but added again as
193+
// just to double-check
190194
if (this.props.isPinned) {
191-
this.observer.unobserve(this.tabSentinel)
195+
this.observer && this.observer.unobserve(this.tabSentinel)
192196
}
193197
const threshold = Object.values(globalStyles.intersection)
194198
// At this moment Chrome can't handle unitless zeroes for rootMargin
@@ -200,20 +204,11 @@ class Tab extends React.Component {
200204
this.tabNode.addEventListener('auxclick', this.onAuxClick.bind(this))
201205
}
202206

203-
componentDidUpdate () {
204-
// if a tab was just pinned, unobserve its intersection
205-
// this gives us some more performance boost
206-
if (this.props.isPinnedTab) {
207-
this.observer.unobserve(this.tabSentinel)
208-
}
209-
}
210-
211207
componentWillUnmount () {
212208
this.observer.unobserve(this.tabSentinel)
213209
}
214210

215211
onObserve (entries) {
216-
// avoid observing pinned tabs
217212
if (this.props.isPinnedTab) {
218213
return
219214
}
@@ -234,27 +229,32 @@ class Tab extends React.Component {
234229
mergeProps (state, ownProps) {
235230
const currentWindow = state.get('currentWindow')
236231
const frame = frameStateUtil.getFrameByKey(currentWindow, ownProps.frameKey) || Immutable.Map()
232+
const frameKey = ownProps.frameKey
233+
const tabId = frame.get('tabId', tabState.TAB_ID_NONE)
234+
const isPinned = tabState.isTabPinned(state, tabId)
235+
const partOfFullPageSet = ownProps.partOfFullPageSet
236+
237+
// TODO: this should have its own method
237238
const notifications = state.get('notifications')
238239
const notificationOrigins = notifications ? notifications.map(bar => bar.get('frameOrigin')) : false
239240
const notificationBarActive = frame.get('location') && notificationOrigins &&
240241
notificationOrigins.includes(UrlUtil.getUrlOrigin(frame.get('location')))
241-
const tabId = frame.get('tabId', tabState.TAB_ID_NONE)
242242

243243
const props = {}
244-
// used in renderer
245-
props.frameKey = ownProps.frameKey
246-
props.isPrivateTab = frame.get('isPrivate')
244+
// TODO: this should have its own method
247245
props.notificationBarActive = notificationBarActive
248-
props.isActive = frameStateUtil.isFrameKeyActive(currentWindow, props.frameKey)
246+
props.frameKey = frameKey
247+
props.isPinnedTab = isPinned
248+
props.isPrivateTab = privateState.isPrivateTab(currentWindow, frameKey)
249+
props.isActive = frameStateUtil.isFrameKeyActive(currentWindow, frameKey)
249250
props.tabWidth = currentWindow.getIn(['ui', 'tabs', 'fixTabWidth'])
250-
props.isPinnedTab = tabState.isTabPinned(state, tabId)
251-
props.canPlayAudio = audioState.canPlayAudio(currentWindow, props.frameKey)
252-
props.themeColor = tabUIState.getThemeColor(currentWindow, props.frameKey)
251+
props.themeColor = tabUIState.getThemeColor(currentWindow, frameKey)
253252
props.title = frame.get('title')
254-
props.partOfFullPageSet = ownProps.partOfFullPageSet
253+
props.partOfFullPageSet = partOfFullPageSet
254+
props.showAudioTopBorder = audioState.showAudioTopBorder(currentWindow, frameKey, isPinned)
255+
props.centralizeTabIcons = tabUIState.centralizeTabIcons(currentWindow, frameKey, isPinned)
255256

256257
// used in other functions
257-
props.totalTabs = state.get('tabs').size
258258
props.dragData = state.getIn(['dragData', 'type']) === dragTypes.TAB && state.get('dragData')
259259
props.tabId = tabId
260260
props.previewMode = currentWindow.getIn(['ui', 'tabs', 'previewMode'])
@@ -265,7 +265,7 @@ class Tab extends React.Component {
265265
render () {
266266
// we don't want themeColor if tab is private
267267
const perPageStyles = !this.props.isPrivateTab && StyleSheet.create({
268-
themeColor: {
268+
tab_themeColor: {
269269
color: this.props.themeColor ? getTextColorForBackground(this.props.themeColor) : 'inherit',
270270
background: this.props.themeColor ? this.props.themeColor : 'inherit',
271271
':hover': {
@@ -301,13 +301,15 @@ class Tab extends React.Component {
301301
className={css(
302302
styles.tab,
303303
// Windows specific style
304-
isWindows && styles.tabForWindows,
305-
this.props.isPinnedTab && styles.isPinned,
306-
this.props.isActive && styles.active,
307-
this.props.isActive && this.props.themeColor && perPageStyles.themeColor,
304+
isWindows && styles.tab_forWindows,
305+
this.props.isPinnedTab && styles.tab_pinned,
306+
this.props.isActive && styles.tab_active,
307+
this.props.showAudioTopBorder && styles.tab_audioTopBorder,
308+
this.props.isActive && this.props.themeColor && perPageStyles.tab_themeColor,
308309
// Private color should override themeColor
309-
this.props.isPrivateTab && styles.private,
310-
this.props.isActive && this.props.isPrivateTab && styles.activePrivateTab
310+
this.props.isPrivateTab && styles.tab_private,
311+
this.props.isActive && this.props.isPrivateTab && styles.tab_active_private,
312+
this.props.centralizeTabIcons && styles.tab__content_centered
311313
)}
312314
data-test-id='tab'
313315
data-frame-key={this.props.frameKey}
@@ -323,7 +325,10 @@ class Tab extends React.Component {
323325
ref={(node) => { this.tabSentinel = node }}
324326
className={css(styles.tab__sentinel)}
325327
/>
326-
<div className={css(styles.tabId)}>
328+
<div className={css(
329+
styles.tab__identity,
330+
this.props.centralizeTabIcons && styles.tab__content_centered
331+
)}>
327332
<Favicon tabId={this.props.tabId} />
328333
<AudioTabIcon tabId={this.props.tabId} />
329334
<TabTitle tabId={this.props.tabId} />
@@ -337,34 +342,39 @@ class Tab extends React.Component {
337342
}
338343

339344
const styles = StyleSheet.create({
340-
// Windows specific style
341-
tabForWindows: {
342-
color: '#555'
343-
},
344-
345345
tab: {
346346
borderWidth: '0 1px 0 0',
347347
borderStyle: 'solid',
348348
borderColor: '#bbb',
349349
boxSizing: 'border-box',
350-
color: '#5a5a5a',
350+
color: theme.tab.color,
351351
display: 'flex',
352352
marginTop: '0',
353-
transition: `transform 200ms ease, ${globalStyles.transition.tabBackgroundTransition}`,
353+
transition: theme.tab.transition,
354354
left: '0',
355355
opacity: '1',
356-
width: '100%',
356+
height: '-webkit-fill-available',
357+
width: '-webkit-fill-available',
357358
alignItems: 'center',
358359
justifyContent: 'space-between',
359-
padding: globalStyles.spacing.defaultTabPadding,
360+
padding: 0,
360361
position: 'relative',
361362

362-
// globalStyles.spacing.tabHeight has been set to globalStyles.spacing.tabsToolbarHeight,
363-
// which is 1px extra due to the border-top of .tabsToolbar
364-
height: '-webkit-fill-available',
363+
':hover': {
364+
background: theme.tab.hover.background
365+
}
366+
},
367+
368+
// Windows specific style
369+
tab_forWindows: {
370+
color: theme.tab.forWindows.color
371+
},
372+
373+
tab_active: {
374+
background: theme.tab.active.background,
365375

366376
':hover': {
367-
background: 'linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(250, 250, 250, 0.4))'
377+
background: theme.tab.active.background
368378
}
369379
},
370380

@@ -380,59 +390,56 @@ const styles = StyleSheet.create({
380390
width: globalStyles.spacing.sentinelSize
381391
},
382392

383-
tabId: {
384-
justifyContent: 'center',
393+
tab_audioTopBorder: {
394+
'::before': {
395+
content: `''`,
396+
display: 'block',
397+
position: 'absolute',
398+
top: 0,
399+
left: 0,
400+
right: 0,
401+
height: '2px',
402+
background: 'lightskyblue'
403+
}
404+
},
405+
406+
tab__identity: {
407+
justifyContent: 'flex-start',
385408
alignItems: 'center',
386409
display: 'flex',
387410
flex: '1',
388-
389-
// @see https://bugzilla.mozilla.org/show_bug.cgi?id=1108514#c5
390-
minWidth: '0',
391-
392-
// prevent the icons wrapper from being the target of mouse events.
393-
pointerEvents: 'none'
411+
minWidth: '0', // @see https://bugzilla.mozilla.org/show_bug.cgi?id=1108514#c5
412+
marginLeft: globalStyles.spacing.defaultTabMargin
394413
},
395414

396-
isPinned: {
415+
tab__content_centered: {
416+
justifyContent: 'center',
417+
flex: 'auto',
397418
padding: 0,
398-
width: `calc(${globalStyles.spacing.tabsToolbarHeight} * 1.1)`,
399-
justifyContent: 'center'
419+
margin: 0
400420
},
401421

402-
active: {
403-
background: `rgba(255, 255, 255, 1.0)`,
404-
marginTop: '0',
405-
borderWidth: '0 1px 0 0',
406-
borderStyle: 'solid',
407-
borderColor: '#bbb',
408-
color: '#000',
409-
410-
':hover': {
411-
background: `linear-gradient(to bottom, #fff, ${globalStyles.color.chromePrimary})`
412-
}
422+
tab_pinned: {
423+
padding: 0,
424+
width: '28px',
425+
justifyContent: 'center'
413426
},
414427

415-
activePrivateTab: {
416-
background: globalStyles.color.privateTabBackgroundActive,
428+
tab_active_private: {
429+
background: theme.tab.active.private.background,
430+
color: theme.tab.active.private.color,
417431

418432
':hover': {
419-
background: globalStyles.color.privateTabBackgroundActive
433+
background: theme.tab.active.private.background
420434
}
421435
},
422436

423-
private: {
424-
background: 'rgba(75, 60, 110, 0.2)',
437+
tab_private: {
438+
background: theme.tab.private.background,
425439

426440
':hover': {
427-
background: globalStyles.color.privateTabBackgroundActive
428-
}
429-
},
430-
431-
dragging: {
432-
':hover': {
433-
closeTab: {
434-
opacity: '0'
435-
}
441+
color: theme.tab.active.private.color,
442+
background: theme.tab.active.private.background
436443
}
437444
}
438445
})

less/tabs.less

+9-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
flex: 1;
1111
overflow: auto;
1212
padding: 0;
13-
height: @tabsToolbarHeight;
13+
height: -webkit-fill-available;
1414
position: relative;
1515
white-space: nowrap;
1616
z-index: @zindexTabs;
@@ -59,6 +59,7 @@
5959
position: relative;
6060
vertical-align: top;
6161
overflow: hidden;
62+
height: -webkit-fill-available;
6263
// There's a special case that tabs should span the full width
6364
// if there are a full set of them.
6465
&:not(.partOfFullPageSet) {
@@ -123,14 +124,17 @@
123124
box-sizing: border-box;
124125
background: @tabsBackground;
125126
display: flex;
126-
height: @tabsToolbarHeight;
127+
// This element is set as border-box so it does not
128+
// take into account the borders as width gutter, so we
129+
// increase its size by 1px to include the top border
130+
height: calc(~'@{tabsToolbarHeight} + 1px');
127131
border-top: 1px solid @tabsToolbarBorderColor;
128132
user-select: none;
129133
}
130134

131135
.tabsToolbarButtons {
132136
box-sizing: border-box;
133-
height: @tabHeight;
137+
height: -webkit-fill-available;
134138
padding-right: 5px;
135139

136140
.browserButton {
@@ -222,6 +226,8 @@
222226
}
223227

224228
.pinnedTabs {
229+
height: -webkit-fill-available;
230+
box-sizing: border-box;
225231
margin-left: 0;
226232
margin-top: 0;
227233
background: @tabsBackgroundInactive;

less/window.less

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,5 +174,5 @@ body {
174174
background-color: #000;
175175
}
176176
#windowContainer {
177-
color: #f00;
177+
color: #000;
178178
}

0 commit comments

Comments
 (0)