Skip to content

Commit 04cf5f8

Browse files
committed
Merge branch 'v0.28-rc' into merge-v0.28
2 parents 40e296a + a1e83a0 commit 04cf5f8

76 files changed

Lines changed: 2019 additions & 1954 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.eslintrc

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,23 @@
1717
"comma-dangle": 0,
1818
"eqeqeq": [2, "allow-null"],
1919
"id-length": 0,
20+
"no-eq-null": 0,
2021
"one-var": [2, { "initialized": "never" }],
2122
"prefer-const": 0,
2223
"no-param-reassign": 0,
2324
"no-this-before-super": 2,
2425
"babel/object-shorthand": 2,
2526
"react/jsx-boolean-value": 2,
2627
"react/jsx-no-duplicate-props": 2,
27-
"react/prop-types": [2, { "ignore": [ "children", "className", "style" ] }],
28-
"react/sort-comp": 0
28+
"react/sort-comp": 0,
29+
"react/prop-types": [2, { "ignore": [
30+
"children",
31+
"className",
32+
"style",
33+
"bsStyle",
34+
"bsClass",
35+
"bsSize"
36+
]
37+
}],
2938
}
3039
}

docs/assets/docs.css

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -535,8 +535,10 @@ body {
535535
*/
536536

537537
/* By default it's not affixed in mobile views, so undo that */
538-
.bs-docs-sidebar.affix {
539-
position: static;
538+
@media (max-width: 991px) {
539+
.bs-docs-sidebar {
540+
position: static !important;
541+
}
540542
}
541543
@media (min-width: 768px) {
542544
.bs-docs-sidebar {
@@ -628,35 +630,17 @@ body {
628630

629631
/* Show and affix the side nav when space allows it */
630632
@media (min-width: 992px) {
633+
.bs-docs-sidebar-holder {
634+
padding-top: 20px;
635+
}
631636
.bs-docs-sidebar .nav > .active > ul {
632637
display: block;
633638
}
634-
/* Widen the fixed sidebar */
635-
.bs-docs-sidebar.affix,
636-
.bs-docs-sidebar.affix-bottom {
637-
width: 213px;
638-
}
639-
.bs-docs-sidebar.affix {
640-
position: fixed; /* Undo the static from mobile first approach */
641-
top: 20px;
642-
}
643-
.bs-docs-sidebar.affix-bottom {
644-
position: absolute; /* Undo the static from mobile first approach */
645-
}
646-
.bs-docs-sidebar.affix-bottom .bs-docs-sidenav,
647-
.bs-docs-sidebar.affix .bs-docs-sidenav {
639+
.bs-docs-sidebar .bs-docs-sidenav {
648640
margin-top: 0;
649641
margin-bottom: 0;
650642
}
651643
}
652-
@media (min-width: 1200px) {
653-
/* Widen the fixed sidebar again */
654-
.bs-docs-sidebar.affix-bottom,
655-
.bs-docs-sidebar.affix {
656-
width: 263px;
657-
}
658-
}
659-
660644

661645
/*
662646
* Docs sections

docs/examples/.eslintrc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,10 @@
3434
"ListGroup",
3535
"ListGroupItem",
3636
"Nav",
37-
"NavBrand",
37+
"NavbarBrand",
38+
"NavbarHeader",
39+
"NavbarToggle",
40+
"NavbarCollapse",
3841
"Navbar",
3942
"NavDropdown",
4043
"NavItem",

docs/examples/CollapsibleNav.js

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

docs/examples/NavbarBasic.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
const navbarInstance = (
22
<Navbar>
3-
<NavBrand><a href="#">React-Bootstrap</a></NavBrand>
3+
<Navbar.Header>
4+
<Navbar.Brand>
5+
<a href="#">React-Bootstrap</a>
6+
</Navbar.Brand>
7+
</Navbar.Header>
48
<Nav>
59
<NavItem eventKey={1} href="#">Link</NavItem>
610
<NavItem eventKey={2} href="#">Link</NavItem>
711
<NavDropdown eventKey={3} title="Dropdown" id="basic-nav-dropdown">
8-
<MenuItem eventKey="1">Action</MenuItem>
9-
<MenuItem eventKey="2">Another action</MenuItem>
10-
<MenuItem eventKey="3">Something else here</MenuItem>
12+
<MenuItem eventKey={3.1}>Action</MenuItem>
13+
<MenuItem eventKey={3.2}>Another action</MenuItem>
14+
<MenuItem eventKey={3.3}>Something else here</MenuItem>
1115
<MenuItem divider />
12-
<MenuItem eventKey="4">Separated link</MenuItem>
16+
<MenuItem eventKey={3.3}>Separated link</MenuItem>
1317
</NavDropdown>
1418
</Nav>
1519
</Navbar>

docs/examples/NavbarCollapsible.js

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
11
const navbarInstance = (
2-
<Navbar inverse toggleNavKey={0}>
3-
<NavBrand><a href="#">React-Bootstrap</a></NavBrand>
4-
<Nav right eventKey={0}> {/* This is the eventKey referenced */}
5-
<NavItem eventKey={1} href="#">Link</NavItem>
6-
<NavItem eventKey={2} href="#">Link</NavItem>
7-
<NavDropdown eventKey={3} title="Dropdown" id="collapsible-navbar-dropdown">
8-
<MenuItem eventKey="1">Action</MenuItem>
9-
<MenuItem eventKey="2">Another action</MenuItem>
10-
<MenuItem eventKey="3">Something else here</MenuItem>
11-
<MenuItem divider />
12-
<MenuItem eventKey="4">Separated link</MenuItem>
13-
</NavDropdown>
14-
</Nav>
2+
<Navbar inverse>
3+
<Navbar.Header>
4+
<Navbar.Brand>
5+
<a href="#">React-Bootstrap</a>
6+
</Navbar.Brand>
7+
<Navbar.Toggle />
8+
</Navbar.Header>
9+
<Navbar.Collapse>
10+
<Nav>
11+
<NavItem eventKey={1} href="#">Link</NavItem>
12+
<NavItem eventKey={2} href="#">Link</NavItem>
13+
<NavDropdown eventKey={3} title="Dropdown" id="basic-nav-dropdown">
14+
<MenuItem eventKey={3.1}>Action</MenuItem>
15+
<MenuItem eventKey={3.2}>Another action</MenuItem>
16+
<MenuItem eventKey={3.3}>Something else here</MenuItem>
17+
<MenuItem divider />
18+
<MenuItem eventKey={3.3}>Separated link</MenuItem>
19+
</NavDropdown>
20+
</Nav>
21+
<Nav pullRight>
22+
<NavItem eventKey={1} href="#">Link Right</NavItem>
23+
<NavItem eventKey={2} href="#">Link Right</NavItem>
24+
</Nav>
25+
</Navbar.Collapse>
1526
</Navbar>
1627
);
1728

docs/examples/NavbarForm.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const navbarInstance = (
2+
<Navbar>
3+
<Navbar.Header>
4+
<Navbar.Brand>
5+
<a href="#">Brand</a>
6+
</Navbar.Brand>
7+
<Navbar.Toggle />
8+
</Navbar.Header>
9+
<Navbar.Collapse>
10+
<Navbar.Form pullLeft>
11+
<Input type="text" placeholder="Search"/>
12+
{' '}
13+
<Button type="submit">Submit</Button>
14+
</Navbar.Form>
15+
</Navbar.Collapse>
16+
</Navbar>
17+
);
18+
19+
ReactDOM.render(navbarInstance, mountNode);

docs/examples/NavbarTextLink.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const navbarInstance = (
2+
<Navbar>
3+
<Navbar.Header>
4+
<Navbar.Brand>
5+
<a href="#">Brand</a>
6+
</Navbar.Brand>
7+
<Navbar.Toggle />
8+
</Navbar.Header>
9+
<Navbar.Collapse>
10+
<Navbar.Text>
11+
Signed in as: <Navbar.Link href="#">Mark Otto</Navbar.Link>
12+
</Navbar.Text>
13+
<Navbar.Text pullRight>
14+
Have a great day!
15+
</Navbar.Text>
16+
</Navbar.Collapse>
17+
</Navbar>
18+
);
19+
20+
ReactDOM.render(navbarInstance, mountNode);

docs/generate-metadata.js

Lines changed: 54 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import glob from 'glob';
33
import fsp from 'fs-promise';
44
import promisify from '../tools/promisify';
55
import marked from 'marked';
6+
import defaultDescriptions from './src/defaultPropDescriptions';
67

78
marked.setOptions({
89
xhtml: true
@@ -18,6 +19,7 @@ let cleanDoclets = desc => {
1819

1920
let cleanDocletValue = str => str.trim().replace(/^\{/, '').replace(/\}$/, '');
2021

22+
let quote = str => str && `'${str}'`;
2123

2224
let isLiteral = str => (/^('|")/).test(str.trim());
2325

@@ -26,10 +28,11 @@ let isLiteral = str => (/^('|")/).test(str.trim());
2628
*
2729
* @param {ComponentMetadata|PropMetadata} obj
2830
*/
29-
function parseDoclets(obj) {
30-
obj.doclets = metadata.parseDoclets(obj.desc || '') || {};
31-
obj.desc = cleanDoclets(obj.desc || '');
32-
obj.descHtml = marked(obj.desc || '');
31+
function parseDoclets(obj, propName) {
32+
let desc = obj.desc || defaultDescriptions[propName] || '';
33+
obj.doclets = metadata.parseDoclets(desc) || {};
34+
obj.desc = cleanDoclets(desc);
35+
obj.descHtml = marked(desc);
3336
}
3437

3538
/**
@@ -61,7 +64,7 @@ function applyPropDoclets(props, propName) {
6164

6265
// Use @required to mark a prop as required
6366
// useful for custom propTypes where there isn't a `.isRequired` addon
64-
if ( doclets.required) {
67+
if (doclets.required) {
6568
prop.required = true;
6669
}
6770

@@ -71,27 +74,71 @@ function applyPropDoclets(props, propName) {
7174
}
7275
}
7376

77+
function addBootstrapPropTypes(Component, componentData) {
78+
let propTypes = Component.propTypes || {};
79+
let defaultProps = Component.defaultProps || {};
80+
81+
function bsPropInfo(propName) {
82+
let props = componentData.props;
83+
let prop = propTypes[propName];
84+
85+
if (prop && !props[propName]) {
86+
let values = prop._values || [];
87+
88+
props[propName] = {
89+
desc: '',
90+
defaultValue: quote(defaultProps[propName]),
91+
type: {
92+
name: 'enum',
93+
value: values.map( v => `"${v}"`),
94+
}
95+
};
96+
}
97+
}
98+
99+
bsPropInfo('bsStyle');
100+
bsPropInfo('bsSize');
101+
102+
if (propTypes.bsClass) {
103+
componentData.props.bsClass = {
104+
desc: '',
105+
defaultValue: quote(defaultProps.bsClass),
106+
type: { name: 'string' }
107+
};
108+
}
109+
}
74110

75111
export default function generate(destination, options = { mixins: true, inferComponent: true }) {
76112
return globp(__dirname + '/../src/**/*.js') // eslint-disable-line no-path-concat
77113
.then( files => {
78114
let results = files.map(
79-
filename => fsp.readFile(filename).then(content => metadata(content, options)) );
115+
filename => fsp.readFile(filename).then(content => metadata(content, options)));
80116

81117
return Promise.all(results)
82118
.then( data => {
83119
let result = {};
84120

85121
data.forEach(components => {
86122
Object.keys(components).forEach(key => {
123+
let Component;
124+
125+
try {
126+
// require the actual component to inspect props we can only get a runtime
127+
Component = require('../src/' + key);
128+
} catch (e) {} //eslint-disable-line
129+
87130
const component = components[key];
88131

132+
if (Component) {
133+
addBootstrapPropTypes(Component, component);
134+
}
135+
89136
parseDoclets(component);
90137

91138
Object.keys(component.props).forEach( propName => {
92139
const prop = component.props[propName];
93140

94-
parseDoclets(prop);
141+
parseDoclets(prop, propName);
95142
applyPropDoclets(component.props, propName);
96143
});
97144
});

0 commit comments

Comments
 (0)