Merge pull request #14 from turniere/ticket/TURNIERE-139

Adjustment of the `/create` page
This commit is contained in:
betanummeric 2019-04-17 08:39:21 +02:00 committed by GitHub
commit 75b4733662
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 427 additions and 49 deletions

View File

@ -340,6 +340,7 @@ const default_applicationstate = {
};
var __store;
var applicationHydrated = false;
export function initializeStore(initialState = default_applicationstate) {
__store = createStore(
@ -348,7 +349,9 @@ export function initializeStore(initialState = default_applicationstate) {
composeWithDevTools(applyMiddleware(thunkMiddleware))
);
__store.subscribe(() => {
localStorage.setItem('reduxState', JSON.stringify(__store.getState()));
if(applicationHydrated) {
localStorage.setItem('reduxState', JSON.stringify(__store.getState()));
}
});
return __store;
}
@ -449,11 +452,12 @@ function rehydrateApplicationState() {
if(persistedState) {
__store.dispatch({
type : actiontypes_userinfo.REHYDRATE,
parameters : Object.assign({}, persistedState.userinfo, {})
parameters : Object.assign({}, persistedState.userinfo)
});
__store.dispatch({
type : actiontypes_tournamentinfo.REHYDRATE,
parameters : Object.assign({}, persistedState.tournamentinfo, {})
parameters : Object.assign({}, persistedState.tournamentinfo)
});
applicationHydrated = true;
}
}

View File

@ -1,54 +1,243 @@
import React from 'react';
import {
Alert,
Button,
Button,
Card,
CardBody,
CardTitle,
Input,
InputGroup,
InputGroupAddon
} from 'reactstrap';
import '../../static/css/editablestringlist.css';
export default class EditableStringList extends React.Component {
constructor(props) {
super(props);
this.state = {
entries: props.entries
groupSize: props.groupSize,
teams: props.teams,
groups: props.groups
};
this.add = this.add.bind(this);
this.remove = this.remove.bind(this);
this.onGroupSwitch = this.onGroupSwitch.bind(this);
}
add(text) {
if (text === '' || this.state.entries.includes(text)) {
if (text === '' || this.state.teams.includes(text)) {
return false;
}
this.state.entries.push(text);
this.setState({entries: this.state.entries});
this.props.onChange(this.state.entries);
this.state.teams.push(text);
var lastGroup = this.state.groups[this.state.groups.length - 1];
if(lastGroup === undefined || lastGroup.length >= this.state.groupSize) {
this.state.groups[this.state.groups.length] = [];
}
lastGroup = this.state.groups[this.state.groups.length - 1];
lastGroup[lastGroup.length] = text;
this.setState({
teams: this.state.teams,
groups: this.state.groups
});
this.props.onTeamsChange(this.state.teams);
this.props.onGroupsChange(this.state.groups);
return true;
}
remove(text) {
let tmp = this.state.entries.filter(item => item !== text);
this.setState({entries: tmp});
this.props.onChange(tmp);
if(this.removeTeamFromGroup(text) === false) {
return false;
}
this.setState({
teams: this.state.teams,
groups: this.state.groups
});
this.props.onTeamsChange(this.state.teams);
this.props.onGroupsChange(this.state.groups);
}
removeTeamFromGroup(text) {
this.state.teams = this.state.teams.filter(item => item !== text);
let teamIndex = this.findTeam(text);
if(teamIndex === null) {
return false;
}
// Move every first team to the next group
this.state.groups[teamIndex.group].splice(teamIndex.team, 1);
for(var group = teamIndex.group; group < this.state.groups.length - 1; group++) {
let currentGroup = this.state.groups[group];
currentGroup[currentGroup.length] = this.state.groups[group + 1].splice(0, 1)[0];
}
// delete the last group in case it is empty
if(this.state.groups[this.state.groups.length - 1].length === 0) {
this.state.groups.splice(this.state.groups.length - 1, 1);
}
return true;
}
findTeam(text) {
for(var group = 0; group < this.state.groups.length; group++) {
for(var team = 0; team < this.state.groups[group].length; team++) {
if(this.state.groups[group][team] === text) {
return {
group: group,
team: team
};
}
}
}
return null;
}
resizeGroups(newSize) {
let oldGroups = this.state.groups;
var rearrangedGroups = [];
for(var oldGroupIndex = 0; oldGroupIndex < oldGroups.length; oldGroupIndex++) {
for(var oldTeamIndex = 0; oldTeamIndex < oldGroups[oldGroupIndex].length; oldTeamIndex++) {
let index = oldGroupIndex * this.state.groupSize + oldTeamIndex;
let newGroupIndex = Math.floor(index / newSize);
let newTeamIndex = index % newSize;
if(newTeamIndex === 0) {
rearrangedGroups[newGroupIndex] = [];
}
rearrangedGroups[newGroupIndex][newTeamIndex] = oldGroups[oldGroupIndex][oldTeamIndex];
}
}
this.setState({
groupSize: newSize,
groups: rearrangedGroups
});
this.props.onGroupsChange(this.state.groups);
}
onGroupSwitch(src, dest) {
const groupCopy = this.state.groups.slice();
const srcTeam = groupCopy[src.group][src.team];
const destTeam = groupCopy[dest.group][dest.team];
groupCopy[src.group].splice(src.team, 1, destTeam);
groupCopy[dest.group].splice(dest.team, 1, srcTeam);
this.setState({
groups: groupCopy
});
this.props.onGroupsChange(this.state.groups);
}
render() {
if ((typeof this.state.entries !== 'undefined') && this.state.entries.length > 0) {
return (
<div className="bg-light p-3 text-secondary font-italic">
<StringInput submit={this.add} placeholder={this.props.inputPlaceholder} addButtonText={this.props.addButtonText}/>
{this.state.entries.map((text) => <Item text={text} key={text} removeItem={this.remove}/>)}
</div>
);
} else {
return (
<div className="bg-light p-3 text-secondary text-center font-italic">
<StringInput submit={this.add} placeholder={this.props.inputPlaceholder} addButtonText={this.props.addButtonText}/>
{this.props.placeholder}
</div>
);
if(this.props.groupSize !== this.state.groupSize) {
this.resizeGroups(this.props.groupSize);
}
if(this.props.groupPhaseEnabled) {
if ((typeof this.state.teams !== 'undefined') && this.state.teams.length > 0) {
return (
<div className="bg-light p-3 text-secondary font-italic">
<StringInput submit={this.add} placeholder={this.props.inputPlaceholder} addButtonText={this.props.addButtonText}/>
<GroupView groups={this.state.groups} removeTeam={this.remove} onGroupSwitched={this.onGroupSwitch}/>
</div>
);
} else {
return (
<div className="bg-light p-3 text-secondary text-center font-italic">
<StringInput submit={this.add} placeholder={this.props.inputPlaceholder} addButtonText={this.props.addButtonText}/>
{this.props.groupPlaceHolder}
</div>
);
}
} else {
if ((typeof this.state.teams !== 'undefined') && this.state.teams.length > 0) {
return (
<div className="bg-light p-3 text-secondary font-italic">
<StringInput submit={this.add} placeholder={this.props.inputPlaceholder} addButtonText={this.props.addButtonText}/>
{this.state.teams.map((text) => <Item text={text} key={text} removeItem={this.remove}/>)}
</div>
);
} else {
return (
<div className="bg-light p-3 text-secondary text-center font-italic">
<StringInput submit={this.add} placeholder={this.props.inputPlaceholder} addButtonText={this.props.addButtonText}/>
{this.props.teamPlaceholder}
</div>
);
}
}
}
}
class GroupView extends React.Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
{this.props.groups.map((group, groupindex) => (
<Card className="group-card" key={groupindex}>
<CardBody>
<CardTitle>Group {groupindex + 1}</CardTitle>
{group.map((team, teamindex) => (
<div key={team} draggable droppable="droppable"
className="grouped-team-item"
onDragStart={(e) => this.onDragStart(e, groupindex,teamindex)}
onDragOver={(e) => this.onDragOver(e)}
onDrop={(e) => this.onDrop(e, groupindex, teamindex)}>
<Item text={team} removeItem={this.props.removeTeam}/>
</div>
))}
</CardBody>
</Card>
))}
</div>
);
}
onDragStart(e, group, team) {
e.dataTransfer.setData(
'text/plain',
JSON.stringify({
group: group,
team: team
})
);
}
onDragOver(e) {
e.preventDefault();
}
onDrop(e, group, team) {
e.preventDefault();
let src = JSON.parse(e.dataTransfer.getData('text'));
let dest = {
group: group,
team: team
};
this.props.onGroupSwitched(src, dest);
}
}
@ -104,7 +293,7 @@ class Item extends React.Component {
render() {
return (
<Alert className="d-inline-block m-2" color="info" isOpen={this.state.visible} toggle={this.onDismiss}>
<Alert className="team-item m-2" color="info" isOpen={this.state.visible} toggle={this.onDismiss}>
{this.props.text}
</Alert>
);

View File

@ -22,6 +22,7 @@
"react-dom": "^16.6.1",
"react-favicon": "^0.0.14",
"react-notify-toast": "^0.5.0",
"react-pose": "^4.0.8",
"react-redux": "^5.1.1",
"reactstrap": "^6.5.0",
"redux": "^4.0.1",

View File

@ -2,6 +2,7 @@ import Head from 'next/head';
import React from 'react';
import { notify } from 'react-notify-toast';
import { connect } from 'react-redux';
import posed from 'react-pose';
import {
Button,
@ -9,7 +10,6 @@ import {
CardBody,
Container,
CustomInput,
Fade,
Form,
FormGroup,
Input,
@ -25,7 +25,7 @@ import { createTournament } from '../js/api';
import '../static/everypage.css';
class PrivateCreatePage extends React.Component {
class CreatePage extends React.Component {
render() {
const { isSignedIn } = this.props;
@ -66,11 +66,9 @@ function mapStateToCreatePageProperties(state) {
return { isSignedIn };
}
const CreatePage = connect(
export default connect(
mapStateToCreatePageProperties
)(PrivateCreatePage);
export default CreatePage;
)(CreatePage);
function CreateTournamentCard() {
return (
@ -85,23 +83,41 @@ function CreateTournamentCard() {
);
}
const GroupphaseFader = posed.div({
visible: {
opacity: 1,
height: 150
},
hidden: {
opacity: 0,
height: 0
}
});
class CreateTournamentForm extends React.Component {
constructor(props) {
super(props);
this.state = {
fadeIn: false,
groupPhaseEnabled: false,
name: '',
description: '',
public: false,
teams: []
groupSize: 4,
groupAdvance: 1,
teams: [],
groups: []
};
this.toggle = this.toggle.bind(this);
this.handleGroupPhaseEnabledInput = this.handleGroupPhaseEnabledInput.bind(this);
this.teamListUpdate = this.teamListUpdate.bind(this);
this.groupListUpdate = this.groupListUpdate.bind(this);
this.create = this.create.bind(this);
this.handleNameInput = this.handleNameInput.bind(this);
this.handleDescriptionInput = this.handleDescriptionInput.bind(this);
this.handlePublicInput = this.handlePublicInput.bind(this);
this.handleGroupSizeInput = this.handleGroupSizeInput.bind(this);
this.handleGroupAdvanceInput = this.handleGroupAdvanceInput.bind(this);
this.create = this.create.bind(this);
}
@ -122,24 +138,35 @@ class CreateTournamentForm extends React.Component {
<CustomInput type="checkbox" id="public"
label="Turnier öffentlich anzeigen (schreibgeschützt)" checked={this.state.public} onChange={this.handlePublicInput}/>
<CustomInput type="checkbox" id="mix-teams" label="Teams mischen"/>
<CustomInput type="checkbox" id="group-phase" label="Gruppenphase" onClick={this.toggle}/>
<CustomInput type="checkbox" id="group-phase" label="Gruppenphase"
checked={this.state.groupPhaseEnabled} onChange={this.handleGroupPhaseEnabledInput}/>
</FormGroup>
<Fade in={this.state.fadeIn} tag="div" className="mt-3" baseClass="d-none"
baseClassActive="d-block">
<GroupphaseFader pose={this.state.groupPhaseEnabled? 'visible' : 'hidden'} className="groupphasefader">
<FormGroup>
<Label for="teams-per-group">Anzahl Teams pro Gruppe</Label>
<Input type="number" name="teams-per-group" size="255"/>
<Input type="number" name="teams-per-group" min="3"
value={this.state.groupSize} onChange={this.handleGroupSizeInput}/>
</FormGroup>
<FormGroup>
<Label for="teams-group-to-playoff">Wie viele Teams sollen nach der Gruppenphase
weiterkommen?</Label>
<Input type="number" name="teams-group-to-playoff" size="255"/>
<Input type="number" name="teams-group-to-playoff" min="1" max={this.state.groupSize - 1}
value={this.state.groupAdvance} onChange={this.handleGroupAdvanceInput}/>
</FormGroup>
</Fade>
</GroupphaseFader>
</Form>
<h3 className="custom-font mt-4">Teams</h3>
<EditableStringList addButtonText="hinzufügen" placeholder="Keine Teams hinzugefügt!" entries={[]}
onChange={this.teamListUpdate} inputPlaceholder="Teamname"/>
<EditableStringList
addButtonText="hinzufügen"
teamPlaceholder="Keine Teams hinzugefügt!"
groupPlaceHolder="Keine Gruppen verfügbar!"
teams={[]}
groups={[]}
groupPhaseEnabled={this.state.groupPhaseEnabled}
groupSize={this.state.groupSize}
onTeamsChange={this.teamListUpdate}
onGroupsChange={this.groupListUpdate}
inputPlaceholder="Teamname"/>
<Button color="success" size="lg" className="w-100 shadow-sm mt-4" onClick={this.create}>Turnier erstellen</Button>
</div>
);
@ -149,10 +176,28 @@ class CreateTournamentForm extends React.Component {
this.setState({teams: list});
}
toggle() {
this.setState({
fadeIn: !this.state.fadeIn
});
groupListUpdate(list) {
this.setState({groups: list});
}
handleGroupSizeInput(input) {
let newSize = input.target.value;
if(newSize <= this.state.groupAdvance) {
this.setState({
groupSize: newSize,
groupAdvance: newSize - 1
});
} else {
this.setState({ groupSize: newSize });
}
}
handleGroupAdvanceInput(input) {
this.setState({ groupAdvance: input.target.value });
}
handleGroupPhaseEnabledInput(input) {
this.setState({ groupPhaseEnabled: input.target.checked });
}
handleNameInput(input) {

View File

@ -0,0 +1,25 @@
.group-card {
margin-top: 15px;
margin-right: 15px;
display: inline-block;
vertical-align: top;
}
.team-item {
display: inline-block;
}
.grouped-team-item {
display: block;
margin-bottom: .5rem;
border-radius: .25rem;
}
.grouped-team-item:last-child {
margin-bottom: 0px;
}
.grouped-team-item > .m-2 {
margin: 0 !important;
}

116
yarn.lock
View File

@ -715,6 +715,18 @@
lodash "^4.17.11"
to-fast-properties "^2.0.0"
"@emotion/is-prop-valid@^0.7.3":
version "0.7.3"
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.7.3.tgz#a6bf4fa5387cbba59d44e698a4680f481a8da6cc"
integrity sha512-uxJqm/sqwXw3YPA5GXX365OBcJGFtxUVkB6WyezqFHlNe9jqUWH5ur2O2M8dGBz61kn1g3ZBlzUunFQXQIClhA==
dependencies:
"@emotion/memoize" "0.7.1"
"@emotion/memoize@0.7.1":
version "0.7.1"
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.1.tgz#e93c13942592cf5ef01aa8297444dc192beee52f"
integrity sha512-Qv4LTqO11jepd5Qmlp3M1YEjBumoTHcHFdgPTQ+sFlIL5myi/7xu/POwP7IRu6odBdmLXdtIs1D6TuW6kbwbbg==
"@mrmlnc/readdir-enhanced@^2.2.1":
version "2.2.1"
resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@ -728,6 +740,21 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
"@popmotion/easing@^1.0.1":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@popmotion/easing/-/easing-1.0.2.tgz#17d925c45b4bf44189e5a38038d149df42d8c0b4"
integrity sha512-IkdW0TNmRnWTeWI7aGQIVDbKXPWHVEYdGgd5ZR4SH/Ty/61p63jCjrPxX1XrR7IGkl08bjhJROStD7j+RKgoIw==
"@popmotion/popcorn@^0.3.6":
version "0.3.6"
resolved "https://registry.yarnpkg.com/@popmotion/popcorn/-/popcorn-0.3.6.tgz#eb4e3a04dd45c9516cc55b3350760ff47d7d55da"
integrity sha512-B8Hdk4LOjCHTIiUd9KfD+9PgLR2iSe9T/X5G9IAl055KY2iAqodIEtTlO6EBpjP8tQWVfI3C4A/fEf0RqYqPPw==
dependencies:
"@popmotion/easing" "^1.0.1"
framesync "^4.0.1"
hey-listen "^1.0.5"
style-value-types "^3.1.0"
"@samverschueren/stream-to-observable@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
@ -740,6 +767,16 @@
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
"@types/invariant@^2.2.29":
version "2.2.29"
resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.29.tgz#aa845204cd0a289f65d47e0de63a6a815e30cc66"
integrity sha512-lRVw09gOvgviOfeUrKc/pmTiRZ7g7oDOU6OAutyuSHpm1/o2RaBQvRhgK8QEdu+FFuw/wnWb29A/iuxv9i8OpQ==
"@types/node@^10.0.5":
version "10.14.4"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.4.tgz#1c586b991457cbb58fef51bc4e0cfcfa347714b5"
integrity sha512-DT25xX/YgyPKiHFOpNuANIQIVvYEwCWXgK2jYYwqgaMrYE6+tq+DtmMwlD3drl6DJbUwtlIDnn0d7tIn/EbXBg==
"@webassemblyjs/ast@1.7.8":
version "1.7.8"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.8.tgz#f31f480debeef957f01b623f27eabc695fa4fe8f"
@ -3703,6 +3740,13 @@ fragment-cache@^0.2.1:
dependencies:
map-cache "^0.2.2"
framesync@^4.0.0, framesync@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/framesync/-/framesync-4.0.2.tgz#b03b62852f12b0d80086b60834b089718f03cda5"
integrity sha512-hQLD5NURHmzB4Symo6JJ5HDw2TWwhr6T3gw9aChNMsZvkxcD8U8Gcz/hllAOOMGE+HO3ScpRPahpXDQRgF19JQ==
dependencies:
hey-listen "^1.0.5"
fresh@0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
@ -4095,6 +4139,11 @@ hash.js@^1.0.0, hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
hey-listen@^1.0.4, hey-listen@^1.0.5:
version "1.0.8"
resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68"
integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==
hmac-drbg@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@ -6088,11 +6137,47 @@ pkg-dir@^3.0.0:
dependencies:
find-up "^3.0.0"
popmotion-pose@^3.4.0:
version "3.4.7"
resolved "https://registry.yarnpkg.com/popmotion-pose/-/popmotion-pose-3.4.7.tgz#faa55f5a61f249e7615f536529ed65989f2d031c"
integrity sha512-mOn9fovrAiCRxANGnFyIGSYN9YArhJXbeK9Az5HBSoC3bUbhJ1heYguzboqg/jfrgEoPZ6UdUTgJsyivlYMsPg==
dependencies:
"@popmotion/easing" "^1.0.1"
hey-listen "^1.0.5"
popmotion "^8.6.2"
pose-core "^2.1.0"
style-value-types "^3.0.6"
ts-essentials "^1.0.3"
tslib "^1.9.1"
popmotion@^8.6.2:
version "8.6.8"
resolved "https://registry.yarnpkg.com/popmotion/-/popmotion-8.6.8.tgz#ccc1eaf1613f0611ba6b48d8171c25a518a1e917"
integrity sha512-BRzdgEHLqicl18RH2+gev/gVAQsU6OJD2eXii+J8Jabvw//fTNdkKIi+o8YM1cFU2QH+bnAAr0PEC3eiXMPJ1w==
dependencies:
"@popmotion/easing" "^1.0.1"
"@popmotion/popcorn" "^0.3.6"
framesync "^4.0.0"
hey-listen "^1.0.5"
style-value-types "^3.1.0"
stylefire "2.4.3"
tslib "^1.9.1"
popper.js@^1.14.1:
version "1.14.7"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.7.tgz#e31ec06cfac6a97a53280c3e55e4e0c860e7738e"
integrity sha512-4q1hNvoUre/8srWsH7hnoSJ5xVmIL4qgz+s4qf2TnJIMyZFUFMGH+9vE7mXynAlHSZ/NdTmmow86muD0myUkVQ==
pose-core@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/pose-core/-/pose-core-2.1.0.tgz#653c85a9a06f924611b909b4a2180ce102bbb258"
integrity sha512-36mVAnIgbM6jfyRug8EqqFbazHUAk9dxwVRpX61FlVw3amI/j7AFegtVU56N0Dht2aYDJIhgYPUYraT1CzjHDw==
dependencies:
"@types/invariant" "^2.2.29"
"@types/node" "^10.0.5"
hey-listen "^1.0.5"
tslib "^1.9.1"
posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
@ -6462,6 +6547,16 @@ react-popper@^0.10.4:
popper.js "^1.14.1"
prop-types "^15.6.1"
react-pose@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/react-pose/-/react-pose-4.0.8.tgz#91bdfafde60e4096e7878a35dcc77715bed68f24"
integrity sha512-WN/583nKJZkKmKg5ha+eErOGWF9GV6A5EngC7WHQX5b910X9rTlOlxzdKlUy/dDcsTRMZEtHV0Sy2gLPYsVQCQ==
dependencies:
"@emotion/is-prop-valid" "^0.7.3"
hey-listen "^1.0.5"
popmotion-pose "^3.4.0"
tslib "^1.9.1"
react-redux@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.1.tgz#88e368682c7fa80e34e055cd7ac56f5936b0f52f"
@ -7456,6 +7551,11 @@ strip-json-comments@^2.0.1, strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
style-value-types@^3.0.6, style-value-types@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/style-value-types/-/style-value-types-3.1.0.tgz#07e06090e7581adff4c7955d544c1029d0663795"
integrity sha512-7eaMZ8RKWIQUKHPQK7qv3zLYmvZNb2pCmO4WguXdVFymd2Qj9xqSUoo7LQ8Wd8eiLuoSd+uqzsvcodyvD8nn6Q==
styled-jsx@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-3.1.0.tgz#c295e4170298b5bb858f848c4b73e423a73a68f3"
@ -7470,6 +7570,15 @@ styled-jsx@3.1.0:
stylis "3.5.3"
stylis-rule-sheet "0.0.10"
stylefire@2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/stylefire/-/stylefire-2.4.3.tgz#1b39847251000bda86ebf82fa2bb4be7dafe6bc4"
integrity sha512-8rckFzuDlVWSyrkmnyTg8avadQavk2t6YkFKUUocsXoj/8NScOjb+/avbB4nrmoPtzD0kN7IyuhKq8jimIBTBQ==
dependencies:
framesync "^4.0.0"
hey-listen "^1.0.4"
style-value-types "^3.0.6"
stylis-rule-sheet@0.0.10:
version "0.0.10"
resolved "https://registry.yarnpkg.com/stylis-rule-sheet/-/stylis-rule-sheet-0.0.10.tgz#44e64a2b076643f4b52e5ff71efc04d8c3c4a430"
@ -7676,7 +7785,12 @@ trim-right@^1.0.1:
resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
tslib@^1.9.0:
ts-essentials@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-1.0.4.tgz#ce3b5dade5f5d97cf69889c11bf7d2da8555b15a"
integrity sha512-q3N1xS4vZpRouhYHDPwO0bDW3EZ6SK9CrrDHxi/D6BPReSjpVgWIOpLS2o0gSBZm+7q/wyKp6RVM1AeeW7uyfQ==
tslib@^1.9.0, tslib@^1.9.1:
version "1.9.3"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==