switch to blueprintjs UI toolkit

This commit is contained in:
David Lechner
2020-06-07 18:59:02 -05:00
committed by David Lechner
parent d0f5a42c85
commit d9211b5b10
14 changed files with 417 additions and 310 deletions
+3 -5
View File
@@ -3,6 +3,7 @@
"version": "0.1.0",
"private": true,
"dependencies": {
"@blueprintjs/core": "^3.28.1",
"@pybricks/firmware": "2.0.0",
"@pybricks/mpy-cross-v5": "^1.0.0",
"@shopify/react-i18n": "^4.0.0",
@@ -15,23 +16,20 @@
"@types/react": "^16.9.35",
"@types/react-dom": "^16.9.8",
"@types/react-redux": "^7.1.9",
"@types/react-transition-group": "^4.4.0",
"@types/react-splitter-layout": "^3.0.0",
"@types/redux-logger": "^3.0.8",
"@types/web-bluetooth": "^0.0.6",
"ace-builds": "^1.4.9",
"bootstrap": "^4.5.0",
"file-saver": "^2.0.2",
"jszip": "^3.4.0",
"node-sass": "^4.14.1",
"react": "^16.13.1",
"react-ace": "^9.0.0",
"react-bootstrap": "^1.0.0",
"react-dom": "^16.13.1",
"react-dropzone": "^11.0.1",
"react-redux": "^7.2.0",
"react-resize-observer": "^1.1.1",
"react-scripts": "3.4.1",
"react-transition-group": "^4.4.1",
"react-splitter-layout": "^4.0.0",
"redux": "^4.0.5",
"redux-logger": "^3.0.6",
"redux-observable": "^1.2.0",
+7 -14
View File
@@ -1,12 +1,9 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { Button, Intent, Position, Tooltip } from '@blueprintjs/core';
import { WithI18nProps, withI18n } from '@shopify/react-i18n';
import React from 'react';
import Button from 'react-bootstrap/Button';
import Image from 'react-bootstrap/Image';
import OverlayTrigger from 'react-bootstrap/OverlayTrigger';
import Tooltip from 'react-bootstrap/Tooltip';
import { TooltipId } from './button';
import en from './button.en.json';
@@ -28,16 +25,12 @@ type Props = ActionButtonProps & WithI18nProps;
class ActionButton extends React.Component<Props> {
render(): JSX.Element {
return (
<OverlayTrigger
placement="bottom"
overlay={
<Tooltip id={`${this.props.id}-tooltip`}>
{this.props.i18n.translate(this.props.tooltip)}.
</Tooltip>
}
<Tooltip
content={this.props.i18n.translate(this.props.tooltip)}
position={Position.BOTTOM}
>
<Button
variant="light"
intent={Intent.PRIMARY}
onClick={(): void => this.props.onAction()}
disabled={this.props.enabled === false}
style={
@@ -46,9 +39,9 @@ class ActionButton extends React.Component<Props> {
: undefined
}
>
<Image src={this.props.icon} alt={this.props.id} />
<img src={this.props.icon} alt={this.props.id} />
</Button>
</OverlayTrigger>
</Tooltip>
);
}
}
+67 -33
View File
@@ -1,50 +1,84 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import React from 'react';
import { Col, Row } from 'react-bootstrap';
import Container from 'react-bootstrap/Container';
import React, { EffectCallback, useEffect, useState } from 'react';
import SplitterLayout from 'react-splitter-layout';
import Editor from './Editor';
import StatusBar from './StatusBar';
import Terminal from './Terminal';
import Toolbar from './Toolbar';
import 'react-splitter-layout/lib/index.css';
function useShowDocs(): boolean {
function getShowDocs(): boolean {
return window.innerWidth >= 1024;
}
const [showDocs, setShowDocs] = useState(getShowDocs);
useEffect((): ReturnType<EffectCallback> => {
function handleResize(): void {
setShowDocs(getShowDocs());
}
window.addEventListener('resize', handleResize);
return (): void => window.removeEventListener('resize', handleResize);
}, []); // Empty array ensures that effect is only run on mount and unmount
return showDocs;
}
function App(): JSX.Element {
const showDocs = useShowDocs();
const [dragging, setDragging] = useState(false);
return (
<div>
<Container fluid>
<Row className="vh-100">
<Col md={12} lg={8} className="d-flex flex-column container-col">
<Row>
<Col>
<Toolbar />
</Col>
</Row>
<Row className="row flex-grow-1">
<Col>
<Editor />
</Col>
</Row>
<Row>
<Col className="terminal py-2">
<Terminal />
</Col>
</Row>
<Row className="mt-2">
<Col>
<StatusBar />
</Col>
</Row>
</Col>
<Col lg={4} className="embed-responsive d-lg-block d-md-none">
<div className="app">
<Toolbar />
<SplitterLayout
customClassName="app-main"
onDragStart={(): void => setDragging(true)}
onDragEnd={(): void => setDragging(false)}
percentage={true}
secondaryInitialSize={Number(
localStorage.getItem('app-main-split') || 30,
)}
onSecondaryPaneSizeChange={(value): void =>
localStorage.setItem('app-main-split', String(value))
}
>
<SplitterLayout
vertical={true}
percentage={true}
secondaryInitialSize={Number(
localStorage.getItem('app-docs-split') || 30,
)}
onSecondaryPaneSizeChange={(value): void =>
localStorage.setItem('app-docs-split', String(value))
}
>
<Editor />
<div className="terminal-padding">
<Terminal />
</div>
</SplitterLayout>
{showDocs && (
<div className="docs-iframe">
{dragging && <div className="docs-iframe-overlay" />}
<iframe
src="https://docs.pybricks.com"
allowFullScreen={true}
title="docs"
></iframe>
</Col>
</Row>
</Container>
width="100%"
height="100%"
frameBorder="none"
/>
</div>
)}
</SplitterLayout>
<StatusBar />
</div>
);
}
+31 -10
View File
@@ -1,9 +1,12 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import React, { ReactElement } from 'react';
import { ResizeSensor } from '@blueprintjs/core';
import { Ace } from 'ace-builds';
import React from 'react';
import AceEditor from 'react-ace';
import { ReactReduxContext } from 'react-redux';
import { connect } from 'react-redux';
import { Action, Dispatch } from '../actions';
import { setEditSession } from '../actions/editor';
import 'ace-builds/src-noconflict/mode-python';
@@ -11,16 +14,30 @@ import 'ace-builds/src-noconflict/theme-xcode';
import 'ace-builds/src-min-noconflict/ext-searchbox';
import 'ace-builds/src-min-noconflict/ext-language_tools';
class Editor extends React.Component {
type DispatchProps = { onSessionChanged: (session?: Ace.EditSession) => void };
type EditorProps = DispatchProps;
class Editor extends React.Component<EditorProps> {
private editorRef: React.RefObject<AceEditor>;
constructor(props: EditorProps) {
super(props);
this.editorRef = React.createRef();
}
render(): JSX.Element {
return (
<ReactReduxContext.Consumer>
{({ store }): ReactElement => (
<ResizeSensor
onResize={(): void => this.editorRef.current?.editor?.resize()}
>
<div className="editor-container">
<AceEditor
ref={this.editorRef}
mode="python"
theme="xcode"
fontSize="16pt"
width="100"
width="100%"
height="100%"
focus={true}
placeholder="Write your program here..."
@@ -31,7 +48,7 @@ class Editor extends React.Component {
enableLiveAutocompletion: true,
}}
onFocus={(_, e): void => {
store.dispatch(setEditSession(e?.session));
this.props.onSessionChanged(e?.session);
}}
onChange={(v): void => localStorage.setItem('program', v)}
commands={[
@@ -47,10 +64,14 @@ class Editor extends React.Component {
},
]}
/>
)}
</ReactReduxContext.Consumer>
</div>
</ResizeSensor>
);
}
}
export default Editor;
const mapDispatchToProps = (dispatch: Dispatch): DispatchProps => ({
onSessionChanged: (s): Action => dispatch(setEditSession(s)),
});
export default connect(undefined, mapDispatchToProps)(Editor);
+49 -36
View File
@@ -1,12 +1,13 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { IconName, Intent, Toast } from '@blueprintjs/core';
import { WithI18nProps, withI18n } from '@shopify/react-i18n';
import React from 'react';
import Toast from 'react-bootstrap/Toast';
import { connect } from 'react-redux';
import { Dispatch } from '../actions';
import { remove } from '../actions/notification';
import { NotificationLevel, remove } from '../actions/notification';
import { Level } from '../reducers/notification';
import en from './notification.en.json';
interface DispatchProps {
@@ -15,7 +16,7 @@ interface DispatchProps {
interface OwnProps {
id: number;
style: string;
level: NotificationLevel;
message?: string;
messageId?: string;
helpUrl?: string;
@@ -23,51 +24,63 @@ interface OwnProps {
type NotificationProps = DispatchProps & OwnProps & WithI18nProps;
function mapTitle(style: string): string {
switch (style) {
case 'danger':
return 'Error';
case 'warning':
return 'Warning';
function mapIntent(level: NotificationLevel): Intent {
switch (level) {
case Level.Error:
return Intent.DANGER;
case Level.Warning:
return Intent.WARNING;
case Level.Info:
return Intent.PRIMARY;
default:
return 'Info';
return Intent.NONE;
}
}
function mapIcon(level: NotificationLevel): IconName | undefined {
switch (level) {
case Level.Error:
return 'error';
case Level.Warning:
return 'warning-sign';
case Level.Info:
return 'info-sign';
default:
return undefined;
}
}
class Notification extends React.Component<NotificationProps> {
render(): JSX.Element {
const title = mapTitle(this.props.style);
return (
<Toast
onClose={(): void => {
onDismiss={(): void => {
this.props.onClose();
}}
transition={false}
>
<Toast.Header>
<strong className={`mr-auto text-${this.props.style}`}>
{title}
</strong>
</Toast.Header>
<Toast.Body>
<p>
{this.props.messageId
? this.props.i18n.translate(this.props.messageId)
: this.props.message || 'missing message!'}
</p>
<p>
timeout={0}
intent={mapIntent(this.props.level)}
icon={mapIcon(this.props.level)}
message={
<div>
<p>
{this.props.messageId
? this.props.i18n.translate(this.props.messageId)
: this.props.message || 'missing message!'}
</p>
{this.props.helpUrl && (
<a
href={this.props.helpUrl}
target="_blank"
rel="noopener noreferrer"
>
More info
</a>
<p>
<a
href={this.props.helpUrl}
target="_blank"
rel="noopener noreferrer"
>
More info
</a>
</p>
)}
</p>
</Toast.Body>
</Toast>
</div>
}
/>
);
}
}
+14 -39
View File
@@ -1,12 +1,11 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { Toaster } from '@blueprintjs/core';
import React from 'react';
import { Collapse } from 'react-bootstrap';
import { connect } from 'react-redux';
import { TransitionGroup } from 'react-transition-group';
import { RootState } from '../reducers';
import { Level, NotificationList } from '../reducers/notification';
import { NotificationList } from '../reducers/notification';
import Notification from './Notification';
interface StateProps {
@@ -15,45 +14,21 @@ interface StateProps {
type NotificationStackProps = StateProps;
function mapLevelToStyle(level: Level): string {
switch (level) {
case Level.Error:
return 'danger';
case Level.Warning:
return 'warning';
case Level.Info:
return 'info';
}
}
class NotificationStack extends React.Component<NotificationStackProps> {
render(): JSX.Element {
return (
<div aria-live="polite" aria-atomic="true" style={{ position: 'relative' }}>
<div
style={{
position: 'absolute',
top: '10px',
right: '10px',
minWidth: '350px',
zIndex: 999,
}}
>
<TransitionGroup>
{this.props.list.map((n) => (
<Collapse key={n.id} in={true}>
<Notification
id={n.id}
style={mapLevelToStyle(n.level)}
message={n.message}
messageId={n.messageId}
helpUrl={n.helpUrl}
/>
</Collapse>
))}
</TransitionGroup>
</div>
</div>
<Toaster>
{this.props.list.map((n) => (
<Notification
id={n.id}
key={n.id}
level={n.level}
message={n.message}
messageId={n.messageId}
helpUrl={n.helpUrl}
/>
))}
</Toaster>
);
}
}
+7 -14
View File
@@ -1,12 +1,9 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { Button, Intent, Position, Tooltip } from '@blueprintjs/core';
import { WithI18nProps, withI18n } from '@shopify/react-i18n';
import React from 'react';
import Button from 'react-bootstrap/Button';
import Image from 'react-bootstrap/Image';
import OverlayTrigger from 'react-bootstrap/OverlayTrigger';
import Tooltip from 'react-bootstrap/Tooltip';
import Dropzone, { FileRejection } from 'react-dropzone';
import { TooltipId } from './button';
import en from './button.en.json';
@@ -81,17 +78,13 @@ class OpenFileButton extends React.Component<Props> {
noKeyboard={this.props.onClick !== undefined}
>
{({ getRootProps, getInputProps }): JSX.Element => (
<OverlayTrigger
placement="bottom"
overlay={
<Tooltip id={`${this.props.id}-tooltip`}>
{this.props.i18n.translate(this.props.tooltip)}.
</Tooltip>
}
<Tooltip
content={this.props.i18n.translate(this.props.tooltip)}
position={Position.BOTTOM}
>
<Button
{...getRootProps()}
variant="light"
intent={Intent.PRIMARY}
disabled={this.props.enabled === false}
style={
this.props.enabled === false
@@ -106,9 +99,9 @@ class OpenFileButton extends React.Component<Props> {
: {})}
>
<input {...getInputProps()} />
<Image src={this.props.icon} alt={this.props.id} />
<img src={this.props.icon} alt={this.props.id} />
</Button>
</OverlayTrigger>
</Tooltip>
)}
</Dropzone>
);
+7 -3
View File
@@ -1,8 +1,8 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { ProgressBar } from '@blueprintjs/core';
import React from 'react';
import ProgressBar from 'react-bootstrap/ProgressBar';
import { connect } from 'react-redux';
import { RootState } from '../reducers';
@@ -13,8 +13,12 @@ type StatusProps = StateProps;
class StatusBar extends React.Component<StatusProps> {
render(): JSX.Element {
return (
<div className="status-bar p-2">
<ProgressBar className="w-25" now={this.props.progress} />
<div className="status-bar">
<ProgressBar
className="status-bar-item"
value={this.props.progress}
animate={false}
/>
</div>
);
}
+4 -8
View File
@@ -1,9 +1,9 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { ResizeSensor } from '@blueprintjs/core';
import React from 'react';
import { connect } from 'react-redux';
import ResizeObserver from 'react-resize-observer';
import { Subscription } from 'rxjs';
import { Terminal as XTerm } from 'xterm';
import { FitAddon } from 'xterm-addon-fit';
@@ -62,13 +62,9 @@ class Terminal extends React.Component<TerminalProps> {
render(): JSX.Element {
return (
<div
id="terminal"
ref={this.terminalRef}
style={{ height: 'inherit', width: 'inherit' }}
>
<ResizeObserver onResize={(): void => this.fitAddon.fit()} />
</div>
<ResizeSensor onResize={(): void => this.fitAddon.fit()}>
<div className="terminal-container" ref={this.terminalRef} />
</ResizeSensor>
);
}
}
+20 -17
View File
@@ -1,9 +1,8 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { ButtonGroup, Navbar } from '@blueprintjs/core';
import React from 'react';
import ButtonGroup from 'react-bootstrap/ButtonGroup';
import ButtonToolbar from 'react-bootstrap/ButtonToolbar';
import BluetoothButton from './BluetoothButton';
import FlashButton from './FlashButton';
import OpenButton from './OpenButton';
@@ -15,21 +14,25 @@ import StopButton from './StopButton';
class Toolbar extends React.Component {
render(): JSX.Element {
return (
<ButtonToolbar className="m-2">
<ButtonGroup className="mr-2" size="lg">
<OpenButton id="open" />
<SaveAsButton id="saveAs" />
</ButtonGroup>
<ButtonGroup className="mr-2" size="lg">
<BluetoothButton id="bluetooth" />
<RunButton id="run" />
<StopButton id="stop" />
</ButtonGroup>
<ButtonGroup className="mr-2" size="lg">
<ReplButton id="repl" />
<FlashButton id="flash" />
</ButtonGroup>
</ButtonToolbar>
<Navbar fixedToTop={true}>
<Navbar.Group>
<ButtonGroup>
<OpenButton id="open" />
<SaveAsButton id="saveAs" />
</ButtonGroup>
<Navbar.Divider />
<ButtonGroup>
<BluetoothButton id="bluetooth" />
<RunButton id="run" />
<StopButton id="stop" />
</ButtonGroup>
<Navbar.Divider />
<ButtonGroup>
<ReplButton id="repl" />
<FlashButton id="flash" />
</ButtonGroup>
</Navbar.Group>
</Navbar>
);
}
}
+79 -19
View File
@@ -1,36 +1,96 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
// Override default variables before the import
$body-bg: #e8e8e8;
@import '@blueprintjs/core/lib/scss/variables.scss';
// Import Bootstrap and its default variables
@import '~bootstrap/scss/bootstrap';
// override variables here
// See https://blueprintjs.com/docs/#core/variables
.terminal {
height: 15vh;
$pt-navbar-height: 72px;
$pybricks-blue: #0088ce;
$pt-intent-primary: $pybricks-blue;
$pt-outline-color: rgba($pybricks-blue, 0.6);
$navbar-backgound-color: $pt-app-background-color;
$dark-navbar-background-color: $pt-dark-app-background-color;
@import '~normalize.css';
@import '@blueprintjs/core/src/blueprint.scss';
$status-bar-height: 3vh;
:root {
--mobile-pad: 0px;
}
.container-col {
padding: 0px;
padding-right: 8px;
body {
// no scrolling of the page
overflow: hidden;
// See https://blueprintjs.com/docs/#core/components/navbar
padding-top: $pt-navbar-height;
}
.docs-iframe {
height: 100%;
width: 100%;
}
.docs-iframe-overlay {
position: absolute;
height: 100%;
width: 100%;
}
.editor-container {
height: 100%;
}
.terminal-padding {
padding-left: 10px;
height: 100%;
}
.terminal-container {
height: 100%;
}
.app-main {
// height makes everything fit without scrolling
height: calc(100vh - #{$pt-navbar-height} - #{$status-bar-height} - var(--mobile-pad)) !important;
}
.status-bar {
background-color: #0088ce;
position: fixed;
top: calc(100vh - #{$status-bar-height} - var(--mobile-pad));
background-color: $pybricks-blue;
height: $status-bar-height;
width: 100vw;
display: flex;
align-items: center;
}
.btn-light, .btn-light:focus {
background-color: #0088ce;
border-width: 0px;
.status-bar-item {
width: 25%;
margin-left: 10px;
}
.btn-light:disabled {
background-color: #65acd0;
border-width: 0px;
.bp3-progress-bar.status-bar-item {
// override progress bar default gray1 backgound
background-color: $pt-app-background-color;
}
.btn-light:hover, .btn-light:active {
background-color: #005885 !important;
border-width: 0px;
.bp3-navbar-divider {
// don't draw vertical line since we are just using button groups
border-left: unset;
}
.ace_gutter {
// make ace editor match app backgound color
background-color: $pt-app-background-color !important;
}
.layout-splitter {
// make layout splitter match app color scheme
background-color: $pt-divider-black !important;
}
+16
View File
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MIT
// Copyright (c) 2020 The Pybricks Authors
import { ResizeSensor } from '@blueprintjs/core';
import { I18nContext, I18nManager } from '@shopify/react-i18n';
import React from 'react';
import ReactDOM from 'react-dom';
@@ -46,6 +47,21 @@ ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<I18nContext.Provider value={i18n}>
{/* This is a hack for correctly sizing to view height on mobile when not running in fullscreen mode. */}
{/* https://css-tricks.com/the-trick-to-viewport-units-on-mobile/ */}
<ResizeSensor
onResize={(e): void => {
document.documentElement.style.setProperty(
'--mobile-pad',
`${e[0].contentRect.height - window.innerHeight}px`,
);
}}
>
<div
id="vh"
style={{ height: '100vh', width: '0px', position: 'absolute' }}
/>
</ResizeSensor>
<NotificationStack />
<App />
</I18nContext.Provider>
+1 -1
View File
@@ -8,7 +8,7 @@ import { BootloaderAction, BootloaderActionType } from '../actions/lwp3-bootload
const progress: Reducer<number, BootloaderAction> = (state = -1, action) => {
switch (action.type) {
case BootloaderActionType.FlashProgress:
return (action.complete / action.total) * 100;
return action.complete / action.total;
default:
return state;
}
+112 -111
View File
@@ -1069,7 +1069,7 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
version "7.10.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839"
integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==
@@ -1109,6 +1109,31 @@
lodash "^4.17.13"
to-fast-properties "^2.0.0"
"@blueprintjs/core@^3.28.1":
version "3.28.1"
resolved "https://registry.yarnpkg.com/@blueprintjs/core/-/core-3.28.1.tgz#cb4056c9637b09d8b8c46bd4efe7363cdb796b8d"
integrity sha512-Ws4+FrtHh5U4TMaqhFW1PXajJobn2By72LOxu18q8ksY4CuyUzvo8xIOooViQdA7ZLx9pwhC6dytsYdykwRy0w==
dependencies:
"@blueprintjs/icons" "^3.18.0"
"@types/dom4" "^2.0.1"
classnames "^2.2"
dom4 "^2.1.5"
normalize.css "^8.0.1"
popper.js "^1.15.0"
react-lifecycles-compat "^3.0.4"
react-popper "^1.3.7"
react-transition-group "^2.9.0"
resize-observer-polyfill "^1.5.1"
tslib "~1.10.0"
"@blueprintjs/icons@^3.18.0":
version "3.18.0"
resolved "https://registry.yarnpkg.com/@blueprintjs/icons/-/icons-3.18.0.tgz#acf7a6915baeb0558d1bec323c0083dbae48ae51"
integrity sha512-emvW6AHWcilE3QoYnTs0eCkAZvpn13liTLnfajMfMVPB2/KKeYDa+TVbEqhVXWhrPanXkvJlZCVcizQvFeEYxw==
dependencies:
classnames "^2.2"
tslib "~1.10.0"
"@cnakazawa/watch@^1.0.3":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
@@ -1330,11 +1355,6 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@popperjs/core@^2.0.0":
version "2.4.0"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.0.tgz#0e1bdf8d021e7ea58affade33d9d607e11365915"
integrity sha512-NMrDy6EWh9TPdSRiHmHH2ye1v5U0gBD7pRYwSwJvomx7Bm4GG04vu63dYiVzebLOx2obPpJugew06xVP0Nk7hA==
"@pybricks/firmware@2.0.0":
version "2.0.0"
resolved "https://npm.pkg.github.com/download/@pybricks/firmware/2.0.0/9ce17f084d6beb8f820d9fbd55d5b7f4238eeba9d935c12bbc1c2bc0d09a1fff#63ef2b783f3ffa52e0dc253a16bee9a939fea791"
@@ -1389,19 +1409,6 @@
resolved "https://registry.yarnpkg.com/@redux-saga/types/-/types-1.1.0.tgz#0e81ce56b4883b4b2a3001ebe1ab298b84237204"
integrity sha512-afmTuJrylUU/0OtqzaRkbyYFFNgCF73Bvel/sw90pvGrWIZ+vyoIJqA6eMSoA6+nb443kTmulmBtC9NerXboNg==
"@restart/context@^2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02"
integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==
"@restart/hooks@^0.3.12", "@restart/hooks@^0.3.21":
version "0.3.25"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.25.tgz#11004139ad1c70d2f5965a8939dcb5aeb96aa652"
integrity sha512-m2v3N5pxTsIiSH74/sb1yW8D9RxkJidGW+5Mfwn/lHb2QzhZNlaU1su7abSyT9EGf0xS/0waLjrf7/XxQHUk7w==
dependencies:
lodash "^4.17.15"
lodash-es "^4.17.15"
"@shopify/dates@^0.3.6":
version "0.3.6"
resolved "https://registry.yarnpkg.com/@shopify/dates/-/dates-0.3.6.tgz#5118ae0b16cbe384dcb7ae19c21f17c6396e8302"
@@ -1654,6 +1661,11 @@
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
"@types/dom4@^2.0.1":
version "2.0.1"
resolved "https://registry.yarnpkg.com/@types/dom4/-/dom4-2.0.1.tgz#506d5781b9bcab81bd9a878b198aec7dee2a6033"
integrity sha512-kSkVAvWmMZiCYtvqjqQEwOmvKwcH+V4uiv3qPQ8pAh1Xl39xggGEo8gHUqV4waYGHezdFw0rKBR8Jt0CrQSDZA==
"@types/eslint-visitor-keys@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
@@ -1766,14 +1778,14 @@
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
"@types/react-transition-group@^4.4.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.0.tgz#882839db465df1320e4753e6e9f70ca7e9b4d46d"
integrity sha512-/QfLHGpu+2fQOqQaXh8MG9q03bFENooTb/it4jr5kKaZlDQfWvjqWZg48AwzPVMBHlRuTRAY7hRHCEOXz5kV6w==
"@types/react-splitter-layout@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/react-splitter-layout/-/react-splitter-layout-3.0.0.tgz#36f551fa8c7729ecd00c5a6a6e514e59f0190919"
integrity sha512-93cz94WYlT+91GC7DKWNogMRHCoW/T89AnJMxQiQwNs22XROwE/zX1oZt44ixyLVzITuwplyjwj1Jcg4VPzrbQ==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@^16.9.11", "@types/react@^16.9.23", "@types/react@^16.9.35":
"@types/react@*", "@types/react@^16.9.35":
version "16.9.35"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368"
integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ==
@@ -1800,11 +1812,6 @@
dependencies:
"@types/jest" "*"
"@types/warning@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52"
integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=
"@types/web-bluetooth@^0.0.6":
version "0.0.6"
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.6.tgz#71b56427353d3495ac7ba9a4d7a13c8f312f9c1e"
@@ -2714,11 +2721,6 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
bootstrap@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.0.tgz#97d9dbcb5a8972f8722c9962483543b907d9b9ec"
integrity sha512-Z93QoXvodoVslA+PWNdk23Hze4RBYIkpb5h8I2HY2Tu2h7A0LpAgLcyrhrSUyo2/Oxm2l1fRZPs1e5hnxnliXA==
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -3180,7 +3182,7 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
classnames@^2.2.6:
classnames@^2.2:
version "2.2.6"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
@@ -3557,6 +3559,14 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
safe-buffer "^5.0.1"
sha.js "^2.4.8"
create-react-context@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c"
integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==
dependencies:
gud "^1.0.0"
warning "^4.0.3"
cross-spawn@7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14"
@@ -3823,7 +3833,7 @@ cssstyle@^1.0.0, cssstyle@^1.1.1:
dependencies:
cssom "0.3.x"
csstype@^2.2.0, csstype@^2.6.7:
csstype@^2.2.0:
version "2.6.10"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.10.tgz#e63af50e66d7c266edb6b32909cfd0aabe03928b"
integrity sha512-D34BqZU4cIlMCY93rZHbrq9pjTAQJ3U8S8rfBqjwHxkGPThWFjzZDQpgMJY0QViLxth6ZKYiwFBo14RdN44U/w==
@@ -3905,7 +3915,7 @@ deep-diff@^0.3.5:
resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84"
integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ=
deep-equal@^1.0.1:
deep-equal@^1.0.1, deep-equal@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
@@ -4104,13 +4114,12 @@ dom-converter@^0.2:
dependencies:
utila "~0.4"
dom-helpers@^5.0.1, dom-helpers@^5.1.0, dom-helpers@^5.1.2:
version "5.1.4"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.4.tgz#4609680ab5c79a45f2531441f1949b79d6587f4b"
integrity sha512-TjMyeVUvNEnOnhzs6uAn9Ya47GmMo3qq7m+Lr/3ON0Rs5kHvb8I+SQYjLUSYn7qhEm0QjW0yrBkvz9yOrwwz1A==
dom-helpers@^3.4.0:
version "3.4.0"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
dependencies:
"@babel/runtime" "^7.8.7"
csstype "^2.6.7"
"@babel/runtime" "^7.1.2"
dom-serializer@0:
version "0.2.2"
@@ -4120,6 +4129,11 @@ dom-serializer@0:
domelementtype "^2.0.1"
entities "^2.0.0"
dom4@^2.1.5:
version "2.1.5"
resolved "https://registry.yarnpkg.com/dom4/-/dom4-2.1.5.tgz#f98a94eb67b340f0fa5b42b0ee9c38cda035428e"
integrity sha512-gJbnVGq5zaBUY0lUh0LUEVGYrtN75Ks8ZwpwOYvnVFrKy/qzXK4R/1WuLIFExWj/tBxbRAkTzZUGJHXmqsBNjQ==
domain-browser@^1.1.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
@@ -5381,6 +5395,11 @@ growly@^1.3.0:
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
gud@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
gzip-size@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
@@ -7110,11 +7129,6 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
lodash-es@^4.17.15:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
lodash._reinterpolate@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -7794,6 +7808,11 @@ normalize-url@^3.0.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
normalize.css@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-8.0.1.tgz#9b98a208738b9cc2634caacbc42d131c97487bf3"
integrity sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==
npm-run-path@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
@@ -8447,6 +8466,11 @@ pnp-webpack-plugin@1.6.4:
dependencies:
ts-pnp "^1.1.6"
popper.js@^1.14.4, popper.js@^1.15.0:
version "1.16.1"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
portfinder@^1.0.25:
version "1.0.26"
resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70"
@@ -9217,15 +9241,7 @@ prompts@^2.0.1:
kleur "^3.0.3"
sisteransi "^1.0.4"
prop-types-extra@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b"
integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
dependencies:
react-is "^16.3.2"
warning "^4.0.0"
prop-types@^15.6.2, prop-types@^15.7.2:
prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
@@ -9407,25 +9423,6 @@ react-app-polyfill@^1.0.6:
regenerator-runtime "^0.13.3"
whatwg-fetch "^3.0.0"
react-bootstrap@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.0.1.tgz#044b51f34a9db8e17dbfb321a71267a8d6ad11b4"
integrity sha512-xMHwsvDN7sIv26P9wWiosWjITZije2dRCjEJHVfV2KFoSJY+8uv2zttEw0XMB7xviQcW3zuIGLJXuj8vf6lYEg==
dependencies:
"@babel/runtime" "^7.4.2"
"@restart/context" "^2.1.4"
"@restart/hooks" "^0.3.21"
"@types/react" "^16.9.23"
classnames "^2.2.6"
dom-helpers "^5.1.2"
invariant "^2.2.4"
prop-types "^15.7.2"
prop-types-extra "^1.1.0"
react-overlays "^3.1.2"
react-transition-group "^4.0.0"
uncontrollable "^7.0.0"
warning "^4.0.3"
react-dev-utils@^10.2.1:
version "10.2.1"
resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19"
@@ -9480,7 +9477,7 @@ react-error-overlay@^6.0.7:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108"
integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA==
react-is@^16.12.0, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0:
react-is@^16.12.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.9.0:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
@@ -9490,19 +9487,18 @@ react-lifecycles-compat@^3.0.4:
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-overlays@^3.1.2:
version "3.2.0"
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-3.2.0.tgz#ed8335adb0871e701b0fc8396c44dfd2467e7a55"
integrity sha512-YTgCmw6l4uBOYylSnc3V8WLX+A0EoGnzDrqkYz0K7MUKbMBZFpaxLXH4EF9eZbspd+syZHQ5XAABI7n/zak1EA==
react-popper@^1.3.7:
version "1.3.7"
resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324"
integrity sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww==
dependencies:
"@babel/runtime" "^7.4.5"
"@popperjs/core" "^2.0.0"
"@restart/hooks" "^0.3.12"
"@types/warning" "^3.0.0"
dom-helpers "^5.1.0"
prop-types "^15.7.2"
uncontrollable "^7.0.0"
warning "^4.0.3"
"@babel/runtime" "^7.1.2"
create-react-context "^0.3.0"
deep-equal "^1.1.1"
popper.js "^1.14.4"
prop-types "^15.6.1"
typed-styles "^0.0.7"
warning "^4.0.2"
react-redux@^7.2.0:
version "7.2.0"
@@ -9515,11 +9511,6 @@ react-redux@^7.2.0:
prop-types "^15.7.2"
react-is "^16.9.0"
react-resize-observer@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/react-resize-observer/-/react-resize-observer-1.1.1.tgz#641dfa2e0f4bd2549a8ab4bbbaf43b68f3dcaf76"
integrity sha512-3R+90Hou90Mr3wJYc+unsySC8Pn91V4nmjO32NKvUvjphRUbq9HisyLg7bDyGBE7xlMrrM6Fax7iNQaFdc/FYA==
react-scripts@3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-3.4.1.tgz#f551298b5c71985cc491b9acf3c8e8c0ae3ada0a"
@@ -9580,15 +9571,20 @@ react-scripts@3.4.1:
optionalDependencies:
fsevents "2.1.2"
react-transition-group@^4.0.0, react-transition-group@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9"
integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==
react-splitter-layout@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/react-splitter-layout/-/react-splitter-layout-4.0.0.tgz#70b43ca6a78c056f5e5fbf29c67b597f040fbf2e"
integrity sha512-SLqOjBOxRuizWUa83w6q5/u9cDWa9/yj9Iko9V9JFN8x+cqIXiDlUFWSx+icz3IIgvsN/oRIw3za5/32RjIwrA==
react-transition-group@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
dependencies:
"@babel/runtime" "^7.5.5"
dom-helpers "^5.0.1"
dom-helpers "^3.4.0"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react-lifecycles-compat "^3.0.4"
react@^16.13.1:
version "16.13.1"
@@ -9930,6 +9926,11 @@ requires-port@^1.0.0:
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
resize-observer-polyfill@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464"
integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
resolve-cwd@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
@@ -11202,6 +11203,11 @@ tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
tslib@~1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
tsutils@^3.17.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -11261,6 +11267,11 @@ type@^2.0.0:
resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3"
integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==
typed-styles@^0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9"
integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==
typedarray@^0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
@@ -11290,16 +11301,6 @@ typescript@~3.9.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a"
integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==
uncontrollable@^7.0.0:
version "7.1.1"
resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.1.1.tgz#f67fed3ef93637126571809746323a9db815d556"
integrity sha512-EcPYhot3uWTS3w00R32R2+vS8Vr53tttrvMj/yA1uYRhf8hbTG2GyugGqWDY0qIskxn0uTTojVd6wPYW9ZEf8Q==
dependencies:
"@babel/runtime" "^7.6.3"
"@types/react" "^16.9.11"
invariant "^2.2.4"
react-lifecycles-compat "^3.0.4"
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@@ -11551,7 +11552,7 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.x"
warning@^4.0.0, warning@^4.0.3:
warning@^4.0.2, warning@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==