Skip to content

Commit 27ac54c

Browse files
authored
Merge pull request #183 from nomcopter/support-bp-4
Support bp 4
2 parents fae0ee5 + 11bc429 commit 27ac54c

19 files changed

+524
-308
lines changed

.circleci/config.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ references:
99
jobs:
1010
build:
1111
docker:
12-
- image: circleci/node:dubnium
12+
- image: circleci/node:gallium
1313
working_directory: ~/react-mosaic
1414
steps:
1515
- checkout
1616
- run:
1717
name: Install Yarn
1818
command: |
19-
curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.16.0
19+
curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version 1.22.18
2020
export PATH="$HOME/.yarn/bin:$PATH"
2121
- restore_cache:
2222
keys:

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,12 @@ export interface MosaicBaseProps<T extends MosaicKey> {
199199
* default: Random UUID
200200
*/
201201
mosaicId?: string;
202+
/**
203+
* Make it possible to use different versions of Blueprint with `mosaic-blueprint-theme`
204+
* Note: does not support updating after instantiation
205+
* default: 'bp3'
206+
*/
207+
blueprintNamespace?: string;
202208
}
203209

204210
export interface MosaicControlledProps<T extends MosaicKey> extends MosaicBaseProps<T> {

demo/ExampleApp.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export class ExampleApp extends React.PureComponent<{}, ExampleAppState> {
9494
onChange={this.onChange}
9595
onRelease={this.onRelease}
9696
className={THEMES[this.state.currentTheme]}
97+
blueprintNamespace="bp4"
9798
/>
9899
</div>
99100
</React.StrictMode>

demo/example.less

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
@import (reference) '~@blueprintjs/core/lib/less/variables';
22

3-
html, body, #app, .react-mosaic-example-app {
3+
html,
4+
body,
5+
#app,
6+
.react-mosaic-example-app {
47
margin: 0;
58
height: 100%;
69
width: 100%;
@@ -38,7 +41,7 @@ html, body, #app, .react-mosaic-example-app {
3841
}
3942

4043
> .mosaic {
41-
height: ~"calc(100% - 50px)";
44+
height: ~'calc(100% - 50px)';
4245
}
4346

4447
.github-link {

package.json

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"scripts": {
1717
"build": "npm-run-all clean -lp build:**",
1818
"build:ts": "tsc -p tsconfig-build.json",
19-
"build:less": "lessc --autoprefix=defaults --source-map styles/index.less react-mosaic-component.css",
19+
"build:less": "lessc --autoprefix=defaults styles/index.less react-mosaic-component.css",
2020
"bundle": "rm -rf docs/ && webpack --config webpack/bundle.ts",
2121
"clean": "rm -rf lib/",
2222
"start": "webpack-dev-server --config webpack/hot.ts",
@@ -31,47 +31,47 @@
3131
"version": "yarn run bundle && git add -A docs/"
3232
},
3333
"devDependencies": {
34-
"@blueprintjs/core": "^3.44.1",
35-
"@blueprintjs/icons": "^3.26.0",
36-
"@types/chai": "^4.1.7",
37-
"@types/classnames": "^2.2.8",
38-
"@types/dom4": "^2.0.1",
34+
"@blueprintjs/core": "^4.0.1",
35+
"@blueprintjs/icons": "^4.1.0",
36+
"@types/chai": "^4.3.0",
37+
"@types/classnames": "^2.3.1",
38+
"@types/dom4": "^2.0.2",
3939
"@types/html-webpack-plugin": "2.30.2",
40-
"@types/lodash": "^4.14.134",
40+
"@types/lodash": "^4.14.180",
4141
"@types/mocha": "^5.2.7",
42-
"@types/prop-types": "^15.7.1",
43-
"@types/react": "^17.0.4",
44-
"@types/react-dnd-multi-backend": "^6.0.0",
45-
"@types/react-dom": "^17.0.3",
42+
"@types/prop-types": "^15.7.4",
43+
"@types/react": "^17.0.43",
44+
"@types/react-dnd-multi-backend": "^6.0.1",
45+
"@types/react-dom": "^17.0.14",
4646
"@types/react-hot-loader": "^3.0.6",
47-
"@types/uuid": "^3.4.4",
48-
"@types/webpack": "^3.8.18",
49-
"chai": "^4.2.0",
47+
"@types/uuid": "^3.4.10",
48+
"@types/webpack": "^3.8.21",
49+
"chai": "^4.3.6",
5050
"css-loader": "^0.28.11",
5151
"file-loader": "^1.1.11",
5252
"html-loader": "^0.5.5",
5353
"html-webpack-plugin": "^2.30.1",
54-
"jsdom": "^15.1.1",
54+
"jsdom": "^15.2.1",
5555
"jsdom-global": "^3.0.2",
56-
"less": "^3.9.0",
56+
"less": "^3.13.1",
5757
"less-loader": "^5.0.0",
5858
"less-plugin-autoprefix": "^2.0.0",
59-
"mocha": "^7.1.0",
59+
"mocha": "^7.2.0",
6060
"mocha-junit-reporter": "^1.23.3",
6161
"npm-run-all": "^4.1.5",
62-
"prettier": "^2.2.1",
62+
"prettier": "^2.6.1",
6363
"react": "^17.0.2",
6464
"react-dom": "^17.0.2",
6565
"react-hot-loader": "^3.1.3",
6666
"source-map-loader": "^0.2.4",
67-
"style-loader": "^0.20.2",
67+
"style-loader": "^0.20.3",
6868
"ts-loader": "^3.5.0",
69-
"ts-node": "^8.10.1",
69+
"ts-node": "^8.10.2",
7070
"tslint": "^6.1.3",
7171
"tslint-config-prettier": "^1.18.0",
7272
"tslint-plugin-prettier": "^2.3.0",
7373
"tslint-react": "^5.0.0",
74-
"typescript": "^4.2.4",
74+
"typescript": "^4.6.3",
7575
"webpack": "^3.12.0",
7676
"webpack-dev-server": "^2.11.5",
7777
"yarn-deduplicate": "^3.1.0"
@@ -80,11 +80,11 @@
8080
"classnames": "^2.3.1",
8181
"immutability-helper": "^3.1.1",
8282
"lodash": "^4.17.21",
83-
"prop-types": "^15.7.2",
84-
"react-dnd": "^14.0.2",
85-
"react-dnd-html5-backend": "^14.0.0",
83+
"prop-types": "^15.8.1",
84+
"react-dnd": "^14.0.5",
85+
"react-dnd-html5-backend": "^14.1.0",
8686
"react-dnd-multi-backend": "^6.0.2",
87-
"react-dnd-touch-backend": "^14.0.0",
87+
"react-dnd-touch-backend": "^14.1.1",
8888
"uuid": "^3.4.0"
8989
},
9090
"peerDependencies": {

src/Mosaic.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ export interface MosaicBaseProps<T extends MosaicKey> {
5151
* default: Random UUID
5252
*/
5353
mosaicId?: string;
54+
/**
55+
* Make it possible to use different versions of Blueprint with `mosaic-blueprint-theme`
56+
* Note: does not support updating after instantiation
57+
* default: 'bp3'
58+
*/
59+
blueprintNamespace?: string;
5460
}
5561

5662
export interface MosaicControlledProps<T extends MosaicKey> extends MosaicBaseProps<T> {
@@ -88,6 +94,7 @@ export class MosaicWithoutDragDropContext<T extends MosaicKey = string> extends
8894
onChange: () => void 0,
8995
zeroStateView: <MosaicZeroState />,
9096
className: 'mosaic-blueprint-theme',
97+
blueprintNamespace: 'bp3',
9198
};
9299

93100
static getDerivedStateFromProps(
@@ -179,6 +186,7 @@ export class MosaicWithoutDragDropContext<T extends MosaicKey = string> extends
179186
private readonly childContext: MosaicContext<T> = {
180187
mosaicActions: this.actions,
181188
mosaicId: this.state.mosaicId,
189+
blueprintNamespace: this.props.blueprintNamespace!,
182190
};
183191

184192
private renderTree() {

src/MosaicDropTarget.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,12 @@ class MosaicDropTargetClass extends React.PureComponent<Props> {
4848
}
4949
}
5050

51-
export const MosaicDropTarget = (DropTarget(
51+
export const MosaicDropTarget = DropTarget(
5252
MosaicDragType.WINDOW,
5353
dropTarget,
5454
(connect, monitor): DropTargetProps => ({
5555
connectDropTarget: connect.dropTarget(),
5656
isOver: monitor.isOver(),
5757
draggedMosaicId: ((monitor.getItem() || {}) as MosaicDragItem).mosaicId,
5858
}),
59-
)(MosaicDropTargetClass) as any) as React.ComponentType<MosaicDropTargetProps>;
59+
)(MosaicDropTargetClass) as any as React.ComponentType<MosaicDropTargetProps>;

src/MosaicWindow.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,10 @@ export class InternalMosaicWindow<T extends MosaicKey> extends React.Component<
165165
<button
166166
onClick={() => this.setAdditionalControlsOpen(!additionalControlsOpen)}
167167
className={classNames(
168-
OptionalBlueprint.getClasses('BUTTON', 'MINIMAL'),
169-
OptionalBlueprint.getIconClass('MORE'),
168+
OptionalBlueprint.getClasses(this.context.blueprintNamespace, 'BUTTON', 'MINIMAL'),
169+
OptionalBlueprint.getIconClass(this.context.blueprintNamespace, 'MORE'),
170170
{
171-
[OptionalBlueprint.getClasses('ACTIVE')]: additionalControlsOpen,
171+
[OptionalBlueprint.getClasses(this.context.blueprintNamespace, 'ACTIVE')]: additionalControlsOpen,
172172
},
173173
)}
174174
>
@@ -231,6 +231,7 @@ export class InternalMosaicWindow<T extends MosaicKey> extends React.Component<
231231
};
232232

233233
private readonly childContext: MosaicWindowContext = {
234+
blueprintNamespace: this.context.blueprintNamespace,
234235
mosaicWindowActions: {
235236
split: this.split,
236237
replaceWithNew: this.swap,

src/MosaicZeroState.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,23 @@ export class MosaicZeroState<T extends MosaicKey> extends React.PureComponent<Mo
1616

1717
render() {
1818
return (
19-
<div className={classNames('mosaic-zero-state', OptionalBlueprint.getClasses('NON_IDEAL_STATE'))}>
20-
<div className={OptionalBlueprint.getClasses('NON_IDEAL_STATE_VISUAL')}>
19+
<div
20+
className={classNames(
21+
'mosaic-zero-state',
22+
OptionalBlueprint.getClasses(this.context.blueprintNamespace, 'NON_IDEAL_STATE'),
23+
)}
24+
>
25+
<div className={OptionalBlueprint.getClasses(this.context.blueprintNamespace, 'NON_IDEAL_STATE_VISUAL')}>
2126
<OptionalBlueprint.Icon className="default-zero-state-icon" size="large" icon="APPLICATIONS" />
2227
</div>
23-
<h4 className={OptionalBlueprint.getClasses('HEADING')}>No Windows Present</h4>
28+
<h4 className={OptionalBlueprint.getClasses(this.context.blueprintNamespace, 'HEADING')}>No Windows Present</h4>
2429
<div>
2530
{this.props.createNode && (
2631
<button
27-
className={classNames(OptionalBlueprint.getClasses('BUTTON'), OptionalBlueprint.getIconClass('ADD'))}
32+
className={classNames(
33+
OptionalBlueprint.getClasses(this.context.blueprintNamespace, 'BUTTON'),
34+
OptionalBlueprint.getIconClass(this.context.blueprintNamespace, 'ADD'),
35+
)}
2836
onClick={this.replace}
2937
>
3038
Add New Window

src/buttons/ExpandButton.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react';
33

44
import { MosaicContext, MosaicRootActions, MosaicWindowContext } from '../contextTypes';
55
import { OptionalBlueprint } from '../util/OptionalBlueprint';
6-
import { createDefaultToolbarButton, MosaicButtonProps } from './MosaicButton';
6+
import { DefaultToolbarButton, MosaicButtonProps } from './MosaicButton';
77

88
export class ExpandButton extends React.PureComponent<MosaicButtonProps> {
99
static contextType = MosaicWindowContext;
@@ -12,13 +12,16 @@ export class ExpandButton extends React.PureComponent<MosaicButtonProps> {
1212
render() {
1313
return (
1414
<MosaicContext.Consumer>
15-
{({ mosaicActions }) =>
16-
createDefaultToolbarButton(
17-
'Expand',
18-
classNames('expand-button', OptionalBlueprint.getIconClass('MAXIMIZE')),
19-
this.createExpand(mosaicActions),
20-
)
21-
}
15+
{({ mosaicActions }) => (
16+
<DefaultToolbarButton
17+
title="Expand"
18+
className={classNames(
19+
'expand-button',
20+
OptionalBlueprint.getIconClass(this.context.blueprintNamespace, 'MAXIMIZE'),
21+
)}
22+
onClick={this.createExpand(mosaicActions)}
23+
/>
24+
)}
2225
</MosaicContext.Consumer>
2326
);
2427
}

src/buttons/MosaicButton.tsx

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,45 @@
11
import classNames from 'classnames';
22
import React from 'react';
3+
import { MosaicContext } from '../contextTypes';
34

45
import { OptionalBlueprint } from '../util/OptionalBlueprint';
56

6-
export function createDefaultToolbarButton(
7-
title: string,
8-
className: string,
9-
onClick: (event: React.MouseEvent<any>) => any,
10-
text?: string,
11-
): React.ReactElement<any> {
7+
export const DefaultToolbarButton = ({
8+
title,
9+
className,
10+
onClick,
11+
text,
12+
}: {
13+
title: string;
14+
className: string;
15+
onClick: (event: React.MouseEvent<any>) => any;
16+
text?: string;
17+
}) => {
18+
const { blueprintNamespace } = React.useContext(MosaicContext);
1219
return (
1320
<button
1421
title={title}
1522
onClick={onClick}
16-
className={classNames('mosaic-default-control', OptionalBlueprint.getClasses('BUTTON', 'MINIMAL'), className)}
23+
className={classNames(
24+
'mosaic-default-control',
25+
OptionalBlueprint.getClasses(blueprintNamespace, 'BUTTON', 'MINIMAL'),
26+
className,
27+
)}
1728
>
1829
{text && <span className="control-text">{text}</span>}
1930
</button>
2031
);
21-
}
32+
};
33+
34+
/**
35+
* @deprecated: see @DefaultToolbarButton
36+
*/
37+
export const createDefaultToolbarButton = (
38+
title: string,
39+
className: string,
40+
onClick: (event: React.MouseEvent<any>) => any,
41+
text?: string,
42+
) => <DefaultToolbarButton title={title} className={className} onClick={onClick} text={text} />;
2243

2344
export interface MosaicButtonProps {
2445
onClick?: () => void;

src/buttons/RemoveButton.tsx

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React from 'react';
33

44
import { MosaicContext, MosaicRootActions, MosaicWindowContext } from '../contextTypes';
55
import { OptionalBlueprint } from '../util/OptionalBlueprint';
6-
import { createDefaultToolbarButton, MosaicButtonProps } from './MosaicButton';
6+
import { DefaultToolbarButton, MosaicButtonProps } from './MosaicButton';
77

88
export class RemoveButton extends React.PureComponent<MosaicButtonProps> {
99
static contextType = MosaicWindowContext;
@@ -12,13 +12,13 @@ export class RemoveButton extends React.PureComponent<MosaicButtonProps> {
1212
render() {
1313
return (
1414
<MosaicContext.Consumer>
15-
{({ mosaicActions }) =>
16-
createDefaultToolbarButton(
17-
'Close Window',
18-
classNames('close-button', OptionalBlueprint.getIconClass('CROSS')),
19-
this.createRemove(mosaicActions),
20-
)
21-
}
15+
{({ mosaicActions, blueprintNamespace }) => (
16+
<DefaultToolbarButton
17+
title="Close Window"
18+
className={classNames('close-button', OptionalBlueprint.getIconClass(blueprintNamespace, 'CROSS'))}
19+
onClick={this.createRemove(mosaicActions)}
20+
/>
21+
)}
2222
</MosaicContext.Consumer>
2323
);
2424
}

src/buttons/ReplaceButton.tsx

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,22 @@ import React from 'react';
44

55
import { MosaicWindowContext } from '../contextTypes';
66
import { OptionalBlueprint } from '../util/OptionalBlueprint';
7-
import { createDefaultToolbarButton, MosaicButtonProps } from './MosaicButton';
7+
import { DefaultToolbarButton, MosaicButtonProps } from './MosaicButton';
88

99
export class ReplaceButton extends React.PureComponent<MosaicButtonProps> {
1010
static contextType = MosaicWindowContext;
1111
context!: MosaicWindowContext;
1212

1313
render() {
14-
return createDefaultToolbarButton(
15-
'Replace Window',
16-
classNames('replace-button', OptionalBlueprint.getIconClass('EXCHANGE')),
17-
this.replace,
14+
return (
15+
<DefaultToolbarButton
16+
title="Replace Window"
17+
className={classNames(
18+
'replace-button',
19+
OptionalBlueprint.getIconClass(this.context.blueprintNamespace, 'EXCHANGE'),
20+
)}
21+
onClick={this.replace}
22+
/>
1823
);
1924
}
2025

0 commit comments

Comments
 (0)