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

Commit 7c58204

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 633ab0a commit 7c58204

File tree

5 files changed

+96
-71
lines changed

5 files changed

+96
-71
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

+83-65
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* 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')
@@ -200,10 +202,10 @@ class Tab extends React.Component {
200202
this.tabNode.addEventListener('auxclick', this.onAuxClick.bind(this))
201203
}
202204

203-
componentDidUpdate () {
205+
componentDidUpdate (prevProps) {
204206
// if a tab was just pinned, unobserve its intersection
205207
// this gives us some more performance boost
206-
if (this.props.isPinnedTab) {
208+
if (prevProps.isPinnedTab !== this.props.isPinnedTab) {
207209
this.observer.unobserve(this.tabSentinel)
208210
}
209211
}
@@ -234,24 +236,33 @@ class Tab extends React.Component {
234236
mergeProps (state, ownProps) {
235237
const currentWindow = state.get('currentWindow')
236238
const frame = frameStateUtil.getFrameByKey(currentWindow, ownProps.frameKey) || Immutable.Map()
239+
const frameKey = ownProps.frameKey
240+
const tabId = frame.get('tabId', tabState.TAB_ID_NONE)
241+
const isPinned = tabState.isTabPinned(state, tabId)
242+
243+
// TODO: this should have its own method
237244
const notifications = state.get('notifications')
238245
const notificationOrigins = notifications ? notifications.map(bar => bar.get('frameOrigin')) : false
239246
const notificationBarActive = frame.get('location') && notificationOrigins &&
240247
notificationOrigins.includes(UrlUtil.getUrlOrigin(frame.get('location')))
241-
const tabId = frame.get('tabId', tabState.TAB_ID_NONE)
242248

243249
const props = {}
244250
// used in renderer
245251
props.frameKey = ownProps.frameKey
246252
props.isPrivateTab = frame.get('isPrivate')
247253
props.notificationBarActive = notificationBarActive
254+
255+
// used in renderer
256+
props.frameKey = frameKey
257+
props.isPinnedTab = isPinned
258+
props.isPrivateTab = privateState.isPrivateTab(currentWindow, frameKey)
248259
props.isActive = frameStateUtil.isFrameKeyActive(currentWindow, props.frameKey)
249260
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)
261+
props.themeColor = tabUIState.getThemeColor(currentWindow, frameKey)
253262
props.title = frame.get('title')
254263
props.partOfFullPageSet = ownProps.partOfFullPageSet
264+
props.showAudioTopBorder = audioState.showAudioTopBorder(currentWindow, frameKey, isPinned)
265+
props.centralizeTabIcons = tabUIState.centralizeTabIcons(currentWindow, frameKey, isPinned)
255266

256267
// used in other functions
257268
props.totalTabs = state.get('tabs').size
@@ -265,7 +276,7 @@ class Tab extends React.Component {
265276
render () {
266277
// we don't want themeColor if tab is private
267278
const perPageStyles = !this.props.isPrivateTab && StyleSheet.create({
268-
themeColor: {
279+
tab_themeColor: {
269280
color: this.props.themeColor ? getTextColorForBackground(this.props.themeColor) : 'inherit',
270281
background: this.props.themeColor ? this.props.themeColor : 'inherit',
271282
':hover': {
@@ -301,13 +312,15 @@ class Tab extends React.Component {
301312
className={css(
302313
styles.tab,
303314
// 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,
315+
isWindows && styles.tab_forWindows,
316+
this.props.isPinnedTab && styles.tab_pinned,
317+
this.props.isActive && styles.tab_active,
318+
this.props.showAudioTopBorder && styles.tab_audioTopBorder,
319+
this.props.isActive && this.props.themeColor && perPageStyles.tab_themeColor,
308320
// Private color should override themeColor
309-
this.props.isPrivateTab && styles.private,
310-
this.props.isActive && this.props.isPrivateTab && styles.activePrivateTab
321+
this.props.isPrivateTab && styles.tab_private,
322+
this.props.isActive && this.props.isPrivateTab && styles.tab_active_private,
323+
this.props.centralizeTabIcons && styles.tab__content_centered
311324
)}
312325
data-test-id='tab'
313326
data-frame-key={this.props.frameKey}
@@ -323,7 +336,10 @@ class Tab extends React.Component {
323336
ref={(node) => { this.tabSentinel = node }}
324337
className={css(styles.tab__sentinel)}
325338
/>
326-
<div className={css(styles.tabId)}>
339+
<div className={css(
340+
styles.tab__identity,
341+
this.props.centralizeTabIcons && styles.tab__content_centered
342+
)}>
327343
<Favicon tabId={this.props.tabId} />
328344
<AudioTabIcon tabId={this.props.tabId} />
329345
<TabTitle tabId={this.props.tabId} />
@@ -337,34 +353,39 @@ class Tab extends React.Component {
337353
}
338354

339355
const styles = StyleSheet.create({
340-
// Windows specific style
341-
tabForWindows: {
342-
color: '#555'
343-
},
344-
345356
tab: {
346357
borderWidth: '0 1px 0 0',
347358
borderStyle: 'solid',
348359
borderColor: '#bbb',
349360
boxSizing: 'border-box',
350-
color: '#5a5a5a',
361+
color: theme.tab.color,
351362
display: 'flex',
352363
marginTop: '0',
353-
transition: `transform 200ms ease, ${globalStyles.transition.tabBackgroundTransition}`,
364+
transition: theme.tab.transition,
354365
left: '0',
355366
opacity: '1',
356-
width: '100%',
367+
height: '-webkit-fill-available',
368+
width: '-webkit-fill-available',
357369
alignItems: 'center',
358370
justifyContent: 'space-between',
359-
padding: globalStyles.spacing.defaultTabPadding,
371+
padding: 0,
360372
position: 'relative',
361373

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',
374+
':hover': {
375+
background: theme.tab.hover.background
376+
}
377+
},
378+
379+
// Windows specific style
380+
tab_forWindows: {
381+
color: theme.tab.forWindows.color
382+
},
383+
384+
tab_active: {
385+
background: theme.tab.active.background,
365386

366387
':hover': {
367-
background: 'linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(250, 250, 250, 0.4))'
388+
background: theme.tab.active.background
368389
}
369390
},
370391

@@ -380,59 +401,56 @@ const styles = StyleSheet.create({
380401
width: globalStyles.spacing.sentinelSize
381402
},
382403

383-
tabId: {
384-
justifyContent: 'center',
404+
tab_audioTopBorder: {
405+
'::before': {
406+
content: `''`,
407+
display: 'block',
408+
position: 'absolute',
409+
top: 0,
410+
left: 0,
411+
right: 0,
412+
height: '2px',
413+
background: 'lightskyblue'
414+
}
415+
},
416+
417+
tab__identity: {
418+
justifyContent: 'flex-start',
385419
alignItems: 'center',
386420
display: 'flex',
387421
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'
422+
minWidth: '0', // @see https://bugzilla.mozilla.org/show_bug.cgi?id=1108514#c5
423+
marginLeft: globalStyles.spacing.defaultTabMargin
394424
},
395425

396-
isPinned: {
426+
tab__content_centered: {
427+
justifyContent: 'center',
428+
flex: 'auto',
397429
padding: 0,
398-
width: `calc(${globalStyles.spacing.tabsToolbarHeight} * 1.1)`,
399-
justifyContent: 'center'
430+
margin: 0
400431
},
401432

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-
}
433+
tab_pinned: {
434+
padding: 0,
435+
width: '28px',
436+
justifyContent: 'center'
413437
},
414438

415-
activePrivateTab: {
416-
background: globalStyles.color.privateTabBackgroundActive,
439+
tab_active_private: {
440+
background: theme.tab.active.private.background,
441+
color: theme.tab.active.private.color,
417442

418443
':hover': {
419-
background: globalStyles.color.privateTabBackgroundActive
444+
background: theme.tab.active.private.background
420445
}
421446
},
422447

423-
private: {
424-
background: 'rgba(75, 60, 110, 0.2)',
448+
tab_private: {
449+
background: theme.tab.private.background,
425450

426451
':hover': {
427-
background: globalStyles.color.privateTabBackgroundActive
428-
}
429-
},
430-
431-
dragging: {
432-
':hover': {
433-
closeTab: {
434-
opacity: '0'
435-
}
452+
color: theme.tab.active.private.color,
453+
background: theme.tab.active.private.background
436454
}
437455
}
438456
})

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)