Skip to content

Commit 240866a

Browse files
committed
feat(css): enable using jss instead of using css asset
1 parent 83df0b6 commit 240866a

17 files changed

+315
-282
lines changed

.flowconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<PROJECT_ROOT>/lib/.*
33
.*/node_modules/.*/tests?/.*\.json
44
.*/node_modules/fbjs/.*
5+
.*/node_modules/jss/.*
56

67
[include]
78
./src

.npmignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ coverage
88
node_modules
99
test
1010
stories
11+
scripts
1112

.storybook/webpack.config.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88
Not another carousel; a simpler component that animates horizontal slide transitions between steps of a wizard or levels
99
of a drilldown.
1010

11+
# Table of Contents
12+
13+
- [Usage](#usage)
14+
- [Using `react-jss` instead of `react-view-slider.css`](#using-react-jss-instead-of-react-view-slidercss)
15+
- [Props](#props)
16+
- [`withTransitionContext`](#withtransitioncontext)
17+
1118
## Usage
1219

1320
```sh
@@ -47,6 +54,17 @@ ReactDOM.render(
4754
)
4855
```
4956

57+
## Using `react-jss` instead of `react-view-slider.css`
58+
59+
```js
60+
import React from 'react'
61+
import BaseViewSlider from 'react-view-slider'
62+
import viewSliderStyles from 'react-view-slider/lib/styles'
63+
import injectSheet from 'react-jss'
64+
65+
const ViewSlider = injectSheet(viewSliderStyles)(BaseViewSlider)
66+
```
67+
5068
## Props
5169

5270
### `renderPage: (props: PageProps) => React.Element<any>` **(required)**
@@ -108,6 +126,17 @@ Any extra class names to add to the inner "viewport" element.
108126

109127
Extra inline styles to add to the inner "viewport" element.
110128

129+
### `classes: {root: string, viewport: string, fillParent: string, page: string}`
130+
131+
The `className`s for the various elements `ViewSlider` renders:
132+
- `root` is the root `div`
133+
- `viewport` is the `div` inside `root` that animates horizontally
134+
- `fillParent` is the `className` applied to the root `div` if the `fillParent` property is `true`
135+
- `page` is the `className` passed to `renderPage`
136+
137+
By default, they match those in `lib/react-view-slider.css`.
138+
Otherwise, you can [use `react-jss` to inject `classes`](#using-react-jss-instead-of-react-view-slidercss).
139+
111140
## `withTransitionContext`
112141

113142
```js

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,22 @@
44
"description": "animates horizontal slide transitions between steps of a wizard or levels of a drilldown",
55
"main": "lib/index.js",
66
"scripts": {
7-
"lint": "eslint src test stories",
8-
"lint:fix": "eslint --fix src test stories",
9-
"lint:watch": "esw --watch src test stories",
7+
"lint": "eslint src test scripts stories",
8+
"lint:fix": "eslint --fix src test scripts stories",
9+
"lint:watch": "esw --watch src test scripts stories",
1010
"flow": "flow",
1111
"flow:coverage": "for file in src/**.js test/**.js; do echo $file; flow coverage $file; done",
1212
"flow:watch": "flow-watch -e js,js.flow,flowconfig --ignore lib/ --ignore node_modules/ --watch .flowconfig --watch src/ --watch test/",
1313
"gen-flow-files": "flow gen-flow-files src/ --out-dir lib",
1414
"copy-flow-files": "cd src; copy *.js.flow **/*.js.flow ../lib",
15-
"build": "rimraf lib && babel src --out-dir lib && node-sass src --output lib",
15+
"build:css": "babel-node scripts/buildCss.js",
16+
"build": "rimraf lib && npm run build:css && babel src --out-dir lib && npm run copy-flow-files",
1617
"test": "NODE_ENV=production BABEL_ENV=test nyc --reporter=lcov --reporter=text mocha $npm_package_config_mocha",
1718
"test:watch": "mocha --watch $npm_package_config_mocha",
1819
"commitmsg": "validate-commit-msg",
1920
"precommit": "npm run lint && flow",
2021
"prepush": "npm test",
21-
"prepublish": "npm run lint && flow && npm test && npm run build && npm run copy-flow-files",
22+
"prepublish": "rimraf lib && npm run build:css && npm run lint && flow && npm test && babel src --out-dir lib && npm run copy-flow-files",
2223
"open:coverage": "open coverage/lcov-report/index.html",
2324
"semantic-release": "semantic-release pre && npm publish && semantic-release post",
2425
"storybook": "start-storybook -p 6006",
@@ -75,7 +76,6 @@
7576
"chai": "^3.5.0",
7677
"copy": "^0.3.0",
7778
"coveralls": "^2.11.16",
78-
"css-loader": "^0.28.4",
7979
"delay": "^2.0.0",
8080
"enzyme": "^2.7.0",
8181
"eslint": "^3.13.1",
@@ -88,19 +88,19 @@
8888
"istanbul": "^0.4.5",
8989
"jsdom": "^10.1.0",
9090
"jsdom-global": "^3.0.2",
91+
"jss": "^8.1.0",
92+
"jss-nested": "^5.0.0",
9193
"mocha": "^3.2.0",
92-
"node-sass": "^4.5.3",
9394
"nyc": "^10.1.2",
9495
"react": "^15.4.2",
9596
"react-addons-test-utils": "^15.4.2",
9697
"react-dom": "^15.4.2",
9798
"react-hot-loader": "^3.0.0-beta.2",
99+
"react-jss": "^6.1.1",
98100
"react-transition-context": "^1.0.0-beta9",
99101
"rimraf": "^2.5.4",
100-
"sass-loader": "^6.0.6",
101102
"semantic-release": "^6.3.6",
102103
"sinon": "^2.3.5",
103-
"style-loader": "^0.18.2",
104104
"validate-commit-msg": "^2.8.2"
105105
},
106106
"peerDependencies": {

scripts/.eslintrc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"env": {
3+
"es6": true,
4+
"node": true
5+
}
6+
}

scripts/buildCss.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#!/usr/bin/env babel-node
2+
3+
import jss from 'jss'
4+
import nested from 'jss-nested'
5+
import fs from 'fs'
6+
import path from 'path'
7+
8+
jss.use(nested())
9+
10+
import styles from '../src/styles'
11+
12+
const sheet = jss.createStyleSheet(styles)
13+
14+
const src = path.resolve(__dirname, '..', 'src')
15+
const lib = path.resolve(__dirname, '..', 'lib')
16+
17+
try {
18+
fs.statSync(lib)
19+
} catch (error) {
20+
fs.mkdirSync(lib)
21+
}
22+
23+
fs.writeFileSync(
24+
path.resolve(src, 'defaultClasses.js'),
25+
'/* eslint-disable */\nmodule.exports = ' + JSON.stringify(sheet.classes) + '\n',
26+
'utf8'
27+
)
28+
console.error('src/styles.js -> src/defaultClasses.js') // eslint-disable-line no-console
29+
30+
fs.writeFileSync(path.resolve(lib, 'react-view-slider.css'), sheet.toString(), 'utf8')
31+
console.error('src/styles.js -> lib/react-view-slider.css') // eslint-disable-line no-console
32+

src/.eslintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"env": {
3-
"es6": true
3+
"es6": true,
4+
"commonjs": true
45
}
56
}

src/defaultClasses.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/index.js

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import classNames from 'class-names'
66
import Prefixer from 'inline-style-prefixer'
77
import getNodeDimensions from 'get-node-dimensions'
88
import range from 'lodash.range'
9+
import defaultClasses from './defaultClasses'
910

1011
type TransitionState = 'in' | 'out' | 'entering' | 'leaving'
1112

@@ -26,6 +27,14 @@ export type DefaultProps = {
2627
prefixer: Prefixer,
2728
style: Object,
2829
viewportStyle: Object,
30+
classes: Classes,
31+
}
32+
33+
export type Classes = {
34+
root: string,
35+
viewport: string,
36+
page: string,
37+
fillParent: string,
2938
}
3039

3140
export type Props = {
@@ -38,6 +47,7 @@ export type Props = {
3847
prefixer: Prefixer,
3948
fillParent?: boolean,
4049
className?: string,
50+
classes: Classes,
4151
style: Object,
4252
viewportClassName?: string,
4353
viewportStyle: Object,
@@ -63,6 +73,7 @@ export default class ViewSlider extends Component<DefaultProps, Props, State> {
6373
prefixer: new Prefixer(),
6474
style: {},
6575
viewportStyle: {},
76+
classes: defaultClasses,
6677
}
6778
state: State = {
6879
height: undefined,
@@ -134,18 +145,19 @@ export default class ViewSlider extends Component<DefaultProps, Props, State> {
134145
}
135146

136147
renderPage: (index: number) => React.Element<any> = (index: number): React.Element<any> => {
137-
const {fillParent} = this.props
148+
const {fillParent, classes} = this.props
138149
const {activePage, transitioning} = this.state
150+
139151
// when not transitioning, render empty placeholder divs before the active page to push it into the right
140152
// horizontal position
141153
if (!transitioning && activePage !== index) {
142-
return <div key={index} className="react-view-slider__page"></div>
154+
return <div key={index} className={classes.page}></div>
143155
}
144156
return this.props.renderPage({
145157
index,
146158
key: index,
147159
active: index === activePage,
148-
className: 'react-view-slider__page',
160+
className: classes.page,
149161
transitionState: this.getTransitionState(index),
150162
style: fillParent ? {left: `${index * 100}%`} : {},
151163
ref: c => this.pages[index] = c,
@@ -155,13 +167,12 @@ export default class ViewSlider extends Component<DefaultProps, Props, State> {
155167
render(): React.Element<any> {
156168
const {
157169
style, className, viewportClassName, viewportStyle, numPages, prefixer, animateHeight, fillParent,
158-
transitionDuration, transitionTimingFunction,
170+
transitionDuration, transitionTimingFunction, classes
159171
} = this.props
160172
const {activePage, height, transitioning} = this.state
161173

162-
const finalClassName = classNames(className, 'react-view-slider__root', {
163-
'react-view-slider__root--transitioning': transitioning,
164-
'react-view-slider__root--fill-parent': fillParent,
174+
const finalClassName = classNames(className, classes.root, {
175+
[classes.fillParent]: fillParent,
165176
})
166177

167178
const finalOuterStyle = {
@@ -193,7 +204,7 @@ export default class ViewSlider extends Component<DefaultProps, Props, State> {
193204
ref={c => this.root = c}
194205
>
195206
<div
196-
className={classNames(viewportClassName, 'react-view-slider__track')}
207+
className={classNames(viewportClassName, classes.viewport)}
197208
style={prefixer.prefix(finalViewportStyle)}
198209
ref={c => this.viewport = c}
199210
onTransitionEnd={this.onTransitionEnd}

0 commit comments

Comments
 (0)