From d8a05e2cc0a2802dcc7e40d6ca423f47a1fb2a3d Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Sun, 24 Jul 2016 15:55:14 -0400 Subject: [PATCH 01/11] Reorganize css to be processed by webpack --- package.json | 8 + public/index.css | 250 ---------------------- public/index.html | 3 - public/test.gif | Bin 143388 -> 0 bytes src/app/component/board-settings.js | 10 +- src/app/component/gerber-input.js | 4 +- src/app/component/gerber-output.js | 6 +- src/app/component/gerber-settings.js | 20 +- src/{ => app/component}/input/checkbox.js | 4 +- src/{ => app/component}/input/select.js | 13 +- src/app/component/main.js | 6 +- src/app/component/nav.js | 6 +- src/app/component/pan-zoom-controls.js | 12 +- src/app/component/view-select.js | 4 +- src/app/style.css | 45 ++++ src/index.css | 136 ++++++++++++ src/index.js | 6 +- src/layer/component.js | 2 +- src/layer/style.css | 5 + webpack.config.js | 18 +- 20 files changed, 260 insertions(+), 298 deletions(-) delete mode 100644 public/index.css delete mode 100644 public/test.gif rename src/{ => app/component}/input/checkbox.js (76%) rename src/{ => app/component}/input/select.js (61%) create mode 100644 src/app/style.css create mode 100644 src/index.css create mode 100644 src/layer/style.css diff --git a/package.json b/package.json index a6eea5e..4921434 100644 --- a/package.json +++ b/package.json @@ -34,11 +34,17 @@ "babel-core": "^6.11.4", "babel-loader": "^6.2.4", "babel-preset-es2040": "^1.1.1", + "css-loader": "^0.23.1", "eslint": "^2.9.0", "express": "^4.13.4", + "extract-text-webpack-plugin": "^1.0.1", "jsdom": "^9.4.1", "nyc": "^7.0.0", + "postcss-cssnext": "^2.7.0", + "postcss-import": "^8.1.2", + "postcss-loader": "^0.9.1", "sinon": "^1.17.4", + "style-loader": "^0.13.1", "webpack": "^1.13.0", "webpack-dev-middleware": "^1.6.1", "webpack-hot-middleware": "^2.10.0", @@ -63,6 +69,8 @@ "redux-throttle": "^0.1.1", "reselect": "^2.5.1", "shortid": "^2.2.6", + "tachyons": "^4.0.4", + "tachyons-z-index": "^1.0.0", "viewbox": "^1.0.0", "whats-that-gerber": "^2.0.1" } diff --git a/public/index.css b/public/index.css deleted file mode 100644 index b913eda..0000000 --- a/public/index.css +++ /dev/null @@ -1,250 +0,0 @@ -body { - font-family: 'Open Sans', Helvetica, sans-serif; -} - -.brand { - color: #3cc; -} - -.brand-2 { - color: #2D3142; -} - -.accent { - color: #BFC0C0; -} - -.accent:hover { - color: #BFC0C0; -} - -.bg-brand { - background-color: #3cc; -} - -.bg-brand-2 { - background-color: #2D3142; -} - -.bg-accent { - background-color: #BFC0C0; -} - -.bg-accent-hover:hover { - background-color: #BFC0C0; -} - -.bg-link { - transition: background-color .15s ease-in; -} - -.bg-app { - background-color: #C9DAEA; -} - -.striped--brand-light:nth-child(odd) { - background-color: rgba(51, 204, 204, 0.1); -} - -.inherit-color { - color: inherit; -} - -.z-1 { - z-index: 1; -} - -.z-back { - z-index: -1; -} - -.center-vertical { - top: 50%; - transform: translateY(-50%); -} - -.transform-center { - transform: translate(-50%, -50%); -} - -.smooth-transform { - transition: transform 100ms; -} - -.left-50 { - left: 50%; -} - -.top-50 { - top: 50%; -} - - -.btn[disabled], -.btn.disabled { - backgound-color: grey; - cursor: default; -} - -.layer-opacity { - opacity: 0.5; -} - -.fx { - display: flex; -} - -.fx-0-0 { - flex: 0 0 auto; -} - -.fx-1-1 { - flex: 1 1 auto; -} - -.fx-b-3 { - flex-basis: calc(100% / 3); -} - -.fx-jc-sa { - justify-content: space-around; -} - -.fx-jc-sb { - justify-content: space-between; -} - -.fx-ai-c { - align-items: center; -} - -.fx-d-c { - flex-direction: column; -} - -.fx-wrap { - flex-wrap: wrap; -} - -.mr-auto { - margin-right: auto; -} - -.mt3-past-h3 { - margin-top: 5rem; -} - -.app-ht { - height: calc(100% - 6rem); -} - -.max-app-ht { - max-height: calc(100% - 6rem); -} - -.max-h5 { - max-height: 16rem; -} - -.collapsible { - transition: max-height 0.3s linear; - overflow: hidden; -} - -.is-collapsed { - max-height: 0; -} - -.h0 { - height: 0 -} - -.h-15 { - height: 15%; -} - -.h-1-3 { - height: calc(100% / 3); -} - -.w0 { - width: 0; -} - -.w-5 { - width: 5%; -} - -.w-47-5 { - width: 47.5%; -} - -.w-1-3 { - width: calc(100% / 3); -} - -.grab { - cursor: move; - cursor: grab; - cursor: -moz-grab; - cursor: -webkit-grab; -} - -.grab:active { - cursor: grabbing; - cursor: -moz-grabbing; - cursor: -webkit-grabbing; -} - -.m-auto { - margin: auto; -} - -.mh-auto { - margin-left: auto; - margin-right: auto; -} - -.mb-1-3 { - margin-bottom: 0.5rem; -} - -.triangle-up { - border-top: 0; - border-left: 0.5rem solid transparent; - border-right: 0.5rem solid transparent; - border-bottom: 1rem solid; -} - -.triangle-right { - border-top: 0.5rem solid transparent; - border-left: 1rem solid; - border-right: 0; - border-bottom: 0.5rem solid transparent; -} - -.triangle-down { - border-top: 1rem solid; - border-left: 0.5rem solid transparent; - border-right: 0.5rem solid transparent; - border-bottom: 0; -} - -.triangle-left { - border-top: 0.5rem solid transparent; - border-left: 0; - border-right: 1rem solid; - border-bottom: 0.5rem solid transparent; -} - -.click-thru { - pointer-events: none; -} - -.clickable { - pointer-events: auto; -} - -.aspect-ratio--1x1 { - padding-bottom: 100%; -} diff --git a/public/index.html b/public/index.html index c4a0e3a..cdf543f 100644 --- a/public/index.html +++ b/public/index.html @@ -4,9 +4,6 @@ tracespace | viewer - - - diff --git a/public/test.gif b/public/test.gif deleted file mode 100644 index 18909edd11304c5702dfc39482d0fe58b17a4062..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143388 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ΠY~syzNTh2$&>6yvyDutt(97w6-z1YW@m7k$ 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

-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­~|MtFuqH{7kZPlKfQqt*{sAHN!#bK|}k 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 { return {value: type, title: getFullName(type)} @@ -29,10 +29,10 @@ const PlacesSelect = { } }) - return h('div', {class: 'ph2 striped--brand-light'}, [ - h('span', {class: 'fw9'}, [ - 'coordinate places', - h('span', {class: 'fa fa-angle-right mh1'}) + return h('div', {class: 'flex items-center ph2 striped--brand-light'}, [ + h('span', {class: 'flex items-center w-50 cf fw6'}, [ + h('span', {class: 'mr-auto'}, ['coordinate places']), + h('span', {class: 'fa fa-angle-right mh2'}) ]), numberInput('places[0]', places[0]), h('span', {class: 'fw9 mh2'}, ['.']), @@ -123,7 +123,7 @@ const ColorPicker = { const {color, onChange} = props return h('label', { - class: 'h2 w2 fx-0-0 btn pointer', + class: 'h2 w2 flex-none btn pointer', style: `background-color: ${color}` }, [ h('input', {onChange, id: path, type: 'color', value: color, class: 'clip'}) @@ -156,14 +156,14 @@ module.exports = function renderLayerDetailsItem({props}) { const settingsClass = classnames('collapsible', { 'is-collapsed': !showSettings, - 'max-h5': showSettings + 'mxht5': showSettings }) return h('li', {class: 'pv1'}, [ - h('div', {class: 'ph2 fx fx-ai-c ma0'}, [ + h('div', {class: 'ph2 flex items-center ma0'}, [ h(ColorPicker, {color, onChange: setColor}), h('span', {class: 'ml2 mr-auto'}, [ - h('p', {class: 'lh-title ma0 f6 b'}, [name]), + h('p', {class: 'lh-title ma0 f6 fw6'}, [name]), h('p', {class: 'lh-title ma0 f6'}, [filename]) ]), h('button', {class: btnClass, disabled: btnDisabled, onClick: toggleSettings}, [ diff --git a/src/input/checkbox.js b/src/app/component/input/checkbox.js similarity index 76% rename from src/input/checkbox.js rename to src/app/component/input/checkbox.js index 374879d..d8cd4db 100644 --- a/src/input/checkbox.js +++ b/src/app/component/input/checkbox.js @@ -7,8 +7,8 @@ module.exports = function renderCheckbox({props, path}) { const {name, checked, onChange} = props const handleChange = (event) => onChange(event.target.checked) - return h('label', {class: 'ph2 pointer db'}, [ + return h('label', {class: 'db ph2 lh-title pointer'}, [ h('input', {id: path, type: 'checkbox', checked, onChange: handleChange}), - h('span', {class: 'ml2 b'}, [name]) + h('span', {class: 'ml2 fw6'}, [name]) ]) } diff --git a/src/input/select.js b/src/app/component/input/select.js similarity index 61% rename from src/input/select.js rename to src/app/component/input/select.js index 4b68853..68f7528 100644 --- a/src/input/select.js +++ b/src/app/component/input/select.js @@ -15,18 +15,21 @@ module.exports = function renderSelect({props, path}) { const children = options.map((option) => { const optionProps = Object.assign({}, option, { - selected: option.value === value + selected: option.value === value, + class: 'normal' }) return h(Option, optionProps) }) - return h('label', {style, class: 'db ph2 pointer'}, [ - h('span', {class: 'b'}, [name]), - h('span', {class: 'fa fa-angle-right mh1'}), + return h('label', {style, class: 'flex items-center ph2 lh-title pointer'}, [ + h('span', {class: 'flex items-center w-50 fw6'}, [ + h('span', {class: 'mr-auto'}, [name]), + h('span', {class: 'fa fa-angle-right mh2'}) + ]), h('select', { id: path, - class: 'input-reset inherit-color bn bg-transparent pointe', + class: 'flex-none input-reset inherit-color bn bg-transparent pointer', onChange: handleChange }, children) ]) diff --git a/src/app/component/main.js b/src/app/component/main.js index 1adac3f..f2a7c61 100644 --- a/src/app/component/main.js +++ b/src/app/component/main.js @@ -138,7 +138,9 @@ module.exports = function renderMain({dispatch, context}) { return h('div', {class: 'h-100 '}, [ h(Nav, {}), - h('div', {class: 'w-25 mh3 mt3-past-h3 fixed right-0 max-app-ht z-1 fx fx-d-c'}, [ + h('div', { + class: 'fixed right-0 w-25 app-max-ht mh3 app-mt3-past-nav z-1 flex flex-column' + }, [ h(ViewSelect, {view: selectedView, switchView: switchView(dispatch)}), h(GerberOutput, { layers, @@ -161,7 +163,7 @@ module.exports = function renderMain({dispatch, context}) { h(GerberInput, {addGerber: addGerber(dispatch)}) ]), - h('div', {class: 'relative w-100 h-100 overflow-hidden bg-black-10'}, [ + h('div', {class: 'relative w-100 h-100 overflow-hidden app-bg'}, [ h(View, { view: selectedView, panZoom: selectedPanZoom, diff --git a/src/app/component/nav.js b/src/app/component/nav.js index 399fd13..a037bbd 100644 --- a/src/app/component/nav.js +++ b/src/app/component/nav.js @@ -5,15 +5,15 @@ const {h} = require('deku') module.exports = function renderTopNav() { return h('header', { - class: 'mb3 w-100 bg-white-90 brand-2 fx fx-ai-c fixed z-1' + class: 'mb3 w-100 bg-white-90 app-dark flex items-center fixed z-1' }, [ h('img', {src: '/logo.svg', class: 'h3 w3 pa2 border-box'}), h('span', {class: 'mr-auto'}, [ h('span', {class: 'f4 v-base'}, ['tracespace | ']), - h('span', {class: 'f4 fw2 v-base'}, ['viewer']) + h('span', {class: 'f4 fw3 v-base'}, ['viewer']) ]), h('nav', {class: 'fr lh-copy f4'}, [ - h('a', {href: '#', class: 'border-box pa3 no-underline link brand-2 dim'}, ['about']) + h('a', {href: '#', class: 'border-box pa3 no-underline link app-dark dim'}, ['about']) ]) ]) } diff --git a/src/app/component/pan-zoom-controls.js b/src/app/component/pan-zoom-controls.js index c9b8b4c..f6ab42d 100644 --- a/src/app/component/pan-zoom-controls.js +++ b/src/app/component/pan-zoom-controls.js @@ -37,7 +37,7 @@ const PanButton = { render({props}) { const {direction, onClick} = props const icon = PAN_BUTTON_ICONS[direction] - const className = 'dib bn btn pointer bg-transparent pa0 clickable w-1-3 h-100' + const className = 'dib bn btn pointer bg-transparent pa0 click w-1-3 h-100' return h('button', { class: className, @@ -49,7 +49,7 @@ const PanButton = { stroke: 'currentColor', 'stroke-linecap': 'square', 'stroke-width': 30, - class: 'w-100 h-100 brand-2 dim link' + class: 'w-100 h-100 app-dark dim link' }, icon) ]) } @@ -100,7 +100,7 @@ const ZoomBar = { return h('div', { onMouseDown: handleMouseEvent, onMouseMove: handleMouseEvent, - class: 'w-50 h-100 m-auto bg-white-90 clickable pointer grab' + class: 'w-50 h-100 m-auto bg-white-90 click pointer grab' }) } } @@ -121,10 +121,10 @@ const ZoomControl = { } } - return h('div', {class: 'w-100 h-100 relative'}, [ + return h('div', {class: 'w-100 h-100 relative dim-child'}, [ h(ZoomBar, {handleMouseEvent}), h('span', { - class: 'absolute w-100 border-box h1 left-0 bg-brand-2 dim ba b--white-80 grab', + class: 'absolute w-100 border-box h1 left-0 app-bg-dark dim ba b--white-80 child', style: `top: calc(${top}% - 0.5rem);`, role: 'slider', tabindex: 0, @@ -142,7 +142,7 @@ module.exports = function renderPanZoomControls({props}) { const {panZoom, handleFit, handleDiscretePan, handleZoomTo} = props return h('div', { - class: 'w-5 mh3 mt3-past-h3 fixed left-0 z-1 click-thru' + class: 'w-5 mh3 app-mt3-past-nav fixed left-0 z-1 click-none' }, [ h('div', {class: 'mb3'}, [ h(PanControl, {handleFit, handleDiscretePan}) diff --git a/src/app/component/view-select.js b/src/app/component/view-select.js index 84829f7..0073cb1 100644 --- a/src/app/component/view-select.js +++ b/src/app/component/view-select.js @@ -7,7 +7,7 @@ const classnames = require('classnames') const renderViewSelectButton = function({props}) { const {name, view, switchView} = props const isSelected = name === view - const classNames = classnames('btn dib w-50 f5 link brand-2 tc pv1', { + const classNames = classnames('btn dib w-50 f5 link app-dark tc pv1', { 'bg-black-20': !isSelected, dim: !isSelected, disabled: isSelected @@ -23,7 +23,7 @@ const renderViewSelectButton = function({props}) { module.exports = function renderViewSelect({props}) { const {view, switchView} = props - return h('div', {class: 'bg-white-90 clickable'}, [ + return h('div', {class: 'bg-white-90 click'}, [ h(renderViewSelectButton, {name: 'layers', view, switchView}), h(renderViewSelectButton, {name: 'board', view, switchView}) ]) diff --git a/src/app/style.css b/src/app/style.css new file mode 100644 index 0000000..bc6fbde --- /dev/null +++ b/src/app/style.css @@ -0,0 +1,45 @@ +/* app specific style */ + +:root { + --background-color: #ddd; + --brand-color: #3cc; + --dark-color: #333; + --accent-color: #F18F01; +} + +/* app window height minus nav-bar and margins */ +.app-ht { + height: calc(100% - 6rem); +} + +.app-max-ht { + max-height: calc(100% - 6rem); +} + +/* margin past the nav */ + +.app-mt3-past-nav { + margin-top: 5rem; +} + +/* app colors */ + +.app-bg { + background-color: var(--background-color); +} + +.app-brand { + color: var(--brand-color); +} + +.app-bg-brand { + background-color: var(--brand-color); +} + +.app-dark { + color: var(--dark-color); +} + +.app-bg-dark { + background-color: var(--dark-color); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..3058884 --- /dev/null +++ b/src/index.css @@ -0,0 +1,136 @@ +/* css entry point */ + +/* google fonts */ + +@import 'https://fonts.googleapis.com/css?family=Open+Sans:300,400,600'; + +/* tachyons for base css */ + +@import 'tachyons'; +@import 'tachyons-z-index'; + +/* application modules */ + +@import './app/style'; +@import './layer/style'; + +/* normalizations */ + +body { + font-family: 'Open Sans', Helvetica, sans-serif; +} + +button[disabled], +.disabled { + opacity: 0.75; + cursor: default; + pointer-events: none; +} + +/* cursors */ + +.grab { + cursor: move; + cursor: grab; + cursor: -moz-grab; + cursor: -webkit-grab; +} + +.grab:active { + cursor: grabbing; + cursor: -moz-grabbing; + cursor: -webkit-grabbing; +} + +/* pointer events */ + +.click { + pointer-events: auto; +} + +.click-none { + pointer-events: none; +} + +/* positioning */ + +.transform-center { + transform: translate(-50%, -50%); +} + +.left-50 { + left: 50%; +} + +.top-50 { + top: 50%; +} + +/* sizing */ + +.h-1-3 { + height: calc(100% / 3); +} + +.w-5 { + width: 5%; +} + +.w-47-5 { + width: 47.5%; +} + +.w-1-3 { + width: calc(100% / 3); +} + +.mxht5 { + max-height: 16rem; +} + +.is-collapsed { + max-height: 0; +} + +.collapsible { + transition: max-height 0.3s linear; + overflow: hidden; +} + +.aspect-ratio--1x1 { + padding-bottom: 100%; +} + +/* spacing */ + +.m-auto { + margin: auto; +} + +.mh-auto { + margin-left: auto; + margin-right: auto; +} + +.mr-auto { + margin-right: auto; +} + +/* colors */ + +.inherit-color { + color: inherit; +} + +.dim-child .child { + opacity: 1; transition: opacity .15s ease-in; +} + +.dim-child:hover .child, +.dim-child:focus .child { + opacity: .5; transition: opacity .15s ease-in; +} + +.dim-child:active .child { + opacity: .8; transition: opacity .15s ease-out; +} diff --git a/src/index.js b/src/index.js index 8fa9321..b8c5a13 100644 --- a/src/index.js +++ b/src/index.js @@ -1,4 +1,4 @@ -// tracespace viewer +// tracespace viewer entry point 'use strict' const {createStore, combineReducers, applyMiddleware, compose} = require('redux') @@ -8,12 +8,16 @@ const throttle = require('redux-throttle') const {responsiveStoreEnhancer, responsiveStateReducer} = require('redux-responsive') const raf = require('raf') +// load application const appReducer = require('./app/reducer') const boardReducer = require('./board/reducer') const layerReducer = require('./layer/reducer') const layerMiddleware = require('./layer/middleware') const converter = require('./converter') +// load css +require('./index.css') + const reducer = combineReducers({ browser: responsiveStateReducer, [appReducer.NAME]: appReducer, diff --git a/src/layer/component.js b/src/layer/component.js index 842f396..16a79ed 100644 --- a/src/layer/component.js +++ b/src/layer/component.js @@ -59,7 +59,7 @@ const component = module.exports = { : 0 return h('div', { - class: 'relative w-100 h0', + class: 'w-100 aspect-ratio', style: `padding-bottom: ${padding}` }, [ renderLayer(model, {id: path, class: 'absolute'}, h, false) diff --git a/src/layer/style.css b/src/layer/style.css new file mode 100644 index 0000000..c0870c3 --- /dev/null +++ b/src/layer/style.css @@ -0,0 +1,5 @@ +/* layer module specific styles */ + +.layer-opacity { + opacity: 0.5; +} diff --git a/webpack.config.js b/webpack.config.js index cc231da..b196dab 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,6 +2,14 @@ const webpack = require('webpack') const path = require('path') +// const ExtractTextPlugin = require('extract-text-webpack-plugin') + +// postcss plugins +const postcssImport = require('postcss-import') +const cssnext = require('postcss-cssnext') + +const FILENAME = 'bundle.js' +// const CSS_FILENAME = 'bundle.css' module.exports = { devtool: '#source-map', @@ -11,7 +19,7 @@ module.exports = { ], output: { path: path.join(__dirname, 'public'), - filename: 'bundle.js', + filename: FILENAME, library: 'app', publicPath: '/' }, @@ -40,8 +48,12 @@ module.exports = { }, { test: /\.css$/, - loader: 'style-loader!css-loader' + loader: 'style-loader!css-loader!postcss-loader' } ] - } + }, + postcss: (wpContext) => [ + postcssImport({addDependencyTo: wpContext}), + cssnext + ] } From cf50411d9830e42c7043045bdc29f07d5bfbd9cf Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Sun, 24 Jul 2016 18:12:37 -0400 Subject: [PATCH 02/11] Adjust README to reflect reality and add about modal --- README.md | 30 ++++++++++++++------------ package.json | 1 + src/app/action.js | 5 +++++ src/app/component/gerber-input.js | 2 +- src/app/component/gerber-settings.js | 8 +++---- src/app/component/main.js | 14 ++++++++++-- src/app/component/nav.js | 17 +++++++++++++-- src/app/component/pan-zoom-controls.js | 2 +- src/app/component/view-select.js | 2 +- src/app/reducer.js | 25 +++++++++++++-------- src/app/selector.js | 11 ++-------- src/index.css | 24 +++++++++++++++++---- test/app/app-action_test.js | 8 +++++++ test/app/app-reducer_test.js | 14 ++++++++++++ test/app/app-selector_test.js | 9 ++++---- test/layer/layer-component_test.js | 2 +- webpack.config.js | 4 ++++ 17 files changed, 126 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index 0130491..948af46 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,47 @@ -# tracespace pcb viewer +# tracespace viewer (beta) +[![GitHub stars](https://img.shields.io/github/stars/tracespace/viewer.svg?style=social&label=Star&maxAge=2592000?style=flat-square)](https://github.com/tracespace/viewer) +[![GitHub issues](https://img.shields.io/github/issues/tracespace/viewer.svg?maxAge=2592000?style=flat-square)](https://github.com/tracespace/viewer/issues) [![Travis](https://img.shields.io/travis/tracespace/viewer.svg?style=flat-square)](https://travis-ci.org/tracespace/viewer) [![Coveralls](https://img.shields.io/coveralls/tracespace/viewer.svg?style=flat-square)](https://coveralls.io/github/tracespace/viewer) [![David](https://img.shields.io/david/tracespace/viewer.svg?style=flat-square)](https://david-dm.org/tracespace/viewer) [![David devDependences](https://img.shields.io/david/dev/tracespace/viewer.svg?style=flat-square)](https://david-dm.org/tracespace/viewer#info=devDependencies) -[![GitHub stars](https://img.shields.io/github/stars/tracespace/viewer.svg?style=social&label=Star&maxAge=2592000?style=flat-square)](https://github.com/tracespace/viewer) +Probably the best printed circuit board viewer on the internet -[http://viewer.tracespace.io](viewer.tracespace.io) + -Probably the best printed circuit board viewer on the internet. + ## about -This particular PCB viewer takes your gerber and drill files and gives you individual layer renders as well as very fancy renders of what your completed boards are going to look like. It does this all locally using the [gerber-to-svg](https://github.com/mcous/gerber-to-svg) module, so nothing gets sent to any server. Also, because the renders are SVGs, they're super easy to save and show off. +This particular PCB viewer takes your Gerber and drill files and gives you individual layer renders as well as very fancy renders of what your completed boards are going to look like. -Using awesome new web technologies, the tracespace viewer also works offline and saves your renders locally. Pretty cool. +The tracespace viewer accomplishes all this locally (nothing gets sent to any server!) by converting your files to SVGs. Thanks to the "Scalable" and "Vector" in "SVG", the renders are easy to examine and quite accurate. ## motivation -Because you should always check your design files for problems! Existing Gerber viewers are good, but tend not to give you a full picture of what your board will look like, meaning you can miss important details (shout out to [OSH Park](https://oshpark.com) for super cool renders by default). Gerber files (i.e. your PCB manufacturing files) are vector image files, so it makes sense to convert them into a web-friendly vector format. And an offline-enabled web-app means you don't have to worry about downloading or updating any software, and you'll still always have your the viewer available. +Because you should always check your design files for problems! Existing Gerber viewers are good, but tend not to give you a full picture of what your board will look like, meaning you can miss important details (shout out to [OSH Park](https://oshpark.com) for super cool renders by default). Gerber files (i.e. your PCB manufacturing files) are vector image files, so it makes sense to convert them into a scalable, web-friendly vector format. ## issues -See something that doesn't look right? [Open an issue!](https://github.com/tracespace/viewer/issues) Screenshots and Gerber files help if you're able to. If you're not comfortable publicly posting your designs, you can also email viewer@tracespace.io with your issue. +See something that doesn't look right? [Open an issue!](https://github.com/tracespace/viewer/issues) Screenshots and Gerber files help if you're able to. If you're not comfortable publicly posting your designs, you can also email with your issue. If you're technically inclined, PR's are always welcome! ## contributing -This site is written in ES2015 and uses [babel](https://babeljs.io/) and [webpack](http://webpack.github.io/) to run in your browser. The state layer is build using [redux](http://rackt.github.io/redux/) and the view layer is built with [deku](http://dekujs.github.io/deku/index.html). Rendering is accomplished with [web workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API), [gerber-to-svg](https://github.com/mcous/gerber-to-svg), and the [tracespace pcb stackup builder](https://github.com/tracespace/pcb-stackup). Local data is stored in [indexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API). +This site is written in [ES2040](https://github.com/ahdinosaur/es2040) and uses [babel](https://babeljs.io/) and [webpack](http://webpack.github.io/) to build for the browser. The state layer is build using [redux](http://rackt.github.io/redux/) and the view layer is built with [deku](https://github.com/anthonyshort/deku). Rendering is accomplished with [web workers](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API), [gerber-to-svg](https://github.com/mcous/gerber-to-svg), and the [tracespace pcb stackup builder](https://github.com/tracespace/pcb-stackup-core). + +Tests are run with [ava](https://github.com/avajs/ava) and code is linted with [eslint](http://eslint.org/). Please make sure any PRs are accompanied by unit tests. We use [travis](https://travis-ci.org/) as our CI server. -Tests are run with [mocha](http://mochajs.org/) and code is linted with [eslint](http://eslint.org/). Please make sure any PRs are accompanied by unit tests. We use [travis](https://travis-ci.org/) as our CI server and run browser tests with [sauce labs](https://saucelabs.com/opensauce/) and [zuul](https://github.com/defunctzombie/zuul). +This app is hosted on [GitHub Pages](https://pages.github.com/). ### build scripts -Nothing fancy here, just npm scripts. See [package.json](package.json) for the full list. These are the important ones: +Nothing fancy here, just npm scripts. See [package.json](https://github.com/tracespace/viewer/blob/master/package.json) for the full list. These are the important ones: * `$ npm start` - starts an HMR dev server at [localhost:8080](http://localhost:8080) * `$ npm test` - run tests * `$ npm run test:watch` - run tests on code changes -* `$ npm run test:browser` - run tests locally in a browser of your choosing -* `$ npm run test:sauce` - run the tests on sauce (sauce credentials in [.zuulrc](https://github.com/defunctzombie/zuul/wiki/Zuulrc) required) -* `$ npm run deploy` - builds and deploys the site (credentials required) +* `$ npm run deploy` - builds and deploys the site to GitHub pages (credentials required) diff --git a/package.json b/package.json index 4921434..3296809 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "express": "^4.13.4", "extract-text-webpack-plugin": "^1.0.1", "jsdom": "^9.4.1", + "markdown-loader": "^0.1.7", "nyc": "^7.0.0", "postcss-cssnext": "^2.7.0", "postcss-import": "^8.1.2", diff --git a/src/app/action.js b/src/app/action.js index 3cf1b36..cb6926c 100644 --- a/src/app/action.js +++ b/src/app/action.js @@ -11,6 +11,7 @@ const action = module.exports = { DISCRETE_PAN: 'app:DISCRETE_PAN', ZOOM_TO: 'app:ZOOM_TO', TOGGLE_LAYER_SETTINGS: 'app:TOGGLE_LAYER_SETTINGS', + OPEN_ABOUT: 'app:OPEN_ABOUT', switchView(view) { return {type: action.SWITCH_VIEW, view} @@ -46,5 +47,9 @@ const action = module.exports = { toggleLayerSettings(id) { return {type: action.TOGGLE_LAYER_SETTINGS, id} + }, + + openAbout(open) { + return {type: action.OPEN_ABOUT, open} } } diff --git a/src/app/component/gerber-input.js b/src/app/component/gerber-input.js index 01be4be..5c87a89 100644 --- a/src/app/component/gerber-input.js +++ b/src/app/component/gerber-input.js @@ -15,7 +15,7 @@ module.exports = function renderGerberInput({props, path}) { h('label', { for: path, - class: 'pointer btn db w-auto tc border-box f3 dim app-bg-brand near-white' + class: 'pointer db w-auto tc border-box f3 dim app-bg-brand near-white' }, ['+']) ]) } diff --git a/src/app/component/gerber-settings.js b/src/app/component/gerber-settings.js index f4fb426..ef83ce7 100644 --- a/src/app/component/gerber-settings.js +++ b/src/app/component/gerber-settings.js @@ -123,7 +123,7 @@ const ColorPicker = { const {color, onChange} = props return h('label', { - class: 'h2 w2 flex-none btn pointer', + class: 'h2 w2 flex-none pointer', style: `background-color: ${color}` }, [ h('input', {onChange, id: path, type: 'color', value: color, class: 'clip'}) @@ -146,7 +146,7 @@ module.exports = function renderLayerDetailsItem({props}) { const {filename, color, layerType, isVisible, isRendering} = layer const name = getFullName(layerType) - const btnClass = 'pointer btn bn bg-transparent dim' + const btnClass = 'pointer bn bg-transparent dim' const btnDisabled = isRendering const visibilityIcon = classnames('fa', { @@ -154,8 +154,8 @@ module.exports = function renderLayerDetailsItem({props}) { 'fa-eye-slash': !isVisible }) - const settingsClass = classnames('collapsible', { - 'is-collapsed': !showSettings, + const settingsClass = classnames('shrink', { + 'mxht0': !showSettings, 'mxht5': showSettings }) diff --git a/src/app/component/main.js b/src/app/component/main.js index f2a7c61..9694bef 100644 --- a/src/app/component/main.js +++ b/src/app/component/main.js @@ -5,6 +5,7 @@ const {h} = require('deku') const set = require('lodash.set') const Nav = require('./nav') +const About = require('./about') const GerberInput = require('./gerber-input') const GerberOutput = require('./gerber-output') const ViewSelect = require('./view-select') @@ -15,7 +16,8 @@ const appAction = require('../action') const { getSelectedView, getSelectedPanZoom, - getLayerDisplayStates + getLayerDisplayStates, + getAboutIsOpen } = require('../selector') const layerAction = require('../../layer/action') @@ -122,6 +124,9 @@ const handleSetMaskWithOutline = (dispatch) => () => (mask) => { dispatch(boardAction.maskWithOutline(mask)) } +const openAbout = (dispatch) => (open) => { + dispatch(appAction.openAbout(open)) +} module.exports = function renderMain({dispatch, context}) { const layers = getLayers(context) @@ -133,10 +138,15 @@ module.exports = function renderMain({dispatch, context}) { const selectedView = getSelectedView(context) const selectedPanZoom = getSelectedPanZoom(context) const totalViewbox = getTotalViewbox(context) + const aboutIsOpen = getAboutIsOpen(context) + const dipatchOpenAbout = openAbout(dispatch) + const windowAspect = context.browser.width / context.browser.height return h('div', {class: 'h-100 '}, [ - h(Nav, {}), + h(Nav, {openAbout: dipatchOpenAbout}), + + h(About, {isOpen: aboutIsOpen, open: dipatchOpenAbout}), h('div', { class: 'fixed right-0 w-25 app-max-ht mh3 app-mt3-past-nav z-1 flex flex-column' diff --git a/src/app/component/nav.js b/src/app/component/nav.js index a037bbd..0932ff5 100644 --- a/src/app/component/nav.js +++ b/src/app/component/nav.js @@ -3,7 +3,16 @@ const {h} = require('deku') -module.exports = function renderTopNav() { +module.exports = function renderTopNav({props}) { + const {openAbout} = props + + const handleAboutClick = (event) => { + event.preventDefault() + event.stopPropagation() + + openAbout(true) + } + return h('header', { class: 'mb3 w-100 bg-white-90 app-dark flex items-center fixed z-1' }, [ @@ -13,7 +22,11 @@ module.exports = function renderTopNav() { h('span', {class: 'f4 fw3 v-base'}, ['viewer']) ]), h('nav', {class: 'fr lh-copy f4'}, [ - h('a', {href: '#', class: 'border-box pa3 no-underline link app-dark dim'}, ['about']) + h('a', { + href: '#', + class: 'border-box pa3 no-underline link app-dark dim', + onClick: handleAboutClick + }, ['about']) ]) ]) } diff --git a/src/app/component/pan-zoom-controls.js b/src/app/component/pan-zoom-controls.js index f6ab42d..e958511 100644 --- a/src/app/component/pan-zoom-controls.js +++ b/src/app/component/pan-zoom-controls.js @@ -37,7 +37,7 @@ const PanButton = { render({props}) { const {direction, onClick} = props const icon = PAN_BUTTON_ICONS[direction] - const className = 'dib bn btn pointer bg-transparent pa0 click w-1-3 h-100' + const className = 'dib bn pointer bg-transparent pa0 click w-1-3 h-100' return h('button', { class: className, diff --git a/src/app/component/view-select.js b/src/app/component/view-select.js index 0073cb1..fa48d68 100644 --- a/src/app/component/view-select.js +++ b/src/app/component/view-select.js @@ -7,7 +7,7 @@ const classnames = require('classnames') const renderViewSelectButton = function({props}) { const {name, view, switchView} = props const isSelected = name === view - const classNames = classnames('btn dib w-50 f5 link app-dark tc pv1', { + const classNames = classnames('dib w-50 f5 link app-dark tc pv1', { 'bg-black-20': !isSelected, dim: !isSelected, disabled: isSelected diff --git a/src/app/reducer.js b/src/app/reducer.js index a6486f3..4707200 100644 --- a/src/app/reducer.js +++ b/src/app/reducer.js @@ -18,6 +18,7 @@ const NAME = 'app' const INITIAL_STATE = { view: 'layers', + aboutIsOpen: false, panZoom: { layers: {panStart: null, scale: 1, x: 0, y: 0}, board: {panStart: null, scale: 1, x: 0, y: 0} @@ -116,10 +117,18 @@ const view = function(state = INITIAL_STATE.view, action) { switch (action.type) { case appActionType.SWITCH_VIEW: return action.view + } + + return state +} - default: - return state +const aboutIsOpen = function(state = INITIAL_STATE.aboutIsOpen, action) { + switch (action.type) { + case appActionType.OPEN_ABOUT: + return action.open } + + return state } const panZoom = function(state = INITIAL_STATE.panZoom, action) { @@ -142,10 +151,9 @@ const panZoom = function(state = INITIAL_STATE.panZoom, action) { case appActionType.ZOOM_TO: return handleZoomTo(state, action) - - default: - return state } + + return state } const layers = function(state = INITIAL_STATE.layers, action) { @@ -162,11 +170,10 @@ const layers = function(state = INITIAL_STATE.layers, action) { return Object.assign({}, state, { [action.id]: {showSettings: !state[action.id].showSettings} }) - - default: - return state } + + return state } -module.exports = combineReducers({view, panZoom, layers}) +module.exports = combineReducers({view, aboutIsOpen, panZoom, layers}) module.exports.NAME = NAME diff --git a/src/app/selector.js b/src/app/selector.js index 6612883..41d0e26 100644 --- a/src/app/selector.js +++ b/src/app/selector.js @@ -8,14 +8,7 @@ const {NAME} = require('./reducer') const getPanZoom = (state) => state[NAME].panZoom const getLayerDisplayStates = (state) => state[NAME].layers const getSelectedView = (state) => state[NAME].view - -const getWindowSize = createSelector( - getPanZoom, - (panZoom) => panZoom.windowSize) - -const getWindowAspect = createSelector( - getWindowSize, - (size) => size.width / size.height) +const getAboutIsOpen = (state) => state[NAME].aboutIsOpen const getSelectedPanZoom = createSelector( getSelectedView, @@ -26,5 +19,5 @@ module.exports = { getLayerDisplayStates, getSelectedView, getSelectedPanZoom, - getWindowAspect + getAboutIsOpen } diff --git a/src/index.css b/src/index.css index 3058884..7555535 100644 --- a/src/index.css +++ b/src/index.css @@ -20,7 +20,7 @@ body { font-family: 'Open Sans', Helvetica, sans-serif; } -button[disabled], +[disabled], .disabled { opacity: 0.75; cursor: default; @@ -29,6 +29,10 @@ button[disabled], /* cursors */ +.cursor-auto { + cursor: auto; +} + .grab { cursor: move; cursor: grab; @@ -84,16 +88,28 @@ button[disabled], width: calc(100% / 3); } +.w7 { + width: 48rem; +} + +.mw0 { + max-width: 0; +} + .mxht5 { max-height: 16rem; } -.is-collapsed { +.mxht0 { + max-height: 0; +} + +.shrink-width { max-height: 0; } -.collapsible { - transition: max-height 0.3s linear; +.shrink { + transition: max-height 0.3s linear, max-width 0.3s linear; overflow: hidden; } diff --git a/test/app/app-action_test.js b/test/app/app-action_test.js index a4f1e50..f3e0e95 100644 --- a/test/app/app-action_test.js +++ b/test/app/app-action_test.js @@ -84,3 +84,11 @@ test('it should be able to toggle the settings drawer flag', (t) => { t.deepEqual(result, {type: action.TOGGLE_LAYER_SETTINGS, id: 'foo'}) }) + +test('it should be able to open the about drawer', (t) => { + const open = action.openAbout(true) + const close = action.openAbout(false) + + t.deepEqual(open, {type: action.OPEN_ABOUT, open: true}) + t.deepEqual(close, {type: action.OPEN_ABOUT, open: false}) +}) diff --git a/test/app/app-reducer_test.js b/test/app/app-reducer_test.js index 4329ab4..d7ccabe 100644 --- a/test/app/app-reducer_test.js +++ b/test/app/app-reducer_test.js @@ -14,6 +14,7 @@ const { const EXPECTED_INITIAL_STATE = { view: 'layers', + aboutIsOpen: false, panZoom: { layers: {panStart: null, scale: 1, x: 0, y: 0}, board: {panStart: null, scale: 1, x: 0, y: 0} @@ -23,6 +24,7 @@ const EXPECTED_INITIAL_STATE = { const PAN_ZOOM_TEST_STATE = { view: 'layers', + aboutIsOpen: false, panZoom: { layers: {panStart: null, scale: 0.5, x: 0.5, y: 0.5}, board: {panStart: null, scale: 0.5, x: 0.5, y: 0.5} @@ -252,3 +254,15 @@ test('it shoud be able to handle a TOGGLE_LAYER_SETTINGS action', (t) => { state = reducer(state, toggleAction) t.deepEqual(state.layers, {foo: {showSettings: false}}) }) + +test('should be able to handle a OPEN_ABOUT action', (t) => { + const openAbout = {type: action.OPEN_ABOUT, open: true} + const closeAbout = {type: action.OPEN_ABOUT, open: false} + let state = EXPECTED_INITIAL_STATE + + state = reducer(state, openAbout) + t.true(state.aboutIsOpen) + + state = reducer(state, closeAbout) + t.false(state.aboutIsOpen) +}) diff --git a/test/app/app-selector_test.js b/test/app/app-selector_test.js index ee59e20..662b270 100644 --- a/test/app/app-selector_test.js +++ b/test/app/app-selector_test.js @@ -9,7 +9,7 @@ const selector = require('../../src/app/selector') const SELECTOR_TEST_STATE_LAYERS = { [reducer.NAME]: { view: 'layers', - windowSize: {width: 1024, height: 768}, + aboutIsOpen: false, panZoom: { windowSize: {width: 1024, height: 768}, layers: {panStart: null, scale: 0.1, x: 0.2, y: 0.3}, @@ -25,6 +25,7 @@ const SELECTOR_TEST_STATE_LAYERS = { const SELECTOR_TEST_STATE_BOARD = { [reducer.NAME]: { view: 'board', + aboutIsOpen: false, panZoom: { windowSize: {width: 1024, height: 768}, layers: {panStart: null, scale: 0.1, x: 0.2, y: 0.3}, @@ -61,8 +62,8 @@ test('it should be able to get the selected view pan zoom', (t) => { t.deepEqual(panZoomBoard, {panStart: null, scale: 0.4, x: 0.6, y: 0.7}) }) -test('it should be able to get the window aspect ratio', (t) => { - const aspect = selector.getWindowAspect(SELECTOR_TEST_STATE_LAYERS) +test('it should be able to get the about open state', (t) => { + const aboutIsOpen = selector.getAboutIsOpen(SELECTOR_TEST_STATE_LAYERS) - t.is(aspect, 1024 / 768) + t.false(aboutIsOpen) }) diff --git a/test/layer/layer-component_test.js b/test/layer/layer-component_test.js index 0fab257..948ccf2 100644 --- a/test/layer/layer-component_test.js +++ b/test/layer/layer-component_test.js @@ -88,7 +88,7 @@ test('it should have a Layers component that wraps Layer elements', (t) => { // ensure the element has the proper aspect ratio t.is(element.getAttribute('style'), 'padding-bottom: 75%') - hasClass(t, element, 'relative', 'w-100', 'relative') + hasClass(t, element, 'aspect-ratio', 'w-100') }) test('it should handle an empty viewbox', (t) => { diff --git a/webpack.config.js b/webpack.config.js index b196dab..c4ba23b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -49,6 +49,10 @@ module.exports = { { test: /\.css$/, loader: 'style-loader!css-loader!postcss-loader' + }, + { + test: /\.md$/, + loader: 'html!markdown' } ] }, From 4c7bfdb0f334cad539c0c6923b44968d35bffe7d Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Sun, 24 Jul 2016 19:27:21 -0400 Subject: [PATCH 03/11] Add missing about component and use custom is-svg-element --- package.json | 2 ++ src/app/component/about.js | 49 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 src/app/component/about.js diff --git a/package.json b/package.json index 3296809..f457131 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "eslint": "^2.9.0", "express": "^4.13.4", "extract-text-webpack-plugin": "^1.0.1", + "html-loader": "^0.4.3", "jsdom": "^9.4.1", "markdown-loader": "^0.1.7", "nyc": "^7.0.0", @@ -57,6 +58,7 @@ "deku": "^2.0.0-rc16", "filereader-stream": "^1.0.0", "gerber-to-svg": "^2.0.1", + "is-svg-element": "github:tracespace/is-svg-element#v1.0.1", "lodash.omit": "^4.3.0", "lodash.set": "^4.2.0", "lodash.uniqueid": "^4.0.0", diff --git a/src/app/component/about.js b/src/app/component/about.js new file mode 100644 index 0000000..27f938c --- /dev/null +++ b/src/app/component/about.js @@ -0,0 +1,49 @@ +// about sliding modal component +'use strict' + +const {h} = require('deku') +const classnames = require('classnames') + +// grab content from repoisitory readme +const content = require('../../../README.md') + +const CloseButton = ({props}) => { + const {isOpen, onClick} = props + const classNames = classnames( + 'fixed top-1 right-2', + 'pa2', + 'app-bg-brand white link dim', + {dn: !isOpen}) + + return h('a', {href: '#', class: classNames, onClick}, [ + h('span', {class: 'fa fa-times mr2'}), + 'close' + ]) +} + +module.exports = function renderAbout({props}) { + const {isOpen, open} = props + const modalClassNames = classnames( + 'fixed right-0 z-2', + 'w-100 h-100 shrink', + 'pointer', + (!isOpen) ? 'mw0' : 'mw-100') + + const handleClose = (event) => { + event.stopPropagation() + event.preventDefault() + + if (event.target === event.currentTarget) { + open(false) + } + } + return h('div', { + class: modalClassNames, + onClick: handleClose + }, [ + h('div', {class: 'w7 h-100 fr bg-white pl3 overflow-auto cursor-auto'}, [ + h('div', {innerHTML: content}), + h(CloseButton, {isOpen, onClick: handleClose}) + ]) + ]) +} From 205acfa4f61d3129f878c449962db231ecba1735 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Sun, 24 Jul 2016 20:33:05 -0400 Subject: [PATCH 04/11] Update pcb-stackup-core to repo version for testing --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f457131..1628940 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "lodash.set": "^4.2.0", "lodash.uniqueid": "^4.0.0", "lodash.without": "^4.2.0", - "pcb-stackup-core": "^1.0.0", + "pcb-stackup-core": "github:tracespace/pcb-stackup-core#ae7af126efb1d44559dddfa96292773f4ab961ec", "raf": "^3.2.0", "randomcolor": "^0.4.4", "redux": "^3.5.2", From a56fc15665c778873ca51de2e330b8dafcf50a86 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Sun, 24 Jul 2016 20:44:42 -0400 Subject: [PATCH 05/11] Fix drawer-close handler interference with links in about page --- src/app/component/about.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/component/about.js b/src/app/component/about.js index 27f938c..c38ad09 100644 --- a/src/app/component/about.js +++ b/src/app/component/about.js @@ -23,24 +23,24 @@ const CloseButton = ({props}) => { module.exports = function renderAbout({props}) { const {isOpen, open} = props - const modalClassNames = classnames( + const classNames = classnames( 'fixed right-0 z-2', 'w-100 h-100 shrink', 'pointer', (!isOpen) ? 'mw0' : 'mw-100') const handleClose = (event) => { + if (event.target !== event.currentTarget) { + return + } + event.stopPropagation() event.preventDefault() - if (event.target === event.currentTarget) { - open(false) - } + open(false) } - return h('div', { - class: modalClassNames, - onClick: handleClose - }, [ + + return h('div', {class: classNames, onClick: handleClose}, [ h('div', {class: 'w7 h-100 fr bg-white pl3 overflow-auto cursor-auto'}, [ h('div', {innerHTML: content}), h(CloseButton, {isOpen, onClick: handleClose}) From 4d590b1e2e3148acfc7ab33a7786f799831e4325 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Mon, 25 Jul 2016 00:33:39 -0400 Subject: [PATCH 06/11] Add travis config and tools to deploy from ci --- .travis.yml | 17 +++++++++++++++++ README.md | 8 +++++++- package.json | 20 ++++++++++++++------ public/CNAME | 1 + 4 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 .travis.yml create mode 100644 public/CNAME diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..2f41c29 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,17 @@ +sudo: false +language: node_js +node_js: +- '6' +script: npm test && npm run build +after_success: npm run coverage:ci +deploy: + provider: script + skip_cleanup: true + script: npm run deploy + on: + repo: tracespace/viewer + tags: true + all_branches: true +env: + global: + secure: M/MgaJEOmT7Vg8p2MAiNKzGpAPgNZJtUKHEGcv6vm55TfXQ+7BwZYjr2xU+A+LvqMSU1aQEZWnX7TeD94YZExmEIptrgz9Q1D3E4UXPEMY3ojJp9jRnuJQghe6TzBV62ERrAK+aYpb2+ONHfIfmV54+gSj3aT/kTzQeR5Uv83yItZJ1WhaDQgvUTbMiORt+6yQl8GE0uG6VAam0uPQ4e6xdFVQLA2uVXKwsDDkBuMydhDFCT8CUgPE2dvTu+WU5d00mmP56AmUbncVvw3E3GfhYMW+CaqsWiNb3cpNwcb/afiUTf48fal8oAUYvPJtecydQ9b4fCtqTHpUCYoch/dcaeiM/cLKC4CSYvgxAyRybDxsCQJlixgT7YLf9fETnKvTCDz9sz5MzZmBGtVgGe4CjnGH3aeiE7lwlEaHui/dnHlz6XLB+FucUbClNxCcnGvA3uB50lrAzkj9jxBnvAnS+sljTK/AAz1nu/8GHZK8xOlOEmEWdVGNgPPmOzCF1t0EsB5gRURLBWGGAQXferB/dqnTRyjKI/H/0cUsYNHdMv1G4sJB1I3weuYtZMbkVqqycVP0TLKG0/5a/TDhZgOpd05Q10fjdRrC/wU7guNINHV8Qes08Bx2kcQk55GC/R42edasWZ89JrR3NvaUesNsR33CZGMoAzpcQ3uOwXTUA= diff --git a/README.md b/README.md index 948af46..308cfe9 100644 --- a/README.md +++ b/README.md @@ -44,4 +44,10 @@ Nothing fancy here, just npm scripts. See [package.json](https://github.com/trac * `$ npm start` - starts an HMR dev server at [localhost:8080](http://localhost:8080) * `$ npm test` - run tests * `$ npm run test:watch` - run tests on code changes -* `$ npm run deploy` - builds and deploys the site to GitHub pages (credentials required) + +### deploying + +The site is deployed automatically by Travis if the commit is tagged (and tests pass). To deploy: + +1. `$ npm version ...` - Use the npm version command to bump the version and tag the commit +2. `$ git push --tags` - Push the tag to trigger a build diff --git a/package.json b/package.json index 1628940..6863b77 100644 --- a/package.json +++ b/package.json @@ -5,15 +5,20 @@ "main": "src/index.js", "scripts": { "start": "node server.js", + "prebuild": "rm -f public/*.js public/*.map public/*.css", + "build": "webpack", "lint": "eslint 'src/**/*.js' 'test/**/*.js'", "test": "nyc --all --include='src/**/*.js' ava --verbose", "test:watch": "ava --watch", - "test:browser": "echo 'script not implemented' && exit 1", - "test:sauce": "echo 'script not implemented' && exit 1", "posttest": "npm run lint", - "deploy": "echo 'script not implemented' && exit 1", "coverage": "nyc report", - "coverage:html": "nyc report --reporter=html" + "coverage:html": "nyc report --reporter=html", + "coverage:ci": "nyc report --reporter=text-lcov | coveralls", + "ci:gitconfig:name": "git config --global user.name 'tracespace bot'", + "ci:gitconfig:email": "git config --global user.email 'bot@tracespace.io'", + "ci:gitconfig": "npm run ci:gitconfig:name && npm run ci:gitconfig:email", + "predeploy": "if [ \"$CI\" = \"true\" ]; then npm run ci:gitconfig; fi", + "deploy": "gh-pages -x -r https://$GH_TOKEN@github.com/tracespace/viewer.git -d public -m \"Build $TRAVIS_BUILD_NUMBER\"" }, "repository": { "type": "git", @@ -28,16 +33,19 @@ "engines": { "node": ">=6.0.0" }, + "private": true, "devDependencies": { "amp-has-class": "^1.0.3", "ava": "^0.15.2", "babel-core": "^6.11.4", "babel-loader": "^6.2.4", "babel-preset-es2040": "^1.1.1", + "coveralls": "^2.11.11", "css-loader": "^0.23.1", - "eslint": "^2.9.0", + "eslint": "^3.1.1", "express": "^4.13.4", "extract-text-webpack-plugin": "^1.0.1", + "gh-pages": "^0.11.0", "html-loader": "^0.4.3", "jsdom": "^9.4.1", "markdown-loader": "^0.1.7", @@ -63,7 +71,7 @@ "lodash.set": "^4.2.0", "lodash.uniqueid": "^4.0.0", "lodash.without": "^4.2.0", - "pcb-stackup-core": "github:tracespace/pcb-stackup-core#ae7af126efb1d44559dddfa96292773f4ab961ec", + "pcb-stackup-core": "^2.0.0", "raf": "^3.2.0", "randomcolor": "^0.4.4", "redux": "^3.5.2", diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..ca3c08b --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +viewer.tracespace.io From 788e56c6b31d3363559d0b280848f6f25daf76e4 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Mon, 25 Jul 2016 03:21:42 -0400 Subject: [PATCH 07/11] Set up webpack config for production --- .gitignore | 2 ++ config/index.js | 92 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 3 +- public/index.html | 6 +++- server.js | 28 ++++++++++++--- webpack.config.js | 68 ++++++----------------------------- 6 files changed, 135 insertions(+), 64 deletions(-) create mode 100644 config/index.js diff --git a/.gitignore b/.gitignore index 515cf0f..ebdf1ec 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ node_modules public/*.js +public/*.css +public/stats.html coverage .nyc_output diff --git a/config/index.js b/config/index.js new file mode 100644 index 0000000..5e7ef1e --- /dev/null +++ b/config/index.js @@ -0,0 +1,92 @@ +// build configs +'use strict' + +const path = require('path') +const webpack = require('webpack') +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const Visualizer = require('webpack-visualizer-plugin') + +// postcss plugins +const postcssImport = require('postcss-import') +const cssnext = require('postcss-cssnext') + +const resolve = (file) => path.resolve(__dirname, file) + +const ENTRY = resolve('../src/index.js') +const OUT = resolve('../public') +const JS_OUT = 'bundle.js' +const CSS_OUT = 'bundle.css' + +const PROD_PLUGIN_OPTS = { + 'process.env': {NODE_ENV: JSON.stringify('production')} +} + +const BASE_CONFIG = { + devtool: '#source-map', + entry: [ENTRY], + output: { + path: OUT, + filename: JS_OUT, + library: 'app', + publicPath: '/' + }, + postcss: (wpContext) => [ + postcssImport({addDependencyTo: wpContext}), + cssnext + ], + module: {} +} + +module.exports = { + create(plugins = [], loaders = []) { + const config = Object.assign({}, BASE_CONFIG) + + config.plugins = plugins.map((factory) => factory()) + config.module.loaders = loaders + + return config + }, + + plugin: { + prodEnv: () => new webpack.DefinePlugin(PROD_PLUGIN_OPTS), + occurence: () => new webpack.optimize.OccurrenceOrderPlugin(), + dedupe: () => new webpack.optimize.DedupePlugin(), + uglifyJs: () => new webpack.optimize.UglifyJsPlugin(), + extractCss: () => new ExtractTextPlugin(CSS_OUT), + visualizeBundle: () => new Visualizer(), + hmr: () => new webpack.HotModuleReplacementPlugin(), + noErrors: () => new webpack.NoErrorsPlugin() + }, + + loader: { + worker: { + test: /\worker\.js$/, + exclude: /node_modules/, + loader: 'worker' + }, + + babel: { + test: /\.js$/, + exclude: /node_modules/, + loader: 'babel', + query: { + presets: ['es2040'] + } + }, + + css: { + test: /\.css$/, + loader: 'style-loader!css-loader!postcss-loader' + }, + + cssExtracted: { + test: /\.css$/, + loader: ExtractTextPlugin.extract('style-loader', 'css-loader!postcss-loader') + }, + + markdown: { + test: /\.md$/, + loader: 'html!markdown' + } + } +} diff --git a/package.json b/package.json index 6863b77..e71f8bf 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "main": "src/index.js", "scripts": { "start": "node server.js", - "prebuild": "rm -f public/*.js public/*.map public/*.css", + "prebuild": "rm -f public/*.js public/*.map public/*.css public/stats.html", "build": "webpack", "lint": "eslint 'src/**/*.js' 'test/**/*.js'", "test": "nyc --all --include='src/**/*.js' ava --verbose", @@ -58,6 +58,7 @@ "webpack": "^1.13.0", "webpack-dev-middleware": "^1.6.1", "webpack-hot-middleware": "^2.10.0", + "webpack-visualizer-plugin": "^0.1.5", "worker-loader": "^0.7.0" }, "dependencies": { diff --git a/public/index.html b/public/index.html index cdf543f..6f5abd7 100644 --- a/public/index.html +++ b/public/index.html @@ -2,8 +2,12 @@ tracespace | viewer + + + - + + diff --git a/server.js b/server.js index 0428f99..17caa1e 100644 --- a/server.js +++ b/server.js @@ -1,18 +1,38 @@ +// dev server with HMR +'use strict' + const webpack = require('webpack') const dev = require('webpack-dev-middleware') const hot = require('webpack-hot-middleware') const express = require('express') -const config = require('./webpack.config.js') - const HOST = process.env.DEV_HOST || 'localhost' const PORT = process.env.DEV_PORT || 8080 +const {create, plugin, loader} = require('./config') +const plugins = [plugin.hmr, plugin.noErrors, plugin.visualizeBundle] +const loaders = [loader.worker, loader.babel, loader.css, loader.markdown] +const config = create(plugins, loaders) + +// load hot middleware client +config.entry.unshift('webpack-hot-middleware/client') + const compiler = webpack(config) const app = express() -app.use(dev(compiler, {publicPath: config.output.publicPath})) -app.use(hot(compiler, {reload: true})) +const devOptions = { + publicPath: config.output.publicPath, + stats: { + colors: true + } +} + +const hotOptions = { + reload: true +} + +app.use(dev(compiler, devOptions)) +app.use(hot(compiler, hotOptions)) app.use(express.static(config.output.path)) app.listen(PORT, HOST, (error) => { diff --git a/webpack.config.js b/webpack.config.js index c4ba23b..04e7b4c 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,63 +1,15 @@ 'use strict' -const webpack = require('webpack') -const path = require('path') -// const ExtractTextPlugin = require('extract-text-webpack-plugin') +const {create, loader, plugin} = require('./config') -// postcss plugins -const postcssImport = require('postcss-import') -const cssnext = require('postcss-cssnext') +const plugins = [ + plugin.prodEnv, + plugin.occurence, + plugin.dedupe, + plugin.uglifyJs, + plugin.extractCss +] -const FILENAME = 'bundle.js' -// const CSS_FILENAME = 'bundle.css' +const loaders = [loader.worker, loader.babel, loader.cssExtracted, loader.markdown] -module.exports = { - devtool: '#source-map', - entry: [ - 'webpack-hot-middleware/client', - './src/index.js' - ], - output: { - path: path.join(__dirname, 'public'), - filename: FILENAME, - library: 'app', - publicPath: '/' - }, - plugins: [ - new webpack.optimize.OccurrenceOrderPlugin(), - new webpack.HotModuleReplacementPlugin(), - new webpack.NoErrorsPlugin(), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': '"development"' - }) - ], - module: { - loaders: [ - { - test: /\worker\.js$/, - exclude: /node_modules/, - loader: 'worker' - }, - { - test: /\.js$/, - exclude: /node_modules/, - loader: 'babel', - query: { - presets: ['es2040'] - } - }, - { - test: /\.css$/, - loader: 'style-loader!css-loader!postcss-loader' - }, - { - test: /\.md$/, - loader: 'html!markdown' - } - ] - }, - postcss: (wpContext) => [ - postcssImport({addDependencyTo: wpContext}), - cssnext - ] -} +module.exports = create(plugins, loaders) From a56021a3e055a4c6a2e4536c7b8844eff075a2d6 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Mon, 25 Jul 2016 03:23:10 -0400 Subject: [PATCH 08/11] Include config in linting --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e71f8bf..07102d6 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "start": "node server.js", "prebuild": "rm -f public/*.js public/*.map public/*.css public/stats.html", "build": "webpack", - "lint": "eslint 'src/**/*.js' 'test/**/*.js'", + "lint": "eslint '*.js' 'config/*.js' 'src/**/*.js' 'test/**/*.js'", "test": "nyc --all --include='src/**/*.js' ava --verbose", "test:watch": "ava --watch", "posttest": "npm run lint", From 7ab89e99ec11d5c3f847e4faa3e9a49413196073 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Mon, 25 Jul 2016 03:48:31 -0400 Subject: [PATCH 09/11] Clean up badges in README --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 308cfe9..7fe32c3 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # tracespace viewer (beta) -[![GitHub stars](https://img.shields.io/github/stars/tracespace/viewer.svg?style=social&label=Star&maxAge=2592000?style=flat-square)](https://github.com/tracespace/viewer) -[![GitHub issues](https://img.shields.io/github/issues/tracespace/viewer.svg?maxAge=2592000?style=flat-square)](https://github.com/tracespace/viewer/issues) -[![Travis](https://img.shields.io/travis/tracespace/viewer.svg?style=flat-square)](https://travis-ci.org/tracespace/viewer) -[![Coveralls](https://img.shields.io/coveralls/tracespace/viewer.svg?style=flat-square)](https://coveralls.io/github/tracespace/viewer) +[![GitHub stars](https://img.shields.io/github/stars/tracespace/viewer.svg?style=flat-square&label=stars&maxAge=2592000)](https://github.com/tracespace/viewer) +[![GitHub issues](https://img.shields.io/github/issues/tracespace/viewer.svg?style=flat-square&maxAge=2592000)](https://github.com/tracespace/viewer/issues) +[![Travis](https://img.shields.io/travis/tracespace/viewer/master.svg?style=flat-square)](https://travis-ci.org/tracespace/viewer) +[![Coveralls](https://img.shields.io/coveralls/tracespace/viewer/master.svg?style=flat-square)](https://coveralls.io/github/tracespace/viewer) [![David](https://img.shields.io/david/tracespace/viewer.svg?style=flat-square)](https://david-dm.org/tracespace/viewer) [![David devDependences](https://img.shields.io/david/dev/tracespace/viewer.svg?style=flat-square)](https://david-dm.org/tracespace/viewer#info=devDependencies) @@ -11,8 +11,6 @@ Probably the best printed circuit board viewer on the internet - - ## about This particular PCB viewer takes your Gerber and drill files and gives you individual layer renders as well as very fancy renders of what your completed boards are going to look like. From d4954fa6d61874014a5ad4fa1f30e6a47fe14d4c Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Mon, 25 Jul 2016 03:51:06 -0400 Subject: [PATCH 10/11] Fix mispelling of "occurrence" in webpack config --- config/index.js | 2 +- webpack.config.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/index.js b/config/index.js index 5e7ef1e..e304721 100644 --- a/config/index.js +++ b/config/index.js @@ -49,7 +49,7 @@ module.exports = { plugin: { prodEnv: () => new webpack.DefinePlugin(PROD_PLUGIN_OPTS), - occurence: () => new webpack.optimize.OccurrenceOrderPlugin(), + occurrence: () => new webpack.optimize.OccurrenceOrderPlugin(), dedupe: () => new webpack.optimize.DedupePlugin(), uglifyJs: () => new webpack.optimize.UglifyJsPlugin(), extractCss: () => new ExtractTextPlugin(CSS_OUT), diff --git a/webpack.config.js b/webpack.config.js index 04e7b4c..aff5908 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,7 +4,7 @@ const {create, loader, plugin} = require('./config') const plugins = [ plugin.prodEnv, - plugin.occurence, + plugin.occurrence, plugin.dedupe, plugin.uglifyJs, plugin.extractCss From 403e0768069671695396e5d1d9b99fcc2a1e81c2 Mon Sep 17 00:00:00 2001 From: Mike Cousins Date: Mon, 25 Jul 2016 03:59:23 -0400 Subject: [PATCH 11/11] Tweak stars badge to use star emoji --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7fe32c3..c0f1825 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # tracespace viewer (beta) -[![GitHub stars](https://img.shields.io/github/stars/tracespace/viewer.svg?style=flat-square&label=stars&maxAge=2592000)](https://github.com/tracespace/viewer) +[![GitHub stars](https://img.shields.io/github/stars/tracespace/viewer.svg?style=flat-square&label=%E2%AD%90&maxAge=2592000)](https://github.com/tracespace/viewer) [![GitHub issues](https://img.shields.io/github/issues/tracespace/viewer.svg?style=flat-square&maxAge=2592000)](https://github.com/tracespace/viewer/issues) [![Travis](https://img.shields.io/travis/tracespace/viewer/master.svg?style=flat-square)](https://travis-ci.org/tracespace/viewer) [![Coveralls](https://img.shields.io/coveralls/tracespace/viewer/master.svg?style=flat-square)](https://coveralls.io/github/tracespace/viewer)