diff --git a/css/base.css b/css/base.css index 7ae181d..be8b017 100644 --- a/css/base.css +++ b/css/base.css @@ -1321,39 +1321,6 @@ table.fixed { .scroll-styled { overflow:auto; } -.scroll-styled .highlight pre::webkit-scrollbar, -.scroll-styled::-webkit-scrollbar { - width:8px; - height:8px; - border-left:0; - background:rgba(0,0,0,0.1); - } -.scroll-styled .highlight pre::webkit-scrollbar:hover, -.scroll-styled::-webkit-scrollbar:hover { - background:rgba(0,0,0,0.15); - } -.scroll-styled .highlight pre::webkit-scrollbar-track, -.scroll-styled::-webkit-scrollbar-track { - background:none; - } -.scroll-styled .highlight pre::webkit-scrollbar-thumb, -.scroll-styled::-webkit-scrollbar-thumb { - background:rgba(0,0,0,0.1); - border-radius:0; - } - -.dark .scroll-styled::-webkit-scrollbar { - width:8px; - height:8px; - background:rgba(255,255,255,0.1); - border-radius:0; - } -.dark .scroll-styled::-webkit-scrollbar:hover { - background:rgba(255,255,255,0.15); - } -.dark .scroll-styled::-webkit-scrollbar-thumb { - background:rgba(255,255,255,0.1); - } /* Inline Elements: Formatted for read content ------------------------------------------------------- */ diff --git a/css/style.css b/css/style.css index ed05054..97a6939 100644 --- a/css/style.css +++ b/css/style.css @@ -44,30 +44,6 @@ padding: 5px; } -.scroll-styled::-webkit-scrollbar { - width: 6px; - height: 6px; - background: transparent; - } -.scroll-styled::-webkit-scrollbar:hover { - background: transparent; -} -.scroll-styled::-webkit-scrollbar-track { - background:none; - } -.scroll-styled::-webkit-scrollbar-thumb { - background: rgba(0,0,0,.18); - width: 6px; - border:none; - border-radius: 3px; - } -.scroll-styled::-webkit-scrollbar-thumb:hover { - background: rgba(0,0,0,.25); - } -.scroll-styled::-webkit-scrollbar-track:hover { - background: transparent; -} - .dark.keyline-top, .dark.keyline-bottom { border-color: #313131; diff --git a/src/components/app.js b/src/components/app.js index 411edc8..506c36d 100644 --- a/src/components/app.js +++ b/src/components/app.js @@ -5,14 +5,37 @@ import RoundedToggle from './rounded_toggle'; import PureRenderMixin from 'react-pure-render/mixin'; import GithubSlugger from 'github-slugger'; import debounce from 'lodash.debounce'; -import { brandNames, brandClasses } from '../../custom'; +import { brandNames, brandClasses } from '../custom'; import qs from 'querystring'; let slugger = new GithubSlugger(); let slug = title => { slugger.reset(); return slugger.slug(title); }; -let languageOptions = ['cURL', 'CLI', 'Python', 'JavaScript']; -let defaultLanguage = 'cURL'; +let languageOptions = [ + { title: 'cURL', + short: 'cURL', + value: 'curl' }, + { title: 'CLI', + short: 'cli', + value: 'cli' }, + { title: 'Python', + short: 'Python', + value: 'python' }, + { title: 'JavaScript', + short: 'JS', + value: 'javascript' }, + { title: 'Java', + short: 'Java', + value: 'java' }, + { title: 'Objective-C', + short: 'ObjC', + value: 'objc' }, + { title: 'Swift', + short: 'Swift', + value: 'swift' } +]; + +let defaultLanguage = languageOptions[0]; let debouncedReplaceState = debounce(hash => { window.history.replaceState('', '', hash); @@ -30,16 +53,15 @@ var App = React.createClass({ if (process.browser) { let hash = window.location.hash.split('#').pop(); let languageFromURL = qs.parse(window.location.search.substring(1)).language; - let language = languageOptions.includes(languageFromURL) ? - languageFromURL : defaultLanguage; - let mqls = { - desktop: window.matchMedia('(min-width: 961px)'), - tablet: window.matchMedia('(max-width: 960px)'), - mobile: window.matchMedia('(max-width: 640px)') - }; - Object.keys(mqls).forEach(key => { - mqls[key].addListener(this.mediaQueryChanged); - }); + let language = languageOptions.find(option => option.title === languageFromURL) || + defaultLanguage; + let mqls = [ + { name: 'widescreen', query: window.matchMedia('(min-width: 1200px)') }, + { name: 'desktop', query: window.matchMedia('(min-width: 961px)') }, + { name: 'tablet', query: window.matchMedia('(max-width: 960px)') }, + { name: 'mobile', query: window.matchMedia('(max-width: 640px)') } + ]; + mqls.forEach(q => q.query.addListener(this.mediaQueryChanged)); if (hash) { let headingForHash = this.props.ast.children .filter(child => child.type === 'heading') @@ -61,9 +83,7 @@ var App = React.createClass({ }; } else { return { - mqls: { - desktop: true - }, + mqls: { }, queryMatches: { desktop: true }, @@ -78,11 +98,11 @@ var App = React.createClass({ }, componentDidMount() { this.mediaQueryChanged(); - this.onScroll = debounce(this._onScroll, 100); + this.onScroll = debounce(this.onScrollImmediate, 100); document.addEventListener('scroll', this.onScroll); - this._onScroll(); + this.onScrollImmediate(); }, - _onScroll() { + onScrollImmediate() { var sections = document.querySelectorAll('div.section'); if (!sections.length) return; for (var i = 0; i < sections.length; i++) { @@ -97,23 +117,21 @@ var App = React.createClass({ }, mediaQueryChanged() { this.setState({ - queryMatches: { - mobile: this.state.mqls.mobile.matches, - tablet: this.state.mqls.tablet.matches, - desktop: this.state.mqls.desktop.matches - } + queryMatches: this.state.mqls.reduce((memo, q) => { + memo[q.name] = q.query.matches; + return memo; + }, {}) }); }, componentWillUnmount() { - Object.keys(this.state.mqls).forEach(key => - this.state.mqls[key].removeListener(this.mediaQueryChanged)); + this.state.mqls.forEach(q => q.removeListener(this.mediaQueryChanged)); document.body.removeEventListener('scroll', this.onScroll); }, onChangeLanguage(language) { this.setState({ language }, () => { if (window.history) { window.history.pushState(null, null, - `?${qs.stringify({ language })}${window.location.hash}`); + `?${qs.stringify({ language: language.title })}${window.location.hash}`); } }); }, @@ -121,7 +139,7 @@ var App = React.createClass({ if (prevState.activeSection !== this.state.activeSection) { // when the section changes, replace the hash debouncedReplaceState(`#${slug(this.state.activeSection)}`); - } else if (prevState.language !== this.state.language || + } else if (prevState.language.title !== this.state.language.title || prevState.columnMode !== this.state.columnMode) { // when the language changes, use the hash to set scroll window.location.hash = window.location.hash; @@ -141,7 +159,7 @@ var App = React.createClass({ }); }, render() { - let { ast } = this.props; + let ast = JSON.parse(JSON.stringify(this.props.ast)); let { activeSection, queryMatches, showNav, columnMode } = this.state; let col1 = columnMode === 1 && queryMatches.desktop; return (