summaryrefslogtreecommitdiff
path: root/sw-ui/src
diff options
context:
space:
mode:
authorJoffrey Bion <joffrey.bion@booking.com>2020-04-06 18:55:25 +0200
committerJoffrey Bion <joffrey.bion@booking.com>2020-04-06 18:55:58 +0200
commitd4d20533556928f63c8759437f67e76336bab55e (patch)
tree34e7bb151b5d21497665131b6ab8d875254e7666 /sw-ui/src
parentRefactoring in GameScene.kt (diff)
downloadseven-wonders-d4d20533556928f63c8759437f67e76336bab55e.tar.gz
seven-wonders-d4d20533556928f63c8759437f67e76336bab55e.tar.bz2
seven-wonders-d4d20533556928f63c8759437f67e76336bab55e.zip
Delete old React/TypeScript UI
Diffstat (limited to 'sw-ui/src')
-rw-r--r--sw-ui/src/@types/reflexbox.d.ts37
-rw-r--r--sw-ui/src/api/model.ts187
-rw-r--r--sw-ui/src/api/sevenWondersApi.ts104
-rw-r--r--sw-ui/src/api/websocket.ts60
-rw-r--r--sw-ui/src/components/Application.tsx16
-rw-r--r--sw-ui/src/components/game-browser/GameBrowser.tsx56
-rw-r--r--sw-ui/src/components/game-browser/GameList.css3
-rw-r--r--sw-ui/src/components/game-browser/GameList.tsx85
-rw-r--r--sw-ui/src/components/game-browser/GameStatus.tsx17
-rw-r--r--sw-ui/src/components/game-browser/PlayerCount.css3
-rw-r--r--sw-ui/src/components/game-browser/PlayerCount.tsx12
-rw-r--r--sw-ui/src/components/game-browser/PlayerInfo.tsx27
-rw-r--r--sw-ui/src/components/game/Board.css38
-rw-r--r--sw-ui/src/components/game/Board.tsx67
-rw-r--r--sw-ui/src/components/game/CardImage.css4
-rw-r--r--sw-ui/src/components/game/CardImage.tsx26
-rw-r--r--sw-ui/src/components/game/GameScene.css13
-rw-r--r--sw-ui/src/components/game/GameScene.tsx77
-rw-r--r--sw-ui/src/components/game/Hand.css50
-rw-r--r--sw-ui/src/components/game/Hand.tsx44
-rw-r--r--sw-ui/src/components/game/ProductionBar.css50
-rw-r--r--sw-ui/src/components/game/ProductionBar.tsx87
-rw-r--r--sw-ui/src/components/home/ChooseNameForm.tsx42
-rw-r--r--sw-ui/src/components/home/Home.css13
-rw-r--r--sw-ui/src/components/home/Home.tsx12
-rw-r--r--sw-ui/src/components/lobby/Lobby.tsx56
-rw-r--r--sw-ui/src/components/lobby/PlayerList.tsx41
-rw-r--r--sw-ui/src/components/lobby/RadialPlayerList.tsx69
-rw-r--r--sw-ui/src/components/lobby/radial-list/RadialList.css23
-rw-r--r--sw-ui/src/components/lobby/radial-list/RadialList.tsx64
-rw-r--r--sw-ui/src/components/lobby/radial-list/RadialListItem.css11
-rw-r--r--sw-ui/src/components/lobby/radial-list/RadialListItem.tsx18
-rw-r--r--sw-ui/src/components/lobby/radial-list/radial-math.ts48
-rw-r--r--sw-ui/src/global-styles.css0
-rw-r--r--sw-ui/src/index.tsx21
-rw-r--r--sw-ui/src/main/kotlin/blueprintjs.kt525
-rw-r--r--sw-ui/src/main/kotlin/blueprintjsHelpers.kt137
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/SevenWondersUi.kt49
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/Application.kt22
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/GlobalStyles.kt36
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Board.kt124
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/CardImage.kt43
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/GameScene.kt178
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Hand.kt174
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/ProductionBar.kt164
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/CreateGameForm.kt76
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameBrowser.kt10
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameList.kt133
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/PlayerInfo.kt36
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/ChooseNameForm.kt64
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/Home.kt21
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/HomeStyles.kt19
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/Lobby.kt66
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialList.kt121
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialMath.kt57
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialPlayerList.kt106
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Actions.kt26
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/ApiActions.kt23
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Reducers.kt84
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Store.kt29
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Utils.kt39
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameBrowserSagas.kt50
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameSagas.kt36
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/LobbySagas.kt42
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/Sagas.kt54
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFramework.kt137
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/router/Router.kt32
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/CoroutinesUtils.kt15
-rw-r--r--sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/ReactUtils.kt16
-rw-r--r--sw-ui/src/main/resources/css/blueprint-icons.css18
-rw-r--r--sw-ui/src/main/resources/css/blueprint.css8040
-rw-r--r--sw-ui/src/main/resources/favicon.icobin0 -> 24838 bytes
-rw-r--r--sw-ui/src/main/resources/images/background-papyrus1.jpg (renamed from sw-ui/src/components/game/background-papyrus.jpg)bin100272 -> 100272 bytes
-rw-r--r--sw-ui/src/main/resources/images/background-papyrus2.jpgbin0 -> 885805 bytes
-rw-r--r--sw-ui/src/main/resources/images/background-papyrus3.jpgbin0 -> 480677 bytes
-rw-r--r--sw-ui/src/main/resources/images/background-zeus-temple.jpg (renamed from sw-ui/src/components/home/background-zeus-temple.jpg)bin571089 -> 571089 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/academy.pngbin0 -> 87620 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/altar.pngbin0 -> 80843 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/apothecary.pngbin0 -> 88905 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/aqueduct.pngbin0 -> 90765 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/archeryrange.pngbin0 -> 86327 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/arena.pngbin0 -> 84837 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/arsenal.pngbin0 -> 88257 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/back/age1.pngbin0 -> 67850 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/back/age2.pngbin0 -> 68501 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/back/age3.pngbin0 -> 63391 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/barracks.pngbin0 -> 83840 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/baths.pngbin0 -> 84236 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/bazar.pngbin0 -> 80862 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/brickyard.pngbin0 -> 79194 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/buildersguild.pngbin0 -> 86054 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/caravansery.pngbin0 -> 85841 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/chamberofcommerce.pngbin0 -> 89136 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/circus.pngbin0 -> 95879 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/claypit.pngbin0 -> 78992 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/claypool.pngbin0 -> 76294 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/courthouse.pngbin0 -> 82399 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/craftsmensguild.pngbin0 -> 90528 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/dispensary.pngbin0 -> 86175 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/easttradingpost.pngbin0 -> 88611 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/excavation.pngbin0 -> 82667 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/forestcave.pngbin0 -> 75845 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/fortifications.pngbin0 -> 85633 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/forum.pngbin0 -> 85713 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/foundry.pngbin0 -> 78894 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/gardens.pngbin0 -> 85889 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/glassworks.pngbin0 -> 81916 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/guardtower.pngbin0 -> 77432 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/haven.pngbin0 -> 93143 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/laboratory.pngbin0 -> 87869 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/library.pngbin0 -> 80338 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/lighthouse.pngbin0 -> 79746 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/lodge.pngbin0 -> 76021 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/loom.pngbin0 -> 85480 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/lumberyard.pngbin0 -> 83067 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/magistratesguild.pngbin0 -> 88073 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/marketplace.pngbin0 -> 89816 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/mine.pngbin0 -> 83500 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/observatory.pngbin0 -> 81745 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/orevein.pngbin0 -> 82176 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/palace.pngbin0 -> 85097 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/pantheon.pngbin0 -> 83290 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/pawnshop.pngbin0 -> 83440 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/philosophersguild.pngbin0 -> 89645 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/press.pngbin0 -> 88277 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/quarry.pngbin0 -> 77177 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/sawmill.pngbin0 -> 80987 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/school.pngbin0 -> 80260 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/scientistsguild.pngbin0 -> 86768 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/scriptorium.pngbin0 -> 84987 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/senate.pngbin0 -> 91055 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/shipownersguild.pngbin0 -> 86836 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/siegeworkshop.pngbin0 -> 89072 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/spiesguild.pngbin0 -> 83823 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/stables.pngbin0 -> 85649 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/statue.pngbin0 -> 83639 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/stockade.pngbin0 -> 70706 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/stonepit.pngbin0 -> 84418 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/strategistsguild.pngbin0 -> 86575 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/study.pngbin0 -> 84016 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/tavern.pngbin0 -> 81229 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/temple.pngbin0 -> 78057 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/theater.pngbin0 -> 89703 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/timberyard.pngbin0 -> 82874 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/townhall.pngbin0 -> 84439 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/tradersguild.pngbin0 -> 88057 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/trainingground.pngbin0 -> 84102 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/treefarm.pngbin0 -> 88252 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/university.pngbin0 -> 74203 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/vineyard.pngbin0 -> 81329 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/walls.pngbin0 -> 83027 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/westtradingpost.pngbin0 -> 90680 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/workersguild.pngbin0 -> 84595 bytes
-rw-r--r--sw-ui/src/main/resources/images/cards/workshop.pngbin0 -> 82116 bytes
-rw-r--r--sw-ui/src/main/resources/images/logo-7-wonders.png (renamed from sw-ui/src/components/home/logo-7-wonders.png)bin301442 -> 301442 bytes
-rw-r--r--sw-ui/src/main/resources/images/round-table.png (renamed from sw-ui/src/components/lobby/round-table.png)bin18527 -> 18527 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/coin.pngbin0 -> 4515 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/resources/clay.pngbin0 -> 19566 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/resources/glass.pngbin0 -> 20961 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/resources/loom.pngbin0 -> 21053 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/resources/ore.pngbin0 -> 21524 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/resources/papyrus.pngbin0 -> 22695 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/resources/stone.pngbin0 -> 21516 bytes
-rw-r--r--sw-ui/src/main/resources/images/tokens/resources/wood.pngbin0 -> 21642 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/alexandriaA.pngbin0 -> 500078 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/alexandriaB.pngbin0 -> 503329 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/babylonA.pngbin0 -> 560943 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/babylonB.pngbin0 -> 560104 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/ephesosA.pngbin0 -> 547227 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/ephesosB.pngbin0 -> 550456 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/agrigentoA.jpgbin0 -> 705403 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/angkorwatA.jpgbin0 -> 930685 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/angkorwatB.jpgbin0 -> 987688 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/avalonA.jpgbin0 -> 658280 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/ctesiphonB.jpgbin0 -> 692738 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/iramA.jpgbin0 -> 734054 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/persepolisA.jpgbin0 -> 1057711 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/romaA.jpgbin0 -> 200076 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/sangri-laA.jpgbin0 -> 682795 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/spahanA.jpgbin0 -> 774749 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/the-great-wallA.jpgbin0 -> 72721 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/veniseA.jpgbin0 -> 945317 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/extra/veniseB.jpgbin0 -> 941879 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/gizahA.pngbin0 -> 490115 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/gizahB.pngbin0 -> 500706 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/halikarnassusA.pngbin0 -> 470957 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/halikarnassusB.pngbin0 -> 487620 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/olympiaA.pngbin0 -> 557107 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/olympiaB.pngbin0 -> 558174 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/rhodosA.pngbin0 -> 578363 bytes
-rw-r--r--sw-ui/src/main/resources/images/wonders/rhodosB.pngbin0 -> 575123 bytes
-rw-r--r--sw-ui/src/main/resources/index.html15
-rw-r--r--sw-ui/src/react-app-env.d.ts1
-rw-r--r--sw-ui/src/reducers.ts31
-rw-r--r--sw-ui/src/redux/actions/all.ts5
-rw-r--r--sw-ui/src/redux/actions/game.ts32
-rw-r--r--sw-ui/src/redux/actions/lobby.ts32
-rw-r--r--sw-ui/src/redux/actions/user.ts17
-rw-r--r--sw-ui/src/redux/currentGame.ts46
-rw-r--r--sw-ui/src/redux/games.ts56
-rw-r--r--sw-ui/src/redux/user.ts43
-rw-r--r--sw-ui/src/sagas.ts23
-rw-r--r--sw-ui/src/sagas/errors.ts36
-rw-r--r--sw-ui/src/sagas/game.ts81
-rw-r--r--sw-ui/src/sagas/gameBrowser.ts55
-rw-r--r--sw-ui/src/sagas/home.ts28
-rw-r--r--sw-ui/src/sagas/lobby.ts44
-rw-r--r--sw-ui/src/setupProxy.js8
-rw-r--r--sw-ui/src/store.ts27
-rw-r--r--sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFrameworkTest.kt91
-rw-r--r--sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/utils/CoroutineUtilsTest.kt24
211 files changed, 10932 insertions, 2046 deletions
diff --git a/sw-ui/src/@types/reflexbox.d.ts b/sw-ui/src/@types/reflexbox.d.ts
deleted file mode 100644
index 802bc5f3..00000000
--- a/sw-ui/src/@types/reflexbox.d.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-declare module 'reflexbox' {
-
- import { HTMLAttributes } from 'react';
- import * as React from 'react'
-
- export interface BoxProps {
- w?: number | string,
- h?: number | string,
-
- flex?: boolean,
- wrap?: boolean,
- column?: boolean,
- auto?: boolean,
- order?: number,
- align?: "flex-start" | "flex-end" | "center" | "stretch" | "baseline",
- justify?: "flex-start" | "flex-end" | "center" | "space-between" | "space-around" | "space-evenly",
-
- m?: number | string,
- mx?: number | string,
- my?: number | string,
- mt?: number | string,
- mb?: number | string,
- ml?: number | string,
- mr?: number | string,
-
- p?: number | string,
- px?: number | string,
- py?: number | string,
- pt?: number | string,
- pb?: number | string,
- pl?: number | string,
- pr?: number | string,
- }
-
- export class Flex extends React.Component<HTMLAttributes & BoxProps> { }
- export class Box extends React.Component<HTMLAttributes & BoxProps> { }
-}
diff --git a/sw-ui/src/api/model.ts b/sw-ui/src/api/model.ts
deleted file mode 100644
index 2796a6d3..00000000
--- a/sw-ui/src/api/model.ts
+++ /dev/null
@@ -1,187 +0,0 @@
-export type ApiErrorDetail = {
- message: string
-};
-
-export type ApiError = {
- message: string,
- details: ApiErrorDetail[]
-};
-
-export type ApiPlayer = {
- username: string,
- displayName: string,
- index: number,
- gameOwner: boolean,
- user: boolean,
-};
-
-export type ApiWonderSidePickMethod = "EACH_RANDOM" | "ALL_A" | "ALL_B" | "SAME_RANDOM_FOR_ALL";
-
-export type ApiSettings = {
- randomSeedForTests: number,
- timeLimitInSeconds: number,
- wonderSidePickMethod: ApiWonderSidePickMethod,
- initialGold: number,
- discardedCardGold: number,
- defaultTradingCost: number,
- pointsPer3Gold: number,
- lostPointsPerDefeat: number,
- wonPointsPerVictoryPerAge: Map<number, number>
-};
-
-export type ApiGameState = "LOBBY" | "PLAYING";
-
-export type ApiLobby = {
- id: number,
- name: string,
- owner: string,
- players: ApiPlayer[],
- settings: ApiSettings,
- state: ApiGameState
-};
-
-export type ApiScience = {
- jokers: number,
- nbWheels: number,
- nbCompasses: number,
- nbTablets: number,
-}
-
-export type ApiMilitary = {
- nbShields: number,
- totalPoints: number,
- nbDefeatTokens: number,
-}
-
-export type ApiResourceType = "WOOD" | "STONE" | "ORE" | "CLAY" | "GLASS" | "PAPYRUS" | "LOOM";
-
-export type ApiResources = {
- quantities: Map<ApiResourceType, number>,
-};
-
-export type ApiRequirements = {
- gold: number,
- resources: ApiResources
-}
-
-export type ApiCardBack = {
- image: string,
-};
-
-export type ApiWonderStage = {
- cardBack: ApiCardBack | null,
- isBuilt: boolean,
- requirements: ApiRequirements,
- builtDuringLastMove: boolean,
-}
-
-export type ApiWonderBuildability = {
- buildable: boolean
-}
-
-export type ApiWonder = {
- name: string,
- initialResource: ApiResourceType,
- stages: ApiWonderStage[],
- image: string,
- nbBuiltStages: number,
- buildability: ApiWonderBuildability,
-}
-
-export type Color = 'BLUE' | 'GREEN' | 'RED' | 'BROWN' | 'GREY' | 'PURPLE' | 'YELLOW';
-
-export type ApiProvider = "LEFT_NEIGHBOUR" | "RIGHT_NEIGHBOUR";
-
-export type ApiCountedResource = {
- type: ApiResourceType,
- count: number,
-}
-
-export type ApiProduction = {
- fixedResources: ApiCountedResource[],
- alternativeResources: ApiResourceType[][],
-}
-
-export type ApiBoughtResources = {
- provider: ApiProvider,
- resources: ApiResources,
-};
-
-export type ApiCard = {
- name: string,
- color: Color,
- requirements: ApiRequirements,
- chainParent: String | null,
- chainChildren: String[],
- image: string,
- back: ApiCardBack
-};
-
-export type ApiTableCard = ApiCard & {
- playedDuringLastMove: boolean,
-};
-
-export type ApiBoard = {
- playerIndex: number,
- wonder: ApiWonder,
- production: ApiProduction,
- publicProduction: ApiProduction,
- science: ApiScience,
- military: ApiMilitary,
- playedCards: ApiTableCard[][],
- gold: number,
-};
-
-export type HandRotationDirection = 'LEFT' | 'RIGHT';
-
-export type ApiMoveType = "PLAY" | "PLAY_FREE" | "UPGRADE_WONDER" | "DISCARD" | "COPY_GUILD";
-
-export type ApiPlayedMove = {
- playerIndex: number,
- type: ApiMoveType,
- card: ApiTableCard,
- boughtResources: ApiBoughtResources[],
-};
-
-export type ApiTable = {
- boards: ApiBoard[],
- currentAge: number,
- handRotationDirection: HandRotationDirection,
- lastPlayedMoves: ApiPlayedMove[],
- nbPlayers: number,
-};
-
-export type ApiAction = 'PLAY' | 'PLAY_2' | 'PLAY_LAST' | 'PICK_NEIGHBOR_GUILD' | 'WAIT';
-
-export type ApiPlayability = {
- playable: boolean,
- chainable: boolean,
- minPrice: number,
-};
-
-export type ApiHandCard = ApiCard & {
- playability: ApiPlayability,
-};
-
-export type ApiPreparedCard = {
- player: ApiPlayer,
- cardBack: ApiCardBack,
-};
-
-export type ApiPlayerTurnInfo = {
- playerIndex: number,
- table: ApiTable,
- currentAge: number,
- action: ApiAction,
- hand: ApiHandCard[],
- playedMove: ApiPlayedMove | null,
- neighbourGuildCards: ApiTableCard[],
- message: string,
- wonderBuildability: ApiWonderBuildability,
-};
-
-export type ApiPlayerMove = {
- type: ApiMoveType,
- cardName: string,
- boughtResources: ApiBoughtResources[],
-};
diff --git a/sw-ui/src/api/sevenWondersApi.ts b/sw-ui/src/api/sevenWondersApi.ts
deleted file mode 100644
index 4f76a677..00000000
--- a/sw-ui/src/api/sevenWondersApi.ts
+++ /dev/null
@@ -1,104 +0,0 @@
-import {
- ApiError,
- ApiLobby,
- ApiPlayer,
- ApiPlayerMove,
- ApiPlayerTurnInfo,
- ApiPreparedCard,
- ApiSettings,
- ApiTable,
-} from './model';
-import { JsonStompClient, SubscribeFn } from './websocket';
-import { createJsonStompClient } from './websocket';
-
-const WS_URL = '/seven-wonders-websocket';
-
-export class SevenWondersSession {
- client: JsonStompClient;
-
- constructor(client: JsonStompClient) {
- this.client = client;
- }
-
- watchErrors(): SubscribeFn<ApiError> {
- return this.client.subscriber('/user/queue/errors');
- }
-
- watchNameChoice(): SubscribeFn<ApiPlayer> {
- return this.client.subscriber('/user/queue/nameChoice');
- }
-
- chooseName(displayName: string): void {
- this.client.send('/app/chooseName', { playerName: displayName });
- }
-
- watchGames(): SubscribeFn<ApiLobby[]> {
- return this.client.subscriber('/topic/games');
- }
-
- watchLobbyJoined(): SubscribeFn<Object> {
- return this.client.subscriber('/user/queue/lobby/joined');
- }
-
- createGame(gameName: string): void {
- this.client.send('/app/lobby/create', { gameName });
- }
-
- joinGame(gameId: number): void {
- this.client.send('/app/lobby/join', { gameId });
- }
-
- watchLobbyUpdated(currentGameId: number): SubscribeFn<Object> {
- return this.client.subscriber(`/topic/lobby/${currentGameId}/updated`);
- }
-
- watchGameStarted(currentGameId: number): SubscribeFn<Object> {
- return this.client.subscriber(`/topic/lobby/${currentGameId}/started`);
- }
-
- leave(): void {
- this.client.send('/app/lobby/leave');
- }
-
- reorderPlayers(orderedPlayers: Array<string>): void {
- this.client.send('/app/lobby/reorderPlayers', { orderedPlayers });
- }
-
- updateSettings(settings: ApiSettings): void {
- this.client.send('/app/lobby/updateSettings', { settings });
- }
-
- startGame(): void {
- this.client.send('/app/lobby/startGame');
- }
-
- watchPlayerReady(currentGameId: number): SubscribeFn<string> {
- return this.client.subscriber(`/topic/game/${currentGameId}/playerReady`);
- }
-
- watchTableUpdates(currentGameId: number): SubscribeFn<ApiTable> {
- return this.client.subscriber(`/topic/game/${currentGameId}/tableUpdates`);
- }
-
- watchPreparedCards(currentGameId: number): SubscribeFn<ApiPreparedCard> {
- return this.client.subscriber(`/topic/game/${currentGameId}/prepared`);
- }
-
- watchTurnInfo(): SubscribeFn<ApiPlayerTurnInfo> {
- return this.client.subscriber('/user/queue/game/turn');
- }
-
- sayReady(): void {
- this.client.send('/app/game/sayReady');
- }
-
- prepareMove(move: ApiPlayerMove): void {
- this.client.send('/app/game/prepareMove', { move });
- }
-}
-
-export async function connectToGame(): Promise<SevenWondersSession> {
- const jsonStompClient: JsonStompClient = createJsonStompClient(WS_URL);
- await jsonStompClient.connect();
- return new SevenWondersSession(jsonStompClient);
-}
diff --git a/sw-ui/src/api/websocket.ts b/sw-ui/src/api/websocket.ts
deleted file mode 100644
index e9393836..00000000
--- a/sw-ui/src/api/websocket.ts
+++ /dev/null
@@ -1,60 +0,0 @@
-import SockJS from 'sockjs-client';
-import { Client, Frame, Message, Options, Subscription } from 'webstomp-client';
-import * as Stomp from 'webstomp-client';
-
-const DEFAULT_DEBUG_OPTIONS = {
- debug: process.env.NODE_ENV !== 'production',
-};
-
-export type Callback<T> = (value: T) => void;
-export type UnsubscribeFn = () => void;
-export type SubscribeFn<T> = (callback: Callback<T>) => UnsubscribeFn;
-
-export class JsonStompClient {
- client: Client;
-
- constructor(client: Client) {
- this.client = client;
- }
-
- connect(headers: Stomp.ConnectionHeaders = {}): Promise<Frame | void> {
- return new Promise((resolve, reject) => {
- this.client.connect(headers, resolve, reject);
- });
- }
-
- subscribe<T>(path: string, callback: Callback<T>): UnsubscribeFn {
- const socketSubscription: Subscription = this.client.subscribe(path, (message: Message) => {
- // not all frames have a JSON body
- const value: T | void = message && JsonStompClient.parseBody(message);
- callback(value || {} as T);
- });
- return () => socketSubscription.unsubscribe();
- }
-
- static parseBody<T>(message: Message): T | void {
- try {
- return message.body ? JSON.parse(message.body) : undefined;
- } catch (jsonParseError) {
- throw new Error('Cannot parse websocket message as JSON: ' + jsonParseError.message);
- }
- }
-
- subscriber<T>(path: string): SubscribeFn<T> {
- return (callback: Callback<T>) => this.subscribe(path, callback);
- }
-
- send(url: string, body?: Object) {
- const strBody = body ? JSON.stringify(body) : '';
- this.client.send(url, strBody);
- }
-}
-
-function createStompClient(url: string, options: Options = {}): Client {
- const optionsWithDebug = Object.assign({}, DEFAULT_DEBUG_OPTIONS, options);
- return Stomp.over(new SockJS(url), optionsWithDebug);
-}
-
-export function createJsonStompClient(url: string, options: Options = {}): JsonStompClient {
- return new JsonStompClient(createStompClient(url, options));
-}
diff --git a/sw-ui/src/components/Application.tsx b/sw-ui/src/components/Application.tsx
deleted file mode 100644
index e0ec604d..00000000
--- a/sw-ui/src/components/Application.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import React from 'react';
-import { Redirect, Route, Switch } from 'react-router-dom';
-import { GameBrowser } from './game-browser/GameBrowser';
-import { GameScene } from './game/GameScene';
-import { Lobby } from './lobby/Lobby';
-import { Home } from './home/Home';
-
-export const Application = () => (
- <Switch>
- <Route path="/game" component={GameScene} />
- <Route path="/games" component={GameBrowser} />
- <Route path="/lobby" component={Lobby} />
- <Route path="/" component={Home} />
- <Redirect to="/" />
- </Switch>
-);
diff --git a/sw-ui/src/components/game-browser/GameBrowser.tsx b/sw-ui/src/components/game-browser/GameBrowser.tsx
deleted file mode 100644
index a6367d5e..00000000
--- a/sw-ui/src/components/game-browser/GameBrowser.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Button, Classes, InputGroup, Intent } from '@blueprintjs/core';
-import React, { ChangeEvent, Component, SyntheticEvent } from 'react';
-import { connect } from 'react-redux';
-import { Flex } from 'reflexbox';
-import { actions } from '../../redux/actions/lobby';
-import { GameList } from './GameList';
-import { PlayerInfo } from './PlayerInfo';
-
-type GameBrowserProps = {
- createGame: (gameName: string) => void,
-}
-
-class GameBrowserPresenter extends Component<GameBrowserProps> {
-
- _gameName: string | void = undefined;
-
- createGame = (e: SyntheticEvent<any>): void => {
- e.preventDefault();
- if (this._gameName !== undefined) {
- this.props.createGame(this._gameName);
- }
- };
-
- render() {
- return (
- <div>
- <Flex align="center" justify='space-between' p={1}>
- <form onSubmit={this.createGame}>
- <InputGroup
- placeholder="Game name"
- name="game_name"
- onChange={(e: ChangeEvent<HTMLInputElement>) => (this._gameName = e.target.value)}
- rightElement={<CreateGameButton createGame={this.createGame}/>}
- />
- </form>
- <PlayerInfo />
- </Flex>
- <GameList />
- </div>
- );
- }
-}
-
-type CreateGameButtonProps = {
- createGame: (e: SyntheticEvent<any>) => void
-}
-
-const CreateGameButton = ({createGame}: CreateGameButtonProps) => (
- <Button className={Classes.MINIMAL} intent={Intent.PRIMARY} icon='add' onClick={createGame} />
-);
-
-const mapDispatchToProps = {
- createGame: actions.requestCreateGame,
-};
-
-export const GameBrowser = connect(null, mapDispatchToProps)(GameBrowserPresenter);
diff --git a/sw-ui/src/components/game-browser/GameList.css b/sw-ui/src/components/game-browser/GameList.css
deleted file mode 100644
index a04e126c..00000000
--- a/sw-ui/src/components/game-browser/GameList.css
+++ /dev/null
@@ -1,3 +0,0 @@
-tr.gameListRow td {
- vertical-align: middle;
-}
diff --git a/sw-ui/src/components/game-browser/GameList.tsx b/sw-ui/src/components/game-browser/GameList.tsx
deleted file mode 100644
index 1b136940..00000000
--- a/sw-ui/src/components/game-browser/GameList.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import { Button, Classes } from '@blueprintjs/core'
-import { List } from 'immutable';
-import React from 'react';
-import { connect } from 'react-redux';
-import { ApiLobby } from '../../api/model';
-import { GlobalState } from '../../reducers';
-import { actions } from '../../redux/actions/lobby';
-import { getAllGames } from '../../redux/games';
-import './GameList.css';
-import { GameStatus } from './GameStatus';
-import { PlayerCount } from './PlayerCount';
-
-type GameListStateProps = {
- games: List<ApiLobby>,
-};
-
-type GameListDispatchProps = {
- joinGame: (gameId: number) => void,
-};
-
-type GameListProps = GameListStateProps & GameListDispatchProps
-
-const GameListPresenter = ({ games, joinGame }: GameListProps) => (
- <table className={Classes.HTML_TABLE}>
- <thead>
- <GameListHeaderRow />
- </thead>
- <tbody>
- {games.map((game: ApiLobby) => <GameListItemRow key={game.id} game={game} joinGame={joinGame}/>)}
- </tbody>
- </table>
-);
-
-const GameListHeaderRow = () => (
- <tr>
- <th>Name</th>
- <th>Status</th>
- <th>Nb Players</th>
- <th>Join</th>
- </tr>
-);
-
-type GameListItemRowProps = {
- game: ApiLobby,
- joinGame: (gameId: number) => void,
-};
-
-const GameListItemRow = ({game, joinGame}: GameListItemRowProps) => (
- <tr className="gameListRow">
- <td>{game.name}</td>
- <td>
- <GameStatus state={game.state} />
- </td>
- <td>
- <PlayerCount nbPlayers={game.players.length} />
- </td>
- <td>
- <JoinButton game={game} joinGame={joinGame}/>
- </td>
- </tr>
-);
-
-type JoinButtonProps = {
- game: ApiLobby,
- joinGame: (gameId: number) => void,
-};
-
-const JoinButton = ({game, joinGame}: JoinButtonProps) => {
- const disabled = game.state !== 'LOBBY';
- const onClick = () => joinGame(game.id);
- return <Button minimal disabled={disabled} icon='arrow-right' title='Join Game' onClick={onClick}/>;
-};
-
-function mapStateToProps(state: GlobalState): GameListStateProps {
- return {
- games: getAllGames(state),
- };
-}
-
-const mapDispatchToProps: GameListDispatchProps = {
- joinGame: actions.requestJoinGame,
-};
-
-export const GameList = connect(mapStateToProps, mapDispatchToProps)(GameListPresenter);
-
diff --git a/sw-ui/src/components/game-browser/GameStatus.tsx b/sw-ui/src/components/game-browser/GameStatus.tsx
deleted file mode 100644
index 5f237258..00000000
--- a/sw-ui/src/components/game-browser/GameStatus.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Tag } from '@blueprintjs/core';
-import { Intent } from '@blueprintjs/core';
-import * as React from 'react';
-import { ApiGameState } from '../../api/model';
-
-type GameStatusProps = {
- state: ApiGameState,
-}
-
-export const GameStatus = ({state}: GameStatusProps) => (
- <Tag minimal intent={statusIntents[state]}>{state}</Tag>
-);
-
-const statusIntents = {
- 'LOBBY': Intent.SUCCESS,
- 'PLAYING': Intent.WARNING,
-};
diff --git a/sw-ui/src/components/game-browser/PlayerCount.css b/sw-ui/src/components/game-browser/PlayerCount.css
deleted file mode 100644
index d2f18e50..00000000
--- a/sw-ui/src/components/game-browser/PlayerCount.css
+++ /dev/null
@@ -1,3 +0,0 @@
-.playerCountIcon, .playerCount {
- vertical-align: middle;
-}
diff --git a/sw-ui/src/components/game-browser/PlayerCount.tsx b/sw-ui/src/components/game-browser/PlayerCount.tsx
deleted file mode 100644
index 64028f68..00000000
--- a/sw-ui/src/components/game-browser/PlayerCount.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Icon } from '@blueprintjs/core';
-import * as React from 'react';
-import './PlayerCount.css';
-
-type PlayerCountProps = {
- nbPlayers: number,
-}
-
-export const PlayerCount = ({nbPlayers}: PlayerCountProps) => <div title='Number of players'>
- <Icon className="playerCountIcon" icon="people" title={false} />
- <span className="playerCount"> {nbPlayers}</span>
-</div>;
diff --git a/sw-ui/src/components/game-browser/PlayerInfo.tsx b/sw-ui/src/components/game-browser/PlayerInfo.tsx
deleted file mode 100644
index 4afed671..00000000
--- a/sw-ui/src/components/game-browser/PlayerInfo.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Text } from '@blueprintjs/core';
-import React from 'react';
-import { connect } from 'react-redux';
-import { GlobalState } from '../../reducers';
-import { User } from '../../redux/user';
-import { getCurrentUser } from '../../redux/user';
-
-type PlayerInfoProps = {
- user: User | null,
-}
-
-const PlayerInfoPresenter = ({user}: PlayerInfoProps) => (
- <Text>
- <b>Username:</b>
- {' '}
- {user && user.displayName}
- </Text>
-);
-
-const mapStateToProps = (state: GlobalState): PlayerInfoProps => ({
- user: getCurrentUser(state),
-});
-
-const mapDispatchToProps = {
-};
-
-export const PlayerInfo = connect(mapStateToProps, mapDispatchToProps)(PlayerInfoPresenter);
diff --git a/sw-ui/src/components/game/Board.css b/sw-ui/src/components/game/Board.css
deleted file mode 100644
index 0600bd14..00000000
--- a/sw-ui/src/components/game/Board.css
+++ /dev/null
@@ -1,38 +0,0 @@
-.board {
- width: 100vw
-}
-
-.cards {
- display: flex;
- height: 40vh;
- width: 100vw;
-}
-
-.card-column {
- height: 40vh;
- margin: auto;
- position: relative;
- width: 15vw;
-}
-
-.card {
- position: absolute;
- /* dynamic positioning in JS */
-}
-
-.table-card-img {
- max-width: 10vw;
- max-height: 25vh;
-}
-
-.wonder {
- width: 100vw;
- text-align: center;
-}
-
-.wonder-img {
- border-radius: 0.5%/1.5%;
- box-shadow: 0.2rem 0.2rem 0.5rem black;
- max-height: 30vh;
- max-width: 95vw;
-}
diff --git a/sw-ui/src/components/game/Board.tsx b/sw-ui/src/components/game/Board.tsx
deleted file mode 100644
index 98298a1f..00000000
--- a/sw-ui/src/components/game/Board.tsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import React from 'react';
-import { ApiBoard, ApiTableCard, ApiWonder } from '../../api/model';
-import './Board.css'
-import { CardImage } from './CardImage';
-
-// card offsets in % of their size when displayed in columns
-const xOffset = 20;
-const yOffset = 21;
-
-type BoardProps = {
- board: ApiBoard,
-}
-
-export const Board = ({board}: BoardProps) => {
- return <div className='board'>
- <TableCards cardColumns={board.playedCards}/>
- <Wonder wonder={board.wonder}/>
- </div>;
-};
-
-type TableCardsProps = {
- cardColumns: ApiTableCard[][],
-}
-
-const TableCards = ({cardColumns}: TableCardsProps) => {
- return <div className="cards">
- {cardColumns.map(column => <TableCardColumn key={column[0].color} cards={column}/>)}
- </div>
-};
-
-type TableCardColumnProps = {
- cards: ApiTableCard[]
-}
-
-const TableCardColumn = ({cards}: TableCardColumnProps) => {
- return <div className="card-column">
- {cards.map((c, i) => <TableCard key={c.name} card={c} indexInColumn={i}/>)}
- </div>
-};
-
-type TableCardProps = {
- card: ApiTableCard,
- indexInColumn: number,
-}
-
-const TableCard = ({card, indexInColumn}: TableCardProps) => {
- let style = {
- transform: `translate(${indexInColumn * xOffset}%, ${indexInColumn * yOffset}%)`,
- zIndex: indexInColumn,
- };
- return <div className="card" style={style}>
- <CardImage card={card} otherClasses="table-card-img"/>
- </div>
-};
-
-type WonderProps = {
- wonder: ApiWonder,
-}
-
-const Wonder = ({wonder}: WonderProps) => {
- return <div className="wonder">
- <img src={`/images/wonders/${wonder.image}`}
- title={wonder.name}
- alt={`Wonder ${wonder.name}`}
- className="wonder-img"/>
- </div>
-};
diff --git a/sw-ui/src/components/game/CardImage.css b/sw-ui/src/components/game/CardImage.css
deleted file mode 100644
index 795c1503..00000000
--- a/sw-ui/src/components/game/CardImage.css
+++ /dev/null
@@ -1,4 +0,0 @@
-.card-img {
- border-radius: 5%;
- box-shadow: 2px 2px 5px black;
-}
diff --git a/sw-ui/src/components/game/CardImage.tsx b/sw-ui/src/components/game/CardImage.tsx
deleted file mode 100644
index a37595ad..00000000
--- a/sw-ui/src/components/game/CardImage.tsx
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react';
-import { ApiCard } from '../../api/model';
-import './CardImage.css'
-
-type CardImageProps = {
- card: ApiCard,
- otherClasses: string,
- highlightColor?: string
-}
-
-export const CardImage = ({card, otherClasses, highlightColor}: CardImageProps) => {
- const style = highlightStyle(highlightColor);
- return <img src={`/images/cards/${card.image}`}
- title={card.name}
- alt={'Card ' + card.name}
- className={`card-img ${otherClasses}`}
- style={style}/>
-};
-
-function highlightStyle(highlightColor?: string) {
- if (highlightColor) {
- return { boxShadow: `0 0 1rem 0.1rem ${highlightColor}` };
- } else {
- return {};
- }
-}
diff --git a/sw-ui/src/components/game/GameScene.css b/sw-ui/src/components/game/GameScene.css
deleted file mode 100644
index 3417459b..00000000
--- a/sw-ui/src/components/game/GameScene.css
+++ /dev/null
@@ -1,13 +0,0 @@
-.gameSceneRoot {
- background: url('background-papyrus.jpg') center no-repeat;
- background-size: cover;
-}
-
-.fullscreen {
- position: fixed;
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
- overflow: hidden;
-}
diff --git a/sw-ui/src/components/game/GameScene.tsx b/sw-ui/src/components/game/GameScene.tsx
deleted file mode 100644
index 465d0840..00000000
--- a/sw-ui/src/components/game/GameScene.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-import { Button, Classes, Intent, NonIdealState } from '@blueprintjs/core';
-import { List } from 'immutable';
-import React, { Component } from 'react';
-import { connect } from 'react-redux';
-import { ApiPlayer, ApiPlayerMove, ApiPlayerTurnInfo } from '../../api/model';
-import { GlobalState } from '../../reducers';
-import { actions } from '../../redux/actions/game';
-import { getCurrentTurnInfo } from '../../redux/currentGame';
-import { getCurrentGame } from '../../redux/games';
-import { Board } from './Board';
-import './GameScene.css'
-import { Hand } from './Hand';
-import { ProductionBar } from './ProductionBar';
-
-type GameSceneStateProps = {
- players: List<ApiPlayer>,
- turnInfo: ApiPlayerTurnInfo | null,
-}
-
-type GameSceneDispatchProps = {
- sayReady: () => void,
- prepareMove: (move: ApiPlayerMove) => void,
-}
-
-type GameSceneProps = GameSceneStateProps & GameSceneDispatchProps
-
-class GameScenePresenter extends Component<GameSceneProps> {
-
- render() {
- return (
- <div className='gameSceneRoot fullscreen'>
- {!this.props.turnInfo && <GamePreStart onReadyClicked={this.props.sayReady}/>}
- {this.props.turnInfo && this.turnInfoScene(this.props.turnInfo)}
- </div>
- );
- }
-
- turnInfoScene(turnInfo: ApiPlayerTurnInfo) {
- let board = turnInfo.table.boards[turnInfo.playerIndex];
- return <div>
- <p>{turnInfo.message}</p>
- <Board board={board}/>
- <Hand cards={turnInfo.hand}
- wonderUpgradable={turnInfo.wonderBuildability.buildable}
- prepareMove={this.props.prepareMove}/>
- <ProductionBar gold={board.gold} production={board.production}/>
- </div>
- }
-}
-
-type GamePreStartProps = {
- onReadyClicked: () => void
-}
-const GamePreStart = ({onReadyClicked}: GamePreStartProps) => <NonIdealState
- description={<p>Click "ready" when you are</p>}
- action={<Button text="READY" className={Classes.LARGE} intent={Intent.PRIMARY} icon='play'
- onClick={() => onReadyClicked()}/>}
-/>;
-
-function mapStateToProps(state: GlobalState): GameSceneStateProps {
- const game = getCurrentGame(state);
- console.info(game);
-
- return {
- players: game ? List(game.players) : List(),
- turnInfo: getCurrentTurnInfo(state),
- };
-}
-
-function mapDispatchToProps(): GameSceneDispatchProps {
- return {
- sayReady: actions.sayReady,
- prepareMove: actions.prepareMove,
- }
-}
-
-export const GameScene = connect(mapStateToProps, mapDispatchToProps)(GameScenePresenter);
diff --git a/sw-ui/src/components/game/Hand.css b/sw-ui/src/components/game/Hand.css
deleted file mode 100644
index 8e7d93c5..00000000
--- a/sw-ui/src/components/game/Hand.css
+++ /dev/null
@@ -1,50 +0,0 @@
-.hand {
- align-items: center;
- bottom: 0;
- display: flex;
- height: 345px; /* can hold enhanced cards */
- left: 50%;
- max-height: 25vw;
- position: absolute;
- transform: translate(-50%, 55%);
- transition: 0.5s;
- z-index: 30;
-}
-.hand:hover {
- bottom: 4rem;
- transform: translate(-50%, 0%);
-}
-
-.hand-card {
- align-items: flex-end;
- display: grid;
- margin: 0.2rem;
-}
-
-.hand-card .hand-card-img {
- grid-row: 1;
- grid-column: 1;
- max-width: 13vw;
- max-height: 60vh;
- transition: 0.1s;
- width: 11rem;
-}
-.hand-card.unplayable .hand-card-img {
- filter: grayscale(50%) contrast(50%);
-}
-.hand-card:hover .hand-card-img {
- box-shadow: 0 10px 40px black;
- width: 14rem;
- max-width: 15vw;
- max-height: 90vh;
-}
-
-.hand-card .action-buttons {
- align-items: flex-end;
- display: none;
- grid-row: 1;
- grid-column: 1;
-}
-.hand-card:hover .action-buttons {
- display: flex;
-}
diff --git a/sw-ui/src/components/game/Hand.tsx b/sw-ui/src/components/game/Hand.tsx
deleted file mode 100644
index 744c45cc..00000000
--- a/sw-ui/src/components/game/Hand.tsx
+++ /dev/null
@@ -1,44 +0,0 @@
-import { Button, ButtonGroup, Classes, Intent } from '@blueprintjs/core';
-import React from 'react';
-import { ApiHandCard, ApiPlayerMove } from '../../api/model';
-import './Hand.css'
-import { CardImage } from './CardImage';
-
-type HandProps = {
- cards: ApiHandCard[],
- wonderUpgradable: boolean,
- prepareMove: (move: ApiPlayerMove) => void
-}
-
-export const Hand = ({cards, wonderUpgradable, prepareMove}: HandProps) => {
- return <div className='hand'>{cards.map((c, i) => <HandCard key={i} card={c}
- wonderUpgradable={wonderUpgradable}
- prepareMove={prepareMove}/>)}</div>;
-};
-
-type HandCardProps = {
- card: ApiHandCard,
- wonderUpgradable: boolean,
- prepareMove: (move: ApiPlayerMove) => void
-}
-
-const HandCard = ({card, wonderUpgradable, prepareMove}: HandCardProps) => {
- let playableClass = card.playability.playable ? '' : 'unplayable';
- return <div className={`hand-card ${playableClass}`}>
- <CardImage card={card} otherClasses="hand-card-img"/>
- <ActionButtons card={card} wonderUpgradable={wonderUpgradable} prepareMove={prepareMove} />
- </div>
-};
-
-type ActionButtonsProps = HandCardProps
-
-const ActionButtons = ({card, wonderUpgradable, prepareMove}: ActionButtonsProps) => <ButtonGroup className="action-buttons">
- <Button title="PLAY" className={Classes.LARGE} intent={Intent.SUCCESS} icon='play'
- disabled={!card.playability.playable}
- onClick={() => prepareMove({type: 'PLAY', cardName: card.name, boughtResources: []})}/>
- <Button title="BUILD WONDER" className={Classes.LARGE} intent={Intent.PRIMARY} icon='key-shift'
- disabled={!wonderUpgradable}
- onClick={() => prepareMove({type: 'UPGRADE_WONDER', cardName: card.name, boughtResources: []})}/>
- <Button title="DISCARD" className={Classes.LARGE} intent={Intent.DANGER} icon='cross'
- onClick={() => prepareMove({type: 'DISCARD', cardName: card.name, boughtResources: []})}/>
-</ButtonGroup>;
diff --git a/sw-ui/src/components/game/ProductionBar.css b/sw-ui/src/components/game/ProductionBar.css
deleted file mode 100644
index 77a3b8fc..00000000
--- a/sw-ui/src/components/game/ProductionBar.css
+++ /dev/null
@@ -1,50 +0,0 @@
-.production-bar {
- align-items: center;
- background: lightgray;
- bottom: 0;
- border-top: 1px #8b8b8b solid;
- background: linear-gradient(#eaeaea, #888 7%);
- box-shadow: 0 0 15px 0 #747474;
- display: flex;
- height: 3.5rem;
- position: fixed;
- width: 100vw;
- z-index: 99;
-}
-
-.fixed-resources {
- margin: auto;
- display: flex;
-}
-.alternative-resources {
- margin: auto;
- display: flex;
-}
-
-.resource-with-count {
- margin-left: 1rem
-}
-.resource-choice {
- margin-left: 1.5rem;
-}
-
-.choice-separator {
- font-size: 2rem;
- vertical-align: middle;
- margin: 5px;
- color: #c29929;
- text-shadow: 0 0 1px black;
-}
-
-.token-img {
- height: 3rem;
- vertical-align: middle;
- width: 3rem;
-}
-
-.token-count {
- font-family: fantasy;
- font-size: 1.5rem;
- margin-left: 0.2rem;
- vertical-align: middle;
-}
diff --git a/sw-ui/src/components/game/ProductionBar.tsx b/sw-ui/src/components/game/ProductionBar.tsx
deleted file mode 100644
index 3e5c6d34..00000000
--- a/sw-ui/src/components/game/ProductionBar.tsx
+++ /dev/null
@@ -1,87 +0,0 @@
-import React from 'react';
-import { ApiCountedResource, ApiProduction, ApiResourceType } from '../../api/model';
-import './ProductionBar.css'
-
-type ProductionBarProps = {
- gold: number,
- production: ApiProduction,
-}
-
-export const ProductionBar = ({gold, production}: ProductionBarProps) => {
- return <div className='production-bar'>
- <GoldIndicator amount={gold}/>
- <FixedResources resources={production.fixedResources}/>
- <AlternativeResources resources={production.alternativeResources}/>
- </div>;
-};
-
-type GoldIndicatorProps = {
- amount: number,
-}
-const GoldIndicator = ({amount}: GoldIndicatorProps) => {
- return <TokenWithCount tokenName="coin" count={amount} otherClasses="gold-indicator"/>
-};
-
-type FixedResourcesProps = {
- resources: ApiCountedResource[],
-}
-const FixedResources = ({resources}: FixedResourcesProps) => {
- return <div className="fixed-resources">
- {resources.map(r => <TokenWithCount key={r.type}
- tokenName={getTokenName(r.type)}
- count={r.count}
- otherClasses="resource-with-count"/>)}
- </div>
-};
-
-type AlternativeResourcesProps = {
- resources: ApiResourceType[][],
-}
-const AlternativeResources = ({resources}: AlternativeResourcesProps) => {
- return <div className="alternative-resources">
- {resources.map((types, i) => <ResourceChoice key={i} types={types}/>)}
- </div>
-};
-
-type ResourceChoiceProps = {
- types: ApiResourceType[],
-}
-const ResourceChoice = ({types}: ResourceChoiceProps) => {
- let typeImages = types.map(type => <TokenImage key={type} tokenName={getTokenName(type)}/>);
- let separator = <span className="choice-separator">∕</span>;
- return <div className="resource-choice">
- {intersperce(typeImages, separator)}
- </div>
-};
-
-function intersperce<T>(array: T[], separator: T): T[] {
- let result = array.reduce((acc: T[], elt: T) => acc.concat(elt, separator), []);
- return result.slice(0, -1); // remove extra separator at the end
-}
-
-type TokenWithCountProps = {
- tokenName: string,
- count: number,
- otherClasses?: string,
-}
-const TokenWithCount = ({tokenName, count, otherClasses = ""}: TokenWithCountProps) => {
- return <div className={`token-with-count ${otherClasses}`}>
- <TokenImage tokenName={tokenName}/>
- <span className="token-count">× {count}</span>
- </div>
-};
-
-type TokenImageProps = {
- tokenName: string,
-}
-const TokenImage = ({tokenName}: TokenImageProps) => {
- return <img src={getTokenImagePath(tokenName)} title={tokenName} alt={tokenName} className="token-img"/>
-};
-
-function getTokenImagePath(tokenName: string): string {
- return `/images/tokens/${tokenName}.png`;
-}
-
-function getTokenName(resourceType: ApiResourceType): string {
- return `resources/${resourceType.toLowerCase()}`;
-}
diff --git a/sw-ui/src/components/home/ChooseNameForm.tsx b/sw-ui/src/components/home/ChooseNameForm.tsx
deleted file mode 100644
index 8292150b..00000000
--- a/sw-ui/src/components/home/ChooseNameForm.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { Button, Classes, InputGroup, Intent } from '@blueprintjs/core';
-import React, { ChangeEvent, Component, SyntheticEvent } from 'react';
-import { connect } from 'react-redux';
-import { actions } from '../../redux/actions/user';
-
-type ChooseNameFormPresenterProps = {
- chooseUsername: (username: string) => void,
-}
-
-class ChooseNameFormPresenter extends Component<ChooseNameFormPresenterProps> {
- _username = '';
-
- play = (e: SyntheticEvent<any>) => {
- e.preventDefault();
- if (this._username !== undefined) {
- this.props.chooseUsername(this._username);
- }
- };
-
- render() {
- return (
- <form onSubmit={this.play}>
- <InputGroup
- className={Classes.LARGE}
- placeholder="Username"
- onChange={(e: ChangeEvent<HTMLInputElement>) => (this._username = e.target.value)}
- rightElement={this.renderSubmit()}
- />
- </form>
- );
- }
-
- renderSubmit = () => (
- <Button className={Classes.MINIMAL} onClick={this.play} intent={Intent.PRIMARY} icon="arrow-right" />
- );
-}
-
-const mapDispatchToProps = {
- chooseUsername: actions.chooseUsername,
-};
-
-export const ChooseNameForm = connect(null, mapDispatchToProps)(ChooseNameFormPresenter);
diff --git a/sw-ui/src/components/home/Home.css b/sw-ui/src/components/home/Home.css
deleted file mode 100644
index 7d9a96de..00000000
--- a/sw-ui/src/components/home/Home.css
+++ /dev/null
@@ -1,13 +0,0 @@
-.homeRoot {
- background: url('background-zeus-temple.jpg') center no-repeat;
- background-size: cover;
-}
-
-.fullscreen {
- position: fixed;
- top: 0;
- left: 0;
- bottom: 0;
- right: 0;
- overflow: hidden;
-}
diff --git a/sw-ui/src/components/home/Home.tsx b/sw-ui/src/components/home/Home.tsx
deleted file mode 100644
index 094db658..00000000
--- a/sw-ui/src/components/home/Home.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import * as React from 'react';
-import { Flex } from 'reflexbox';
-import { ChooseNameForm } from './ChooseNameForm';
-import './Home.css'
-import logo from './logo-7-wonders.png';
-
-export const Home = () => (
- <Flex className='homeRoot fullscreen' column align='center' justify='center'>
- <img src={logo} alt="Seven Wonders"/>
- <ChooseNameForm/>
- </Flex>
-);
diff --git a/sw-ui/src/components/lobby/Lobby.tsx b/sw-ui/src/components/lobby/Lobby.tsx
deleted file mode 100644
index 3594af65..00000000
--- a/sw-ui/src/components/lobby/Lobby.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import { Button, Classes, Intent } from '@blueprintjs/core';
-import { List } from 'immutable';
-import React, { Component } from 'react';
-import { connect } from 'react-redux';
-import { ApiLobby, ApiPlayer } from '../../api/model';
-import { GlobalState } from '../../reducers';
-import { actions } from '../../redux/actions/lobby';
-import { getCurrentGame } from '../../redux/games';
-import { getCurrentPlayer } from '../../redux/user';
-import { RadialPlayerList } from './RadialPlayerList';
-
-export type LobbyStateProps = {
- currentGame: ApiLobby | null,
- currentPlayer: ApiPlayer | null,
- players: List<ApiPlayer>,
-}
-
-export type LobbyDispatchProps = {
- startGame: () => void,
-}
-
-export type LobbyProps = LobbyStateProps & LobbyDispatchProps
-
-class LobbyPresenter extends Component<LobbyProps> {
-
- render() {
- const {currentGame, currentPlayer, players, startGame} = this.props;
- if (!currentGame || !currentPlayer) {
- return <div>Error: no current game.</div>
- }
- return (
- <div>
- <h2>{currentGame.name + ' — Lobby'}</h2>
- <RadialPlayerList players={players}/>
- {currentPlayer.gameOwner && <Button text="START" className={Classes.LARGE} intent={Intent.PRIMARY} icon='play'
- onClick={startGame} disabled={players.size < 3}/>}
- </div>
- );
- }
-}
-
-function mapStateToProps(state: GlobalState): LobbyStateProps {
- const game = getCurrentGame(state);
- console.info(game);
- return {
- currentGame: game,
- currentPlayer: getCurrentPlayer(state),
- players: game ? List(game.players) : List(),
- };
-}
-
-const mapDispatchToProps = {
- startGame: actions.requestStartGame,
-};
-
-export const Lobby = connect(mapStateToProps, mapDispatchToProps)(LobbyPresenter);
diff --git a/sw-ui/src/components/lobby/PlayerList.tsx b/sw-ui/src/components/lobby/PlayerList.tsx
deleted file mode 100644
index bfc3a56c..00000000
--- a/sw-ui/src/components/lobby/PlayerList.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import { Classes, Icon } from '@blueprintjs/core'
-import { List } from 'immutable';
-import * as React from 'react';
-import { Flex } from 'reflexbox';
-import { ApiPlayer } from '../../api/model';
-
-type PlayerListItemProps = {
- player: ApiPlayer,
- isOwner: boolean,
- isUser: boolean,
-};
-
-const PlayerListItem = ({player, isOwner, isUser}: PlayerListItemProps) => (
- <tr>
- <td>
- <Flex align='center'>
- {isOwner && <Icon icon='badge' title='Game owner'/>}
- {isUser && <Icon icon='user' title='This is you'/>}
- </Flex>
- </td>
- <td>{player.displayName}</td>
- <td>{player.username}</td>
- </tr>
-);
-
-type PlayerListProps = {
- players: List<ApiPlayer>,
- owner: string,
- currentPlayer: ApiPlayer,
-};
-
-export const PlayerList = ({players, owner, currentPlayer}: PlayerListProps) => (
- <table className={Classes.HTML_TABLE}>
- <tbody>
- {players.map((player: ApiPlayer) => <PlayerListItem key={player.username}
- player={player}
- isOwner={player.username === owner}
- isUser={player.username === currentPlayer.username}/>)}
- </tbody>
- </table>
-);
diff --git a/sw-ui/src/components/lobby/RadialPlayerList.tsx b/sw-ui/src/components/lobby/RadialPlayerList.tsx
deleted file mode 100644
index 88db55fc..00000000
--- a/sw-ui/src/components/lobby/RadialPlayerList.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import { Icon, IconName, Intent } from '@blueprintjs/core';
-import { List } from 'immutable';
-import * as React from 'react';
-import { ReactNode } from 'react';
-import { Flex } from 'reflexbox';
-import { ApiPlayer } from '../../api/model';
-import { RadialList } from './radial-list/RadialList';
-import roundTable from './round-table.png';
-
-type PlayerItemProps = {
- player: ApiPlayer
-};
-
-const PlayerItem = ({player}: PlayerItemProps) => (
- <Flex column align='center'>
- <UserIcon isOwner={player.gameOwner} isUser={player.user} title={player.gameOwner ? 'Game owner' : null}/>
- <h5 style={{margin: 0}}>{player.displayName}</h5>
- </Flex>
-);
-
-const PlayerPlaceholder = () => (
- <Flex column align='center' style={{opacity: 0.3}}>
- <UserIcon isOwner={false} isUser={false} title='Waiting for player...'/>
- <h5 style={{margin: 0}}>?</h5>
- </Flex>
-);
-
-type UserIconProps = {
- isUser: boolean,
- isOwner: boolean,
- title: string | null,
-};
-
-const UserIcon = ({isUser, isOwner, title}: UserIconProps) => {
- const icon: IconName = isOwner ? 'badge' : 'user';
- const intent: Intent = isUser ? Intent.WARNING : Intent.NONE;
- return <Icon icon={icon} iconSize={50} intent={intent} title={title}/>;
-};
-
-type RadialPlayerListProps = {
- players: List<ApiPlayer>
-};
-
-export const RadialPlayerList = ({players}: RadialPlayerListProps) => {
- const orderedPlayers = placeUserFirst(players.toArray());
- const playerItems = orderedPlayers.map(player => <PlayerItem key={player.username} player={player}/>);
- const tableImg = <img src={roundTable} alt='Round table' style={{width: 200, height: 200}}/>;
- return <RadialList items={completeWithPlaceholders(playerItems)}
- centerElement={tableImg}
- radius={175}
- offsetDegrees={180}
- itemWidth={120}
- itemHeight={100}/>;
-};
-
-function placeUserFirst(players: ApiPlayer[]): ApiPlayer[] {
- while (!players[0].user) {
- players.push(players.shift()!);
- }
- return players;
-}
-
-function completeWithPlaceholders(playerItems: Array<ReactNode>): Array<ReactNode> {
- while (playerItems.length < 3) {
- playerItems.push(<PlayerPlaceholder/>);
- }
- return playerItems;
-}
-
diff --git a/sw-ui/src/components/lobby/radial-list/RadialList.css b/sw-ui/src/components/lobby/radial-list/RadialList.css
deleted file mode 100644
index 3b0f3a79..00000000
--- a/sw-ui/src/components/lobby/radial-list/RadialList.css
+++ /dev/null
@@ -1,23 +0,0 @@
-.radial-list-container {
- margin: 0;
- padding: 0;
- position: relative;
-}
-
-.radial-list {
- margin: 0;
- padding: 0;
- transition: all 500ms ease-in-out;
- z-index: 1;
-}
-
-.radial-list-center {
- z-index: 0;
-}
-
-.absolute-center {
- position: absolute;
- left: 50%;
- top: 50%;
- transform: translate(-50%, -50%);
-}
diff --git a/sw-ui/src/components/lobby/radial-list/RadialList.tsx b/sw-ui/src/components/lobby/radial-list/RadialList.tsx
deleted file mode 100644
index 806cdd08..00000000
--- a/sw-ui/src/components/lobby/radial-list/RadialList.tsx
+++ /dev/null
@@ -1,64 +0,0 @@
-import React, { ReactNode } from 'react';
-import { CartesianCoords, RadialConfig } from './radial-math';
-import { offsetsFromCenter, CLOCKWISE, COUNTERCLOCKWISE } from './radial-math';
-import './RadialList.css';
-import { RadialListItem } from './RadialListItem';
-
-type RadialListProps = {
- items: Array<ReactNode>,
- centerElement?: ReactNode,
- radius?: number, // 120px by default
- offsetDegrees?: number, // defaults to 0 = 12 o'clock
- arc?: number, // defaults to 360 (full circle)
- clockwise?: boolean, // defaults to true
- itemWidth?: number,
- itemHeight?: number,
-};
-
-export const RadialList = ({items, centerElement, radius = 120, offsetDegrees = 0, arc = 360, clockwise = true, itemWidth = 20, itemHeight = 20}: RadialListProps) => {
- const diameter = radius * 2;
- const containerStyle = {
- width: diameter + itemWidth,
- height: diameter + itemHeight,
- };
- const direction = clockwise ? CLOCKWISE : COUNTERCLOCKWISE;
- const radialConfig: RadialConfig = {radius, arc, offsetDegrees, direction};
-
- return <div className='radial-list-container' style={containerStyle}>
- <RadialListItems items={items} radialConfig={radialConfig}/>
- <RadialListCenter centerElement={centerElement}/>
- </div>;
-};
-
-type RadialListItemsProps = {
- items: Array<React.ReactNode>,
- radialConfig: RadialConfig,
-};
-
-const RadialListItems = ({items, radialConfig}: RadialListItemsProps) => {
- const diameter = radialConfig.radius * 2;
- const ulStyle = {
- width: diameter,
- height: diameter,
- };
- const itemOffsets: Array<CartesianCoords> = offsetsFromCenter(items.length, radialConfig);
-
- return <ul className='radial-list absolute-center' style={ulStyle}>
- {items.map((item, i) => (<RadialListItem
- key={i}
- item={item}
- offsets={itemOffsets[i]}
- />))}
- </ul>;
-};
-
-type RadialListCenterProps = {
- centerElement?: ReactNode,
-};
-
-const RadialListCenter = ({centerElement}: RadialListCenterProps) => {
- if (!centerElement) {
- return null;
- }
- return <div className='radial-list-center absolute-center'>{centerElement}</div>;
-};
diff --git a/sw-ui/src/components/lobby/radial-list/RadialListItem.css b/sw-ui/src/components/lobby/radial-list/RadialListItem.css
deleted file mode 100644
index 65bb9661..00000000
--- a/sw-ui/src/components/lobby/radial-list/RadialListItem.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.radial-list-item {
- display: block;
- position: absolute;
- top: 50%;
- left: 50%;
- margin: 0;
- padding: 0;
- list-style: unset;
- transition: all 500ms ease-in-out;
- z-index: 1;
-}
diff --git a/sw-ui/src/components/lobby/radial-list/RadialListItem.tsx b/sw-ui/src/components/lobby/radial-list/RadialListItem.tsx
deleted file mode 100644
index 19a27638..00000000
--- a/sw-ui/src/components/lobby/radial-list/RadialListItem.tsx
+++ /dev/null
@@ -1,18 +0,0 @@
-import * as React from 'react';
-import { ReactNode } from 'react';
-import { CartesianCoords } from './radial-math';
-import './RadialListItem.css';
-
-type RadialListItemProps = {
- item: ReactNode,
- offsets: CartesianCoords,
-};
-
-export const RadialListItem = ({item, offsets}: RadialListItemProps) => {
- // Y-axis points down, hence the minus sign
- const liStyle = {
- transform: `translate(${offsets.x}px, ${-offsets.y}px) translate(-50%, -50%)`,
- };
-
- return <li className='radial-list-item' style={liStyle}>{item}</li>;
-};
diff --git a/sw-ui/src/components/lobby/radial-list/radial-math.ts b/sw-ui/src/components/lobby/radial-list/radial-math.ts
deleted file mode 100644
index f0f411f5..00000000
--- a/sw-ui/src/components/lobby/radial-list/radial-math.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-export type CartesianCoords = {
- x: number,
- y: number,
-}
-type PolarCoords = {
- radius: number,
- angleDeg: number,
-}
-
-const toRad = (deg: number) => deg * (Math.PI / 180);
-const roundedProjection = (radius: number, thetaRad: number, trigFn: (angle: number) => number) => Math.round(radius * trigFn(thetaRad));
-const xProjection = (radius: number, thetaRad: number) => roundedProjection(radius, thetaRad, Math.cos);
-const yProjection = (radius: number, thetaRad: number) => roundedProjection(radius, thetaRad, Math.sin);
-
-const toCartesian = ({radius, angleDeg}: PolarCoords): CartesianCoords => ({
- x: xProjection(radius, toRad(angleDeg)),
- y: yProjection(radius, toRad(angleDeg)),
-});
-
-export type Direction = -1 | 1;
-export const CLOCKWISE: Direction = -1;
-export const COUNTERCLOCKWISE: Direction = 1;
-
-export type RadialConfig = {
- radius: number,
- arc: number,
- offsetDegrees: number,
- direction: Direction,
-}
-const DEFAULT_CONFIG: RadialConfig = {
- radius: 120,
- arc: 360,
- offsetDegrees: 0,
- direction: CLOCKWISE,
-};
-
-const DEFAULT_START = 90; // Up
-
-export function offsetsFromCenter(nbItems: number, radialConfig: RadialConfig = DEFAULT_CONFIG): Array<CartesianCoords> {
- return Array.from({length: nbItems}, (v, i) => itemCartesianOffsets(i, nbItems, radialConfig));
-}
-
-function itemCartesianOffsets(index: number, nbItems: number, {radius, arc, direction, offsetDegrees}: RadialConfig): CartesianCoords {
- const startAngle = DEFAULT_START + direction * offsetDegrees;
- const angleStep = arc / nbItems;
- const itemAngle = startAngle + direction * angleStep * index;
- return toCartesian({radius, angleDeg: itemAngle});
-}
diff --git a/sw-ui/src/global-styles.css b/sw-ui/src/global-styles.css
deleted file mode 100644
index e69de29b..00000000
--- a/sw-ui/src/global-styles.css
+++ /dev/null
diff --git a/sw-ui/src/index.tsx b/sw-ui/src/index.tsx
deleted file mode 100644
index fce90915..00000000
--- a/sw-ui/src/index.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import '@blueprintjs/core/lib/css/blueprint.css';
-import React from 'react';
-import ReactDOM from 'react-dom';
-import { Provider } from 'react-redux';
-import { ConnectedRouter } from 'react-router-redux';
-import { Application } from './components/Application';
-import { INITIAL_STATE } from './reducers';
-import { configureStore } from './store';
-
-const { store, history } = configureStore(INITIAL_STATE);
-
-const rootElement = document.getElementById('root');
-if (rootElement) {
- ReactDOM.render(<Provider store={store}>
- <ConnectedRouter history={history}>
- <Application/>
- </ConnectedRouter>
- </Provider>, rootElement);
-} else {
- console.error('Element with ID "root" was not found, cannot bootstrap react app');
-}
diff --git a/sw-ui/src/main/kotlin/blueprintjs.kt b/sw-ui/src/main/kotlin/blueprintjs.kt
new file mode 100644
index 00000000..13de8744
--- /dev/null
+++ b/sw-ui/src/main/kotlin/blueprintjs.kt
@@ -0,0 +1,525 @@
+@file:JsModule("@blueprintjs/core")
+package com.palantir.blueprintjs
+
+import org.w3c.dom.HTMLElement
+import org.w3c.dom.HTMLInputElement
+import org.w3c.dom.events.Event
+import org.w3c.dom.events.MouseEvent
+import react.*
+
+/**
+ * The four basic intents.
+ */
+// export declare const Intent: {
+// NONE: "none";
+// PRIMARY: "primary";
+// SUCCESS: "success";
+// WARNING: "warning";
+// DANGER: "danger";
+//};
+//export declare type Intent = typeof Intent[keyof typeof Intent];
+external enum class Intent {
+ NONE,
+ PRIMARY,
+ SUCCESS,
+ WARNING,
+ DANGER
+}
+
+/** Alignment along the horizontal axis. */
+//export declare const Alignment: {
+// CENTER: "center";
+// LEFT: "left";
+// RIGHT: "right";
+//};
+//export declare type Alignment = typeof Alignment[keyof typeof Alignment];
+external enum class Alignment {
+ CENTER,
+ LEFT,
+ RIGHT
+}
+
+/**
+ * A shared base interface for all Blueprint component props.
+ */
+external interface IProps : RProps {
+ /** A space-delimited list of class names to pass along to a child element. */
+ var className: String?
+}
+external interface IIntentProps {
+ /** Visual intent color to apply to element. */
+ var intent: Intent?
+}
+/**
+ * Interface for a clickable action, such as a button or menu item.
+ * These props can be spready directly to a `<Button>` or `<MenuItem>` element.
+ */
+external interface IActionProps : IIntentProps, IProps {
+ /** Whether this action is non-interactive. */
+ var disabled: Boolean?
+ /** Name of a Blueprint UI icon (or an icon element) to render before the text. */
+ var icon: IconName?
+ /** Click event handler. */
+ var onClick: ((event: MouseEvent) -> Unit)?
+ /** Action text. Can be any single React renderable. */
+ var text: String?
+}
+/** Interface for a link, with support for customizing target window. */
+external interface ILinkProps {
+ /** Link URL. */
+ var href: String?
+ /** Link target attribute. Use `"_blank"` to open in a new window. */
+ var target: String?
+}
+/** Interface for a controlled input. */
+external interface IControlledProps {
+ /** Initial value of the input, for uncontrolled usage. */
+ var defaultValue: String?
+ /** Change event handler. Use `event.target.value` for new value. */
+ var onChange: ((Event) -> Unit)?
+ /** Form value of the input, for controlled usage. */
+ var value: String?
+}
+/**
+ * An interface for an option in a list, such as in a `<select>` or `RadioGroup`.
+ * These props can be spread directly to an `<option>` or `<Radio>` element.
+ */
+external interface IOptionProps : IProps {
+ /** Whether this option is non-interactive. */
+ var disabled: Boolean?
+ /** Label text for this option. If omitted, `value` is used as the label. */
+ var label: String?
+ /** Value of this option. */
+ var value: Any? // String | Number
+}
+
+external interface IIconProps : IIntentProps, IProps {
+ /**
+ * Color of icon. This is used as the `fill` attribute on the `<svg>` image
+ * so it will override any CSS `color` property, including that set by
+ * `intent`. If this prop is omitted, icon color is inherited from
+ * surrounding text.
+ */
+ var color: String?
+ /**
+ * String for the `title` attribute on the rendered element, which will appear
+ * on hover as a native browser tooltip.
+ */
+ var htmlTitle: String?
+ /**
+ * Name of a Blueprint UI icon, or an icon element, to render. This prop is
+ * required because it determines the content of the component, but it can
+ * be explicitly set to falsy values to render nothing.
+ *
+ * - If `null` or `undefined` or `false`, this component will render
+ * nothing.
+ * - If given an `IconName` (a string literal union of all icon names), that
+ * icon will be rendered as an `<svg>` with `<path>` tags. Unknown strings
+ * will render a blank icon to occupy space.
+ * - If given a `JSX.Element`, that element will be rendered and _all other
+ * props on this component are ignored._ This type is supported to
+ * simplify icon support in other Blueprint components. As a consumer, you
+ * should avoid using `<Icon icon={<Element />}` directly; simply render
+ * `<Element />` instead.
+ */
+ var icon: IconName
+ /**
+ * Size of the icon, in pixels. Blueprint contains 16px and 20px SVG icon
+ * images, and chooses the appropriate resolution based on this prop.
+ * @default Icon.SIZE_STANDARD = 16
+ */
+ var iconSize: Int?
+ /** CSS style properties. */
+ //var style: CSSProperties? // TODO
+ /**
+ * HTML tag to use for the rendered element.
+ * @default "span"
+ */
+ var tagName: String? // keyof JSX.IntrinsicElements
+ /**
+ * Description string. This string does not appear in normal browsers, but
+ * it increases accessibility. For instance, screen readers will use it for
+ * aural feedback. By default, this is set to the icon's name. Pass an
+ * explicit falsy value to disable.
+ */
+ var title: String?
+}
+
+external class Icon : PureComponent<IIconProps, RState> {
+
+ override fun render(): ReactElement?
+
+ companion object {
+ val SIZE_STANDARD: Int = definedExternally
+ val SIZE_LARGE: Int = definedExternally
+ }
+}
+
+external interface IButtonProps : IActionProps {
+ // artificially added to allow title on button (should probably be on more general props)
+ var title: String?
+ /**
+ * If set to `true`, the button will display in an active state.
+ * This is equivalent to setting `className={Classes.ACTIVE}`.
+ * @default false
+ */
+ var active: Boolean?
+ /**
+ * Text alignment within button. By default, icons and text will be centered
+ * within the button. Passing `"left"` or `"right"` will align the button
+ * text to that side and push `icon` and `rightIcon` to either edge. Passing
+ * `"center"` will center the text and icons together.
+ * @default Alignment.CENTER
+ */
+ var alignText: Alignment?
+ /** A ref handler that receives the native HTML element backing this component. */
+ var elementRef: ((ref: HTMLElement?) -> Any)?
+ /** Whether this button should expand to fill its container. */
+ var fill: Boolean?
+ /** Whether this button should use large styles. */
+ var large: Boolean?
+ /**
+ * If set to `true`, the button will display a centered loading spinner instead of its contents.
+ * The width of the button is not affected by the value of this prop.
+ * @default false
+ */
+ var loading: Boolean?
+ /** Whether this button should use minimal styles. */
+ var minimal: Boolean?
+ /** Whether this button should use outlined styles. */
+ var outlined: Boolean?
+ /** Name of a Blueprint UI icon (or an icon element) to render after the text. */
+ var rightIcon: IconName?
+ /** Whether this button should use small styles. */
+ var small: Boolean?
+ /**
+ * HTML `type` attribute of button. Accepted values are `"button"`, `"submit"`, and `"reset"`.
+ * Note that this prop has no effect on `AnchorButton`; it only affects `Button`.
+ * @default "button"
+ */
+ var type: String? //"submit" | "reset" | "button";
+}
+
+external interface IButtonState : RState {
+ var isActive: Boolean
+}
+
+abstract external class AbstractButton : PureComponent<IButtonProps, IButtonState> {
+}
+
+external class Button : AbstractButton {
+ override fun render(): ReactElement
+}
+external class AnchorButton : AbstractButton {
+ override fun render(): ReactElement
+}
+
+external interface IButtonGroupProps : IProps {
+ /**
+ * Text alignment within button. By default, icons and text will be centered
+ * within the button. Passing `"left"` or `"right"` will align the button
+ * text to that side and push `icon` and `rightIcon` to either edge. Passing
+ * `"center"` will center the text and icons together.
+ */
+ var alignText: Alignment?
+
+ /**
+ * Whether the button group should take up the full width of its container.
+ * @default false
+ */
+ var fill: Boolean?
+
+ /**
+ * Whether the child buttons should appear with minimal styling.
+ * @default false
+ */
+ var minimal: Boolean?
+
+ /**
+ * Whether the child buttons should appear with large styling.
+ * @default false
+ */
+ var large: Boolean?
+
+ /**
+ * Whether the button group should appear with vertical styling.
+ * @default false
+ */
+ var vertical: Boolean?
+}
+
+external class ButtonGroup : PureComponent<IButtonGroupProps, RState> {
+ override fun render(): ReactElement?
+}
+
+external interface IInputGroupProps : IControlledProps, IIntentProps, IProps {
+ /**
+ * Whether the input is non-interactive.
+ * Note that `rightElement` must be disabled separately; this prop will not affect it.
+ * @default false
+ */
+ var disabled: Boolean?
+ /**
+ * Whether the component should take up the full width of its container.
+ */
+ var fill: Boolean?
+ /** Ref handler that receives HTML `<input>` element backing this component. */
+ var inputRef: ((ref: HTMLInputElement?) -> Any)?;
+ /**
+ * Name of a Blueprint UI icon (or an icon element) to render on the left side of the input group,
+ * before the user's cursor.
+ */
+ var leftIcon: IconName?
+ /** Whether this input should use large styles. */
+ var large: Boolean?
+ /** Whether this input should use small styles. */
+ var small: Boolean?
+ /** Placeholder text in the absence of any value. */
+ var placeholder: String?
+ /**
+ * Element to render on right side of input.
+ * For best results, use a minimal button, tag, or small spinner.
+ */
+ var rightElement: ReactElement?
+ /** Whether the input (and any buttons) should appear with rounded caps. */
+ var round: Boolean?
+ /**
+ * HTML `input` type attribute.
+ * @default "text"
+ */
+ var type: String?
+}
+
+external interface IInputGroupState : RState {
+ var rightElementWidth: Int
+}
+
+external class InputGroup : PureComponent<IInputGroupProps, IInputGroupState> {
+ override fun render(): ReactElement
+}
+
+external interface ITagProps : IProps, IIntentProps {
+ /**
+ * Whether the tag should appear in an active state.
+ * @default false
+ */
+ var active: Boolean?
+ /**
+ * Whether the tag should take up the full width of its container.
+ * @default false
+ */
+ var fill: Boolean?
+ /** Name of a Blueprint UI icon (or an icon element) to render before the children. */
+ var icon: IconName?
+ /**
+ * Whether the tag should visually respond to user interactions. If set
+ * to `true`, hovering over the tag will change its color and mouse cursor.
+ *
+ * Recommended when `onClick` is also defined.
+ *
+ * @default false
+ */
+ var interactive: Boolean?
+ /**
+ * Whether this tag should use large styles.
+ * @default false
+ */
+ var large: Boolean?
+ /**
+ * Whether this tag should use minimal styles.
+ * @default false
+ */
+ var minimal: Boolean?
+ /**
+ * Whether tag content should be allowed to occupy multiple lines.
+ * If false, a single line of text will be truncated with an ellipsis if
+ * it overflows. Note that icons will be vertically centered relative to
+ * multiline text.
+ * @default false
+ */
+ var multiline: Boolean?
+ /**
+ * Callback invoked when the tag is clicked.
+ * Recommended when `interactive` is `true`.
+ */
+ var onClick: ((e: MouseEvent) -> Unit)?;
+ /**
+ * Click handler for remove button.
+ * The remove button will only be rendered if this prop is defined.
+ */
+ var onRemove: ((e: MouseEvent, tagProps: ITagProps) -> Unit)?
+ /** Name of a Blueprint UI icon (or an icon element) to render after the children. */
+ var rightIcon: IconName?
+ /**
+ * Whether this tag should have rounded ends.
+ * @default false
+ */
+ var round: Boolean?
+}
+
+external class Tag : PureComponent<ITagProps, RState> {
+ override fun render(): ReactElement
+}
+
+external interface INonIdealStateProps : IProps {
+ /** An action to resolve the non-ideal state which appears after `description`. */
+ var action: ReactElement?
+
+ /**
+ * Advanced usage: React `children` will appear last (after `action`).
+ * Avoid passing raw strings as they will not receive margins and disrupt the layout flow.
+ */
+ var children: ReactElement?
+
+ /**
+ * A longer description of the non-ideal state.
+ * A string or number value will be wrapped in a `<div>` to preserve margins.
+ */
+ var description: ReactElement?
+
+ /** The name of a Blueprint icon or a JSX Element (such as `<Spinner/>`) to render above the title. */
+ var icon: IconName?
+
+ /** The title of the non-ideal state. */
+ var title: ReactElement?
+}
+
+external class NonIdealState : PureComponent<INonIdealStateProps, RState> {
+ override fun render(): ReactElement?
+}
+
+external class Classes {
+ companion object {
+ val HTML_TABLE: String = definedExternally
+ }
+}
+
+external interface IOverlayableProps : IOverlayLifecycleProps {
+ /**
+ * Whether the overlay should acquire application focus when it first opens.
+ * @default true
+ */
+ var autoFocus: Boolean?
+ /**
+ * Whether pressing the `esc` key should invoke `onClose`.
+ * @default true
+ */
+ var canEscapeKeyClose: Boolean?
+ /**
+ * Whether the overlay should prevent focus from leaving itself. That is, if the user attempts
+ * to focus an element outside the overlay and this prop is enabled, then the overlay will
+ * immediately bring focus back to itself. If you are nesting overlay components, either disable
+ * this prop on the "outermost" overlays or mark the nested ones `usePortal={false}`.
+ * @default true
+ */
+ var enforceFocus: Boolean?
+ /**
+ * If `true` and `usePortal={true}`, the `Portal` containing the children is created and attached
+ * to the DOM when the overlay is opened for the first time; otherwise this happens when the
+ * component mounts. Lazy mounting provides noticeable performance improvements if you have lots
+ * of overlays at once, such as on each row of a table.
+ * @default true
+ */
+ var lazy: Boolean?
+ /**
+ * Indicates how long (in milliseconds) the overlay's enter/leave transition takes.
+ * This is used by React `CSSTransition` to know when a transition completes and must match
+ * the duration of the animation in CSS. Only set this prop if you override Blueprint's default
+ * transitions with new transitions of a different length.
+ * @default 300
+ */
+ var transitionDuration: Int?
+ /**
+ * Whether the overlay should be wrapped in a `Portal`, which renders its contents in a new
+ * element attached to `portalContainer` prop.
+ *
+ * This prop essentially determines which element is covered by the backdrop: if `false`,
+ * then only its parent is covered; otherwise, the entire page is covered (because the parent
+ * of the `Portal` is the `<body>` itself).
+ *
+ * Set this prop to `false` on nested overlays (such as `Dialog` or `Popover`) to ensure that they
+ * are rendered above their parents.
+ * @default true
+ */
+ var usePortal: Boolean?
+ /**
+ * Space-delimited string of class names applied to the `Portal` element if
+ * `usePortal={true}`.
+ */
+ var portalClassName: String?
+ /**
+ * The container element into which the overlay renders its contents, when `usePortal` is `true`.
+ * This prop is ignored if `usePortal` is `false`.
+ * @default document.body
+ */
+ var portalContainer: HTMLElement?
+ /**
+ * A callback that is invoked when user interaction causes the overlay to close, such as
+ * clicking on the overlay or pressing the `esc` key (if enabled).
+ *
+ * Receives the event from the user's interaction, if there was an event (generally either a
+ * mouse or key event). Note that, since this component is controlled by the `isOpen` prop, it
+ * will not actually close itself until that prop becomes `false`.
+ */
+ var onClose: ((Event) -> Unit)?
+}
+external interface IOverlayLifecycleProps {
+ /**
+ * Lifecycle method invoked just before the CSS _close_ transition begins on
+ * a child. Receives the DOM element of the child being closed.
+ */
+ var onClosing: ((node: HTMLElement) -> Unit)?
+ /**
+ * Lifecycle method invoked just after the CSS _close_ transition ends but
+ * before the child has been removed from the DOM. Receives the DOM element
+ * of the child being closed.
+ */
+ var onClosed: ((node: HTMLElement) -> Unit)?
+ /**
+ * Lifecycle method invoked just after mounting the child in the DOM but
+ * just before the CSS _open_ transition begins. Receives the DOM element of
+ * the child being opened.
+ */
+ var onOpening: ((node: HTMLElement) -> Unit)?
+ /**
+ * Lifecycle method invoked just after the CSS _open_ transition ends.
+ * Receives the DOM element of the child being opened.
+ */
+ var onOpened: ((node: HTMLElement) -> Unit)?
+}
+external interface IBackdropProps {
+ /** CSS class names to apply to backdrop element. */
+ var backdropClassName: String?
+ /** HTML props for the backdrop element. */
+ var backdropProps: RProps? //React.HTMLProps<HTMLDivElement>?
+ /**
+ * Whether clicking outside the overlay element (either on backdrop when present or on document)
+ * should invoke `onClose`.
+ * @default true
+ */
+ var canOutsideClickClose: Boolean?
+ /**
+ * Whether a container-spanning backdrop element should be rendered behind the contents.
+ * @default true
+ */
+ var hasBackdrop: Boolean?
+}
+external interface IOverlayProps : IOverlayableProps, IBackdropProps, IProps {
+ /**
+ * Toggles the visibility of the overlay and its children.
+ * This prop is required because the component is controlled.
+ */
+ var isOpen: Boolean
+ /**
+ * Name of the transition for internal `CSSTransition`.
+ * Providing your own name here will require defining new CSS transition properties.
+ * @default Classes.OVERLAY
+ */
+ var transitionName: String?
+}
+external interface IOverlayState : RState {
+ var hasEverOpened: Boolean?
+}
+external class Overlay : PureComponent<IOverlayProps, IOverlayState> {
+ override fun render(): ReactElement
+} \ No newline at end of file
diff --git a/sw-ui/src/main/kotlin/blueprintjsHelpers.kt b/sw-ui/src/main/kotlin/blueprintjsHelpers.kt
new file mode 100644
index 00000000..da6b6914
--- /dev/null
+++ b/sw-ui/src/main/kotlin/blueprintjsHelpers.kt
@@ -0,0 +1,137 @@
+package com.palantir.blueprintjs
+
+import org.w3c.dom.events.Event
+import org.w3c.dom.events.MouseEvent
+import react.RBuilder
+import react.RHandler
+import react.ReactElement
+
+typealias IconName = String
+
+fun RBuilder.bpIcon(
+ name: IconName,
+ size: Int = Icon.SIZE_STANDARD,
+ intent: Intent = Intent.NONE,
+ title: String? = null,
+ alt: String? = null,
+ className: String? = null,
+ block: RHandler<IIconProps> = {}
+): ReactElement = child(Icon::class) {
+ attrs {
+ this.icon = name
+ this.iconSize = size
+ this.htmlTitle = title
+ this.intent = intent
+ this.title = alt
+ this.className = className
+ }
+ block()
+}
+
+fun RBuilder.bpButton(
+ minimal: Boolean = false,
+ small: Boolean = false,
+ large: Boolean = false,
+ disabled: Boolean = false,
+ title: String? = null,
+ icon: IconName? = null,
+ rightIcon: IconName? = null,
+ intent: Intent = Intent.NONE,
+ onClick: ((event: MouseEvent) -> Unit)? = {},
+ block: RHandler<IButtonProps> = {}
+): ReactElement = child(Button::class) {
+ attrs {
+ this.title = title
+ this.minimal = minimal
+ this.small = small
+ this.large = large
+ this.disabled = disabled
+ this.icon = icon
+ this.rightIcon = rightIcon
+ this.intent = intent
+ this.onClick = onClick
+ }
+ block()
+}
+
+fun RBuilder.bpButtonGroup(
+ large: Boolean = false,
+ minimal: Boolean = false,
+ block: RHandler<IButtonGroupProps> = {}
+): ReactElement = child(ButtonGroup::class) {
+ attrs {
+ this.large = large
+ this.minimal = minimal
+ }
+ block()
+}
+
+fun RBuilder.bpInputGroup(
+ large: Boolean = false,
+ placeholder: String = "",
+ rightElement: ReactElement? = null,
+ onChange: (Event) -> Unit
+): ReactElement = child(InputGroup::class) {
+ attrs {
+ this.large = large
+ this.placeholder = placeholder
+ this.rightElement = rightElement
+ this.onChange = onChange
+ }
+}
+
+fun RBuilder.bpTag(
+ intent: Intent? = null,
+ minimal: Boolean? = null,
+ active: Boolean? = null,
+ block: RHandler<ITagProps> = {}
+): ReactElement = child(Tag::class) {
+ attrs {
+ this.intent = intent
+ this.minimal = minimal
+ this.active = active
+ }
+ block()
+}
+
+fun RBuilder.bpNonIdealState(
+ icon: IconName? = null,
+ title: ReactElement? = null,
+ description: ReactElement? = null,
+ action: ReactElement? = null,
+ children: ReactElement? = null,
+ block: RHandler<INonIdealStateProps> = {}
+): ReactElement = child(NonIdealState::class) {
+ attrs {
+ this.icon = icon
+ this.title = title
+ this.description = description
+ this.action = action
+ this.children = children
+ }
+ block()
+}
+
+fun RBuilder.bpOverlay(
+ isOpen: Boolean,
+ autoFocus: Boolean = true,
+ enforceFocus: Boolean = true,
+ usePortal: Boolean = true,
+ hasBackdrop: Boolean = true,
+ canEscapeKeyClose: Boolean = true,
+ canOutsideClickClose: Boolean = true,
+ onClose: () -> Unit = {},
+ block: RHandler<IOverlayProps> = {}
+): ReactElement = child(Overlay::class) {
+ attrs {
+ this.isOpen = isOpen
+ this.autoFocus = autoFocus
+ this.enforceFocus = enforceFocus
+ this.usePortal = usePortal
+ this.hasBackdrop = hasBackdrop
+ this.canEscapeKeyClose = canEscapeKeyClose
+ this.canOutsideClickClose = canOutsideClickClose
+ this.onClose = { onClose() }
+ }
+ block()
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/SevenWondersUi.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/SevenWondersUi.kt
new file mode 100644
index 00000000..8b38e010
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/SevenWondersUi.kt
@@ -0,0 +1,49 @@
+package org.luxons.sevenwonders.ui
+
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import org.luxons.sevenwonders.ui.components.application
+import org.luxons.sevenwonders.ui.redux.SwState
+import org.luxons.sevenwonders.ui.redux.configureStore
+import org.luxons.sevenwonders.ui.redux.sagas.SagaManager
+import org.luxons.sevenwonders.ui.redux.sagas.rootSaga
+import org.w3c.dom.Element
+import react.dom.*
+import react.redux.provider
+import redux.RAction
+import redux.Store
+import redux.WrapperAction
+import kotlin.browser.document
+import kotlin.browser.window
+
+fun main() {
+ window.onload = {
+ val rootElement = document.getElementById("root")
+ if (rootElement != null) {
+ initializeAndRender(rootElement)
+ } else {
+ console.error("Element with ID 'root' was not found, cannot bootstrap react app")
+ }
+ }
+}
+
+private fun initializeAndRender(rootElement: Element) {
+ val store = initRedux()
+
+ render(rootElement) {
+ provider(store) {
+ application()
+ }
+ }
+}
+
+private fun initRedux(): Store<SwState, RAction, WrapperAction> {
+ val sagaManager = SagaManager<SwState, RAction, WrapperAction>()
+ val store = configureStore(sagaManager = sagaManager)
+ GlobalScope.launch {
+ sagaManager.launchSaga(this) {
+ rootSaga()
+ }
+ }
+ return store
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/Application.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/Application.kt
new file mode 100644
index 00000000..b1244b5c
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/Application.kt
@@ -0,0 +1,22 @@
+package org.luxons.sevenwonders.ui.components
+
+import org.luxons.sevenwonders.ui.components.game.gameScene
+import org.luxons.sevenwonders.ui.components.gameBrowser.gameBrowser
+import org.luxons.sevenwonders.ui.components.home.home
+import org.luxons.sevenwonders.ui.components.lobby.lobby
+import org.luxons.sevenwonders.ui.router.Route
+import react.RBuilder
+import react.router.dom.hashRouter
+import react.router.dom.redirect
+import react.router.dom.route
+import react.router.dom.switch
+
+fun RBuilder.application() = hashRouter {
+ switch {
+ route(Route.GAME_BROWSER.path) { gameBrowser() }
+ route(Route.GAME.path) { gameScene() }
+ route(Route.LOBBY.path) { lobby() }
+ route(Route.HOME.path, exact = true) { home() }
+ redirect(from = "*", to = "/")
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/GlobalStyles.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/GlobalStyles.kt
new file mode 100644
index 00000000..f5b16248
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/GlobalStyles.kt
@@ -0,0 +1,36 @@
+package org.luxons.sevenwonders.ui.components
+
+import kotlinx.css.Overflow
+import kotlinx.css.Position
+import kotlinx.css.bottom
+import kotlinx.css.left
+import kotlinx.css.overflow
+import kotlinx.css.pct
+import kotlinx.css.position
+import kotlinx.css.properties.transform
+import kotlinx.css.properties.translate
+import kotlinx.css.px
+import kotlinx.css.right
+import kotlinx.css.top
+import styled.StyleSheet
+
+object GlobalStyles : StyleSheet("GlobalStyles", isStatic = true) {
+
+ val fullscreen by css {
+ position = Position.fixed
+ top = 0.px
+ left = 0.px
+ bottom = 0.px
+ right = 0.px
+ overflow = Overflow.hidden
+ }
+
+ val fixedCenter by css {
+ position = Position.fixed
+ left = 50.pct
+ top = 50.pct
+ transform {
+ translate((-50).pct, (-50).pct)
+ }
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Board.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Board.kt
new file mode 100644
index 00000000..dd67757a
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Board.kt
@@ -0,0 +1,124 @@
+package org.luxons.sevenwonders.ui.components.game
+
+import kotlinx.css.Color
+import kotlinx.css.Display
+import kotlinx.css.Position
+import kotlinx.css.TextAlign
+import kotlinx.css.display
+import kotlinx.css.height
+import kotlinx.css.margin
+import kotlinx.css.maxHeight
+import kotlinx.css.maxWidth
+import kotlinx.css.pct
+import kotlinx.css.position
+import kotlinx.css.properties.boxShadow
+import kotlinx.css.properties.transform
+import kotlinx.css.properties.translate
+import kotlinx.css.rem
+import kotlinx.css.textAlign
+import kotlinx.css.vh
+import kotlinx.css.vw
+import kotlinx.css.width
+import kotlinx.css.zIndex
+import kotlinx.html.DIV
+import kotlinx.html.title
+import org.luxons.sevenwonders.model.boards.Board
+import org.luxons.sevenwonders.model.cards.TableCard
+import org.luxons.sevenwonders.model.wonders.ApiWonder
+import react.RBuilder
+import styled.StyledDOMBuilder
+import styled.css
+import styled.styledDiv
+import styled.styledImg
+
+// card offsets in % of their size when displayed in columns
+private const val xOffset = 20
+private const val yOffset = 21
+
+fun RBuilder.boardComponent(board: Board) {
+ styledDiv {
+ css {
+ width = 100.vw
+ }
+ tableCards(cardColumns = board.playedCards)
+ wonderComponent(wonder = board.wonder)
+ }
+}
+
+private fun RBuilder.tableCards(cardColumns: List<List<TableCard>>) {
+ styledDiv {
+ css {
+ display = Display.flex
+ height = 40.vh
+ width = 100.vw
+ }
+ cardColumns.forEach { cards ->
+ tableCardColumn(cards = cards) {
+ attrs {
+ key = cards.first().color.toString()
+ }
+ }
+ }
+ }
+}
+
+private fun RBuilder.tableCardColumn(cards: List<TableCard>, block: StyledDOMBuilder<DIV>.() -> Unit = {}) {
+ styledDiv {
+ css {
+ height = 40.vh
+ width = 15.vw
+ margin = "auto"
+ position = Position.relative
+ }
+ block()
+ cards.forEachIndexed { index, card ->
+ tableCard(card = card, indexInColumn = index) {
+ attrs { key = card.name }
+ }
+ }
+ }
+}
+
+private fun RBuilder.tableCard(card: TableCard, indexInColumn: Int, block: StyledDOMBuilder<DIV>.() -> Unit = {}) {
+ styledDiv {
+ css {
+ position = Position.absolute
+ zIndex = indexInColumn
+ transform {
+ translate(
+ tx = (indexInColumn * xOffset).pct,
+ ty = (indexInColumn * yOffset).pct
+ )
+ }
+ }
+ block()
+ val highlightColor = if (card.playedDuringLastMove) Color.gold else null
+ cardImage(card = card, highlightColor = highlightColor) {
+ css {
+ maxWidth = 10.vw
+ maxHeight = 25.vh
+ }
+ }
+ }
+}
+
+private fun RBuilder.wonderComponent(wonder: ApiWonder) {
+ styledDiv {
+ css {
+ width = 100.vw
+ textAlign = TextAlign.center
+ }
+ styledImg(src="/images/wonders/${wonder.image}") {
+ css {
+ declarations["border-radius"] = "0.5%/1.5%"
+ boxShadow(color = Color.black, offsetX = 0.2.rem, offsetY = 0.2.rem, blurRadius = 0.5.rem)
+ maxHeight = 30.vh
+ maxWidth = 95.vw
+ }
+ attrs {
+ this.title = wonder.name
+ this.alt = "Wonder ${wonder.name}"
+ }
+ }
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/CardImage.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/CardImage.kt
new file mode 100644
index 00000000..38afe028
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/CardImage.kt
@@ -0,0 +1,43 @@
+package org.luxons.sevenwonders.ui.components.game
+
+import kotlinx.css.CSSBuilder
+import kotlinx.css.Color
+import kotlinx.css.borderRadius
+import kotlinx.css.pct
+import kotlinx.css.properties.boxShadow
+import kotlinx.css.px
+import kotlinx.css.rem
+import kotlinx.html.IMG
+import kotlinx.html.title
+import org.luxons.sevenwonders.model.cards.Card
+import react.RBuilder
+import styled.StyledDOMBuilder
+import styled.css
+import styled.styledImg
+
+fun RBuilder.cardImage(card: Card, highlightColor: Color? = null, block: StyledDOMBuilder<IMG>.() -> Unit = {}) {
+ styledImg(src = "/images/cards/${card.image}") {
+ css {
+ borderRadius = 5.pct
+ boxShadow(offsetX = 2.px, offsetY = 2.px, blurRadius = 5.px, color = Color.black)
+ highlightStyle(highlightColor)
+ }
+ attrs {
+ title = card.name
+ alt = "Card ${card.name}"
+ }
+ block()
+ }
+}
+
+private fun CSSBuilder.highlightStyle(highlightColor: Color?) {
+ if (highlightColor != null) {
+ boxShadow(
+ offsetX = 0.px,
+ offsetY = 0.px,
+ blurRadius = 1.rem,
+ spreadRadius = 0.1.rem,
+ color = highlightColor
+ )
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/GameScene.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/GameScene.kt
new file mode 100644
index 00000000..d54a0240
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/GameScene.kt
@@ -0,0 +1,178 @@
+package org.luxons.sevenwonders.ui.components.game
+
+import com.palantir.blueprintjs.Intent
+import com.palantir.blueprintjs.bpButton
+import com.palantir.blueprintjs.bpButtonGroup
+import com.palantir.blueprintjs.bpOverlay
+import kotlinx.css.Position
+import kotlinx.css.background
+import kotlinx.css.backgroundSize
+import kotlinx.css.bottom
+import kotlinx.css.left
+import kotlinx.css.pct
+import kotlinx.css.position
+import kotlinx.css.properties.transform
+import kotlinx.css.properties.translate
+import kotlinx.css.px
+import kotlinx.css.rem
+import kotlinx.css.right
+import kotlinx.css.top
+import kotlinx.html.DIV
+import org.luxons.sevenwonders.model.Action
+import org.luxons.sevenwonders.model.PlayerMove
+import org.luxons.sevenwonders.model.PlayerTurnInfo
+import org.luxons.sevenwonders.model.api.PlayerDTO
+import org.luxons.sevenwonders.model.cards.HandCard
+import org.luxons.sevenwonders.ui.components.GlobalStyles
+import org.luxons.sevenwonders.ui.redux.GameState
+import org.luxons.sevenwonders.ui.redux.RequestPrepareMove
+import org.luxons.sevenwonders.ui.redux.RequestSayReady
+import org.luxons.sevenwonders.ui.redux.RequestUnprepareMove
+import org.luxons.sevenwonders.ui.redux.connectStateAndDispatch
+import react.RBuilder
+import react.RClass
+import react.RComponent
+import react.RProps
+import react.RState
+import react.ReactElement
+import react.dom.*
+import styled.StyledDOMBuilder
+import styled.css
+import styled.styledDiv
+
+interface GameSceneStateProps: RProps {
+ var playerIsReady: Boolean
+ var players: List<PlayerDTO>
+ var gameState: GameState?
+ var preparedMove: PlayerMove?
+ var preparedCard: HandCard?
+}
+
+interface GameSceneDispatchProps: RProps {
+ var sayReady: () -> Unit
+ var prepareMove: (move: PlayerMove) -> Unit
+ var unprepareMove: () -> Unit
+}
+
+interface GameSceneProps : GameSceneStateProps, GameSceneDispatchProps
+
+private class GameScene(props: GameSceneProps) : RComponent<GameSceneProps, RState>(props) {
+
+ override fun RBuilder.render() {
+ styledDiv {
+ css {
+ background = "url('images/background-papyrus3.jpg')"
+ backgroundSize = "cover"
+ +GlobalStyles.fullscreen
+ }
+ val turnInfo = props.gameState?.turnInfo
+ if (turnInfo == null) {
+ p { +"Error: no turn info data"}
+ } else {
+ turnInfoScene(turnInfo)
+ }
+ }
+ }
+
+ private fun RBuilder.sayReadyButton(): ReactElement {
+ val isReady = props.playerIsReady
+ val intent = if (isReady) Intent.SUCCESS else Intent.PRIMARY
+ return styledDiv {
+ css {
+ position = Position.absolute
+ bottom = 6.rem
+ left = 50.pct
+ transform { translate(tx = (-50).pct) }
+ }
+ bpButtonGroup {
+ bpButton(
+ large = true,
+ disabled = isReady,
+ intent = intent,
+ icon = if (isReady) "tick-circle" else "play",
+ onClick = { props.sayReady() }
+ ) {
+ +"READY"
+ }
+ // not really a button, but nice for style
+ bpButton(
+ large = true,
+ icon = "people",
+ disabled = isReady,
+ intent = intent
+ ) {
+ +"${props.players.count { it.isReady }}/${props.players.size}"
+ }
+ }
+ }
+ }
+
+ private fun RBuilder.turnInfoScene(turnInfo: PlayerTurnInfo) {
+ val board = turnInfo.table.boards[turnInfo.playerIndex]
+ div {
+ // TODO use blueprint's Callout component without header and primary intent
+ p { + turnInfo.message }
+ boardComponent(board = board)
+ val hand = turnInfo.hand
+ if (hand != null) {
+ handComponent(
+ cards = hand,
+ wonderUpgradable = turnInfo.wonderBuildability.isBuildable,
+ preparedMove = props.preparedMove,
+ prepareMove = props.prepareMove
+ )
+ }
+ val card = props.preparedCard
+ if (card != null) {
+ preparedMove(card)
+ }
+ if (turnInfo.action == Action.SAY_READY) {
+ sayReadyButton()
+ }
+ productionBar(gold = board.gold, production = board.production)
+ }
+ }
+
+ private fun RBuilder.preparedMove(card: HandCard) {
+ bpOverlay(isOpen = true, onClose = props.unprepareMove) {
+ styledDiv {
+ css { +GlobalStyles.fixedCenter }
+ cardImage(card)
+ styledDiv {
+ css {
+ position = Position.absolute
+ top = 0.px
+ right = 0.px
+ }
+ bpButton(
+ icon = "cross",
+ title = "Cancel prepared move",
+ small = true,
+ intent = Intent.DANGER,
+ onClick = { props.unprepareMove() }
+ )
+ }
+ }
+ }
+ }
+}
+
+fun RBuilder.gameScene() = gameScene {}
+
+private val gameScene: RClass<GameSceneProps> = connectStateAndDispatch<GameSceneStateProps, GameSceneDispatchProps,
+ GameSceneProps>(
+ clazz = GameScene::class,
+ mapDispatchToProps = { dispatch, _ ->
+ prepareMove = { move -> dispatch(RequestPrepareMove(move)) }
+ unprepareMove = { dispatch(RequestUnprepareMove()) }
+ sayReady = { dispatch(RequestSayReady()) }
+ },
+ mapStateToProps = { state, _ ->
+ playerIsReady = state.currentPlayer?.isReady == true
+ players = state.gameState?.players ?: emptyList()
+ gameState = state.gameState
+ preparedMove = state.gameState?.currentPreparedMove
+ preparedCard = state.gameState?.currentPreparedCard
+ }
+)
+
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Hand.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Hand.kt
new file mode 100644
index 00000000..17ceffd2
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/Hand.kt
@@ -0,0 +1,174 @@
+package org.luxons.sevenwonders.ui.components.game
+
+import com.palantir.blueprintjs.Intent
+import com.palantir.blueprintjs.bpButton
+import com.palantir.blueprintjs.bpButtonGroup
+import kotlinx.css.Align
+import kotlinx.css.CSSBuilder
+import kotlinx.css.Color
+import kotlinx.css.Display
+import kotlinx.css.GridColumn
+import kotlinx.css.GridRow
+import kotlinx.css.Position
+import kotlinx.css.alignItems
+import kotlinx.css.bottom
+import kotlinx.css.display
+import kotlinx.css.filter
+import kotlinx.css.gridColumn
+import kotlinx.css.gridRow
+import kotlinx.css.height
+import kotlinx.css.left
+import kotlinx.css.margin
+import kotlinx.css.maxHeight
+import kotlinx.css.maxWidth
+import kotlinx.css.pct
+import kotlinx.css.position
+import kotlinx.css.properties.boxShadow
+import kotlinx.css.properties.s
+import kotlinx.css.properties.transform
+import kotlinx.css.properties.transition
+import kotlinx.css.properties.translate
+import kotlinx.css.px
+import kotlinx.css.rem
+import kotlinx.css.vh
+import kotlinx.css.vw
+import kotlinx.css.width
+import kotlinx.css.zIndex
+import kotlinx.html.DIV
+import org.luxons.sevenwonders.model.MoveType
+import org.luxons.sevenwonders.model.PlayerMove
+import org.luxons.sevenwonders.model.cards.HandCard
+import org.luxons.sevenwonders.model.cards.PreparedCard
+import org.luxons.sevenwonders.ui.components.game.cardImage
+import react.RBuilder
+import styled.StyledDOMBuilder
+import styled.css
+import styled.styledDiv
+
+fun RBuilder.handComponent(
+ cards: List<HandCard>,
+ wonderUpgradable: Boolean,
+ preparedMove: PlayerMove?,
+ prepareMove: (PlayerMove) -> Unit
+) {
+ styledDiv {
+ css {
+ handStyle()
+ }
+ cards.filter { it.name != preparedMove?.cardName }.forEachIndexed { index, c ->
+ handCard(
+ card = c,
+ wonderUpgradable = wonderUpgradable,
+ prepareMove = prepareMove
+ ) {
+ attrs {
+ key = index.toString()
+ }
+ }
+ }
+ }
+}
+
+private fun RBuilder.handCard(
+ card: HandCard,
+ wonderUpgradable: Boolean,
+ prepareMove: (PlayerMove) -> Unit,
+ block: StyledDOMBuilder<DIV>.() -> Unit
+) {
+ styledDiv {
+ css {
+ handCardStyle()
+ }
+ block()
+ cardImage(card) {
+ css {
+ handCardImgStyle(card.playability.isPlayable)
+ }
+ }
+ actionButtons(card, wonderUpgradable, prepareMove)
+ }
+}
+
+private fun RBuilder.actionButtons(card: HandCard, wonderUpgradable: Boolean, prepareMove: (PlayerMove) -> Unit) {
+ // class: action-buttons
+ styledDiv {
+ css {
+ alignItems = Align.flexEnd
+ display = Display.none
+ gridRow = GridRow("1")
+ gridColumn = GridColumn("1")
+
+ ancestorHover(".hand-card") {
+ display = Display.flex
+ }
+ }
+ bpButtonGroup {
+ bpButton(title = "PLAY",
+ large = true,
+ intent = Intent.SUCCESS,
+ icon = "play",
+ disabled = !card.playability.isPlayable,
+ onClick = { prepareMove(PlayerMove(MoveType.PLAY, card.name)) })
+ bpButton(title = "UPGRADE WONDER",
+ large = true,
+ intent = Intent.PRIMARY,
+ icon = "key-shift",
+ disabled = !wonderUpgradable,
+ onClick = { prepareMove(PlayerMove(MoveType.UPGRADE_WONDER, card.name)) })
+ bpButton(title = "DISCARD",
+ large = true,
+ intent = Intent.DANGER,
+ icon = "cross",
+ onClick = { prepareMove(PlayerMove(MoveType.DISCARD, card.name)) })
+ }
+ }
+}
+
+private fun CSSBuilder.handStyle() {
+ alignItems = Align.center
+ bottom = 0.px
+ display = Display.flex
+ height = 345.px
+ left = 50.pct
+ maxHeight = 25.vw
+ position = Position.absolute
+ transform {
+ translate(tx = (-50).pct, ty = 55.pct)
+ }
+ transition(duration = 0.5.s)
+ zIndex = 30
+
+ hover {
+ bottom = 4.rem
+ transform {
+ translate(tx = (-50).pct, ty = 0.pct)
+ }
+ }
+}
+
+private fun CSSBuilder.handCardStyle() {
+ classes.add("hand-card")
+ alignItems = Align.flexEnd
+ display = Display.grid
+ margin(all = 0.2.rem)
+}
+
+private fun CSSBuilder.handCardImgStyle(isPlayable: Boolean) {
+ gridRow = GridRow("1")
+ gridColumn = GridColumn("1")
+ maxWidth = 13.vw
+ maxHeight = 60.vh
+ transition(duration = 0.1.s)
+ width = 11.rem
+
+ ancestorHover(".hand-card") {
+ boxShadow(offsetX = 0.px, offsetY = 10.px, blurRadius = 40.px, color = Color.black)
+ width = 14.rem
+ maxWidth = 15.vw
+ maxHeight = 90.vh
+ }
+
+ if (!isPlayable) {
+ filter = "grayscale(50%) contrast(50%)"
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/ProductionBar.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/ProductionBar.kt
new file mode 100644
index 00000000..773e9835
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/game/ProductionBar.kt
@@ -0,0 +1,164 @@
+package org.luxons.sevenwonders.ui.components.game
+
+import kotlinx.css.Align
+import kotlinx.css.BorderStyle
+import kotlinx.css.CSSBuilder
+import kotlinx.css.Color
+import kotlinx.css.Display
+import kotlinx.css.Position
+import kotlinx.css.VerticalAlign
+import kotlinx.css.alignItems
+import kotlinx.css.background
+import kotlinx.css.bottom
+import kotlinx.css.color
+import kotlinx.css.display
+import kotlinx.css.fontFamily
+import kotlinx.css.fontSize
+import kotlinx.css.height
+import kotlinx.css.margin
+import kotlinx.css.marginLeft
+import kotlinx.css.position
+import kotlinx.css.properties.borderTop
+import kotlinx.css.properties.boxShadow
+import kotlinx.css.px
+import kotlinx.css.rem
+import kotlinx.css.verticalAlign
+import kotlinx.css.vw
+import kotlinx.css.width
+import kotlinx.css.zIndex
+import kotlinx.html.DIV
+import kotlinx.html.title
+import org.luxons.sevenwonders.model.boards.Production
+import org.luxons.sevenwonders.model.resources.CountedResource
+import org.luxons.sevenwonders.model.resources.ResourceType
+import react.RBuilder
+import react.dom.*
+import styled.StyledDOMBuilder
+import styled.css
+import styled.styledDiv
+import styled.styledImg
+import styled.styledSpan
+
+fun RBuilder.productionBar(gold: Int, production: Production) {
+ styledDiv {
+ css {
+ productionBarStyle()
+ }
+ goldIndicator(gold)
+ fixedResources(production.fixedResources)
+ alternativeResources(production.alternativeResources)
+ }
+}
+
+private fun RBuilder.goldIndicator(amount: Int) {
+ tokenWithCount(tokenName = "coin", count = amount)
+}
+
+private fun RBuilder.fixedResources(resources: List<CountedResource>) {
+ styledDiv {
+ css {
+ margin = "auto"
+ display = Display.flex
+ }
+ resources.forEach {
+ tokenWithCount(tokenName = getTokenName(it.type), count = it.count) {
+ attrs { key = it.type.toString() }
+ css { marginLeft = 1.rem }
+ }
+ }
+ }
+}
+
+private fun RBuilder.alternativeResources(resources: Set<Set<ResourceType>>) {
+ styledDiv {
+ css {
+ margin = "auto"
+ display = Display.flex
+ }
+ resources.forEachIndexed { index, res ->
+ resourceChoice(types = res) {
+ attrs {
+ key = index.toString()
+ }
+ }
+ }
+ }
+}
+
+private fun RBuilder.resourceChoice(types: Set<ResourceType>, block: StyledDOMBuilder<DIV>.() -> Unit = {}) {
+ styledDiv {
+ css {
+ marginLeft = (1.5).rem
+ }
+ block()
+ for ((i, t) in types.withIndex()) {
+ tokenImage(tokenName = getTokenName(t)) {
+ attrs { this.key = t.toString() }
+ }
+ if (i < types.indices.last) {
+ styledSpan { css { choiceSeparatorStyle() } }
+ }
+ }
+ }
+}
+
+private fun RBuilder.tokenWithCount(tokenName: String, count: Int, block: StyledDOMBuilder<DIV>.() -> Unit = {}) {
+ styledDiv {
+ block()
+ tokenImage(tokenName)
+ styledSpan {
+ css { tokenCountStyle() }
+ + "× $count"
+ }
+ }
+}
+
+private fun RBuilder.tokenImage(tokenName: String, block: StyledDOMBuilder<DIV>.() -> Unit = {}) {
+ styledImg(src = getTokenImagePath(tokenName)) {
+ css {
+ tokenImageStyle()
+ }
+ attrs {
+ this.title = tokenName
+ this.alt = tokenName
+ }
+ }
+}
+
+private fun getTokenImagePath(tokenName: String)= "/images/tokens/${tokenName}.png"
+
+private fun getTokenName(resourceType: ResourceType)= "resources/${resourceType.toString().toLowerCase()}"
+
+private fun CSSBuilder.productionBarStyle() {
+ alignItems = Align.center
+ background = "linear-gradient(#eaeaea, #888 7%)"
+ bottom = 0.px
+ borderTop(width = 1.px, color = Color("#8b8b8b"), style = BorderStyle.solid)
+ boxShadow(blurRadius = 15.px, color = Color("#747474"))
+ display = Display.flex
+ height = (3.5).rem
+ width = 100.vw
+ position = Position.fixed
+ zIndex = 99
+}
+
+private fun CSSBuilder.choiceSeparatorStyle() {
+ fontSize = 2.rem
+ verticalAlign = VerticalAlign.middle
+ margin(all = 5.px)
+ color = Color("#c29929")
+ declarations["text-shadow"] = "0 0 1px black"
+}
+
+private fun CSSBuilder.tokenImageStyle() {
+ height = 3.rem
+ width = 3.rem
+ verticalAlign = VerticalAlign.middle
+}
+
+private fun CSSBuilder.tokenCountStyle() {
+ fontFamily = "fantasy"
+ fontSize = 1.5.rem
+ verticalAlign = VerticalAlign.middle
+ marginLeft = 0.2.rem
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/CreateGameForm.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/CreateGameForm.kt
new file mode 100644
index 00000000..876a167e
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/CreateGameForm.kt
@@ -0,0 +1,76 @@
+package org.luxons.sevenwonders.ui.components.gameBrowser
+
+import com.palantir.blueprintjs.Intent
+import com.palantir.blueprintjs.bpButton
+import com.palantir.blueprintjs.bpInputGroup
+import kotlinx.css.Display
+import kotlinx.css.FlexDirection
+import kotlinx.css.JustifyContent
+import kotlinx.css.display
+import kotlinx.css.flexDirection
+import kotlinx.css.justifyContent
+import kotlinx.html.js.onSubmitFunction
+import org.luxons.sevenwonders.ui.redux.RequestCreateGame
+import org.luxons.sevenwonders.ui.redux.connectDispatch
+import org.luxons.sevenwonders.ui.utils.createElement
+import org.w3c.dom.HTMLInputElement
+import org.w3c.dom.events.Event
+import react.RBuilder
+import react.RClass
+import react.RComponent
+import react.RProps
+import react.RState
+import react.dom.*
+import styled.css
+import styled.styledDiv
+
+private interface CreateGameFormProps: RProps {
+ var createGame: (String) -> Unit
+}
+
+private data class CreateGameFormState(var gameName: String = ""): RState
+
+private class CreateGameForm(props: CreateGameFormProps): RComponent<CreateGameFormProps, CreateGameFormState>(props) {
+
+ override fun CreateGameFormState.init(props: CreateGameFormProps) {
+ gameName = ""
+ }
+
+ override fun RBuilder.render() {
+ styledDiv {
+ css {
+ display = Display.flex
+ flexDirection = FlexDirection.row
+ justifyContent = JustifyContent.spaceBetween
+ }
+ form {
+ attrs {
+ onSubmitFunction = { e -> createGame(e) }
+ }
+
+ bpInputGroup(
+ placeholder = "Game name",
+ onChange = { e ->
+ val input = e.currentTarget as HTMLInputElement
+ setState(transformState = { CreateGameFormState(input.value) })
+ },
+ rightElement = createGameButton()
+ )
+ }
+ playerInfo()
+ }
+ }
+
+ private fun createGameButton() = createElement {
+ bpButton(minimal = true, intent = Intent.PRIMARY, icon = "add", onClick = { e -> createGame(e) })
+ }
+
+ private fun createGame(e: Event) {
+ e.preventDefault() // prevents refreshing the page when pressing Enter
+ props.createGame(state.gameName)
+ }
+}
+
+val createGameForm: RClass<RProps> = connectDispatch(CreateGameForm::class) { dispatch, _ ->
+ createGame = { name -> dispatch(RequestCreateGame(name)) }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameBrowser.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameBrowser.kt
new file mode 100644
index 00000000..2f860ca7
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameBrowser.kt
@@ -0,0 +1,10 @@
+package org.luxons.sevenwonders.ui.components.gameBrowser
+
+import react.RBuilder
+import react.dom.*
+
+fun RBuilder.gameBrowser() = div {
+ h1 { +"Games" }
+ createGameForm {}
+ gameList()
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameList.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameList.kt
new file mode 100644
index 00000000..47c17da1
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/GameList.kt
@@ -0,0 +1,133 @@
+package org.luxons.sevenwonders.ui.components.gameBrowser
+
+import com.palantir.blueprintjs.Classes
+import com.palantir.blueprintjs.Intent
+import com.palantir.blueprintjs.bpButton
+import com.palantir.blueprintjs.bpIcon
+import com.palantir.blueprintjs.bpTag
+import kotlinx.css.Align
+import kotlinx.css.Display
+import kotlinx.css.FlexDirection
+import kotlinx.css.VerticalAlign
+import kotlinx.css.alignItems
+import kotlinx.css.display
+import kotlinx.css.flexDirection
+import kotlinx.css.verticalAlign
+import kotlinx.html.classes
+import kotlinx.html.title
+import org.luxons.sevenwonders.model.api.ConnectedPlayer
+import org.luxons.sevenwonders.model.api.LobbyDTO
+import org.luxons.sevenwonders.model.api.State
+import org.luxons.sevenwonders.ui.redux.RequestJoinGame
+import org.luxons.sevenwonders.ui.redux.connectStateAndDispatch
+import react.RBuilder
+import react.RComponent
+import react.RProps
+import react.RState
+import react.dom.*
+import styled.css
+import styled.styledDiv
+import styled.styledSpan
+import styled.styledTr
+
+interface GameListStateProps : RProps {
+ var connectedPlayer: ConnectedPlayer
+ var games: List<LobbyDTO>
+}
+
+interface GameListDispatchProps: RProps {
+ var joinGame: (Long) -> Unit
+}
+
+interface GameListProps : GameListStateProps, GameListDispatchProps
+
+class GameListPresenter(props: GameListProps) : RComponent<GameListProps, RState>(props) {
+
+ override fun RBuilder.render() {
+ table {
+ attrs {
+ classes = setOf(Classes.HTML_TABLE)
+ }
+ thead {
+ gameListHeaderRow()
+ }
+ tbody {
+ props.games.forEach {
+ gameListItemRow(it, props.joinGame)
+ }
+ }
+ }
+ }
+
+ private fun RBuilder.gameListHeaderRow() = tr {
+ th { +"Name" }
+ th { +"Status" }
+ th { +"Nb Players" }
+ th { +"Join" }
+ }
+
+ private fun RBuilder.gameListItemRow(lobby: LobbyDTO, joinGame: (Long) -> Unit) = styledTr {
+ css {
+ verticalAlign = VerticalAlign.middle
+ }
+ attrs {
+ key = lobby.id.toString()
+ }
+ td { +lobby.name }
+ td { gameStatus(lobby.state) }
+ td { playerCount(lobby.players.size) }
+ td { joinButton(lobby) }
+ }
+
+ private fun RBuilder.gameStatus(state: State) {
+ val intent = when(state) {
+ State.LOBBY -> Intent.SUCCESS
+ State.PLAYING -> Intent.WARNING
+ State.FINISHED -> Intent.DANGER
+ }
+ bpTag(minimal = true, intent = intent) {
+ +state.toString()
+ }
+ }
+
+ private fun RBuilder.playerCount(nPlayers: Int) {
+ styledDiv {
+ css {
+ display = Display.flex
+ flexDirection = FlexDirection.row
+ alignItems = Align.center
+ }
+ attrs {
+ title = "Number of players"
+ }
+ bpIcon(name = "people", title = null)
+ styledSpan {
+ +nPlayers.toString()
+ }
+ }
+ }
+
+ private fun RBuilder.joinButton(lobby: LobbyDTO) {
+ val joinability = lobby.joinability(props.connectedPlayer.displayName)
+ bpButton(
+ minimal = true,
+ title = joinability.tooltip,
+ icon = "arrow-right",
+ disabled = !joinability.canDo,
+ onClick = { props.joinGame(lobby.id) }
+ )
+ }
+}
+
+fun RBuilder.gameList() = gameList {}
+
+private val gameList = connectStateAndDispatch<GameListStateProps, GameListDispatchProps, GameListProps>(
+ clazz = GameListPresenter::class,
+ mapStateToProps = { state, _ ->
+ connectedPlayer = state.connectedPlayer ?: error("there should be a connected player")
+ games = state.games
+ },
+ mapDispatchToProps = { dispatch, _ ->
+ joinGame = { gameId -> dispatch(RequestJoinGame(gameId = gameId)) }
+ }
+)
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/PlayerInfo.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/PlayerInfo.kt
new file mode 100644
index 00000000..b939dfe1
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/gameBrowser/PlayerInfo.kt
@@ -0,0 +1,36 @@
+package org.luxons.sevenwonders.ui.components.gameBrowser
+
+import org.luxons.sevenwonders.model.api.ConnectedPlayer
+import org.luxons.sevenwonders.ui.redux.connectState
+import react.RBuilder
+import react.RComponent
+import react.RProps
+import react.RState
+import react.dom.*
+
+interface PlayerInfoProps : RProps {
+ var connectedPlayer: ConnectedPlayer?
+}
+
+class PlayerInfoPresenter(props: PlayerInfoProps) : RComponent<PlayerInfoProps, RState>(props) {
+
+ override fun RBuilder.render() {
+ span {
+ b {
+ +"Username:"
+ }
+ props.connectedPlayer?.let {
+ + " ${it.displayName}"
+ }
+ }
+ }
+}
+
+fun RBuilder.playerInfo() = playerInfo {}
+
+private val playerInfo = connectState(
+ clazz = PlayerInfoPresenter::class,
+ mapStateToProps = { state, _ ->
+ connectedPlayer = state.connectedPlayer
+ }
+)
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/ChooseNameForm.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/ChooseNameForm.kt
new file mode 100644
index 00000000..1aa4be43
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/ChooseNameForm.kt
@@ -0,0 +1,64 @@
+package org.luxons.sevenwonders.ui.components.home
+
+import com.palantir.blueprintjs.Intent
+import com.palantir.blueprintjs.bpButton
+import com.palantir.blueprintjs.bpInputGroup
+import kotlinx.html.js.onSubmitFunction
+import org.luxons.sevenwonders.ui.redux.RequestChooseName
+import org.luxons.sevenwonders.ui.redux.connectDispatch
+import org.luxons.sevenwonders.ui.utils.createElement
+import org.w3c.dom.HTMLInputElement
+import org.w3c.dom.events.Event
+import react.RBuilder
+import react.RClass
+import react.RComponent
+import react.RProps
+import react.RState
+import react.ReactElement
+import react.dom.*
+
+private interface ChooseNameFormProps: RProps {
+ var chooseUsername: (String) -> Unit
+}
+
+private data class ChooseNameFormState(var username: String = ""): RState
+
+private class ChooseNameForm(props: ChooseNameFormProps): RComponent<ChooseNameFormProps, ChooseNameFormState>(props) {
+
+ override fun ChooseNameFormState.init(props: ChooseNameFormProps) {
+ username = ""
+ }
+
+ override fun RBuilder.render() {
+ form {
+ attrs.onSubmitFunction = { e -> chooseUsername(e) }
+ bpInputGroup(
+ large = true,
+ placeholder = "Username",
+ rightElement = submitButton(),
+ onChange = { e ->
+ val input = e.currentTarget as HTMLInputElement
+ setState(transformState = { ChooseNameFormState(input.value) })
+ }
+ )
+ }
+ }
+
+ private fun submitButton(): ReactElement = createElement {
+ bpButton(
+ minimal = true,
+ icon = "arrow-right",
+ intent = Intent.PRIMARY,
+ onClick = { e -> chooseUsername(e) }
+ )
+ }
+
+ private fun chooseUsername(e: Event) {
+ e.preventDefault()
+ props.chooseUsername(state.username)
+ }
+}
+
+val chooseNameForm: RClass<RProps> = connectDispatch(ChooseNameForm::class) { dispatch, _ ->
+ chooseUsername = { name -> dispatch(RequestChooseName(name)) }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/Home.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/Home.kt
new file mode 100644
index 00000000..43a1592b
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/Home.kt
@@ -0,0 +1,21 @@
+package org.luxons.sevenwonders.ui.components.home
+
+import org.luxons.sevenwonders.ui.components.GlobalStyles
+import react.RBuilder
+import react.dom.*
+import styled.css
+import styled.styledDiv
+
+private const val LOGO = "images/logo-7-wonders.png"
+
+fun RBuilder.home() = styledDiv {
+ css {
+ +GlobalStyles.fullscreen
+ +HomeStyles.centerChildren
+ +HomeStyles.zeusBackground
+ }
+
+ img(src = LOGO, alt = "Seven Wonders") {}
+
+ chooseNameForm {}
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/HomeStyles.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/HomeStyles.kt
new file mode 100644
index 00000000..624f430c
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/home/HomeStyles.kt
@@ -0,0 +1,19 @@
+package org.luxons.sevenwonders.ui.components.home
+
+import kotlinx.css.*
+import styled.StyleSheet
+
+object HomeStyles : StyleSheet("HomeStyles", isStatic = true) {
+
+ val zeusBackground by css {
+ background = "url('images/background-zeus-temple.jpg') center no-repeat"
+ backgroundSize = "cover"
+ }
+
+ val centerChildren by css {
+ display = Display.flex
+ flexDirection = FlexDirection.column
+ alignItems = Align.center
+ justifyContent = JustifyContent.center
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/Lobby.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/Lobby.kt
new file mode 100644
index 00000000..5b13d8b1
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/Lobby.kt
@@ -0,0 +1,66 @@
+package org.luxons.sevenwonders.ui.components.lobby
+
+import com.palantir.blueprintjs.Intent
+import com.palantir.blueprintjs.bpButton
+import org.luxons.sevenwonders.model.api.LobbyDTO
+import org.luxons.sevenwonders.model.api.PlayerDTO
+import org.luxons.sevenwonders.ui.redux.RequestStartGame
+import org.luxons.sevenwonders.ui.redux.connectStateAndDispatch
+import react.RBuilder
+import react.RComponent
+import react.RProps
+import react.RState
+import react.dom.*
+
+interface LobbyStateProps : RProps {
+ var currentGame: LobbyDTO?
+ var currentPlayer: PlayerDTO?
+}
+
+interface LobbyDispatchProps : RProps {
+ var startGame: () -> Unit
+}
+
+interface LobbyProps : LobbyDispatchProps, LobbyStateProps
+
+class LobbyPresenter(props: LobbyProps) : RComponent<LobbyProps, RState>(props) {
+
+ override fun RBuilder.render() {
+ val currentGame = props.currentGame
+ val currentPlayer = props.currentPlayer
+ if (currentGame == null || currentPlayer == null) {
+ div { +"Error: no current game." }
+ return
+ }
+ div {
+ h2 { +"${currentGame.name} — Lobby" }
+ radialPlayerList(currentGame.players, currentPlayer)
+ if (currentPlayer.isGameOwner) {
+ val startability = currentGame.startability(currentPlayer.username)
+ bpButton(
+ large = true,
+ intent = Intent.PRIMARY,
+ icon = "play",
+ title = startability.tooltip,
+ disabled = !startability.canDo,
+ onClick = { props.startGame() }
+ ) {
+ + "START"
+ }
+ }
+ }
+ }
+}
+
+fun RBuilder.lobby() = lobby {}
+
+private val lobby = connectStateAndDispatch<LobbyStateProps, LobbyDispatchProps, LobbyProps>(
+ clazz = LobbyPresenter::class,
+ mapStateToProps = { state, _ ->
+ currentGame = state.currentLobby
+ currentPlayer = state.currentPlayer
+ },
+ mapDispatchToProps = { dispatch, _ ->
+ startGame = { dispatch(RequestStartGame()) }
+ }
+)
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialList.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialList.kt
new file mode 100644
index 00000000..be3bb1de
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialList.kt
@@ -0,0 +1,121 @@
+package org.luxons.sevenwonders.ui.components.lobby
+
+import kotlinx.css.CSSBuilder
+import kotlinx.css.Display
+import kotlinx.css.ListStyleType
+import kotlinx.css.Position
+import kotlinx.css.display
+import kotlinx.css.height
+import kotlinx.css.left
+import kotlinx.css.listStyleType
+import kotlinx.css.margin
+import kotlinx.css.padding
+import kotlinx.css.pct
+import kotlinx.css.position
+import kotlinx.css.properties.Timing
+import kotlinx.css.properties.ms
+import kotlinx.css.properties.transform
+import kotlinx.css.properties.transition
+import kotlinx.css.properties.translate
+import kotlinx.css.px
+import kotlinx.css.top
+import kotlinx.css.width
+import kotlinx.css.zIndex
+import react.RBuilder
+import react.ReactElement
+import react.dom.*
+import styled.css
+import styled.styledDiv
+import styled.styledLi
+import styled.styledUl
+
+typealias ElementBuilder = RBuilder.() -> ReactElement
+
+fun RBuilder.radialList(
+ itemBuilders: List<ElementBuilder>,
+ centerElementBuilder: ElementBuilder,
+ itemWidth: Int,
+ itemHeight: Int,
+ options: RadialConfig = RadialConfig()
+): ReactElement {
+ val containerWidth = options.diameter + itemWidth
+ val containerHeight = options.diameter + itemHeight
+
+ return styledDiv {
+ css {
+ zeroMargins()
+ position = Position.relative
+ width = containerWidth.px
+ height = containerHeight.px
+ }
+ radialListItems(itemBuilders, options)
+ radialListCenter(centerElementBuilder)
+ }
+}
+
+private fun RBuilder.radialListItems(itemBuilders: List<ElementBuilder>, radialConfig: RadialConfig): ReactElement {
+ val offsets = offsetsFromCenter(itemBuilders.size, radialConfig)
+ return styledUl {
+ css {
+ zeroMargins()
+ transition(property = "all", duration = 500.ms, timing = Timing.easeInOut)
+ zIndex = 1
+ width = radialConfig.diameter.px
+ height = radialConfig.diameter.px
+ absoluteCenter()
+ }
+ itemBuilders.forEachIndexed { i, itemBuilder ->
+ radialListItem(itemBuilder, i, offsets[i])
+ }
+ }
+}
+
+private fun RBuilder.radialListItem(itemBuilder: ElementBuilder, i: Int, offset: CartesianCoords): ReactElement {
+ return styledLi {
+ css {
+ display = Display.block
+ position = Position.absolute
+ top = 50.pct
+ left = 50.pct
+ zeroMargins()
+ listStyleType = ListStyleType.unset
+ transition("all", 500.ms, Timing.easeInOut)
+ zIndex = 1
+ transform {
+ translate(offset.x.px, offset.y.px)
+ translate((-50).pct, (-50).pct)
+ }
+ }
+ attrs {
+ key = "$i"
+ }
+ itemBuilder()
+ }
+}
+
+private fun RBuilder.radialListCenter(centerElement: ElementBuilder?): ReactElement? {
+ if (centerElement == null) {
+ return null
+ }
+ return styledDiv {
+ css {
+ zIndex = 0
+ absoluteCenter()
+ }
+ centerElement()
+ }
+}
+
+private fun CSSBuilder.absoluteCenter() {
+ position = Position.absolute
+ left = 50.pct
+ top = 50.pct
+ transform {
+ translate((-50).pct, (-50).pct)
+ }
+}
+
+private fun CSSBuilder.zeroMargins() {
+ margin = "0"
+ padding = "0"
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialMath.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialMath.kt
new file mode 100644
index 00000000..d668ab9b
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialMath.kt
@@ -0,0 +1,57 @@
+package org.luxons.sevenwonders.ui.components.lobby
+
+import kotlin.math.PI
+import kotlin.math.cos
+import kotlin.math.roundToInt
+import kotlin.math.sin
+
+data class CartesianCoords(
+ val x: Int,
+ val y: Int
+)
+
+data class PolarCoords(
+ val radius: Int,
+ val angleDeg: Int
+)
+
+private fun Int.toRadians() = (this * PI / 180.0)
+private fun Double.project(angleRad: Double, trigFn: (Double) -> Double) = (this * trigFn(angleRad)).roundToInt()
+private fun Double.xProjection(angleRad: Double) = project(angleRad, ::cos)
+private fun Double.yProjection(angleRad: Double) = project(angleRad, ::sin)
+
+private fun PolarCoords.toCartesian() = CartesianCoords(
+ x = radius.toDouble().xProjection(angleDeg.toRadians()),
+ y = radius.toDouble().yProjection(angleDeg.toRadians())
+)
+
+// Y-axis is pointing down in the browser, so the directions need to be reversed
+// (positive angles are now clockwise)
+enum class Direction(private val value: Int) {
+ CLOCKWISE(1),
+ COUNTERCLOCKWISE(-1);
+
+ fun toOrientedDegrees(deg: Int) = value * deg
+}
+
+data class RadialConfig(
+ val radius: Int = 120,
+ val spreadArcDegrees: Int = 360, // full circle
+ val firstItemAngleDegrees: Int = 0, // 12 o'clock
+ val direction: Direction = Direction.CLOCKWISE
+) {
+ val diameter: Int = radius * 2
+}
+
+private const val DEFAULT_START = -90 // Up, because Y-axis is reversed
+
+fun offsetsFromCenter(nbItems: Int, radialConfig: RadialConfig = RadialConfig()): List<CartesianCoords> {
+ val startAngle = DEFAULT_START + radialConfig.direction.toOrientedDegrees(radialConfig.firstItemAngleDegrees)
+ val angleStep = radialConfig.spreadArcDegrees / nbItems
+ return List(nbItems) { itemCartesianOffsets(startAngle, angleStep, it, radialConfig) }
+}
+
+private fun itemCartesianOffsets(startAngle: Int, angleStep: Int, index: Int, config: RadialConfig): CartesianCoords {
+ val itemAngle = startAngle + config.direction.toOrientedDegrees(angleStep) * index
+ return PolarCoords(config.radius, itemAngle).toCartesian()
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialPlayerList.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialPlayerList.kt
new file mode 100644
index 00000000..ff541696
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/components/lobby/RadialPlayerList.kt
@@ -0,0 +1,106 @@
+package org.luxons.sevenwonders.ui.components.lobby
+
+import com.palantir.blueprintjs.IconName
+import com.palantir.blueprintjs.Intent
+import com.palantir.blueprintjs.bpIcon
+import kotlinx.css.Align
+import kotlinx.css.Display
+import kotlinx.css.FlexDirection
+import kotlinx.css.alignItems
+import kotlinx.css.display
+import kotlinx.css.flexDirection
+import kotlinx.css.margin
+import kotlinx.css.opacity
+import org.luxons.sevenwonders.model.api.PlayerDTO
+import react.RBuilder
+import react.ReactElement
+import react.dom.*
+import styled.css
+import styled.styledDiv
+import styled.styledH5
+
+fun RBuilder.radialPlayerList(players: List<PlayerDTO>, currentPlayer: PlayerDTO): ReactElement {
+ val playerItemBuilders = players
+ .growTo(targetSize = 3)
+ .withUserFirst(currentPlayer)
+ .map { p -> p.elementBuilder(p?.username == currentPlayer.username) }
+
+ val tableImgBuilder: ElementBuilder = { roundTableImg() }
+
+ return radialList(
+ itemBuilders = playerItemBuilders,
+ centerElementBuilder = tableImgBuilder,
+ itemWidth = 120,
+ itemHeight = 100,
+ options = RadialConfig(
+ radius = 175,
+ firstItemAngleDegrees = 180 // self at the bottom
+ )
+ )
+}
+
+private fun RBuilder.roundTableImg(): ReactElement = img {
+ attrs {
+ src = "images/round-table.png"
+ alt = "Round table"
+ width = "200"
+ height = "200"
+ }
+}
+
+private fun List<PlayerDTO?>.withUserFirst(me: PlayerDTO): List<PlayerDTO?> {
+ val nonUsersBeginning = takeWhile { it?.username != me.username }
+ val userToEnd = subList(nonUsersBeginning.size, size)
+ return userToEnd + nonUsersBeginning
+}
+
+private fun <T> List<T>.growTo(targetSize: Int): List<T?> {
+ if (size >= targetSize) return this
+ return this + List(targetSize - size) { null }
+}
+
+private fun PlayerDTO?.elementBuilder(isMe: Boolean): ElementBuilder {
+ if (this == null) {
+ return { playerPlaceholder() }
+ } else {
+ return { playerItem(this@elementBuilder, isMe) }
+ }
+}
+
+private fun RBuilder.playerItem(player: PlayerDTO, isMe: Boolean): ReactElement = styledDiv {
+ css {
+ display = Display.flex
+ flexDirection = FlexDirection.column
+ alignItems = Align.center
+ }
+ val title = if (player.isGameOwner) "Game owner" else null
+ userIcon(isMe = isMe, isOwner = player.isGameOwner, title = title)
+ styledH5 {
+ css {
+ margin = "0"
+ }
+ +player.displayName
+ }
+}
+
+private fun RBuilder.playerPlaceholder(): ReactElement = styledDiv {
+ css {
+ display = Display.flex
+ flexDirection = FlexDirection.column
+ alignItems = Align.center
+ opacity = 0.3
+ }
+ userIcon(isMe = false, isOwner = false, title = "Waiting for player...")
+ styledH5 {
+ css {
+ margin = "0"
+ }
+ +"?"
+ }
+}
+
+private fun RBuilder.userIcon(isMe: Boolean, isOwner: Boolean, title: String?): ReactElement {
+ val iconName: IconName = if (isOwner) "badge" else "user"
+ val intent: Intent = if (isMe) Intent.WARNING else Intent.NONE
+ return bpIcon(name = iconName, intent = intent, size = 50, title = title)
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Actions.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Actions.kt
new file mode 100644
index 00000000..3e3de561
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Actions.kt
@@ -0,0 +1,26 @@
+package org.luxons.sevenwonders.ui.redux
+
+import org.luxons.sevenwonders.model.PlayerMove
+import org.luxons.sevenwonders.model.PlayerTurnInfo
+import org.luxons.sevenwonders.model.api.ConnectedPlayer
+import org.luxons.sevenwonders.model.api.LobbyDTO
+import org.luxons.sevenwonders.model.cards.PreparedCard
+import redux.RAction
+
+data class SetCurrentPlayerAction(val player: ConnectedPlayer): RAction
+
+data class UpdateGameListAction(val games: List<LobbyDTO>): RAction
+
+data class UpdateLobbyAction(val lobby: LobbyDTO): RAction
+
+data class EnterLobbyAction(val lobby: LobbyDTO): RAction
+
+data class EnterGameAction(val lobby: LobbyDTO, val turnInfo: PlayerTurnInfo): RAction
+
+data class TurnInfoEvent(val turnInfo: PlayerTurnInfo): RAction
+
+data class PreparedMoveEvent(val move: PlayerMove): RAction
+
+data class PreparedCardEvent(val card: PreparedCard): RAction
+
+data class PlayerReadyEvent(val username: String): RAction
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/ApiActions.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/ApiActions.kt
new file mode 100644
index 00000000..836f5b4e
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/ApiActions.kt
@@ -0,0 +1,23 @@
+package org.luxons.sevenwonders.ui.redux
+
+import org.luxons.sevenwonders.model.CustomizableSettings
+import org.luxons.sevenwonders.model.PlayerMove
+import redux.RAction
+
+data class RequestChooseName(val playerName: String): RAction
+
+data class RequestCreateGame(val gameName: String): RAction
+
+data class RequestJoinGame(val gameId: Long): RAction
+
+data class RequestReorderPlayers(val orderedPlayers: List<String>): RAction
+
+data class RequestUpdateSettings(val settings: CustomizableSettings): RAction
+
+class RequestStartGame: RAction
+
+class RequestSayReady: RAction
+
+data class RequestPrepareMove(val move: PlayerMove): RAction
+
+class RequestUnprepareMove: RAction
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Reducers.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Reducers.kt
new file mode 100644
index 00000000..c21f6deb
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Reducers.kt
@@ -0,0 +1,84 @@
+package org.luxons.sevenwonders.ui.redux
+
+import org.luxons.sevenwonders.model.PlayerMove
+import org.luxons.sevenwonders.model.PlayerTurnInfo
+import org.luxons.sevenwonders.model.api.ConnectedPlayer
+import org.luxons.sevenwonders.model.api.LobbyDTO
+import org.luxons.sevenwonders.model.api.PlayerDTO
+import org.luxons.sevenwonders.model.api.State
+import org.luxons.sevenwonders.model.cards.CardBack
+import org.luxons.sevenwonders.model.cards.HandCard
+import redux.RAction
+
+data class SwState(
+ val connectedPlayer: ConnectedPlayer? = null,
+ // they must be by ID to support updates to a sublist
+ val gamesById: Map<Long, LobbyDTO> = emptyMap(),
+ val currentLobby: LobbyDTO? = null,
+ val gameState: GameState? = null
+) {
+ val currentPlayer: PlayerDTO? = (gameState?.players ?: currentLobby?.players)?.first {
+ it.username == connectedPlayer?.username
+ }
+ val games: List<LobbyDTO> = gamesById.values.toList()
+}
+
+data class GameState(
+ val id: Long,
+ val players: List<PlayerDTO>,
+ val turnInfo: PlayerTurnInfo?,
+ val preparedCardsByUsername: Map<String, CardBack?> = emptyMap(),
+ val currentPreparedMove: PlayerMove? = null
+) {
+ val currentPreparedCard: HandCard?
+ get() = turnInfo?.hand?.firstOrNull { it.name == currentPreparedMove?.cardName }
+}
+
+fun rootReducer(state: SwState, action: RAction): SwState = state.copy(
+ gamesById = gamesReducer(state.gamesById, action),
+ connectedPlayer = currentPlayerReducer(state.connectedPlayer, action),
+ currentLobby = currentLobbyReducer(state.currentLobby, action),
+ gameState = gameStateReducer(state.gameState, action)
+)
+
+private fun gamesReducer(games: Map<Long, LobbyDTO>, action: RAction): Map<Long, LobbyDTO> = when (action) {
+ is UpdateGameListAction -> (games + action.games.associateBy { it.id }).filterValues { it.state != State.FINISHED }
+ else -> games
+}
+
+private fun currentPlayerReducer(currentPlayer: ConnectedPlayer?, action: RAction): ConnectedPlayer? = when (action) {
+ is SetCurrentPlayerAction -> action.player
+ else -> currentPlayer
+}
+
+private fun currentLobbyReducer(currentLobby: LobbyDTO?, action: RAction): LobbyDTO? = when (action) {
+ is EnterLobbyAction -> action.lobby
+ is UpdateLobbyAction -> action.lobby
+ is PlayerReadyEvent -> currentLobby?.let { l ->
+ l.copy(players = l.players.map { p ->
+ if (p.username == action.username) p.copy(isReady = true) else p
+ })
+ }
+ else -> currentLobby
+}
+
+private fun gameStateReducer(gameState: GameState?, action: RAction): GameState? = when (action) {
+ is EnterGameAction -> GameState(
+ id = action.lobby.id,
+ players = action.lobby.players,
+ turnInfo = action.turnInfo
+ )
+ is PreparedMoveEvent -> gameState?.copy(currentPreparedMove = action.move)
+ is RequestUnprepareMove -> gameState?.copy(currentPreparedMove = null)
+ is PreparedCardEvent -> gameState?.copy(
+ preparedCardsByUsername = gameState.preparedCardsByUsername + (action.card.player.username to action.card.cardBack)
+ )
+ is PlayerReadyEvent -> gameState?.copy(players = gameState.players.map { p ->
+ if (p.username == action.username) p.copy(isReady = true) else p
+ })
+ is TurnInfoEvent -> gameState?.copy(
+ players = gameState.players.map { p -> p.copy(isReady = false) },
+ turnInfo = action.turnInfo
+ )
+ else -> gameState
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Store.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Store.kt
new file mode 100644
index 00000000..6f50a627
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Store.kt
@@ -0,0 +1,29 @@
+package org.luxons.sevenwonders.ui.redux
+
+import org.luxons.sevenwonders.ui.redux.sagas.SagaManager
+import redux.RAction
+import redux.Store
+import redux.WrapperAction
+import redux.applyMiddleware
+import redux.compose
+import redux.createStore
+import redux.rEnhancer
+import kotlin.browser.window
+
+val INITIAL_STATE = SwState()
+
+private fun <A, T1, R> composeWithDevTools(function1: (T1) -> R, function2: (A) -> T1): (A) -> R {
+ val reduxDevtoolsExtensionCompose = window.asDynamic().__REDUX_DEVTOOLS_EXTENSION_COMPOSE__
+ if (reduxDevtoolsExtensionCompose == undefined) {
+ return compose(function1, function2)
+ }
+ return reduxDevtoolsExtensionCompose(function1, function2) as Function1<A, R>
+}
+
+fun configureStore(
+ sagaManager: SagaManager<SwState, RAction, WrapperAction>,
+ initialState: SwState = INITIAL_STATE
+): Store<SwState, RAction, WrapperAction> {
+ val sagaEnhancer = applyMiddleware(sagaManager.createMiddleware())
+ return createStore(::rootReducer, initialState, composeWithDevTools(sagaEnhancer, rEnhancer()))
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Utils.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Utils.kt
new file mode 100644
index 00000000..67ac5304
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/Utils.kt
@@ -0,0 +1,39 @@
+package org.luxons.sevenwonders.ui.redux
+
+import react.RClass
+import react.RComponent
+import react.RProps
+import react.RState
+import react.invoke
+import react.redux.rConnect
+import redux.RAction
+import redux.WrapperAction
+import kotlin.reflect.KClass
+
+inline fun <reified DP : RProps> connectDispatch(
+ clazz: KClass<out RComponent<DP, out RState>>,
+ noinline mapDispatchToProps: DP.((RAction) -> WrapperAction, RProps) -> Unit
+): RClass<RProps> {
+ val connect = rConnect(mapDispatchToProps = mapDispatchToProps)
+ return connect.invoke(clazz.js.unsafeCast<RClass<DP>>())
+}
+
+inline fun <reified SP : RProps> connectState(
+ clazz: KClass<out RComponent<SP, out RState>>,
+ noinline mapStateToProps: SP.(SwState, RProps) -> Unit
+): RClass<RProps> {
+ val connect = rConnect(mapStateToProps = mapStateToProps)
+ return connect.invoke(clazz.js.unsafeCast<RClass<SP>>())
+}
+
+inline fun <reified SP : RProps, reified DP : RProps, reified P : RProps> connectStateAndDispatch(
+ clazz: KClass<out RComponent<P, out RState>>,
+ noinline mapStateToProps: SP.(SwState, RProps) -> Unit,
+ noinline mapDispatchToProps: DP.((RAction) -> WrapperAction, RProps) -> Unit
+): RClass<RProps> {
+ val connect = rConnect<SwState, RAction, WrapperAction, RProps, SP, DP, P>(
+ mapStateToProps = mapStateToProps,
+ mapDispatchToProps = mapDispatchToProps
+ )
+ return connect.invoke(clazz.js.unsafeCast<RClass<P>>())
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameBrowserSagas.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameBrowserSagas.kt
new file mode 100644
index 00000000..7806bc98
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameBrowserSagas.kt
@@ -0,0 +1,50 @@
+package org.luxons.sevenwonders.ui.redux.sagas
+
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import org.hildan.krossbow.stomp.StompSubscription
+import org.luxons.sevenwonders.client.SevenWondersSession
+import org.luxons.sevenwonders.model.api.LobbyDTO
+import org.luxons.sevenwonders.ui.redux.EnterLobbyAction
+import org.luxons.sevenwonders.ui.redux.RequestCreateGame
+import org.luxons.sevenwonders.ui.redux.RequestJoinGame
+import org.luxons.sevenwonders.ui.redux.UpdateGameListAction
+import org.luxons.sevenwonders.ui.router.Navigate
+import org.luxons.sevenwonders.ui.router.Route
+import org.luxons.sevenwonders.ui.utils.awaitFirst
+
+suspend fun SwSagaContext.gameBrowserSaga(session: SevenWondersSession) {
+ GameBrowserSaga(session, this).run()
+}
+
+private class GameBrowserSaga(
+ private val session: SevenWondersSession,
+ private val sagaContext: SwSagaContext
+) {
+ suspend fun run() {
+ coroutineScope {
+ val gamesSubscription = session.watchGames()
+ launch { dispatchGameUpdates(gamesSubscription) }
+ val lobby = awaitCreateOrJoinGame()
+ gamesSubscription.unsubscribe()
+ sagaContext.dispatch(EnterLobbyAction(lobby))
+ sagaContext.dispatch(Navigate(Route.LOBBY))
+ }
+ }
+
+ private suspend fun dispatchGameUpdates(gamesSubscription: StompSubscription<List<LobbyDTO>>) {
+ sagaContext.dispatchAll(gamesSubscription.messages) { UpdateGameListAction(it) }
+ }
+
+ private suspend fun awaitCreateOrJoinGame(): LobbyDTO = awaitFirst(this::awaitCreateGame, this::awaitJoinGame)
+
+ private suspend fun awaitCreateGame(): LobbyDTO {
+ val action = sagaContext.next<RequestCreateGame>()
+ return session.createGame(action.gameName)
+ }
+
+ private suspend fun awaitJoinGame(): LobbyDTO {
+ val action = sagaContext.next<RequestJoinGame>()
+ return session.joinGame(action.gameId)
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameSagas.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameSagas.kt
new file mode 100644
index 00000000..a9c2ca2c
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/GameSagas.kt
@@ -0,0 +1,36 @@
+package org.luxons.sevenwonders.ui.redux.sagas
+
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import org.luxons.sevenwonders.client.SevenWondersSession
+import org.luxons.sevenwonders.ui.redux.PlayerReadyEvent
+import org.luxons.sevenwonders.ui.redux.PreparedCardEvent
+import org.luxons.sevenwonders.ui.redux.PreparedMoveEvent
+import org.luxons.sevenwonders.ui.redux.RequestPrepareMove
+import org.luxons.sevenwonders.ui.redux.RequestSayReady
+import org.luxons.sevenwonders.ui.redux.RequestUnprepareMove
+import org.luxons.sevenwonders.ui.redux.TurnInfoEvent
+
+suspend fun SwSagaContext.gameSaga(session: SevenWondersSession) {
+ val game = getState().gameState ?: error("Game saga run without a current game")
+ coroutineScope {
+ val playerReadySub = session.watchPlayerReady(game.id)
+ val preparedCardsSub = session.watchPreparedCards(game.id)
+ val turnInfoSub = session.watchTurns()
+ val sayReadyJob = launch { onEach<RequestSayReady> { session.sayReady() } }
+ val unprepareJob = launch { onEach<RequestUnprepareMove> { session.unprepareMove() } }
+ val prepareMoveJob = launch {
+ onEach<RequestPrepareMove> {
+ val move = session.prepareMove(it.move)
+ dispatch(PreparedMoveEvent(move))
+ }
+ }
+ launch { dispatchAll(playerReadySub.messages) { PlayerReadyEvent(it) } }
+ launch { dispatchAll(preparedCardsSub.messages) { PreparedCardEvent(it) } }
+ launch { dispatchAll(turnInfoSub.messages) { TurnInfoEvent(it) } }
+ // TODO await game end
+ // TODO unsubscribe all subs, cancel all jobs
+ }
+ console.log("End of game saga")
+}
+
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/LobbySagas.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/LobbySagas.kt
new file mode 100644
index 00000000..678276dc
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/LobbySagas.kt
@@ -0,0 +1,42 @@
+package org.luxons.sevenwonders.ui.redux.sagas
+
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import org.hildan.krossbow.stomp.StompSubscription
+import org.luxons.sevenwonders.client.SevenWondersSession
+import org.luxons.sevenwonders.model.api.LobbyDTO
+import org.luxons.sevenwonders.ui.redux.EnterGameAction
+import org.luxons.sevenwonders.ui.redux.RequestStartGame
+import org.luxons.sevenwonders.ui.redux.UpdateLobbyAction
+import org.luxons.sevenwonders.ui.router.Navigate
+import org.luxons.sevenwonders.ui.router.Route
+
+suspend fun SwSagaContext.lobbySaga(session: SevenWondersSession) {
+ val lobby = getState().currentLobby ?: error("Lobby saga run without a current lobby")
+ coroutineScope {
+ val lobbyUpdatesSubscription = session.watchLobbyUpdates()
+ launch { watchLobbyUpdates(lobbyUpdatesSubscription) }
+ val startGameJob = launch { awaitStartGame(session) }
+
+ awaitGameStart(session, lobby.id)
+
+ lobbyUpdatesSubscription.unsubscribe()
+ startGameJob.cancel()
+ dispatch(Navigate(Route.GAME))
+ }
+}
+
+private suspend fun SwSagaContext.watchLobbyUpdates(lobbyUpdatesSubscription: StompSubscription<LobbyDTO>) {
+ dispatchAll(lobbyUpdatesSubscription.messages) { UpdateLobbyAction(it) }
+}
+
+private suspend fun SwSagaContext.awaitGameStart(session: SevenWondersSession, lobbyId: Long) {
+ val turnInfo = session.awaitGameStart(lobbyId)
+ val lobby = getState().currentLobby!!
+ dispatch(EnterGameAction(lobby, turnInfo))
+}
+
+private suspend fun SwSagaContext.awaitStartGame(session: SevenWondersSession) {
+ next<RequestStartGame>()
+ session.startGame()
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/Sagas.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/Sagas.kt
new file mode 100644
index 00000000..c4a92581
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/Sagas.kt
@@ -0,0 +1,54 @@
+package org.luxons.sevenwonders.ui.redux.sagas
+
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.yield
+import org.luxons.sevenwonders.client.SevenWondersClient
+import org.luxons.sevenwonders.client.SevenWondersSession
+import org.luxons.sevenwonders.ui.redux.RequestChooseName
+import org.luxons.sevenwonders.ui.redux.SetCurrentPlayerAction
+import org.luxons.sevenwonders.ui.redux.SwState
+import org.luxons.sevenwonders.ui.router.Route
+import org.luxons.sevenwonders.ui.router.routerSaga
+import redux.RAction
+import redux.WrapperAction
+
+typealias SwSagaContext = SagaContext<SwState, RAction, WrapperAction>
+
+suspend fun SwSagaContext.rootSaga() = coroutineScope {
+ val action = next<RequestChooseName>()
+ val session = SevenWondersClient().connect("localhost:8000")
+ console.info("Connected to Seven Wonders web socket API")
+
+ launch {
+ serverErrorSaga(session)
+ }
+ yield() // ensures the error saga starts
+
+ val player = session.chooseName(action.playerName)
+ dispatch(SetCurrentPlayerAction(player))
+
+ routerSaga(Route.GAME_BROWSER) {
+ when (it) {
+ Route.HOME -> homeSaga(session)
+ Route.LOBBY -> lobbySaga(session)
+ Route.GAME_BROWSER -> gameBrowserSaga(session)
+ Route.GAME -> gameSaga(session)
+ }
+ }
+}
+
+private suspend fun serverErrorSaga(session: SevenWondersSession) {
+ val errorsSub = session.watchErrors()
+ for (err in errorsSub.messages) {
+ // TODO use blueprintjs toaster
+ console.error("${err.code}: ${err.message}")
+ console.error(JSON.stringify(err))
+ }
+}
+
+private suspend fun SwSagaContext.homeSaga(session: SevenWondersSession) {
+ val action = next<RequestChooseName>()
+ val player = session.chooseName(action.playerName)
+ dispatch(SetCurrentPlayerAction(player))
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFramework.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFramework.kt
new file mode 100644
index 00000000..1a57708e
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFramework.kt
@@ -0,0 +1,137 @@
+package org.luxons.sevenwonders.ui.redux.sagas
+
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.FlowPreview
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.channels.BroadcastChannel
+import kotlinx.coroutines.channels.ReceiveChannel
+import kotlinx.coroutines.launch
+import redux.Middleware
+import redux.MiddlewareApi
+import redux.RAction
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class SagaManager<S, A : RAction, R>(
+ private val monitor: ((A) -> Unit)? = null
+) {
+ private lateinit var context: SagaContext<S, A, R>
+
+ private val actions = BroadcastChannel<A>(16)
+
+ fun createMiddleware(): Middleware<S, A, R, A, R> = ::sagasMiddleware
+
+ private fun sagasMiddleware(api: MiddlewareApi<S, A, R>): ((A) -> R) -> (A) -> R {
+ context = SagaContext(api, actions)
+ return { nextDispatch ->
+ { action ->
+ onActionDispatched(action)
+ val result = nextDispatch(action)
+ handleAction(action)
+ result
+ }
+ }
+ }
+
+ private fun onActionDispatched(action: A) {
+ monitor?.invoke(action)
+ }
+
+ private fun handleAction(action: A) {
+ GlobalScope.launch { actions.send(action) }
+ }
+
+ fun launchSaga(coroutineScope: CoroutineScope, saga: suspend SagaContext<S, A, R>.() -> Unit): Job {
+ checkMiddlewareApplied()
+ return coroutineScope.launch {
+ context.saga()
+ }
+ }
+
+ suspend fun runSaga(saga: suspend SagaContext<S, A, R>.() -> Unit) {
+ checkMiddlewareApplied()
+ context.saga()
+ }
+
+ private fun checkMiddlewareApplied() {
+ check(::context.isInitialized) {
+ "Before running a Saga, you must mount the Saga middleware on the Store using applyMiddleware"
+ }
+ }
+}
+
+@OptIn(FlowPreview::class, ExperimentalCoroutinesApi::class)
+class SagaContext<S, A : RAction, R>(
+ private val reduxApi: MiddlewareApi<S, A, R>,
+ private val actions: BroadcastChannel<A>
+) {
+ /**
+ * Gets the current redux state.
+ */
+ fun getState(): S = reduxApi.getState()
+
+ /**
+ * Dispatches the given redux [action].
+ */
+ fun dispatch(action: A) {
+ reduxApi.dispatch(action)
+ }
+
+ /**
+ * Dispatches an action given by [createAction] for each message received in [channel].
+ */
+ suspend fun <T> dispatchAll(channel: ReceiveChannel<T>, createAction: (T) -> A) {
+ for (msg in channel) {
+ reduxApi.dispatch(createAction(msg))
+ }
+ }
+
+ /**
+ * Executes [handle] on every action dispatched. This runs forever until the current coroutine is cancelled.
+ */
+ suspend fun onEach(handle: suspend SagaContext<S, A, R>.(A) -> Unit) {
+ val channel = actions.openSubscription()
+ try {
+ for (a in channel) {
+ handle(a)
+ }
+ } finally {
+ channel.cancel()
+ }
+ }
+
+ /**
+ * Executes [handle] on every action dispatched of the type [T]. This runs forever until the current coroutine is
+ * cancelled.
+ */
+ suspend inline fun <reified T : A> onEach(
+ crossinline handle: suspend SagaContext<S, A, R>.(T) -> Unit
+ ) = onEach {
+ if (it is T) {
+ handle(it)
+ }
+ }
+
+ /**
+ * Suspends until the next action matching the given [predicate] is dispatched, and returns that action.
+ */
+ suspend fun next(predicate: (A) -> Boolean): A {
+ val channel = actions.openSubscription()
+ try {
+ for (a in channel) {
+ if (predicate(a)) {
+ return a
+ }
+ }
+ } finally {
+ channel.cancel()
+ }
+ error("Actions channel closed before receiving a matching action")
+ }
+
+ /**
+ * Suspends until the next action of type [T] is dispatched, and returns that action.
+ */
+ suspend inline fun <reified T : A> next(): T = next { it is T } as T
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/router/Router.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/router/Router.kt
new file mode 100644
index 00000000..19e8bd94
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/router/Router.kt
@@ -0,0 +1,32 @@
+package org.luxons.sevenwonders.ui.router
+
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.launch
+import org.luxons.sevenwonders.ui.redux.sagas.SwSagaContext
+import redux.RAction
+import kotlin.browser.window
+
+enum class Route(val path: String) {
+ HOME("/"),
+ GAME_BROWSER("/games"),
+ LOBBY("/lobby"),
+ GAME("/game"),
+}
+
+data class Navigate(val route: Route): RAction
+
+suspend fun SwSagaContext.routerSaga(
+ startRoute: Route,
+ runRouteSaga: suspend SwSagaContext.(Route) -> Unit
+) {
+ coroutineScope {
+ window.location.hash = startRoute.path
+ var currentSaga: Job = launch { runRouteSaga(startRoute) }
+ onEach<Navigate> {
+ currentSaga.cancel()
+ window.location.hash = it.route.path
+ currentSaga = launch { runRouteSaga(it.route) }
+ }
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/CoroutinesUtils.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/CoroutinesUtils.kt
new file mode 100644
index 00000000..600f08d3
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/CoroutinesUtils.kt
@@ -0,0 +1,15 @@
+package org.luxons.sevenwonders.ui.utils
+
+import kotlinx.coroutines.async
+import kotlinx.coroutines.coroutineScope
+import kotlinx.coroutines.selects.select
+
+// Cannot inline or it crashes for some reason
+suspend fun <R> awaitFirst(f1: suspend () -> R, f2: suspend () -> R): R = coroutineScope {
+ val deferred1 = async { f1() }
+ val deferred2 = async { f2() }
+ select<R> {
+ deferred1.onAwait { deferred2.cancel(); it }
+ deferred2.onAwait { deferred1.cancel(); it }
+ }
+}
diff --git a/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/ReactUtils.kt b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/ReactUtils.kt
new file mode 100644
index 00000000..07b3f2b5
--- /dev/null
+++ b/sw-ui/src/main/kotlin/org/luxons/sevenwonders/ui/utils/ReactUtils.kt
@@ -0,0 +1,16 @@
+package org.luxons.sevenwonders.ui.utils
+
+import kotlinx.html.SPAN
+import kotlinx.html.attributesMapOf
+import react.RBuilder
+import react.ReactElement
+import react.dom.*
+
+/**
+ * Creates a ReactElement without appending it (so that is can be passed around).
+ */
+fun createElement(block: RBuilder.() -> ReactElement): ReactElement {
+ return RDOMBuilder { SPAN(attributesMapOf("class", null), it) }
+ .apply { block() }
+ .create()
+}
diff --git a/sw-ui/src/main/resources/css/blueprint-icons.css b/sw-ui/src/main/resources/css/blueprint-icons.css
new file mode 100644
index 00000000..6b7e06d0
--- /dev/null
+++ b/sw-ui/src/main/resources/css/blueprint-icons.css
@@ -0,0 +1,18 @@
+/*!
+
+Copyright 2017-present Palantir Technologies, Inc. All rights reserved.
+Licensed under the Apache License, Version 2.0.
+
+*/
+@font-face{
+ font-family:"Icons16";
+ font-weight:normal;
+ font-style:normal;
+ src:url("../../resources/icons/icons-16.eot?#iefix") format("embedded-opentype"), url("../../resources/icons/icons-16.woff") format("woff"), url("../../resources/icons/icons-16.ttf") format("truetype"); }
+
+@font-face{
+ font-family:"Icons20";
+ font-weight:normal;
+ font-style:normal;
+ src:url("../../resources/icons/icons-20.eot?#iefix") format("embedded-opentype"), url("../../resources/icons/icons-20.woff") format("woff"), url("../../resources/icons/icons-20.ttf") format("truetype"); }
+/*# sourceMappingURL=blueprint-icons.css.map */ \ No newline at end of file
diff --git a/sw-ui/src/main/resources/css/blueprint.css b/sw-ui/src/main/resources/css/blueprint.css
new file mode 100644
index 00000000..7a5b94a8
--- /dev/null
+++ b/sw-ui/src/main/resources/css/blueprint.css
@@ -0,0 +1,8040 @@
+@charset "UTF-8";
+/*!
+
+Copyright 2015-present Palantir Technologies, Inc. All rights reserved.
+Licensed under the Apache License, Version 2.0.
+
+*/
+html{
+ -webkit-box-sizing:border-box;
+ box-sizing:border-box; }
+
+*,
+*::before,
+*::after{
+ -webkit-box-sizing:inherit;
+ box-sizing:inherit; }
+
+body{
+ text-transform:none;
+ line-height:1.28581;
+ letter-spacing:0;
+ font-size:14px;
+ font-weight:400;
+ color:#182026;
+ font-family:-apple-system, "BlinkMacSystemFont", "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Open Sans", "Helvetica Neue", "Icons16", sans-serif; }
+
+p{
+ margin-top:0;
+ margin-bottom:10px; }
+
+small{
+ font-size:12px; }
+
+strong{
+ font-weight:600; }
+
+::-moz-selection{
+ background:rgba(125, 188, 255, 0.6); }
+
+::selection{
+ background:rgba(125, 188, 255, 0.6); }
+.bp3-heading{
+ color:#182026;
+ font-weight:600;
+ margin:0 0 10px;
+ padding:0; }
+ .bp3-dark .bp3-heading{
+ color:#f5f8fa; }
+
+h1.bp3-heading, .bp3-running-text h1{
+ line-height:40px;
+ font-size:36px; }
+
+h2.bp3-heading, .bp3-running-text h2{
+ line-height:32px;
+ font-size:28px; }
+
+h3.bp3-heading, .bp3-running-text h3{
+ line-height:25px;
+ font-size:22px; }
+
+h4.bp3-heading, .bp3-running-text h4{
+ line-height:21px;
+ font-size:18px; }
+
+h5.bp3-heading, .bp3-running-text h5{
+ line-height:19px;
+ font-size:16px; }
+
+h6.bp3-heading, .bp3-running-text h6{
+ line-height:16px;
+ font-size:14px; }
+.bp3-ui-text{
+ text-transform:none;
+ line-height:1.28581;
+ letter-spacing:0;
+ font-size:14px;
+ font-weight:400; }
+
+.bp3-monospace-text{
+ text-transform:none;
+ font-family:monospace; }
+
+.bp3-text-muted{
+ color:#5c7080; }
+ .bp3-dark .bp3-text-muted{
+ color:#a7b6c2; }
+
+.bp3-text-disabled{
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-dark .bp3-text-disabled{
+ color:rgba(167, 182, 194, 0.6); }
+
+.bp3-text-overflow-ellipsis{
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal; }
+.bp3-running-text{
+ line-height:1.5;
+ font-size:14px; }
+ .bp3-running-text h1{
+ color:#182026;
+ font-weight:600;
+ margin-top:40px;
+ margin-bottom:20px; }
+ .bp3-dark .bp3-running-text h1{
+ color:#f5f8fa; }
+ .bp3-running-text h2{
+ color:#182026;
+ font-weight:600;
+ margin-top:40px;
+ margin-bottom:20px; }
+ .bp3-dark .bp3-running-text h2{
+ color:#f5f8fa; }
+ .bp3-running-text h3{
+ color:#182026;
+ font-weight:600;
+ margin-top:40px;
+ margin-bottom:20px; }
+ .bp3-dark .bp3-running-text h3{
+ color:#f5f8fa; }
+ .bp3-running-text h4{
+ color:#182026;
+ font-weight:600;
+ margin-top:40px;
+ margin-bottom:20px; }
+ .bp3-dark .bp3-running-text h4{
+ color:#f5f8fa; }
+ .bp3-running-text h5{
+ color:#182026;
+ font-weight:600;
+ margin-top:40px;
+ margin-bottom:20px; }
+ .bp3-dark .bp3-running-text h5{
+ color:#f5f8fa; }
+ .bp3-running-text h6{
+ color:#182026;
+ font-weight:600;
+ margin-top:40px;
+ margin-bottom:20px; }
+ .bp3-dark .bp3-running-text h6{
+ color:#f5f8fa; }
+ .bp3-running-text hr{
+ margin:20px 0;
+ border:none;
+ border-bottom:1px solid rgba(16, 22, 26, 0.15); }
+ .bp3-dark .bp3-running-text hr{
+ border-color:rgba(255, 255, 255, 0.15); }
+ .bp3-running-text p{
+ margin:0 0 10px;
+ padding:0; }
+
+.bp3-text-large{
+ font-size:16px; }
+
+.bp3-text-small{
+ font-size:12px; }
+a{
+ text-decoration:none;
+ color:#106ba3; }
+ a:hover{
+ cursor:pointer;
+ text-decoration:underline;
+ color:#106ba3; }
+ a .bp3-icon, a .bp3-icon-standard, a .bp3-icon-large{
+ color:inherit; }
+ a code,
+ .bp3-dark a code{
+ color:inherit; }
+ .bp3-dark a,
+ .bp3-dark a:hover{
+ color:#48aff0; }
+ .bp3-dark a .bp3-icon, .bp3-dark a .bp3-icon-standard, .bp3-dark a .bp3-icon-large,
+ .bp3-dark a:hover .bp3-icon,
+ .bp3-dark a:hover .bp3-icon-standard,
+ .bp3-dark a:hover .bp3-icon-large{
+ color:inherit; }
+.bp3-running-text code, .bp3-code{
+ text-transform:none;
+ font-family:monospace;
+ border-radius:3px;
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2);
+ background:rgba(255, 255, 255, 0.7);
+ padding:2px 5px;
+ color:#5c7080;
+ font-size:smaller; }
+ .bp3-dark .bp3-running-text code, .bp3-running-text .bp3-dark code, .bp3-dark .bp3-code{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ background:rgba(16, 22, 26, 0.3);
+ color:#a7b6c2; }
+ .bp3-running-text a > code, a > .bp3-code{
+ color:#137cbd; }
+ .bp3-dark .bp3-running-text a > code, .bp3-running-text .bp3-dark a > code, .bp3-dark a > .bp3-code{
+ color:inherit; }
+
+.bp3-running-text pre, .bp3-code-block{
+ text-transform:none;
+ font-family:monospace;
+ display:block;
+ margin:10px 0;
+ border-radius:3px;
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
+ background:rgba(255, 255, 255, 0.7);
+ padding:13px 15px 12px;
+ line-height:1.4;
+ color:#182026;
+ font-size:13px;
+ word-break:break-all;
+ word-wrap:break-word; }
+ .bp3-dark .bp3-running-text pre, .bp3-running-text .bp3-dark pre, .bp3-dark .bp3-code-block{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ background:rgba(16, 22, 26, 0.3);
+ color:#f5f8fa; }
+ .bp3-running-text pre > code, .bp3-code-block > code{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ padding:0;
+ color:inherit;
+ font-size:inherit; }
+
+.bp3-running-text kbd, .bp3-key{
+ display:-webkit-inline-box;
+ display:-ms-inline-flexbox;
+ display:inline-flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ border-radius:3px;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
+ background:#ffffff;
+ min-width:24px;
+ height:24px;
+ padding:3px 6px;
+ vertical-align:middle;
+ line-height:24px;
+ color:#5c7080;
+ font-family:inherit;
+ font-size:12px; }
+ .bp3-running-text kbd .bp3-icon, .bp3-key .bp3-icon, .bp3-running-text kbd .bp3-icon-standard, .bp3-key .bp3-icon-standard, .bp3-running-text kbd .bp3-icon-large, .bp3-key .bp3-icon-large{
+ margin-right:5px; }
+ .bp3-dark .bp3-running-text kbd, .bp3-running-text .bp3-dark kbd, .bp3-dark .bp3-key{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
+ background:#394b59;
+ color:#a7b6c2; }
+.bp3-running-text blockquote, .bp3-blockquote{
+ margin:0 0 10px;
+ border-left:solid 4px rgba(167, 182, 194, 0.5);
+ padding:0 20px; }
+ .bp3-dark .bp3-running-text blockquote, .bp3-running-text .bp3-dark blockquote, .bp3-dark .bp3-blockquote{
+ border-color:rgba(115, 134, 148, 0.5); }
+.bp3-running-text ul,
+.bp3-running-text ol, .bp3-list{
+ margin:10px 0;
+ padding-left:30px; }
+ .bp3-running-text ul li:not(:last-child), .bp3-running-text ol li:not(:last-child), .bp3-list li:not(:last-child){
+ margin-bottom:5px; }
+ .bp3-running-text ul ol, .bp3-running-text ol ol, .bp3-list ol,
+ .bp3-running-text ul ul,
+ .bp3-running-text ol ul,
+ .bp3-list ul{
+ margin-top:5px; }
+
+.bp3-list-unstyled{
+ margin:0;
+ padding:0;
+ list-style:none; }
+ .bp3-list-unstyled li{
+ padding:0; }
+.bp3-rtl{
+ text-align:right; }
+
+.bp3-dark{
+ color:#f5f8fa; }
+
+:focus{
+ outline:rgba(19, 124, 189, 0.6) auto 2px;
+ outline-offset:2px;
+ -moz-outline-radius:6px; }
+
+.bp3-focus-disabled :focus{
+ outline:none !important; }
+ .bp3-focus-disabled :focus ~ .bp3-control-indicator{
+ outline:none !important; }
+
+.bp3-alert{
+ max-width:400px;
+ padding:20px; }
+
+.bp3-alert-body{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex; }
+ .bp3-alert-body .bp3-icon{
+ margin-top:0;
+ margin-right:20px;
+ font-size:40px; }
+
+.bp3-alert-footer{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:reverse;
+ -ms-flex-direction:row-reverse;
+ flex-direction:row-reverse;
+ margin-top:10px; }
+ .bp3-alert-footer .bp3-button{
+ margin-left:10px; }
+.bp3-breadcrumbs{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -ms-flex-wrap:wrap;
+ flex-wrap:wrap;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ margin:0;
+ cursor:default;
+ height:30px;
+ padding:0;
+ list-style:none; }
+ .bp3-breadcrumbs > li{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center; }
+ .bp3-breadcrumbs > li::after{
+ display:block;
+ margin:0 5px;
+ background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M10.71 7.29l-4-4a1.003 1.003 0 00-1.42 1.42L8.59 8 5.3 11.29c-.19.18-.3.43-.3.71a1.003 1.003 0 001.71.71l4-4c.18-.18.29-.43.29-.71 0-.28-.11-.53-.29-.71z' fill='%235C7080'/%3e%3c/svg%3e");
+ width:16px;
+ height:16px;
+ content:""; }
+ .bp3-breadcrumbs > li:last-of-type::after{
+ display:none; }
+
+.bp3-breadcrumb,
+.bp3-breadcrumb-current,
+.bp3-breadcrumbs-collapsed{
+ display:-webkit-inline-box;
+ display:-ms-inline-flexbox;
+ display:inline-flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ font-size:16px; }
+
+.bp3-breadcrumb,
+.bp3-breadcrumbs-collapsed{
+ color:#5c7080; }
+
+.bp3-breadcrumb:hover{
+ text-decoration:none; }
+
+.bp3-breadcrumb.bp3-disabled{
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+
+.bp3-breadcrumb .bp3-icon{
+ margin-right:5px; }
+
+.bp3-breadcrumb-current{
+ color:inherit;
+ font-weight:600; }
+ .bp3-breadcrumb-current .bp3-input{
+ vertical-align:baseline;
+ font-size:inherit;
+ font-weight:inherit; }
+
+.bp3-breadcrumbs-collapsed{
+ margin-right:2px;
+ border:none;
+ border-radius:3px;
+ background:#ced9e0;
+ cursor:pointer;
+ padding:1px 5px;
+ vertical-align:text-bottom; }
+ .bp3-breadcrumbs-collapsed::before{
+ display:block;
+ background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cg fill='%235C7080'%3e%3ccircle cx='2' cy='8.03' r='2'/%3e%3ccircle cx='14' cy='8.03' r='2'/%3e%3ccircle cx='8' cy='8.03' r='2'/%3e%3c/g%3e%3c/svg%3e") center no-repeat;
+ width:16px;
+ height:16px;
+ content:""; }
+ .bp3-breadcrumbs-collapsed:hover{
+ background:#bfccd6;
+ text-decoration:none;
+ color:#182026; }
+
+.bp3-dark .bp3-breadcrumb,
+.bp3-dark .bp3-breadcrumbs-collapsed{
+ color:#a7b6c2; }
+
+.bp3-dark .bp3-breadcrumbs > li::after{
+ color:#a7b6c2; }
+
+.bp3-dark .bp3-breadcrumb.bp3-disabled{
+ color:rgba(167, 182, 194, 0.6); }
+
+.bp3-dark .bp3-breadcrumb-current{
+ color:#f5f8fa; }
+
+.bp3-dark .bp3-breadcrumbs-collapsed{
+ background:rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-breadcrumbs-collapsed:hover{
+ background:rgba(16, 22, 26, 0.6);
+ color:#f5f8fa; }
+.bp3-button{
+ display:-webkit-inline-box;
+ display:-ms-inline-flexbox;
+ display:inline-flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ border:none;
+ border-radius:3px;
+ cursor:pointer;
+ padding:5px 10px;
+ vertical-align:middle;
+ text-align:left;
+ font-size:14px;
+ min-width:30px;
+ min-height:30px; }
+ .bp3-button > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-button > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-button::before,
+ .bp3-button > *{
+ margin-right:7px; }
+ .bp3-button:empty::before,
+ .bp3-button > :last-child{
+ margin-right:0; }
+ .bp3-button:empty{
+ padding:0 !important; }
+ .bp3-button:disabled, .bp3-button.bp3-disabled{
+ cursor:not-allowed; }
+ .bp3-button.bp3-fill{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ width:100%; }
+ .bp3-button.bp3-align-right,
+ .bp3-align-right .bp3-button{
+ text-align:right; }
+ .bp3-button.bp3-align-left,
+ .bp3-align-left .bp3-button{
+ text-align:left; }
+ .bp3-button:not([class*="bp3-intent-"]){
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-color:#f5f8fa;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
+ color:#182026; }
+ .bp3-button:not([class*="bp3-intent-"]):hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-clip:padding-box;
+ background-color:#ebf1f5; }
+ .bp3-button:not([class*="bp3-intent-"]):active, .bp3-button:not([class*="bp3-intent-"]).bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#d8e1e8;
+ background-image:none; }
+ .bp3-button:not([class*="bp3-intent-"]):disabled, .bp3-button:not([class*="bp3-intent-"]).bp3-disabled{
+ outline:none;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(206, 217, 224, 0.5);
+ background-image:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-button:not([class*="bp3-intent-"]):disabled.bp3-active, .bp3-button:not([class*="bp3-intent-"]):disabled.bp3-active:hover, .bp3-button:not([class*="bp3-intent-"]).bp3-disabled.bp3-active, .bp3-button:not([class*="bp3-intent-"]).bp3-disabled.bp3-active:hover{
+ background:rgba(206, 217, 224, 0.7); }
+ .bp3-button.bp3-intent-primary{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#137cbd;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
+ color:#ffffff; }
+ .bp3-button.bp3-intent-primary:hover, .bp3-button.bp3-intent-primary:active, .bp3-button.bp3-intent-primary.bp3-active{
+ color:#ffffff; }
+ .bp3-button.bp3-intent-primary:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#106ba3; }
+ .bp3-button.bp3-intent-primary:active, .bp3-button.bp3-intent-primary.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#0e5a8a;
+ background-image:none; }
+ .bp3-button.bp3-intent-primary:disabled, .bp3-button.bp3-intent-primary.bp3-disabled{
+ border-color:transparent;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(19, 124, 189, 0.5);
+ background-image:none;
+ color:rgba(255, 255, 255, 0.6); }
+ .bp3-button.bp3-intent-success{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#0f9960;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
+ color:#ffffff; }
+ .bp3-button.bp3-intent-success:hover, .bp3-button.bp3-intent-success:active, .bp3-button.bp3-intent-success.bp3-active{
+ color:#ffffff; }
+ .bp3-button.bp3-intent-success:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#0d8050; }
+ .bp3-button.bp3-intent-success:active, .bp3-button.bp3-intent-success.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#0a6640;
+ background-image:none; }
+ .bp3-button.bp3-intent-success:disabled, .bp3-button.bp3-intent-success.bp3-disabled{
+ border-color:transparent;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(15, 153, 96, 0.5);
+ background-image:none;
+ color:rgba(255, 255, 255, 0.6); }
+ .bp3-button.bp3-intent-warning{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#d9822b;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
+ color:#ffffff; }
+ .bp3-button.bp3-intent-warning:hover, .bp3-button.bp3-intent-warning:active, .bp3-button.bp3-intent-warning.bp3-active{
+ color:#ffffff; }
+ .bp3-button.bp3-intent-warning:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#bf7326; }
+ .bp3-button.bp3-intent-warning:active, .bp3-button.bp3-intent-warning.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#a66321;
+ background-image:none; }
+ .bp3-button.bp3-intent-warning:disabled, .bp3-button.bp3-intent-warning.bp3-disabled{
+ border-color:transparent;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(217, 130, 43, 0.5);
+ background-image:none;
+ color:rgba(255, 255, 255, 0.6); }
+ .bp3-button.bp3-intent-danger{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#db3737;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
+ color:#ffffff; }
+ .bp3-button.bp3-intent-danger:hover, .bp3-button.bp3-intent-danger:active, .bp3-button.bp3-intent-danger.bp3-active{
+ color:#ffffff; }
+ .bp3-button.bp3-intent-danger:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#c23030; }
+ .bp3-button.bp3-intent-danger:active, .bp3-button.bp3-intent-danger.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#a82a2a;
+ background-image:none; }
+ .bp3-button.bp3-intent-danger:disabled, .bp3-button.bp3-intent-danger.bp3-disabled{
+ border-color:transparent;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(219, 55, 55, 0.5);
+ background-image:none;
+ color:rgba(255, 255, 255, 0.6); }
+ .bp3-button[class*="bp3-intent-"] .bp3-button-spinner .bp3-spinner-head{
+ stroke:#ffffff; }
+ .bp3-button.bp3-large,
+ .bp3-large .bp3-button{
+ min-width:40px;
+ min-height:40px;
+ padding:5px 15px;
+ font-size:16px; }
+ .bp3-button.bp3-large::before,
+ .bp3-button.bp3-large > *,
+ .bp3-large .bp3-button::before,
+ .bp3-large .bp3-button > *{
+ margin-right:10px; }
+ .bp3-button.bp3-large:empty::before,
+ .bp3-button.bp3-large > :last-child,
+ .bp3-large .bp3-button:empty::before,
+ .bp3-large .bp3-button > :last-child{
+ margin-right:0; }
+ .bp3-button.bp3-small,
+ .bp3-small .bp3-button{
+ min-width:24px;
+ min-height:24px;
+ padding:0 7px; }
+ .bp3-button.bp3-loading{
+ position:relative; }
+ .bp3-button.bp3-loading[class*="bp3-icon-"]::before{
+ visibility:hidden; }
+ .bp3-button.bp3-loading .bp3-button-spinner{
+ position:absolute;
+ margin:0; }
+ .bp3-button.bp3-loading > :not(.bp3-button-spinner){
+ visibility:hidden; }
+ .bp3-button[class*="bp3-icon-"]::before{
+ line-height:1;
+ font-family:"Icons16", sans-serif;
+ font-size:16px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ color:#5c7080; }
+ .bp3-button .bp3-icon, .bp3-button .bp3-icon-standard, .bp3-button .bp3-icon-large{
+ color:#5c7080; }
+ .bp3-button .bp3-icon.bp3-align-right, .bp3-button .bp3-icon-standard.bp3-align-right, .bp3-button .bp3-icon-large.bp3-align-right{
+ margin-left:7px; }
+ .bp3-button .bp3-icon:first-child:last-child,
+ .bp3-button .bp3-spinner + .bp3-icon:last-child{
+ margin:0 -7px; }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]){
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#394b59;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+ color:#f5f8fa; }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]):hover, .bp3-dark .bp3-button:not([class*="bp3-intent-"]):active, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-active{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]):hover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#30404d; }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]):active, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-active{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#202b33;
+ background-image:none; }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]):disabled, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(57, 75, 89, 0.5);
+ background-image:none;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]):disabled.bp3-active, .bp3-dark .bp3-button:not([class*="bp3-intent-"]).bp3-disabled.bp3-active{
+ background:rgba(57, 75, 89, 0.7); }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-button-spinner .bp3-spinner-head{
+ background:rgba(16, 22, 26, 0.5);
+ stroke:#8a9ba8; }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"])[class*="bp3-icon-"]::before{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-icon, .bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-icon-standard, .bp3-dark .bp3-button:not([class*="bp3-intent-"]) .bp3-icon-large{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-button[class*="bp3-intent-"]{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-button[class*="bp3-intent-"]:hover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-button[class*="bp3-intent-"]:active, .bp3-dark .bp3-button[class*="bp3-intent-"].bp3-active{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2); }
+ .bp3-dark .bp3-button[class*="bp3-intent-"]:disabled, .bp3-dark .bp3-button[class*="bp3-intent-"].bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-image:none;
+ color:rgba(255, 255, 255, 0.3); }
+ .bp3-dark .bp3-button[class*="bp3-intent-"] .bp3-button-spinner .bp3-spinner-head{
+ stroke:#8a9ba8; }
+ .bp3-button:disabled::before,
+ .bp3-button:disabled .bp3-icon, .bp3-button:disabled .bp3-icon-standard, .bp3-button:disabled .bp3-icon-large, .bp3-button.bp3-disabled::before,
+ .bp3-button.bp3-disabled .bp3-icon, .bp3-button.bp3-disabled .bp3-icon-standard, .bp3-button.bp3-disabled .bp3-icon-large, .bp3-button[class*="bp3-intent-"]::before,
+ .bp3-button[class*="bp3-intent-"] .bp3-icon, .bp3-button[class*="bp3-intent-"] .bp3-icon-standard, .bp3-button[class*="bp3-intent-"] .bp3-icon-large{
+ color:inherit !important; }
+ .bp3-button.bp3-minimal{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none; }
+ .bp3-button.bp3-minimal:hover{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(167, 182, 194, 0.3);
+ text-decoration:none;
+ color:#182026; }
+ .bp3-button.bp3-minimal:active, .bp3-button.bp3-minimal.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(115, 134, 148, 0.3);
+ color:#182026; }
+ .bp3-button.bp3-minimal:disabled, .bp3-button.bp3-minimal:disabled:hover, .bp3-button.bp3-minimal.bp3-disabled, .bp3-button.bp3-minimal.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-button.bp3-minimal:disabled.bp3-active, .bp3-button.bp3-minimal:disabled:hover.bp3-active, .bp3-button.bp3-minimal.bp3-disabled.bp3-active, .bp3-button.bp3-minimal.bp3-disabled:hover.bp3-active{
+ background:rgba(115, 134, 148, 0.3); }
+ .bp3-dark .bp3-button.bp3-minimal{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:inherit; }
+ .bp3-dark .bp3-button.bp3-minimal:hover, .bp3-dark .bp3-button.bp3-minimal:active, .bp3-dark .bp3-button.bp3-minimal.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none; }
+ .bp3-dark .bp3-button.bp3-minimal:hover{
+ background:rgba(138, 155, 168, 0.15); }
+ .bp3-dark .bp3-button.bp3-minimal:active, .bp3-dark .bp3-button.bp3-minimal.bp3-active{
+ background:rgba(138, 155, 168, 0.3);
+ color:#f5f8fa; }
+ .bp3-dark .bp3-button.bp3-minimal:disabled, .bp3-dark .bp3-button.bp3-minimal:disabled:hover, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-button.bp3-minimal:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal:disabled:hover.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-disabled:hover.bp3-active{
+ background:rgba(138, 155, 168, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-primary{
+ color:#106ba3; }
+ .bp3-button.bp3-minimal.bp3-intent-primary:hover, .bp3-button.bp3-minimal.bp3-intent-primary:active, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#106ba3; }
+ .bp3-button.bp3-minimal.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.15);
+ color:#106ba3; }
+ .bp3-button.bp3-minimal.bp3-intent-primary:active, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#106ba3; }
+ .bp3-button.bp3-minimal.bp3-intent-primary:disabled, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(16, 107, 163, 0.5); }
+ .bp3-button.bp3-minimal.bp3-intent-primary:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
+ stroke:#106ba3; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary{
+ color:#48aff0; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.2);
+ color:#48aff0; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#48aff0; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(72, 175, 240, 0.5); }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-success{
+ color:#0d8050; }
+ .bp3-button.bp3-minimal.bp3-intent-success:hover, .bp3-button.bp3-minimal.bp3-intent-success:active, .bp3-button.bp3-minimal.bp3-intent-success.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#0d8050; }
+ .bp3-button.bp3-minimal.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.15);
+ color:#0d8050; }
+ .bp3-button.bp3-minimal.bp3-intent-success:active, .bp3-button.bp3-minimal.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#0d8050; }
+ .bp3-button.bp3-minimal.bp3-intent-success:disabled, .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(13, 128, 80, 0.5); }
+ .bp3-button.bp3-minimal.bp3-intent-success:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
+ stroke:#0d8050; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success{
+ color:#3dcc91; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.2);
+ color:#3dcc91; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#3dcc91; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(61, 204, 145, 0.5); }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-warning{
+ color:#bf7326; }
+ .bp3-button.bp3-minimal.bp3-intent-warning:hover, .bp3-button.bp3-minimal.bp3-intent-warning:active, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#bf7326; }
+ .bp3-button.bp3-minimal.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.15);
+ color:#bf7326; }
+ .bp3-button.bp3-minimal.bp3-intent-warning:active, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#bf7326; }
+ .bp3-button.bp3-minimal.bp3-intent-warning:disabled, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(191, 115, 38, 0.5); }
+ .bp3-button.bp3-minimal.bp3-intent-warning:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
+ stroke:#bf7326; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning{
+ color:#ffb366; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.2);
+ color:#ffb366; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#ffb366; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(255, 179, 102, 0.5); }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-danger{
+ color:#c23030; }
+ .bp3-button.bp3-minimal.bp3-intent-danger:hover, .bp3-button.bp3-minimal.bp3-intent-danger:active, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#c23030; }
+ .bp3-button.bp3-minimal.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.15);
+ color:#c23030; }
+ .bp3-button.bp3-minimal.bp3-intent-danger:active, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#c23030; }
+ .bp3-button.bp3-minimal.bp3-intent-danger:disabled, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(194, 48, 48, 0.5); }
+ .bp3-button.bp3-minimal.bp3-intent-danger:disabled.bp3-active, .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+ .bp3-button.bp3-minimal.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
+ stroke:#c23030; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger{
+ color:#ff7373; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.2);
+ color:#ff7373; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#ff7373; }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:disabled, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(255, 115, 115, 0.5); }
+ .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-button.bp3-minimal.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+ .bp3-button.bp3-outlined{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ border:1px solid rgba(24, 32, 38, 0.2);
+ -webkit-box-sizing:border-box;
+ box-sizing:border-box; }
+ .bp3-button.bp3-outlined:hover{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(167, 182, 194, 0.3);
+ text-decoration:none;
+ color:#182026; }
+ .bp3-button.bp3-outlined:active, .bp3-button.bp3-outlined.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(115, 134, 148, 0.3);
+ color:#182026; }
+ .bp3-button.bp3-outlined:disabled, .bp3-button.bp3-outlined:disabled:hover, .bp3-button.bp3-outlined.bp3-disabled, .bp3-button.bp3-outlined.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-button.bp3-outlined:disabled.bp3-active, .bp3-button.bp3-outlined:disabled:hover.bp3-active, .bp3-button.bp3-outlined.bp3-disabled.bp3-active, .bp3-button.bp3-outlined.bp3-disabled:hover.bp3-active{
+ background:rgba(115, 134, 148, 0.3); }
+ .bp3-dark .bp3-button.bp3-outlined{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:inherit; }
+ .bp3-dark .bp3-button.bp3-outlined:hover, .bp3-dark .bp3-button.bp3-outlined:active, .bp3-dark .bp3-button.bp3-outlined.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none; }
+ .bp3-dark .bp3-button.bp3-outlined:hover{
+ background:rgba(138, 155, 168, 0.15); }
+ .bp3-dark .bp3-button.bp3-outlined:active, .bp3-dark .bp3-button.bp3-outlined.bp3-active{
+ background:rgba(138, 155, 168, 0.3);
+ color:#f5f8fa; }
+ .bp3-dark .bp3-button.bp3-outlined:disabled, .bp3-dark .bp3-button.bp3-outlined:disabled:hover, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-button.bp3-outlined:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined:disabled:hover.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover.bp3-active{
+ background:rgba(138, 155, 168, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-primary{
+ color:#106ba3; }
+ .bp3-button.bp3-outlined.bp3-intent-primary:hover, .bp3-button.bp3-outlined.bp3-intent-primary:active, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#106ba3; }
+ .bp3-button.bp3-outlined.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.15);
+ color:#106ba3; }
+ .bp3-button.bp3-outlined.bp3-intent-primary:active, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#106ba3; }
+ .bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(16, 107, 163, 0.5); }
+ .bp3-button.bp3-outlined.bp3-intent-primary:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
+ stroke:#106ba3; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary{
+ color:#48aff0; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.2);
+ color:#48aff0; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#48aff0; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(72, 175, 240, 0.5); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-success{
+ color:#0d8050; }
+ .bp3-button.bp3-outlined.bp3-intent-success:hover, .bp3-button.bp3-outlined.bp3-intent-success:active, .bp3-button.bp3-outlined.bp3-intent-success.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#0d8050; }
+ .bp3-button.bp3-outlined.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.15);
+ color:#0d8050; }
+ .bp3-button.bp3-outlined.bp3-intent-success:active, .bp3-button.bp3-outlined.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#0d8050; }
+ .bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(13, 128, 80, 0.5); }
+ .bp3-button.bp3-outlined.bp3-intent-success:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
+ stroke:#0d8050; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success{
+ color:#3dcc91; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.2);
+ color:#3dcc91; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#3dcc91; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(61, 204, 145, 0.5); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-warning{
+ color:#bf7326; }
+ .bp3-button.bp3-outlined.bp3-intent-warning:hover, .bp3-button.bp3-outlined.bp3-intent-warning:active, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#bf7326; }
+ .bp3-button.bp3-outlined.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.15);
+ color:#bf7326; }
+ .bp3-button.bp3-outlined.bp3-intent-warning:active, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#bf7326; }
+ .bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(191, 115, 38, 0.5); }
+ .bp3-button.bp3-outlined.bp3-intent-warning:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
+ stroke:#bf7326; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning{
+ color:#ffb366; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.2);
+ color:#ffb366; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#ffb366; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(255, 179, 102, 0.5); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-danger{
+ color:#c23030; }
+ .bp3-button.bp3-outlined.bp3-intent-danger:hover, .bp3-button.bp3-outlined.bp3-intent-danger:active, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#c23030; }
+ .bp3-button.bp3-outlined.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.15);
+ color:#c23030; }
+ .bp3-button.bp3-outlined.bp3-intent-danger:active, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#c23030; }
+ .bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(194, 48, 48, 0.5); }
+ .bp3-button.bp3-outlined.bp3-intent-danger:disabled.bp3-active, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+ .bp3-button.bp3-outlined.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
+ stroke:#c23030; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger{
+ color:#ff7373; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.2);
+ color:#ff7373; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#ff7373; }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(255, 115, 115, 0.5); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+ .bp3-button.bp3-outlined:disabled, .bp3-button.bp3-outlined.bp3-disabled, .bp3-button.bp3-outlined:disabled:hover, .bp3-button.bp3-outlined.bp3-disabled:hover{
+ border-color:rgba(92, 112, 128, 0.1); }
+ .bp3-dark .bp3-button.bp3-outlined{
+ border-color:rgba(255, 255, 255, 0.4); }
+ .bp3-dark .bp3-button.bp3-outlined:disabled, .bp3-dark .bp3-button.bp3-outlined:disabled:hover, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-disabled:hover{
+ border-color:rgba(255, 255, 255, 0.2); }
+ .bp3-button.bp3-outlined.bp3-intent-primary{
+ border-color:rgba(16, 107, 163, 0.6); }
+ .bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
+ border-color:rgba(16, 107, 163, 0.2); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary{
+ border-color:rgba(72, 175, 240, 0.6); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-primary.bp3-disabled{
+ border-color:rgba(72, 175, 240, 0.2); }
+ .bp3-button.bp3-outlined.bp3-intent-success{
+ border-color:rgba(13, 128, 80, 0.6); }
+ .bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
+ border-color:rgba(13, 128, 80, 0.2); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success{
+ border-color:rgba(61, 204, 145, 0.6); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-success.bp3-disabled{
+ border-color:rgba(61, 204, 145, 0.2); }
+ .bp3-button.bp3-outlined.bp3-intent-warning{
+ border-color:rgba(191, 115, 38, 0.6); }
+ .bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
+ border-color:rgba(191, 115, 38, 0.2); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning{
+ border-color:rgba(255, 179, 102, 0.6); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-warning.bp3-disabled{
+ border-color:rgba(255, 179, 102, 0.2); }
+ .bp3-button.bp3-outlined.bp3-intent-danger{
+ border-color:rgba(194, 48, 48, 0.6); }
+ .bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
+ border-color:rgba(194, 48, 48, 0.2); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger{
+ border-color:rgba(255, 115, 115, 0.6); }
+ .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger:disabled, .bp3-dark .bp3-button.bp3-outlined.bp3-intent-danger.bp3-disabled{
+ border-color:rgba(255, 115, 115, 0.2); }
+
+a.bp3-button{
+ text-align:center;
+ text-decoration:none;
+ -webkit-transition:none;
+ transition:none; }
+ a.bp3-button, a.bp3-button:hover, a.bp3-button:active{
+ color:#182026; }
+ a.bp3-button.bp3-disabled{
+ color:rgba(92, 112, 128, 0.6); }
+
+.bp3-button-text{
+ -webkit-box-flex:0;
+ -ms-flex:0 1 auto;
+ flex:0 1 auto; }
+
+.bp3-button.bp3-align-left .bp3-button-text, .bp3-button.bp3-align-right .bp3-button-text,
+.bp3-button-group.bp3-align-left .bp3-button-text,
+.bp3-button-group.bp3-align-right .bp3-button-text{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto; }
+.bp3-button-group{
+ display:-webkit-inline-box;
+ display:-ms-inline-flexbox;
+ display:inline-flex; }
+ .bp3-button-group .bp3-button{
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ position:relative;
+ z-index:4; }
+ .bp3-button-group .bp3-button:focus{
+ z-index:5; }
+ .bp3-button-group .bp3-button:hover{
+ z-index:6; }
+ .bp3-button-group .bp3-button:active, .bp3-button-group .bp3-button.bp3-active{
+ z-index:7; }
+ .bp3-button-group .bp3-button:disabled, .bp3-button-group .bp3-button.bp3-disabled{
+ z-index:3; }
+ .bp3-button-group .bp3-button[class*="bp3-intent-"]{
+ z-index:9; }
+ .bp3-button-group .bp3-button[class*="bp3-intent-"]:focus{
+ z-index:10; }
+ .bp3-button-group .bp3-button[class*="bp3-intent-"]:hover{
+ z-index:11; }
+ .bp3-button-group .bp3-button[class*="bp3-intent-"]:active, .bp3-button-group .bp3-button[class*="bp3-intent-"].bp3-active{
+ z-index:12; }
+ .bp3-button-group .bp3-button[class*="bp3-intent-"]:disabled, .bp3-button-group .bp3-button[class*="bp3-intent-"].bp3-disabled{
+ z-index:8; }
+ .bp3-button-group:not(.bp3-minimal) > .bp3-popover-wrapper:not(:first-child) .bp3-button,
+ .bp3-button-group:not(.bp3-minimal) > .bp3-button:not(:first-child){
+ border-top-left-radius:0;
+ border-bottom-left-radius:0; }
+ .bp3-button-group:not(.bp3-minimal) > .bp3-popover-wrapper:not(:last-child) .bp3-button,
+ .bp3-button-group:not(.bp3-minimal) > .bp3-button:not(:last-child){
+ margin-right:-1px;
+ border-top-right-radius:0;
+ border-bottom-right-radius:0; }
+ .bp3-button-group.bp3-minimal .bp3-button{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none; }
+ .bp3-button-group.bp3-minimal .bp3-button:hover{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(167, 182, 194, 0.3);
+ text-decoration:none;
+ color:#182026; }
+ .bp3-button-group.bp3-minimal .bp3-button:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(115, 134, 148, 0.3);
+ color:#182026; }
+ .bp3-button-group.bp3-minimal .bp3-button:disabled, .bp3-button-group.bp3-minimal .bp3-button:disabled:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-button-group.bp3-minimal .bp3-button:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button:disabled:hover.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover.bp3-active{
+ background:rgba(115, 134, 148, 0.3); }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:inherit; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:hover, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:hover{
+ background:rgba(138, 155, 168, 0.15); }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-active{
+ background:rgba(138, 155, 168, 0.3);
+ color:#f5f8fa; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled:hover, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button:disabled:hover.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-disabled:hover.bp3-active{
+ background:rgba(138, 155, 168, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary{
+ color:#106ba3; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#106ba3; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.15);
+ color:#106ba3; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#106ba3; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(16, 107, 163, 0.5); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
+ stroke:#106ba3; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary{
+ color:#48aff0; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.2);
+ color:#48aff0; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#48aff0; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(72, 175, 240, 0.5); }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success{
+ color:#0d8050; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#0d8050; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.15);
+ color:#0d8050; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#0d8050; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(13, 128, 80, 0.5); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
+ stroke:#0d8050; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success{
+ color:#3dcc91; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.2);
+ color:#3dcc91; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#3dcc91; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(61, 204, 145, 0.5); }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning{
+ color:#bf7326; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#bf7326; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.15);
+ color:#bf7326; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#bf7326; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(191, 115, 38, 0.5); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
+ stroke:#bf7326; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning{
+ color:#ffb366; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.2);
+ color:#ffb366; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#ffb366; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(255, 179, 102, 0.5); }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger{
+ color:#c23030; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#c23030; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.15);
+ color:#c23030; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#c23030; }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(194, 48, 48, 0.5); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled.bp3-active, .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+ .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
+ stroke:#c23030; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger{
+ color:#ff7373; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.2);
+ color:#ff7373; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#ff7373; }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(255, 115, 115, 0.5); }
+ .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-button-group.bp3-minimal .bp3-button.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+ .bp3-button-group .bp3-popover-wrapper,
+ .bp3-button-group .bp3-popover-target{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto; }
+ .bp3-button-group.bp3-fill{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ width:100%; }
+ .bp3-button-group .bp3-button.bp3-fill,
+ .bp3-button-group.bp3-fill .bp3-button:not(.bp3-fixed){
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto; }
+ .bp3-button-group.bp3-vertical{
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ -webkit-box-align:stretch;
+ -ms-flex-align:stretch;
+ align-items:stretch;
+ vertical-align:top; }
+ .bp3-button-group.bp3-vertical.bp3-fill{
+ width:unset;
+ height:100%; }
+ .bp3-button-group.bp3-vertical .bp3-button{
+ margin-right:0 !important;
+ width:100%; }
+ .bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-popover-wrapper:first-child .bp3-button,
+ .bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-button:first-child{
+ border-radius:3px 3px 0 0; }
+ .bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-popover-wrapper:last-child .bp3-button,
+ .bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-button:last-child{
+ border-radius:0 0 3px 3px; }
+ .bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-popover-wrapper:not(:last-child) .bp3-button,
+ .bp3-button-group.bp3-vertical:not(.bp3-minimal) > .bp3-button:not(:last-child){
+ margin-bottom:-1px; }
+ .bp3-button-group.bp3-align-left .bp3-button{
+ text-align:left; }
+ .bp3-dark .bp3-button-group:not(.bp3-minimal) > .bp3-popover-wrapper:not(:last-child) .bp3-button,
+ .bp3-dark .bp3-button-group:not(.bp3-minimal) > .bp3-button:not(:last-child){
+ margin-right:1px; }
+ .bp3-dark .bp3-button-group.bp3-vertical > .bp3-popover-wrapper:not(:last-child) .bp3-button,
+ .bp3-dark .bp3-button-group.bp3-vertical > .bp3-button:not(:last-child){
+ margin-bottom:1px; }
+.bp3-callout{
+ line-height:1.5;
+ font-size:14px;
+ position:relative;
+ border-radius:3px;
+ background-color:rgba(138, 155, 168, 0.15);
+ width:100%;
+ padding:10px 12px 9px; }
+ .bp3-callout[class*="bp3-icon-"]{
+ padding-left:40px; }
+ .bp3-callout[class*="bp3-icon-"]::before{
+ line-height:1;
+ font-family:"Icons20", sans-serif;
+ font-size:20px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ position:absolute;
+ top:10px;
+ left:10px;
+ color:#5c7080; }
+ .bp3-callout.bp3-callout-icon{
+ padding-left:40px; }
+ .bp3-callout.bp3-callout-icon > .bp3-icon:first-child{
+ position:absolute;
+ top:10px;
+ left:10px;
+ color:#5c7080; }
+ .bp3-callout .bp3-heading{
+ margin-top:0;
+ margin-bottom:5px;
+ line-height:20px; }
+ .bp3-callout .bp3-heading:last-child{
+ margin-bottom:0; }
+ .bp3-dark .bp3-callout{
+ background-color:rgba(138, 155, 168, 0.2); }
+ .bp3-dark .bp3-callout[class*="bp3-icon-"]::before{
+ color:#a7b6c2; }
+ .bp3-callout.bp3-intent-primary{
+ background-color:rgba(19, 124, 189, 0.15); }
+ .bp3-callout.bp3-intent-primary[class*="bp3-icon-"]::before,
+ .bp3-callout.bp3-intent-primary > .bp3-icon:first-child,
+ .bp3-callout.bp3-intent-primary .bp3-heading{
+ color:#106ba3; }
+ .bp3-dark .bp3-callout.bp3-intent-primary{
+ background-color:rgba(19, 124, 189, 0.25); }
+ .bp3-dark .bp3-callout.bp3-intent-primary[class*="bp3-icon-"]::before,
+ .bp3-dark .bp3-callout.bp3-intent-primary > .bp3-icon:first-child,
+ .bp3-dark .bp3-callout.bp3-intent-primary .bp3-heading{
+ color:#48aff0; }
+ .bp3-callout.bp3-intent-success{
+ background-color:rgba(15, 153, 96, 0.15); }
+ .bp3-callout.bp3-intent-success[class*="bp3-icon-"]::before,
+ .bp3-callout.bp3-intent-success > .bp3-icon:first-child,
+ .bp3-callout.bp3-intent-success .bp3-heading{
+ color:#0d8050; }
+ .bp3-dark .bp3-callout.bp3-intent-success{
+ background-color:rgba(15, 153, 96, 0.25); }
+ .bp3-dark .bp3-callout.bp3-intent-success[class*="bp3-icon-"]::before,
+ .bp3-dark .bp3-callout.bp3-intent-success > .bp3-icon:first-child,
+ .bp3-dark .bp3-callout.bp3-intent-success .bp3-heading{
+ color:#3dcc91; }
+ .bp3-callout.bp3-intent-warning{
+ background-color:rgba(217, 130, 43, 0.15); }
+ .bp3-callout.bp3-intent-warning[class*="bp3-icon-"]::before,
+ .bp3-callout.bp3-intent-warning > .bp3-icon:first-child,
+ .bp3-callout.bp3-intent-warning .bp3-heading{
+ color:#bf7326; }
+ .bp3-dark .bp3-callout.bp3-intent-warning{
+ background-color:rgba(217, 130, 43, 0.25); }
+ .bp3-dark .bp3-callout.bp3-intent-warning[class*="bp3-icon-"]::before,
+ .bp3-dark .bp3-callout.bp3-intent-warning > .bp3-icon:first-child,
+ .bp3-dark .bp3-callout.bp3-intent-warning .bp3-heading{
+ color:#ffb366; }
+ .bp3-callout.bp3-intent-danger{
+ background-color:rgba(219, 55, 55, 0.15); }
+ .bp3-callout.bp3-intent-danger[class*="bp3-icon-"]::before,
+ .bp3-callout.bp3-intent-danger > .bp3-icon:first-child,
+ .bp3-callout.bp3-intent-danger .bp3-heading{
+ color:#c23030; }
+ .bp3-dark .bp3-callout.bp3-intent-danger{
+ background-color:rgba(219, 55, 55, 0.25); }
+ .bp3-dark .bp3-callout.bp3-intent-danger[class*="bp3-icon-"]::before,
+ .bp3-dark .bp3-callout.bp3-intent-danger > .bp3-icon:first-child,
+ .bp3-dark .bp3-callout.bp3-intent-danger .bp3-heading{
+ color:#ff7373; }
+ .bp3-running-text .bp3-callout{
+ margin:20px 0; }
+.bp3-card{
+ border-radius:3px;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
+ background-color:#ffffff;
+ padding:20px;
+ -webkit-transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-card.bp3-dark,
+ .bp3-dark .bp3-card{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
+ background-color:#30404d; }
+
+.bp3-elevation-0{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.15), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0); }
+ .bp3-elevation-0.bp3-dark,
+ .bp3-dark .bp3-elevation-0{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), 0 0 0 rgba(16, 22, 26, 0), 0 0 0 rgba(16, 22, 26, 0); }
+
+.bp3-elevation-1{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-elevation-1.bp3-dark,
+ .bp3-dark .bp3-elevation-1{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
+
+.bp3-elevation-2{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 1px 1px rgba(16, 22, 26, 0.2), 0 2px 6px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 1px 1px rgba(16, 22, 26, 0.2), 0 2px 6px rgba(16, 22, 26, 0.2); }
+ .bp3-elevation-2.bp3-dark,
+ .bp3-dark .bp3-elevation-2{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.4), 0 2px 6px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.4), 0 2px 6px rgba(16, 22, 26, 0.4); }
+
+.bp3-elevation-3{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2); }
+ .bp3-elevation-3.bp3-dark,
+ .bp3-dark .bp3-elevation-3{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
+
+.bp3-elevation-4{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2); }
+ .bp3-elevation-4.bp3-dark,
+ .bp3-dark .bp3-elevation-4{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4); }
+
+.bp3-card.bp3-interactive:hover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ cursor:pointer; }
+ .bp3-card.bp3-interactive:hover.bp3-dark,
+ .bp3-dark .bp3-card.bp3-interactive:hover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
+
+.bp3-card.bp3-interactive:active{
+ opacity:0.9;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
+ -webkit-transition-duration:0;
+ transition-duration:0; }
+ .bp3-card.bp3-interactive:active.bp3-dark,
+ .bp3-dark .bp3-card.bp3-interactive:active{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
+
+.bp3-collapse{
+ height:0;
+ overflow-y:hidden;
+ -webkit-transition:height 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:height 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-collapse .bp3-collapse-body{
+ -webkit-transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-collapse .bp3-collapse-body[aria-hidden="true"]{
+ display:none; }
+
+.bp3-context-menu .bp3-popover-target{
+ display:block; }
+
+.bp3-context-menu-popover-target{
+ position:fixed; }
+
+.bp3-divider{
+ margin:5px;
+ border-right:1px solid rgba(16, 22, 26, 0.15);
+ border-bottom:1px solid rgba(16, 22, 26, 0.15); }
+ .bp3-dark .bp3-divider{
+ border-color:rgba(16, 22, 26, 0.4); }
+.bp3-dialog-container{
+ opacity:1;
+ -webkit-transform:scale(1);
+ transform:scale(1);
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ width:100%;
+ min-height:100%;
+ pointer-events:none;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-dialog-container.bp3-overlay-enter > .bp3-dialog, .bp3-dialog-container.bp3-overlay-appear > .bp3-dialog{
+ opacity:0;
+ -webkit-transform:scale(0.5);
+ transform:scale(0.5); }
+ .bp3-dialog-container.bp3-overlay-enter-active > .bp3-dialog, .bp3-dialog-container.bp3-overlay-appear-active > .bp3-dialog{
+ opacity:1;
+ -webkit-transform:scale(1);
+ transform:scale(1);
+ -webkit-transition-property:opacity, -webkit-transform;
+ transition-property:opacity, -webkit-transform;
+ transition-property:opacity, transform;
+ transition-property:opacity, transform, -webkit-transform;
+ -webkit-transition-duration:300ms;
+ transition-duration:300ms;
+ -webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-dialog-container.bp3-overlay-exit > .bp3-dialog{
+ opacity:1;
+ -webkit-transform:scale(1);
+ transform:scale(1); }
+ .bp3-dialog-container.bp3-overlay-exit-active > .bp3-dialog{
+ opacity:0;
+ -webkit-transform:scale(0.5);
+ transform:scale(0.5);
+ -webkit-transition-property:opacity, -webkit-transform;
+ transition-property:opacity, -webkit-transform;
+ transition-property:opacity, transform;
+ transition-property:opacity, transform, -webkit-transform;
+ -webkit-transition-duration:300ms;
+ transition-duration:300ms;
+ -webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+
+.bp3-dialog{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ margin:30px 0;
+ border-radius:6px;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
+ background:#ebf1f5;
+ width:500px;
+ padding-bottom:20px;
+ pointer-events:all;
+ -webkit-user-select:text;
+ -moz-user-select:text;
+ -ms-user-select:text;
+ user-select:text; }
+ .bp3-dialog:focus{
+ outline:0; }
+ .bp3-dialog.bp3-dark,
+ .bp3-dark .bp3-dialog{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
+ background:#293742;
+ color:#f5f8fa; }
+
+.bp3-dialog-header{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ border-radius:6px 6px 0 0;
+ -webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
+ box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
+ background:#ffffff;
+ min-height:40px;
+ padding-right:5px;
+ padding-left:20px; }
+ .bp3-dialog-header .bp3-icon-large,
+ .bp3-dialog-header .bp3-icon{
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ margin-right:10px;
+ color:#5c7080; }
+ .bp3-dialog-header .bp3-heading{
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal;
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ margin:0;
+ line-height:inherit; }
+ .bp3-dialog-header .bp3-heading:last-child{
+ margin-right:20px; }
+ .bp3-dark .bp3-dialog-header{
+ -webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.4);
+ box-shadow:0 1px 0 rgba(16, 22, 26, 0.4);
+ background:#30404d; }
+ .bp3-dark .bp3-dialog-header .bp3-icon-large,
+ .bp3-dark .bp3-dialog-header .bp3-icon{
+ color:#a7b6c2; }
+
+.bp3-dialog-body{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ margin:20px;
+ line-height:18px; }
+
+.bp3-dialog-footer{
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ margin:0 20px; }
+
+.bp3-dialog-footer-actions{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-pack:end;
+ -ms-flex-pack:end;
+ justify-content:flex-end; }
+ .bp3-dialog-footer-actions .bp3-button{
+ margin-left:10px; }
+.bp3-drawer{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ margin:0;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 4px 8px rgba(16, 22, 26, 0.2), 0 18px 46px 6px rgba(16, 22, 26, 0.2);
+ background:#ffffff;
+ padding:0; }
+ .bp3-drawer:focus{
+ outline:0; }
+ .bp3-drawer.bp3-position-top{
+ top:0;
+ right:0;
+ left:0;
+ height:50%; }
+ .bp3-drawer.bp3-position-top.bp3-overlay-enter, .bp3-drawer.bp3-position-top.bp3-overlay-appear{
+ -webkit-transform:translateY(-100%);
+ transform:translateY(-100%); }
+ .bp3-drawer.bp3-position-top.bp3-overlay-enter-active, .bp3-drawer.bp3-position-top.bp3-overlay-appear-active{
+ -webkit-transform:translateY(0);
+ transform:translateY(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-position-top.bp3-overlay-exit{
+ -webkit-transform:translateY(0);
+ transform:translateY(0); }
+ .bp3-drawer.bp3-position-top.bp3-overlay-exit-active{
+ -webkit-transform:translateY(-100%);
+ transform:translateY(-100%);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-position-bottom{
+ right:0;
+ bottom:0;
+ left:0;
+ height:50%; }
+ .bp3-drawer.bp3-position-bottom.bp3-overlay-enter, .bp3-drawer.bp3-position-bottom.bp3-overlay-appear{
+ -webkit-transform:translateY(100%);
+ transform:translateY(100%); }
+ .bp3-drawer.bp3-position-bottom.bp3-overlay-enter-active, .bp3-drawer.bp3-position-bottom.bp3-overlay-appear-active{
+ -webkit-transform:translateY(0);
+ transform:translateY(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-position-bottom.bp3-overlay-exit{
+ -webkit-transform:translateY(0);
+ transform:translateY(0); }
+ .bp3-drawer.bp3-position-bottom.bp3-overlay-exit-active{
+ -webkit-transform:translateY(100%);
+ transform:translateY(100%);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-position-left{
+ top:0;
+ bottom:0;
+ left:0;
+ width:50%; }
+ .bp3-drawer.bp3-position-left.bp3-overlay-enter, .bp3-drawer.bp3-position-left.bp3-overlay-appear{
+ -webkit-transform:translateX(-100%);
+ transform:translateX(-100%); }
+ .bp3-drawer.bp3-position-left.bp3-overlay-enter-active, .bp3-drawer.bp3-position-left.bp3-overlay-appear-active{
+ -webkit-transform:translateX(0);
+ transform:translateX(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-position-left.bp3-overlay-exit{
+ -webkit-transform:translateX(0);
+ transform:translateX(0); }
+ .bp3-drawer.bp3-position-left.bp3-overlay-exit-active{
+ -webkit-transform:translateX(-100%);
+ transform:translateX(-100%);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-position-right{
+ top:0;
+ right:0;
+ bottom:0;
+ width:50%; }
+ .bp3-drawer.bp3-position-right.bp3-overlay-enter, .bp3-drawer.bp3-position-right.bp3-overlay-appear{
+ -webkit-transform:translateX(100%);
+ transform:translateX(100%); }
+ .bp3-drawer.bp3-position-right.bp3-overlay-enter-active, .bp3-drawer.bp3-position-right.bp3-overlay-appear-active{
+ -webkit-transform:translateX(0);
+ transform:translateX(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-position-right.bp3-overlay-exit{
+ -webkit-transform:translateX(0);
+ transform:translateX(0); }
+ .bp3-drawer.bp3-position-right.bp3-overlay-exit-active{
+ -webkit-transform:translateX(100%);
+ transform:translateX(100%);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right):not(.bp3-vertical){
+ top:0;
+ right:0;
+ bottom:0;
+ width:50%; }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right):not(.bp3-vertical).bp3-overlay-enter, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right):not(.bp3-vertical).bp3-overlay-appear{
+ -webkit-transform:translateX(100%);
+ transform:translateX(100%); }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right):not(.bp3-vertical).bp3-overlay-enter-active, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right):not(.bp3-vertical).bp3-overlay-appear-active{
+ -webkit-transform:translateX(0);
+ transform:translateX(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right):not(.bp3-vertical).bp3-overlay-exit{
+ -webkit-transform:translateX(0);
+ transform:translateX(0); }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right):not(.bp3-vertical).bp3-overlay-exit-active{
+ -webkit-transform:translateX(100%);
+ transform:translateX(100%);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right).bp3-vertical{
+ right:0;
+ bottom:0;
+ left:0;
+ height:50%; }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right).bp3-vertical.bp3-overlay-enter, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right).bp3-vertical.bp3-overlay-appear{
+ -webkit-transform:translateY(100%);
+ transform:translateY(100%); }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right).bp3-vertical.bp3-overlay-enter-active, .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right).bp3-vertical.bp3-overlay-appear-active{
+ -webkit-transform:translateY(0);
+ transform:translateY(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right).bp3-vertical.bp3-overlay-exit{
+ -webkit-transform:translateY(0);
+ transform:translateY(0); }
+ .bp3-drawer:not(.bp3-position-top):not(.bp3-position-bottom):not(.bp3-position-left):not(
+ .bp3-position-right).bp3-vertical.bp3-overlay-exit-active{
+ -webkit-transform:translateY(100%);
+ transform:translateY(100%);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-drawer.bp3-dark,
+ .bp3-dark .bp3-drawer{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 4px 8px rgba(16, 22, 26, 0.4), 0 18px 46px 6px rgba(16, 22, 26, 0.4);
+ background:#30404d;
+ color:#f5f8fa; }
+
+.bp3-drawer-header{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ position:relative;
+ border-radius:0;
+ -webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
+ box-shadow:0 1px 0 rgba(16, 22, 26, 0.15);
+ min-height:40px;
+ padding:5px;
+ padding-left:20px; }
+ .bp3-drawer-header .bp3-icon-large,
+ .bp3-drawer-header .bp3-icon{
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ margin-right:10px;
+ color:#5c7080; }
+ .bp3-drawer-header .bp3-heading{
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal;
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ margin:0;
+ line-height:inherit; }
+ .bp3-drawer-header .bp3-heading:last-child{
+ margin-right:20px; }
+ .bp3-dark .bp3-drawer-header{
+ -webkit-box-shadow:0 1px 0 rgba(16, 22, 26, 0.4);
+ box-shadow:0 1px 0 rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-drawer-header .bp3-icon-large,
+ .bp3-dark .bp3-drawer-header .bp3-icon{
+ color:#a7b6c2; }
+
+.bp3-drawer-body{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ overflow:auto;
+ line-height:18px; }
+
+.bp3-drawer-footer{
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ position:relative;
+ -webkit-box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.15);
+ box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.15);
+ padding:10px 20px; }
+ .bp3-dark .bp3-drawer-footer{
+ -webkit-box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 1px 0 rgba(16, 22, 26, 0.4); }
+.bp3-editable-text{
+ display:inline-block;
+ position:relative;
+ cursor:text;
+ max-width:100%;
+ vertical-align:top;
+ white-space:nowrap; }
+ .bp3-editable-text::before{
+ position:absolute;
+ top:-3px;
+ right:-3px;
+ bottom:-3px;
+ left:-3px;
+ border-radius:3px;
+ content:"";
+ -webkit-transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9), box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-editable-text:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15); }
+ .bp3-editable-text.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ background-color:#ffffff; }
+ .bp3-editable-text.bp3-disabled::before{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-editable-text.bp3-intent-primary .bp3-editable-text-input,
+ .bp3-editable-text.bp3-intent-primary .bp3-editable-text-content{
+ color:#137cbd; }
+ .bp3-editable-text.bp3-intent-primary:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(19, 124, 189, 0.4);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(19, 124, 189, 0.4); }
+ .bp3-editable-text.bp3-intent-primary.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-editable-text.bp3-intent-success .bp3-editable-text-input,
+ .bp3-editable-text.bp3-intent-success .bp3-editable-text-content{
+ color:#0f9960; }
+ .bp3-editable-text.bp3-intent-success:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px rgba(15, 153, 96, 0.4);
+ box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px rgba(15, 153, 96, 0.4); }
+ .bp3-editable-text.bp3-intent-success.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-editable-text.bp3-intent-warning .bp3-editable-text-input,
+ .bp3-editable-text.bp3-intent-warning .bp3-editable-text-content{
+ color:#d9822b; }
+ .bp3-editable-text.bp3-intent-warning:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px rgba(217, 130, 43, 0.4);
+ box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px rgba(217, 130, 43, 0.4); }
+ .bp3-editable-text.bp3-intent-warning.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-editable-text.bp3-intent-danger .bp3-editable-text-input,
+ .bp3-editable-text.bp3-intent-danger .bp3-editable-text-content{
+ color:#db3737; }
+ .bp3-editable-text.bp3-intent-danger:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px rgba(219, 55, 55, 0.4);
+ box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px rgba(219, 55, 55, 0.4); }
+ .bp3-editable-text.bp3-intent-danger.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-dark .bp3-editable-text:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(255, 255, 255, 0.15);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(255, 255, 255, 0.15); }
+ .bp3-dark .bp3-editable-text.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ background-color:rgba(16, 22, 26, 0.3); }
+ .bp3-dark .bp3-editable-text.bp3-disabled::before{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-dark .bp3-editable-text.bp3-intent-primary .bp3-editable-text-content{
+ color:#48aff0; }
+ .bp3-dark .bp3-editable-text.bp3-intent-primary:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(72, 175, 240, 0), 0 0 0 0 rgba(72, 175, 240, 0), inset 0 0 0 1px rgba(72, 175, 240, 0.4);
+ box-shadow:0 0 0 0 rgba(72, 175, 240, 0), 0 0 0 0 rgba(72, 175, 240, 0), inset 0 0 0 1px rgba(72, 175, 240, 0.4); }
+ .bp3-dark .bp3-editable-text.bp3-intent-primary.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #48aff0, 0 0 0 3px rgba(72, 175, 240, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #48aff0, 0 0 0 3px rgba(72, 175, 240, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-editable-text.bp3-intent-success .bp3-editable-text-content{
+ color:#3dcc91; }
+ .bp3-dark .bp3-editable-text.bp3-intent-success:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(61, 204, 145, 0), 0 0 0 0 rgba(61, 204, 145, 0), inset 0 0 0 1px rgba(61, 204, 145, 0.4);
+ box-shadow:0 0 0 0 rgba(61, 204, 145, 0), 0 0 0 0 rgba(61, 204, 145, 0), inset 0 0 0 1px rgba(61, 204, 145, 0.4); }
+ .bp3-dark .bp3-editable-text.bp3-intent-success.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #3dcc91, 0 0 0 3px rgba(61, 204, 145, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #3dcc91, 0 0 0 3px rgba(61, 204, 145, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-editable-text.bp3-intent-warning .bp3-editable-text-content{
+ color:#ffb366; }
+ .bp3-dark .bp3-editable-text.bp3-intent-warning:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(255, 179, 102, 0), 0 0 0 0 rgba(255, 179, 102, 0), inset 0 0 0 1px rgba(255, 179, 102, 0.4);
+ box-shadow:0 0 0 0 rgba(255, 179, 102, 0), 0 0 0 0 rgba(255, 179, 102, 0), inset 0 0 0 1px rgba(255, 179, 102, 0.4); }
+ .bp3-dark .bp3-editable-text.bp3-intent-warning.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #ffb366, 0 0 0 3px rgba(255, 179, 102, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #ffb366, 0 0 0 3px rgba(255, 179, 102, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-editable-text.bp3-intent-danger .bp3-editable-text-content{
+ color:#ff7373; }
+ .bp3-dark .bp3-editable-text.bp3-intent-danger:hover::before{
+ -webkit-box-shadow:0 0 0 0 rgba(255, 115, 115, 0), 0 0 0 0 rgba(255, 115, 115, 0), inset 0 0 0 1px rgba(255, 115, 115, 0.4);
+ box-shadow:0 0 0 0 rgba(255, 115, 115, 0), 0 0 0 0 rgba(255, 115, 115, 0), inset 0 0 0 1px rgba(255, 115, 115, 0.4); }
+ .bp3-dark .bp3-editable-text.bp3-intent-danger.bp3-editable-text-editing::before{
+ -webkit-box-shadow:0 0 0 1px #ff7373, 0 0 0 3px rgba(255, 115, 115, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #ff7373, 0 0 0 3px rgba(255, 115, 115, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+
+.bp3-editable-text-input,
+.bp3-editable-text-content{
+ display:inherit;
+ position:relative;
+ min-width:inherit;
+ max-width:inherit;
+ vertical-align:top;
+ text-transform:inherit;
+ letter-spacing:inherit;
+ color:inherit;
+ font:inherit;
+ resize:none; }
+
+.bp3-editable-text-input{
+ border:none;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ width:100%;
+ padding:0;
+ white-space:pre-wrap; }
+ .bp3-editable-text-input::-webkit-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-editable-text-input::-moz-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-editable-text-input:-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-editable-text-input::-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-editable-text-input::placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-editable-text-input:focus{
+ outline:none; }
+ .bp3-editable-text-input::-ms-clear{
+ display:none; }
+
+.bp3-editable-text-content{
+ overflow:hidden;
+ padding-right:2px;
+ text-overflow:ellipsis;
+ white-space:pre; }
+ .bp3-editable-text-editing > .bp3-editable-text-content{
+ position:absolute;
+ left:0;
+ visibility:hidden; }
+ .bp3-editable-text-placeholder > .bp3-editable-text-content{
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-dark .bp3-editable-text-placeholder > .bp3-editable-text-content{
+ color:rgba(167, 182, 194, 0.6); }
+
+.bp3-editable-text.bp3-multiline{
+ display:block; }
+ .bp3-editable-text.bp3-multiline .bp3-editable-text-content{
+ overflow:auto;
+ white-space:pre-wrap;
+ word-wrap:break-word; }
+.bp3-control-group{
+ -webkit-transform:translateZ(0);
+ transform:translateZ(0);
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:stretch;
+ -ms-flex-align:stretch;
+ align-items:stretch; }
+ .bp3-control-group > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-control-group > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-control-group .bp3-button,
+ .bp3-control-group .bp3-html-select,
+ .bp3-control-group .bp3-input,
+ .bp3-control-group .bp3-select{
+ position:relative; }
+ .bp3-control-group .bp3-input{
+ z-index:2;
+ border-radius:inherit; }
+ .bp3-control-group .bp3-input:focus{
+ z-index:14;
+ border-radius:3px; }
+ .bp3-control-group .bp3-input[class*="bp3-intent"]{
+ z-index:13; }
+ .bp3-control-group .bp3-input[class*="bp3-intent"]:focus{
+ z-index:15; }
+ .bp3-control-group .bp3-input[readonly], .bp3-control-group .bp3-input:disabled, .bp3-control-group .bp3-input.bp3-disabled{
+ z-index:1; }
+ .bp3-control-group .bp3-input-group[class*="bp3-intent"] .bp3-input{
+ z-index:13; }
+ .bp3-control-group .bp3-input-group[class*="bp3-intent"] .bp3-input:focus{
+ z-index:15; }
+ .bp3-control-group .bp3-button,
+ .bp3-control-group .bp3-html-select select,
+ .bp3-control-group .bp3-select select{
+ -webkit-transform:translateZ(0);
+ transform:translateZ(0);
+ z-index:4;
+ border-radius:inherit; }
+ .bp3-control-group .bp3-button:focus,
+ .bp3-control-group .bp3-html-select select:focus,
+ .bp3-control-group .bp3-select select:focus{
+ z-index:5; }
+ .bp3-control-group .bp3-button:hover,
+ .bp3-control-group .bp3-html-select select:hover,
+ .bp3-control-group .bp3-select select:hover{
+ z-index:6; }
+ .bp3-control-group .bp3-button:active,
+ .bp3-control-group .bp3-html-select select:active,
+ .bp3-control-group .bp3-select select:active{
+ z-index:7; }
+ .bp3-control-group .bp3-button[readonly], .bp3-control-group .bp3-button:disabled, .bp3-control-group .bp3-button.bp3-disabled,
+ .bp3-control-group .bp3-html-select select[readonly],
+ .bp3-control-group .bp3-html-select select:disabled,
+ .bp3-control-group .bp3-html-select select.bp3-disabled,
+ .bp3-control-group .bp3-select select[readonly],
+ .bp3-control-group .bp3-select select:disabled,
+ .bp3-control-group .bp3-select select.bp3-disabled{
+ z-index:3; }
+ .bp3-control-group .bp3-button[class*="bp3-intent"],
+ .bp3-control-group .bp3-html-select select[class*="bp3-intent"],
+ .bp3-control-group .bp3-select select[class*="bp3-intent"]{
+ z-index:9; }
+ .bp3-control-group .bp3-button[class*="bp3-intent"]:focus,
+ .bp3-control-group .bp3-html-select select[class*="bp3-intent"]:focus,
+ .bp3-control-group .bp3-select select[class*="bp3-intent"]:focus{
+ z-index:10; }
+ .bp3-control-group .bp3-button[class*="bp3-intent"]:hover,
+ .bp3-control-group .bp3-html-select select[class*="bp3-intent"]:hover,
+ .bp3-control-group .bp3-select select[class*="bp3-intent"]:hover{
+ z-index:11; }
+ .bp3-control-group .bp3-button[class*="bp3-intent"]:active,
+ .bp3-control-group .bp3-html-select select[class*="bp3-intent"]:active,
+ .bp3-control-group .bp3-select select[class*="bp3-intent"]:active{
+ z-index:12; }
+ .bp3-control-group .bp3-button[class*="bp3-intent"][readonly], .bp3-control-group .bp3-button[class*="bp3-intent"]:disabled, .bp3-control-group .bp3-button[class*="bp3-intent"].bp3-disabled,
+ .bp3-control-group .bp3-html-select select[class*="bp3-intent"][readonly],
+ .bp3-control-group .bp3-html-select select[class*="bp3-intent"]:disabled,
+ .bp3-control-group .bp3-html-select select[class*="bp3-intent"].bp3-disabled,
+ .bp3-control-group .bp3-select select[class*="bp3-intent"][readonly],
+ .bp3-control-group .bp3-select select[class*="bp3-intent"]:disabled,
+ .bp3-control-group .bp3-select select[class*="bp3-intent"].bp3-disabled{
+ z-index:8; }
+ .bp3-control-group .bp3-input-group > .bp3-icon,
+ .bp3-control-group .bp3-input-group > .bp3-button,
+ .bp3-control-group .bp3-input-group > .bp3-input-action{
+ z-index:16; }
+ .bp3-control-group .bp3-select::after,
+ .bp3-control-group .bp3-html-select::after,
+ .bp3-control-group .bp3-select > .bp3-icon,
+ .bp3-control-group .bp3-html-select > .bp3-icon{
+ z-index:17; }
+ .bp3-control-group:not(.bp3-vertical) > *{
+ margin-right:-1px; }
+ .bp3-dark .bp3-control-group:not(.bp3-vertical) > *{
+ margin-right:0; }
+ .bp3-dark .bp3-control-group:not(.bp3-vertical) > .bp3-button + .bp3-button{
+ margin-left:1px; }
+ .bp3-control-group .bp3-popover-wrapper,
+ .bp3-control-group .bp3-popover-target{
+ border-radius:inherit; }
+ .bp3-control-group > :first-child{
+ border-radius:3px 0 0 3px; }
+ .bp3-control-group > :last-child{
+ margin-right:0;
+ border-radius:0 3px 3px 0; }
+ .bp3-control-group > :only-child{
+ margin-right:0;
+ border-radius:3px; }
+ .bp3-control-group .bp3-input-group .bp3-button{
+ border-radius:3px; }
+ .bp3-control-group > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto; }
+ .bp3-control-group.bp3-fill > *:not(.bp3-fixed){
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto; }
+ .bp3-control-group.bp3-vertical{
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column; }
+ .bp3-control-group.bp3-vertical > *{
+ margin-top:-1px; }
+ .bp3-control-group.bp3-vertical > :first-child{
+ margin-top:0;
+ border-radius:3px 3px 0 0; }
+ .bp3-control-group.bp3-vertical > :last-child{
+ border-radius:0 0 3px 3px; }
+.bp3-control{
+ display:block;
+ position:relative;
+ margin-bottom:10px;
+ cursor:pointer;
+ text-transform:none; }
+ .bp3-control input:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#137cbd;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
+ color:#ffffff; }
+ .bp3-control:hover input:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#106ba3; }
+ .bp3-control input:not(:disabled):active:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background:#0e5a8a; }
+ .bp3-control input:disabled:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(19, 124, 189, 0.5); }
+ .bp3-dark .bp3-control input:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-control:hover input:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#106ba3; }
+ .bp3-dark .bp3-control input:not(:disabled):active:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#0e5a8a; }
+ .bp3-dark .bp3-control input:disabled:checked ~ .bp3-control-indicator{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(14, 90, 138, 0.5); }
+ .bp3-control:not(.bp3-align-right){
+ padding-left:26px; }
+ .bp3-control:not(.bp3-align-right) .bp3-control-indicator{
+ margin-left:-26px; }
+ .bp3-control.bp3-align-right{
+ padding-right:26px; }
+ .bp3-control.bp3-align-right .bp3-control-indicator{
+ margin-right:-26px; }
+ .bp3-control.bp3-disabled{
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-control.bp3-inline{
+ display:inline-block;
+ margin-right:20px; }
+ .bp3-control input{
+ position:absolute;
+ top:0;
+ left:0;
+ opacity:0;
+ z-index:-1; }
+ .bp3-control .bp3-control-indicator{
+ display:inline-block;
+ position:relative;
+ margin-top:-3px;
+ margin-right:10px;
+ border:none;
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-clip:padding-box;
+ background-color:#f5f8fa;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
+ cursor:pointer;
+ width:1em;
+ height:1em;
+ vertical-align:middle;
+ font-size:16px;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-control .bp3-control-indicator::before{
+ display:block;
+ width:1em;
+ height:1em;
+ content:""; }
+ .bp3-control:hover .bp3-control-indicator{
+ background-color:#ebf1f5; }
+ .bp3-control input:not(:disabled):active ~ .bp3-control-indicator{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background:#d8e1e8; }
+ .bp3-control input:disabled ~ .bp3-control-indicator{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(206, 217, 224, 0.5);
+ cursor:not-allowed; }
+ .bp3-control input:focus ~ .bp3-control-indicator{
+ outline:rgba(19, 124, 189, 0.6) auto 2px;
+ outline-offset:2px;
+ -moz-outline-radius:6px; }
+ .bp3-control.bp3-align-right .bp3-control-indicator{
+ float:right;
+ margin-top:1px;
+ margin-left:10px; }
+ .bp3-control.bp3-large{
+ font-size:16px; }
+ .bp3-control.bp3-large:not(.bp3-align-right){
+ padding-left:30px; }
+ .bp3-control.bp3-large:not(.bp3-align-right) .bp3-control-indicator{
+ margin-left:-30px; }
+ .bp3-control.bp3-large.bp3-align-right{
+ padding-right:30px; }
+ .bp3-control.bp3-large.bp3-align-right .bp3-control-indicator{
+ margin-right:-30px; }
+ .bp3-control.bp3-large .bp3-control-indicator{
+ font-size:20px; }
+ .bp3-control.bp3-large.bp3-align-right .bp3-control-indicator{
+ margin-top:0; }
+ .bp3-control.bp3-checkbox input:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#137cbd;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.1)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.1), rgba(255, 255, 255, 0));
+ color:#ffffff; }
+ .bp3-control.bp3-checkbox:hover input:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 -1px 0 rgba(16, 22, 26, 0.2);
+ background-color:#106ba3; }
+ .bp3-control.bp3-checkbox input:not(:disabled):active:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background:#0e5a8a; }
+ .bp3-control.bp3-checkbox input:disabled:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(19, 124, 189, 0.5); }
+ .bp3-dark .bp3-control.bp3-checkbox input:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-control.bp3-checkbox:hover input:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#106ba3; }
+ .bp3-dark .bp3-control.bp3-checkbox input:not(:disabled):active:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#0e5a8a; }
+ .bp3-dark .bp3-control.bp3-checkbox input:disabled:indeterminate ~ .bp3-control-indicator{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(14, 90, 138, 0.5); }
+ .bp3-control.bp3-checkbox .bp3-control-indicator{
+ border-radius:3px; }
+ .bp3-control.bp3-checkbox input:checked ~ .bp3-control-indicator::before{
+ background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M12 5c-.28 0-.53.11-.71.29L7 9.59l-2.29-2.3a1.003 1.003 0 00-1.42 1.42l3 3c.18.18.43.29.71.29s.53-.11.71-.29l5-5A1.003 1.003 0 0012 5z' fill='white'/%3e%3c/svg%3e"); }
+ .bp3-control.bp3-checkbox input:indeterminate ~ .bp3-control-indicator::before{
+ background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill-rule='evenodd' clip-rule='evenodd' d='M11 7H5c-.55 0-1 .45-1 1s.45 1 1 1h6c.55 0 1-.45 1-1s-.45-1-1-1z' fill='white'/%3e%3c/svg%3e"); }
+ .bp3-control.bp3-radio .bp3-control-indicator{
+ border-radius:50%; }
+ .bp3-control.bp3-radio input:checked ~ .bp3-control-indicator::before{
+ background-image:radial-gradient(#ffffff, #ffffff 28%, transparent 32%); }
+ .bp3-control.bp3-radio input:checked:disabled ~ .bp3-control-indicator::before{
+ opacity:0.5; }
+ .bp3-control.bp3-radio input:focus ~ .bp3-control-indicator{
+ -moz-outline-radius:16px; }
+ .bp3-control.bp3-switch input ~ .bp3-control-indicator{
+ background:rgba(167, 182, 194, 0.5); }
+ .bp3-control.bp3-switch:hover input ~ .bp3-control-indicator{
+ background:rgba(115, 134, 148, 0.5); }
+ .bp3-control.bp3-switch input:not(:disabled):active ~ .bp3-control-indicator{
+ background:rgba(92, 112, 128, 0.5); }
+ .bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator{
+ background:rgba(206, 217, 224, 0.5); }
+ .bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator::before{
+ background:rgba(255, 255, 255, 0.8); }
+ .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator{
+ background:#137cbd; }
+ .bp3-control.bp3-switch:hover input:checked ~ .bp3-control-indicator{
+ background:#106ba3; }
+ .bp3-control.bp3-switch input:checked:not(:disabled):active ~ .bp3-control-indicator{
+ background:#0e5a8a; }
+ .bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator{
+ background:rgba(19, 124, 189, 0.5); }
+ .bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator::before{
+ background:rgba(255, 255, 255, 0.8); }
+ .bp3-control.bp3-switch:not(.bp3-align-right){
+ padding-left:38px; }
+ .bp3-control.bp3-switch:not(.bp3-align-right) .bp3-control-indicator{
+ margin-left:-38px; }
+ .bp3-control.bp3-switch.bp3-align-right{
+ padding-right:38px; }
+ .bp3-control.bp3-switch.bp3-align-right .bp3-control-indicator{
+ margin-right:-38px; }
+ .bp3-control.bp3-switch .bp3-control-indicator{
+ border:none;
+ border-radius:1.75em;
+ -webkit-box-shadow:none !important;
+ box-shadow:none !important;
+ width:auto;
+ min-width:1.75em;
+ -webkit-transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:background-color 100ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-control.bp3-switch .bp3-control-indicator::before{
+ position:absolute;
+ left:0;
+ margin:2px;
+ border-radius:50%;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
+ background:#ffffff;
+ width:calc(1em - 4px);
+ height:calc(1em - 4px);
+ -webkit-transition:left 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:left 100ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator::before{
+ left:calc(100% - 1em); }
+ .bp3-control.bp3-switch.bp3-large:not(.bp3-align-right){
+ padding-left:45px; }
+ .bp3-control.bp3-switch.bp3-large:not(.bp3-align-right) .bp3-control-indicator{
+ margin-left:-45px; }
+ .bp3-control.bp3-switch.bp3-large.bp3-align-right{
+ padding-right:45px; }
+ .bp3-control.bp3-switch.bp3-large.bp3-align-right .bp3-control-indicator{
+ margin-right:-45px; }
+ .bp3-dark .bp3-control.bp3-switch input ~ .bp3-control-indicator{
+ background:rgba(16, 22, 26, 0.5); }
+ .bp3-dark .bp3-control.bp3-switch:hover input ~ .bp3-control-indicator{
+ background:rgba(16, 22, 26, 0.7); }
+ .bp3-dark .bp3-control.bp3-switch input:not(:disabled):active ~ .bp3-control-indicator{
+ background:rgba(16, 22, 26, 0.9); }
+ .bp3-dark .bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator{
+ background:rgba(57, 75, 89, 0.5); }
+ .bp3-dark .bp3-control.bp3-switch input:disabled ~ .bp3-control-indicator::before{
+ background:rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator{
+ background:#137cbd; }
+ .bp3-dark .bp3-control.bp3-switch:hover input:checked ~ .bp3-control-indicator{
+ background:#106ba3; }
+ .bp3-dark .bp3-control.bp3-switch input:checked:not(:disabled):active ~ .bp3-control-indicator{
+ background:#0e5a8a; }
+ .bp3-dark .bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator{
+ background:rgba(14, 90, 138, 0.5); }
+ .bp3-dark .bp3-control.bp3-switch input:checked:disabled ~ .bp3-control-indicator::before{
+ background:rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-control.bp3-switch .bp3-control-indicator::before{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background:#394b59; }
+ .bp3-dark .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator::before{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-control.bp3-switch .bp3-switch-inner-text{
+ text-align:center;
+ font-size:0.7em; }
+ .bp3-control.bp3-switch .bp3-control-indicator-child:first-child{
+ visibility:hidden;
+ margin-right:1.2em;
+ margin-left:0.5em;
+ line-height:0; }
+ .bp3-control.bp3-switch .bp3-control-indicator-child:last-child{
+ visibility:visible;
+ margin-right:0.5em;
+ margin-left:1.2em;
+ line-height:1em; }
+ .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator .bp3-control-indicator-child:first-child{
+ visibility:visible;
+ line-height:1em; }
+ .bp3-control.bp3-switch input:checked ~ .bp3-control-indicator .bp3-control-indicator-child:last-child{
+ visibility:hidden;
+ line-height:0; }
+ .bp3-dark .bp3-control{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-control.bp3-disabled{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-control .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#394b59;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0)); }
+ .bp3-dark .bp3-control:hover .bp3-control-indicator{
+ background-color:#30404d; }
+ .bp3-dark .bp3-control input:not(:disabled):active ~ .bp3-control-indicator{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background:#202b33; }
+ .bp3-dark .bp3-control input:disabled ~ .bp3-control-indicator{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(57, 75, 89, 0.5);
+ cursor:not-allowed; }
+ .bp3-dark .bp3-control.bp3-checkbox input:disabled:checked ~ .bp3-control-indicator, .bp3-dark .bp3-control.bp3-checkbox input:disabled:indeterminate ~ .bp3-control-indicator{
+ color:rgba(167, 182, 194, 0.6); }
+.bp3-file-input{
+ display:inline-block;
+ position:relative;
+ cursor:pointer;
+ height:30px; }
+ .bp3-file-input input{
+ opacity:0;
+ margin:0;
+ min-width:200px; }
+ .bp3-file-input input:disabled + .bp3-file-upload-input,
+ .bp3-file-input input.bp3-disabled + .bp3-file-upload-input{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(206, 217, 224, 0.5);
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6);
+ resize:none; }
+ .bp3-file-input input:disabled + .bp3-file-upload-input::after,
+ .bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after{
+ outline:none;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(206, 217, 224, 0.5);
+ background-image:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-file-input input:disabled + .bp3-file-upload-input::after.bp3-active, .bp3-file-input input:disabled + .bp3-file-upload-input::after.bp3-active:hover,
+ .bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after.bp3-active,
+ .bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after.bp3-active:hover{
+ background:rgba(206, 217, 224, 0.7); }
+ .bp3-dark .bp3-file-input input:disabled + .bp3-file-upload-input, .bp3-dark
+ .bp3-file-input input.bp3-disabled + .bp3-file-upload-input{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(57, 75, 89, 0.5);
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-input input:disabled + .bp3-file-upload-input::after, .bp3-dark
+ .bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(57, 75, 89, 0.5);
+ background-image:none;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-input input:disabled + .bp3-file-upload-input::after.bp3-active, .bp3-dark
+ .bp3-file-input input.bp3-disabled + .bp3-file-upload-input::after.bp3-active{
+ background:rgba(57, 75, 89, 0.7); }
+ .bp3-file-input.bp3-file-input-has-selection .bp3-file-upload-input{
+ color:#182026; }
+ .bp3-dark .bp3-file-input.bp3-file-input-has-selection .bp3-file-upload-input{
+ color:#f5f8fa; }
+ .bp3-file-input.bp3-fill{
+ width:100%; }
+ .bp3-file-input.bp3-large,
+ .bp3-large .bp3-file-input{
+ height:40px; }
+ .bp3-file-input .bp3-file-upload-input-custom-text::after{
+ content:attr(bp3-button-text); }
+
+.bp3-file-upload-input{
+ outline:none;
+ border:none;
+ border-radius:3px;
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ background:#ffffff;
+ height:30px;
+ padding:0 10px;
+ vertical-align:middle;
+ line-height:30px;
+ color:#182026;
+ font-size:14px;
+ font-weight:400;
+ -webkit-transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-appearance:none;
+ -moz-appearance:none;
+ appearance:none;
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal;
+ position:absolute;
+ top:0;
+ right:0;
+ left:0;
+ padding-right:80px;
+ color:rgba(92, 112, 128, 0.6);
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-file-upload-input::-webkit-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-file-upload-input::-moz-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-file-upload-input:-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-file-upload-input::-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-file-upload-input::placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-file-upload-input:focus, .bp3-file-upload-input.bp3-active{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-file-upload-input[type="search"], .bp3-file-upload-input.bp3-round{
+ border-radius:30px;
+ -webkit-box-sizing:border-box;
+ box-sizing:border-box;
+ padding-left:10px; }
+ .bp3-file-upload-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15); }
+ .bp3-file-upload-input:disabled, .bp3-file-upload-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(206, 217, 224, 0.5);
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6);
+ resize:none; }
+ .bp3-file-upload-input::after{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-color:#f5f8fa;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
+ color:#182026;
+ min-width:24px;
+ min-height:24px;
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal;
+ position:absolute;
+ top:0;
+ right:0;
+ margin:3px;
+ border-radius:3px;
+ width:70px;
+ text-align:center;
+ line-height:24px;
+ content:"Browse"; }
+ .bp3-file-upload-input::after:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-clip:padding-box;
+ background-color:#ebf1f5; }
+ .bp3-file-upload-input::after:active, .bp3-file-upload-input::after.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#d8e1e8;
+ background-image:none; }
+ .bp3-file-upload-input::after:disabled, .bp3-file-upload-input::after.bp3-disabled{
+ outline:none;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(206, 217, 224, 0.5);
+ background-image:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-file-upload-input::after:disabled.bp3-active, .bp3-file-upload-input::after:disabled.bp3-active:hover, .bp3-file-upload-input::after.bp3-disabled.bp3-active, .bp3-file-upload-input::after.bp3-disabled.bp3-active:hover{
+ background:rgba(206, 217, 224, 0.7); }
+ .bp3-file-upload-input:hover::after{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-clip:padding-box;
+ background-color:#ebf1f5; }
+ .bp3-file-upload-input:active::after{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#d8e1e8;
+ background-image:none; }
+ .bp3-large .bp3-file-upload-input{
+ height:40px;
+ line-height:40px;
+ font-size:16px;
+ padding-right:95px; }
+ .bp3-large .bp3-file-upload-input[type="search"], .bp3-large .bp3-file-upload-input.bp3-round{
+ padding:0 15px; }
+ .bp3-large .bp3-file-upload-input::after{
+ min-width:30px;
+ min-height:30px;
+ margin:5px;
+ width:85px;
+ line-height:30px; }
+ .bp3-dark .bp3-file-upload-input{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ background:rgba(16, 22, 26, 0.3);
+ color:#f5f8fa;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input::-webkit-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input::-moz-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input:-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input::-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input::placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input:focus{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-file-upload-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-file-upload-input:disabled, .bp3-dark .bp3-file-upload-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(57, 75, 89, 0.5);
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input::after{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#394b59;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+ color:#f5f8fa; }
+ .bp3-dark .bp3-file-upload-input::after:hover, .bp3-dark .bp3-file-upload-input::after:active, .bp3-dark .bp3-file-upload-input::after.bp3-active{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-file-upload-input::after:hover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#30404d; }
+ .bp3-dark .bp3-file-upload-input::after:active, .bp3-dark .bp3-file-upload-input::after.bp3-active{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#202b33;
+ background-image:none; }
+ .bp3-dark .bp3-file-upload-input::after:disabled, .bp3-dark .bp3-file-upload-input::after.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(57, 75, 89, 0.5);
+ background-image:none;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-file-upload-input::after:disabled.bp3-active, .bp3-dark .bp3-file-upload-input::after.bp3-disabled.bp3-active{
+ background:rgba(57, 75, 89, 0.7); }
+ .bp3-dark .bp3-file-upload-input::after .bp3-button-spinner .bp3-spinner-head{
+ background:rgba(16, 22, 26, 0.5);
+ stroke:#8a9ba8; }
+ .bp3-dark .bp3-file-upload-input:hover::after{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#30404d; }
+ .bp3-dark .bp3-file-upload-input:active::after{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#202b33;
+ background-image:none; }
+
+.bp3-file-upload-input::after{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1); }
+.bp3-form-group{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ margin:0 0 15px; }
+ .bp3-form-group label.bp3-label{
+ margin-bottom:5px; }
+ .bp3-form-group .bp3-control{
+ margin-top:7px; }
+ .bp3-form-group .bp3-form-helper-text{
+ margin-top:5px;
+ color:#5c7080;
+ font-size:12px; }
+ .bp3-form-group.bp3-intent-primary .bp3-form-helper-text{
+ color:#106ba3; }
+ .bp3-form-group.bp3-intent-success .bp3-form-helper-text{
+ color:#0d8050; }
+ .bp3-form-group.bp3-intent-warning .bp3-form-helper-text{
+ color:#bf7326; }
+ .bp3-form-group.bp3-intent-danger .bp3-form-helper-text{
+ color:#c23030; }
+ .bp3-form-group.bp3-inline{
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:start;
+ -ms-flex-align:start;
+ align-items:flex-start; }
+ .bp3-form-group.bp3-inline.bp3-large label.bp3-label{
+ margin:0 10px 0 0;
+ line-height:40px; }
+ .bp3-form-group.bp3-inline label.bp3-label{
+ margin:0 10px 0 0;
+ line-height:30px; }
+ .bp3-form-group.bp3-disabled .bp3-label,
+ .bp3-form-group.bp3-disabled .bp3-text-muted,
+ .bp3-form-group.bp3-disabled .bp3-form-helper-text{
+ color:rgba(92, 112, 128, 0.6) !important; }
+ .bp3-dark .bp3-form-group.bp3-intent-primary .bp3-form-helper-text{
+ color:#48aff0; }
+ .bp3-dark .bp3-form-group.bp3-intent-success .bp3-form-helper-text{
+ color:#3dcc91; }
+ .bp3-dark .bp3-form-group.bp3-intent-warning .bp3-form-helper-text{
+ color:#ffb366; }
+ .bp3-dark .bp3-form-group.bp3-intent-danger .bp3-form-helper-text{
+ color:#ff7373; }
+ .bp3-dark .bp3-form-group .bp3-form-helper-text{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-form-group.bp3-disabled .bp3-label,
+ .bp3-dark .bp3-form-group.bp3-disabled .bp3-text-muted,
+ .bp3-dark .bp3-form-group.bp3-disabled .bp3-form-helper-text{
+ color:rgba(167, 182, 194, 0.6) !important; }
+.bp3-input-group{
+ display:block;
+ position:relative; }
+ .bp3-input-group .bp3-input{
+ position:relative;
+ width:100%; }
+ .bp3-input-group .bp3-input:not(:first-child){
+ padding-left:30px; }
+ .bp3-input-group .bp3-input:not(:last-child){
+ padding-right:30px; }
+ .bp3-input-group .bp3-input-action,
+ .bp3-input-group > .bp3-button,
+ .bp3-input-group > .bp3-icon{
+ position:absolute;
+ top:0; }
+ .bp3-input-group .bp3-input-action:first-child,
+ .bp3-input-group > .bp3-button:first-child,
+ .bp3-input-group > .bp3-icon:first-child{
+ left:0; }
+ .bp3-input-group .bp3-input-action:last-child,
+ .bp3-input-group > .bp3-button:last-child,
+ .bp3-input-group > .bp3-icon:last-child{
+ right:0; }
+ .bp3-input-group .bp3-button{
+ min-width:24px;
+ min-height:24px;
+ margin:3px;
+ padding:0 7px; }
+ .bp3-input-group .bp3-button:empty{
+ padding:0; }
+ .bp3-input-group > .bp3-icon{
+ z-index:1;
+ color:#5c7080; }
+ .bp3-input-group > .bp3-icon:empty{
+ line-height:1;
+ font-family:"Icons16", sans-serif;
+ font-size:16px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased; }
+ .bp3-input-group > .bp3-icon,
+ .bp3-input-group .bp3-input-action > .bp3-spinner{
+ margin:7px; }
+ .bp3-input-group .bp3-tag{
+ margin:5px; }
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus),
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus){
+ color:#5c7080; }
+ .bp3-dark .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus), .bp3-dark
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus){
+ color:#a7b6c2; }
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-standard, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-large,
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon,
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-standard,
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:not(:hover):not(:focus) .bp3-icon-large{
+ color:#5c7080; }
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled,
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled{
+ color:rgba(92, 112, 128, 0.6) !important; }
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled .bp3-icon, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled .bp3-icon-standard, .bp3-input-group .bp3-input:not(:focus) + .bp3-button.bp3-minimal:disabled .bp3-icon-large,
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon,
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon-standard,
+ .bp3-input-group .bp3-input:not(:focus) + .bp3-input-action .bp3-button.bp3-minimal:disabled .bp3-icon-large{
+ color:rgba(92, 112, 128, 0.6) !important; }
+ .bp3-input-group.bp3-disabled{
+ cursor:not-allowed; }
+ .bp3-input-group.bp3-disabled .bp3-icon{
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input-group.bp3-large .bp3-button{
+ min-width:30px;
+ min-height:30px;
+ margin:5px; }
+ .bp3-input-group.bp3-large > .bp3-icon,
+ .bp3-input-group.bp3-large .bp3-input-action > .bp3-spinner{
+ margin:12px; }
+ .bp3-input-group.bp3-large .bp3-input{
+ height:40px;
+ line-height:40px;
+ font-size:16px; }
+ .bp3-input-group.bp3-large .bp3-input[type="search"], .bp3-input-group.bp3-large .bp3-input.bp3-round{
+ padding:0 15px; }
+ .bp3-input-group.bp3-large .bp3-input:not(:first-child){
+ padding-left:40px; }
+ .bp3-input-group.bp3-large .bp3-input:not(:last-child){
+ padding-right:40px; }
+ .bp3-input-group.bp3-small .bp3-button{
+ min-width:20px;
+ min-height:20px;
+ margin:2px; }
+ .bp3-input-group.bp3-small .bp3-tag{
+ min-width:20px;
+ min-height:20px;
+ margin:2px; }
+ .bp3-input-group.bp3-small > .bp3-icon,
+ .bp3-input-group.bp3-small .bp3-input-action > .bp3-spinner{
+ margin:4px; }
+ .bp3-input-group.bp3-small .bp3-input{
+ height:24px;
+ padding-right:8px;
+ padding-left:8px;
+ line-height:24px;
+ font-size:12px; }
+ .bp3-input-group.bp3-small .bp3-input[type="search"], .bp3-input-group.bp3-small .bp3-input.bp3-round{
+ padding:0 12px; }
+ .bp3-input-group.bp3-small .bp3-input:not(:first-child){
+ padding-left:24px; }
+ .bp3-input-group.bp3-small .bp3-input:not(:last-child){
+ padding-right:24px; }
+ .bp3-input-group.bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ width:100%; }
+ .bp3-input-group.bp3-round .bp3-button,
+ .bp3-input-group.bp3-round .bp3-input,
+ .bp3-input-group.bp3-round .bp3-tag{
+ border-radius:30px; }
+ .bp3-dark .bp3-input-group .bp3-icon{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-input-group.bp3-disabled .bp3-icon{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-input-group.bp3-intent-primary .bp3-input{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-primary .bp3-input:focus{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-primary .bp3-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #137cbd;
+ box-shadow:inset 0 0 0 1px #137cbd; }
+ .bp3-input-group.bp3-intent-primary .bp3-input:disabled, .bp3-input-group.bp3-intent-primary .bp3-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input-group.bp3-intent-primary > .bp3-icon{
+ color:#106ba3; }
+ .bp3-dark .bp3-input-group.bp3-intent-primary > .bp3-icon{
+ color:#48aff0; }
+ .bp3-input-group.bp3-intent-success .bp3-input{
+ -webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-success .bp3-input:focus{
+ -webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-success .bp3-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #0f9960;
+ box-shadow:inset 0 0 0 1px #0f9960; }
+ .bp3-input-group.bp3-intent-success .bp3-input:disabled, .bp3-input-group.bp3-intent-success .bp3-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input-group.bp3-intent-success > .bp3-icon{
+ color:#0d8050; }
+ .bp3-dark .bp3-input-group.bp3-intent-success > .bp3-icon{
+ color:#3dcc91; }
+ .bp3-input-group.bp3-intent-warning .bp3-input{
+ -webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-warning .bp3-input:focus{
+ -webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-warning .bp3-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #d9822b;
+ box-shadow:inset 0 0 0 1px #d9822b; }
+ .bp3-input-group.bp3-intent-warning .bp3-input:disabled, .bp3-input-group.bp3-intent-warning .bp3-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input-group.bp3-intent-warning > .bp3-icon{
+ color:#bf7326; }
+ .bp3-dark .bp3-input-group.bp3-intent-warning > .bp3-icon{
+ color:#ffb366; }
+ .bp3-input-group.bp3-intent-danger .bp3-input{
+ -webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-danger .bp3-input:focus{
+ -webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input-group.bp3-intent-danger .bp3-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #db3737;
+ box-shadow:inset 0 0 0 1px #db3737; }
+ .bp3-input-group.bp3-intent-danger .bp3-input:disabled, .bp3-input-group.bp3-intent-danger .bp3-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input-group.bp3-intent-danger > .bp3-icon{
+ color:#c23030; }
+ .bp3-dark .bp3-input-group.bp3-intent-danger > .bp3-icon{
+ color:#ff7373; }
+.bp3-input{
+ outline:none;
+ border:none;
+ border-radius:3px;
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ background:#ffffff;
+ height:30px;
+ padding:0 10px;
+ vertical-align:middle;
+ line-height:30px;
+ color:#182026;
+ font-size:14px;
+ font-weight:400;
+ -webkit-transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:-webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-box-shadow 100ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-appearance:none;
+ -moz-appearance:none;
+ appearance:none; }
+ .bp3-input::-webkit-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input::-moz-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input:-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input::-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input::placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input:focus, .bp3-input.bp3-active{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input[type="search"], .bp3-input.bp3-round{
+ border-radius:30px;
+ -webkit-box-sizing:border-box;
+ box-sizing:border-box;
+ padding-left:10px; }
+ .bp3-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.15); }
+ .bp3-input:disabled, .bp3-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(206, 217, 224, 0.5);
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6);
+ resize:none; }
+ .bp3-input.bp3-large{
+ height:40px;
+ line-height:40px;
+ font-size:16px; }
+ .bp3-input.bp3-large[type="search"], .bp3-input.bp3-large.bp3-round{
+ padding:0 15px; }
+ .bp3-input.bp3-small{
+ height:24px;
+ padding-right:8px;
+ padding-left:8px;
+ line-height:24px;
+ font-size:12px; }
+ .bp3-input.bp3-small[type="search"], .bp3-input.bp3-small.bp3-round{
+ padding:0 12px; }
+ .bp3-input.bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ width:100%; }
+ .bp3-dark .bp3-input{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ background:rgba(16, 22, 26, 0.3);
+ color:#f5f8fa; }
+ .bp3-dark .bp3-input::-webkit-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-input::-moz-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-input:-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-input::-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-input::placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-input:focus{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input:disabled, .bp3-dark .bp3-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(57, 75, 89, 0.5);
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-input.bp3-intent-primary{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-primary:focus{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-primary[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #137cbd;
+ box-shadow:inset 0 0 0 1px #137cbd; }
+ .bp3-input.bp3-intent-primary:disabled, .bp3-input.bp3-intent-primary.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-dark .bp3-input.bp3-intent-primary{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px #137cbd, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-primary:focus{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-primary[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #137cbd;
+ box-shadow:inset 0 0 0 1px #137cbd; }
+ .bp3-dark .bp3-input.bp3-intent-primary:disabled, .bp3-dark .bp3-input.bp3-intent-primary.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input.bp3-intent-success{
+ -webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-success:focus{
+ -webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-success[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #0f9960;
+ box-shadow:inset 0 0 0 1px #0f9960; }
+ .bp3-input.bp3-intent-success:disabled, .bp3-input.bp3-intent-success.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-dark .bp3-input.bp3-intent-success{
+ -webkit-box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), 0 0 0 0 rgba(15, 153, 96, 0), inset 0 0 0 1px #0f9960, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-success:focus{
+ -webkit-box-shadow:0 0 0 1px #0f9960, 0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #0f9960, 0 0 0 1px #0f9960, 0 0 0 3px rgba(15, 153, 96, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-success[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #0f9960;
+ box-shadow:inset 0 0 0 1px #0f9960; }
+ .bp3-dark .bp3-input.bp3-intent-success:disabled, .bp3-dark .bp3-input.bp3-intent-success.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input.bp3-intent-warning{
+ -webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-warning:focus{
+ -webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-warning[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #d9822b;
+ box-shadow:inset 0 0 0 1px #d9822b; }
+ .bp3-input.bp3-intent-warning:disabled, .bp3-input.bp3-intent-warning.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-dark .bp3-input.bp3-intent-warning{
+ -webkit-box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), 0 0 0 0 rgba(217, 130, 43, 0), inset 0 0 0 1px #d9822b, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-warning:focus{
+ -webkit-box-shadow:0 0 0 1px #d9822b, 0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #d9822b, 0 0 0 1px #d9822b, 0 0 0 3px rgba(217, 130, 43, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-warning[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #d9822b;
+ box-shadow:inset 0 0 0 1px #d9822b; }
+ .bp3-dark .bp3-input.bp3-intent-warning:disabled, .bp3-dark .bp3-input.bp3-intent-warning.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input.bp3-intent-danger{
+ -webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.15), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-danger:focus{
+ -webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-input.bp3-intent-danger[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #db3737;
+ box-shadow:inset 0 0 0 1px #db3737; }
+ .bp3-input.bp3-intent-danger:disabled, .bp3-input.bp3-intent-danger.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-dark .bp3-input.bp3-intent-danger{
+ -webkit-box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), 0 0 0 0 rgba(219, 55, 55, 0), inset 0 0 0 1px #db3737, inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-danger:focus{
+ -webkit-box-shadow:0 0 0 1px #db3737, 0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #db3737, 0 0 0 1px #db3737, 0 0 0 3px rgba(219, 55, 55, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-input.bp3-intent-danger[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px #db3737;
+ box-shadow:inset 0 0 0 1px #db3737; }
+ .bp3-dark .bp3-input.bp3-intent-danger:disabled, .bp3-dark .bp3-input.bp3-intent-danger.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-input::-ms-clear{
+ display:none; }
+textarea.bp3-input{
+ max-width:100%;
+ padding:10px; }
+ textarea.bp3-input, textarea.bp3-input.bp3-large, textarea.bp3-input.bp3-small{
+ height:auto;
+ line-height:inherit; }
+ textarea.bp3-input.bp3-small{
+ padding:8px; }
+ .bp3-dark textarea.bp3-input{
+ -webkit-box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), 0 0 0 0 rgba(19, 124, 189, 0), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ background:rgba(16, 22, 26, 0.3);
+ color:#f5f8fa; }
+ .bp3-dark textarea.bp3-input::-webkit-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark textarea.bp3-input::-moz-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark textarea.bp3-input:-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark textarea.bp3-input::-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark textarea.bp3-input::placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark textarea.bp3-input:focus{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark textarea.bp3-input[readonly]{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark textarea.bp3-input:disabled, .bp3-dark textarea.bp3-input.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(57, 75, 89, 0.5);
+ color:rgba(167, 182, 194, 0.6); }
+label.bp3-label{
+ display:block;
+ margin-top:0;
+ margin-bottom:15px; }
+ label.bp3-label .bp3-html-select,
+ label.bp3-label .bp3-input,
+ label.bp3-label .bp3-select,
+ label.bp3-label .bp3-slider,
+ label.bp3-label .bp3-popover-wrapper{
+ display:block;
+ margin-top:5px;
+ text-transform:none; }
+ label.bp3-label .bp3-button-group{
+ margin-top:5px; }
+ label.bp3-label .bp3-select select,
+ label.bp3-label .bp3-html-select select{
+ width:100%;
+ vertical-align:top;
+ font-weight:400; }
+ label.bp3-label.bp3-disabled,
+ label.bp3-label.bp3-disabled .bp3-text-muted{
+ color:rgba(92, 112, 128, 0.6); }
+ label.bp3-label.bp3-inline{
+ line-height:30px; }
+ label.bp3-label.bp3-inline .bp3-html-select,
+ label.bp3-label.bp3-inline .bp3-input,
+ label.bp3-label.bp3-inline .bp3-input-group,
+ label.bp3-label.bp3-inline .bp3-select,
+ label.bp3-label.bp3-inline .bp3-popover-wrapper{
+ display:inline-block;
+ margin:0 0 0 5px;
+ vertical-align:top; }
+ label.bp3-label.bp3-inline .bp3-button-group{
+ margin:0 0 0 5px; }
+ label.bp3-label.bp3-inline .bp3-input-group .bp3-input{
+ margin-left:0; }
+ label.bp3-label.bp3-inline.bp3-large{
+ line-height:40px; }
+ label.bp3-label:not(.bp3-inline) .bp3-popover-target{
+ display:block; }
+ .bp3-dark label.bp3-label{
+ color:#f5f8fa; }
+ .bp3-dark label.bp3-label.bp3-disabled,
+ .bp3-dark label.bp3-label.bp3-disabled .bp3-text-muted{
+ color:rgba(167, 182, 194, 0.6); }
+.bp3-numeric-input .bp3-button-group.bp3-vertical > .bp3-button{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 14px;
+ flex:1 1 14px;
+ width:30px;
+ min-height:0;
+ padding:0; }
+ .bp3-numeric-input .bp3-button-group.bp3-vertical > .bp3-button:first-child{
+ border-radius:0 3px 0 0; }
+ .bp3-numeric-input .bp3-button-group.bp3-vertical > .bp3-button:last-child{
+ border-radius:0 0 3px 0; }
+
+.bp3-numeric-input .bp3-button-group.bp3-vertical:first-child > .bp3-button:first-child{
+ border-radius:3px 0 0 0; }
+
+.bp3-numeric-input .bp3-button-group.bp3-vertical:first-child > .bp3-button:last-child{
+ border-radius:0 0 0 3px; }
+
+.bp3-numeric-input.bp3-large .bp3-button-group.bp3-vertical > .bp3-button{
+ width:40px; }
+
+form{
+ display:block; }
+.bp3-html-select select,
+.bp3-select select{
+ display:-webkit-inline-box;
+ display:-ms-inline-flexbox;
+ display:inline-flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ border:none;
+ border-radius:3px;
+ cursor:pointer;
+ padding:5px 10px;
+ vertical-align:middle;
+ text-align:left;
+ font-size:14px;
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-color:#f5f8fa;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
+ color:#182026;
+ border-radius:3px;
+ width:100%;
+ height:30px;
+ padding:0 25px 0 10px;
+ -moz-appearance:none;
+ -webkit-appearance:none; }
+ .bp3-html-select select > *, .bp3-select select > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-html-select select > .bp3-fill, .bp3-select select > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-html-select select::before,
+ .bp3-select select::before, .bp3-html-select select > *, .bp3-select select > *{
+ margin-right:7px; }
+ .bp3-html-select select:empty::before,
+ .bp3-select select:empty::before,
+ .bp3-html-select select > :last-child,
+ .bp3-select select > :last-child{
+ margin-right:0; }
+ .bp3-html-select select:hover,
+ .bp3-select select:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-clip:padding-box;
+ background-color:#ebf1f5; }
+ .bp3-html-select select:active,
+ .bp3-select select:active, .bp3-html-select select.bp3-active,
+ .bp3-select select.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#d8e1e8;
+ background-image:none; }
+ .bp3-html-select select:disabled,
+ .bp3-select select:disabled, .bp3-html-select select.bp3-disabled,
+ .bp3-select select.bp3-disabled{
+ outline:none;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(206, 217, 224, 0.5);
+ background-image:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-html-select select:disabled.bp3-active,
+ .bp3-select select:disabled.bp3-active, .bp3-html-select select:disabled.bp3-active:hover,
+ .bp3-select select:disabled.bp3-active:hover, .bp3-html-select select.bp3-disabled.bp3-active,
+ .bp3-select select.bp3-disabled.bp3-active, .bp3-html-select select.bp3-disabled.bp3-active:hover,
+ .bp3-select select.bp3-disabled.bp3-active:hover{
+ background:rgba(206, 217, 224, 0.7); }
+
+.bp3-html-select.bp3-minimal select,
+.bp3-select.bp3-minimal select{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none; }
+ .bp3-html-select.bp3-minimal select:hover,
+ .bp3-select.bp3-minimal select:hover{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(167, 182, 194, 0.3);
+ text-decoration:none;
+ color:#182026; }
+ .bp3-html-select.bp3-minimal select:active,
+ .bp3-select.bp3-minimal select:active, .bp3-html-select.bp3-minimal select.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:rgba(115, 134, 148, 0.3);
+ color:#182026; }
+ .bp3-html-select.bp3-minimal select:disabled,
+ .bp3-select.bp3-minimal select:disabled, .bp3-html-select.bp3-minimal select:disabled:hover,
+ .bp3-select.bp3-minimal select:disabled:hover, .bp3-html-select.bp3-minimal select.bp3-disabled,
+ .bp3-select.bp3-minimal select.bp3-disabled, .bp3-html-select.bp3-minimal select.bp3-disabled:hover,
+ .bp3-select.bp3-minimal select.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-html-select.bp3-minimal select:disabled.bp3-active,
+ .bp3-select.bp3-minimal select:disabled.bp3-active, .bp3-html-select.bp3-minimal select:disabled:hover.bp3-active,
+ .bp3-select.bp3-minimal select:disabled:hover.bp3-active, .bp3-html-select.bp3-minimal select.bp3-disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-disabled:hover.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-disabled:hover.bp3-active{
+ background:rgba(115, 134, 148, 0.3); }
+ .bp3-dark .bp3-html-select.bp3-minimal select, .bp3-html-select.bp3-minimal .bp3-dark select,
+ .bp3-dark .bp3-select.bp3-minimal select, .bp3-select.bp3-minimal .bp3-dark select{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:inherit; }
+ .bp3-dark .bp3-html-select.bp3-minimal select:hover, .bp3-html-select.bp3-minimal .bp3-dark select:hover,
+ .bp3-dark .bp3-select.bp3-minimal select:hover, .bp3-select.bp3-minimal .bp3-dark select:hover, .bp3-dark .bp3-html-select.bp3-minimal select:active, .bp3-html-select.bp3-minimal .bp3-dark select:active,
+ .bp3-dark .bp3-select.bp3-minimal select:active, .bp3-select.bp3-minimal .bp3-dark select:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none; }
+ .bp3-dark .bp3-html-select.bp3-minimal select:hover, .bp3-html-select.bp3-minimal .bp3-dark select:hover,
+ .bp3-dark .bp3-select.bp3-minimal select:hover, .bp3-select.bp3-minimal .bp3-dark select:hover{
+ background:rgba(138, 155, 168, 0.15); }
+ .bp3-dark .bp3-html-select.bp3-minimal select:active, .bp3-html-select.bp3-minimal .bp3-dark select:active,
+ .bp3-dark .bp3-select.bp3-minimal select:active, .bp3-select.bp3-minimal .bp3-dark select:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-active{
+ background:rgba(138, 155, 168, 0.3);
+ color:#f5f8fa; }
+ .bp3-dark .bp3-html-select.bp3-minimal select:disabled, .bp3-html-select.bp3-minimal .bp3-dark select:disabled,
+ .bp3-dark .bp3-select.bp3-minimal select:disabled, .bp3-select.bp3-minimal .bp3-dark select:disabled, .bp3-dark .bp3-html-select.bp3-minimal select:disabled:hover, .bp3-html-select.bp3-minimal .bp3-dark select:disabled:hover,
+ .bp3-dark .bp3-select.bp3-minimal select:disabled:hover, .bp3-select.bp3-minimal .bp3-dark select:disabled:hover, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled:hover,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-disabled:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled:hover{
+ background:none;
+ cursor:not-allowed;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-html-select.bp3-minimal select:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select:disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select:disabled:hover.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select:disabled:hover.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select:disabled:hover.bp3-active, .bp3-select.bp3-minimal .bp3-dark select:disabled:hover.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-disabled:hover.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-disabled:hover.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-disabled:hover.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-disabled:hover.bp3-active{
+ background:rgba(138, 155, 168, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-primary,
+ .bp3-select.bp3-minimal select.bp3-intent-primary{
+ color:#106ba3; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-primary:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-primary:hover, .bp3-html-select.bp3-minimal select.bp3-intent-primary:active,
+ .bp3-select.bp3-minimal select.bp3-intent-primary:active, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#106ba3; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-primary:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.15);
+ color:#106ba3; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-primary:active,
+ .bp3-select.bp3-minimal select.bp3-intent-primary:active, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#106ba3; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-primary:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(16, 107, 163, 0.5); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-primary .bp3-button-spinner .bp3-spinner-head{
+ stroke:#106ba3; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary{
+ color:#48aff0; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:hover,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:hover{
+ background:rgba(19, 124, 189, 0.2);
+ color:#48aff0; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-active{
+ background:rgba(19, 124, 189, 0.3);
+ color:#48aff0; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled{
+ background:none;
+ color:rgba(72, 175, 240, 0.5); }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-primary.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-primary.bp3-disabled.bp3-active{
+ background:rgba(19, 124, 189, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-success,
+ .bp3-select.bp3-minimal select.bp3-intent-success{
+ color:#0d8050; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-success:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-success:hover, .bp3-html-select.bp3-minimal select.bp3-intent-success:active,
+ .bp3-select.bp3-minimal select.bp3-intent-success:active, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-success.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#0d8050; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-success:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.15);
+ color:#0d8050; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-success:active,
+ .bp3-select.bp3-minimal select.bp3-intent-success:active, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#0d8050; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-success:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(13, 128, 80, 0.5); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-success .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-success .bp3-button-spinner .bp3-spinner-head{
+ stroke:#0d8050; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success{
+ color:#3dcc91; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:hover,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:hover{
+ background:rgba(15, 153, 96, 0.2);
+ color:#3dcc91; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-active{
+ background:rgba(15, 153, 96, 0.3);
+ color:#3dcc91; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled{
+ background:none;
+ color:rgba(61, 204, 145, 0.5); }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-success.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-success.bp3-disabled.bp3-active{
+ background:rgba(15, 153, 96, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-warning,
+ .bp3-select.bp3-minimal select.bp3-intent-warning{
+ color:#bf7326; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-warning:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-warning:hover, .bp3-html-select.bp3-minimal select.bp3-intent-warning:active,
+ .bp3-select.bp3-minimal select.bp3-intent-warning:active, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#bf7326; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-warning:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.15);
+ color:#bf7326; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-warning:active,
+ .bp3-select.bp3-minimal select.bp3-intent-warning:active, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#bf7326; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-warning:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(191, 115, 38, 0.5); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-warning .bp3-button-spinner .bp3-spinner-head{
+ stroke:#bf7326; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning{
+ color:#ffb366; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:hover,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:hover{
+ background:rgba(217, 130, 43, 0.2);
+ color:#ffb366; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-active{
+ background:rgba(217, 130, 43, 0.3);
+ color:#ffb366; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled{
+ background:none;
+ color:rgba(255, 179, 102, 0.5); }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-warning.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-warning.bp3-disabled.bp3-active{
+ background:rgba(217, 130, 43, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-danger,
+ .bp3-select.bp3-minimal select.bp3-intent-danger{
+ color:#c23030; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-danger:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-danger:hover, .bp3-html-select.bp3-minimal select.bp3-intent-danger:active,
+ .bp3-select.bp3-minimal select.bp3-intent-danger:active, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ color:#c23030; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-danger:hover,
+ .bp3-select.bp3-minimal select.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.15);
+ color:#c23030; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-danger:active,
+ .bp3-select.bp3-minimal select.bp3-intent-danger:active, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#c23030; }
+ .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-danger:disabled, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled,
+ .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(194, 48, 48, 0.5); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active, .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active,
+ .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+ .bp3-html-select.bp3-minimal select.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head, .bp3-select.bp3-minimal select.bp3-intent-danger .bp3-button-spinner .bp3-spinner-head{
+ stroke:#c23030; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger{
+ color:#ff7373; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:hover, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:hover,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:hover, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:hover{
+ background:rgba(219, 55, 55, 0.2);
+ color:#ff7373; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-active{
+ background:rgba(219, 55, 55, 0.3);
+ color:#ff7373; }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled{
+ background:none;
+ color:rgba(255, 115, 115, 0.5); }
+ .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger:disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger:disabled.bp3-active, .bp3-dark .bp3-html-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active, .bp3-html-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled.bp3-active,
+ .bp3-dark .bp3-select.bp3-minimal select.bp3-intent-danger.bp3-disabled.bp3-active, .bp3-select.bp3-minimal .bp3-dark select.bp3-intent-danger.bp3-disabled.bp3-active{
+ background:rgba(219, 55, 55, 0.3); }
+
+.bp3-html-select.bp3-large select,
+.bp3-select.bp3-large select{
+ height:40px;
+ padding-right:35px;
+ font-size:16px; }
+
+.bp3-dark .bp3-html-select select, .bp3-dark .bp3-select select{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#394b59;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+ color:#f5f8fa; }
+ .bp3-dark .bp3-html-select select:hover, .bp3-dark .bp3-select select:hover, .bp3-dark .bp3-html-select select:active, .bp3-dark .bp3-select select:active, .bp3-dark .bp3-html-select select.bp3-active, .bp3-dark .bp3-select select.bp3-active{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-html-select select:hover, .bp3-dark .bp3-select select:hover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#30404d; }
+ .bp3-dark .bp3-html-select select:active, .bp3-dark .bp3-select select:active, .bp3-dark .bp3-html-select select.bp3-active, .bp3-dark .bp3-select select.bp3-active{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#202b33;
+ background-image:none; }
+ .bp3-dark .bp3-html-select select:disabled, .bp3-dark .bp3-select select:disabled, .bp3-dark .bp3-html-select select.bp3-disabled, .bp3-dark .bp3-select select.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(57, 75, 89, 0.5);
+ background-image:none;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-html-select select:disabled.bp3-active, .bp3-dark .bp3-select select:disabled.bp3-active, .bp3-dark .bp3-html-select select.bp3-disabled.bp3-active, .bp3-dark .bp3-select select.bp3-disabled.bp3-active{
+ background:rgba(57, 75, 89, 0.7); }
+ .bp3-dark .bp3-html-select select .bp3-button-spinner .bp3-spinner-head, .bp3-dark .bp3-select select .bp3-button-spinner .bp3-spinner-head{
+ background:rgba(16, 22, 26, 0.5);
+ stroke:#8a9ba8; }
+
+.bp3-html-select select:disabled,
+.bp3-select select:disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(206, 217, 224, 0.5);
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+
+.bp3-html-select .bp3-icon,
+.bp3-select .bp3-icon, .bp3-select::after{
+ position:absolute;
+ top:7px;
+ right:7px;
+ color:#5c7080;
+ pointer-events:none; }
+ .bp3-html-select .bp3-disabled.bp3-icon,
+ .bp3-select .bp3-disabled.bp3-icon, .bp3-disabled.bp3-select::after{
+ color:rgba(92, 112, 128, 0.6); }
+.bp3-html-select,
+.bp3-select{
+ display:inline-block;
+ position:relative;
+ vertical-align:middle;
+ letter-spacing:normal; }
+ .bp3-html-select select::-ms-expand,
+ .bp3-select select::-ms-expand{
+ display:none; }
+ .bp3-html-select .bp3-icon,
+ .bp3-select .bp3-icon{
+ color:#5c7080; }
+ .bp3-html-select .bp3-icon:hover,
+ .bp3-select .bp3-icon:hover{
+ color:#182026; }
+ .bp3-dark .bp3-html-select .bp3-icon, .bp3-dark
+ .bp3-select .bp3-icon{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-html-select .bp3-icon:hover, .bp3-dark
+ .bp3-select .bp3-icon:hover{
+ color:#f5f8fa; }
+ .bp3-html-select.bp3-large::after,
+ .bp3-html-select.bp3-large .bp3-icon,
+ .bp3-select.bp3-large::after,
+ .bp3-select.bp3-large .bp3-icon{
+ top:12px;
+ right:12px; }
+ .bp3-html-select.bp3-fill,
+ .bp3-html-select.bp3-fill select,
+ .bp3-select.bp3-fill,
+ .bp3-select.bp3-fill select{
+ width:100%; }
+ .bp3-dark .bp3-html-select option, .bp3-dark
+ .bp3-select option{
+ background-color:#30404d;
+ color:#f5f8fa; }
+ .bp3-dark .bp3-html-select option:disabled, .bp3-dark
+ .bp3-select option:disabled{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-html-select::after, .bp3-dark
+ .bp3-select::after{
+ color:#a7b6c2; }
+
+.bp3-select::after{
+ line-height:1;
+ font-family:"Icons16", sans-serif;
+ font-size:16px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ content:""; }
+.bp3-running-text table, table.bp3-html-table{
+ border-spacing:0;
+ font-size:14px; }
+ .bp3-running-text table th, table.bp3-html-table th,
+ .bp3-running-text table td,
+ table.bp3-html-table td{
+ padding:11px;
+ vertical-align:top;
+ text-align:left; }
+ .bp3-running-text table th, table.bp3-html-table th{
+ color:#182026;
+ font-weight:600; }
+
+ .bp3-running-text table td,
+ table.bp3-html-table td{
+ color:#182026; }
+ .bp3-running-text table tbody tr:first-child th, table.bp3-html-table tbody tr:first-child th,
+ .bp3-running-text table tbody tr:first-child td,
+ table.bp3-html-table tbody tr:first-child td{
+ -webkit-box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15);
+ box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15); }
+ .bp3-dark .bp3-running-text table th, .bp3-running-text .bp3-dark table th, .bp3-dark table.bp3-html-table th{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-running-text table td, .bp3-running-text .bp3-dark table td, .bp3-dark table.bp3-html-table td{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-running-text table tbody tr:first-child th, .bp3-running-text .bp3-dark table tbody tr:first-child th, .bp3-dark table.bp3-html-table tbody tr:first-child th,
+ .bp3-dark .bp3-running-text table tbody tr:first-child td,
+ .bp3-running-text .bp3-dark table tbody tr:first-child td,
+ .bp3-dark table.bp3-html-table tbody tr:first-child td{
+ -webkit-box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15);
+ box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15); }
+
+table.bp3-html-table.bp3-html-table-condensed th,
+table.bp3-html-table.bp3-html-table-condensed td, table.bp3-html-table.bp3-small th,
+table.bp3-html-table.bp3-small td{
+ padding-top:6px;
+ padding-bottom:6px; }
+
+table.bp3-html-table.bp3-html-table-striped tbody tr:nth-child(odd) td{
+ background:rgba(191, 204, 214, 0.15); }
+
+table.bp3-html-table.bp3-html-table-bordered th:not(:first-child){
+ -webkit-box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15);
+ box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15); }
+
+table.bp3-html-table.bp3-html-table-bordered tbody tr td{
+ -webkit-box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15);
+ box-shadow:inset 0 1px 0 0 rgba(16, 22, 26, 0.15); }
+ table.bp3-html-table.bp3-html-table-bordered tbody tr td:not(:first-child){
+ -webkit-box-shadow:inset 1px 1px 0 0 rgba(16, 22, 26, 0.15);
+ box-shadow:inset 1px 1px 0 0 rgba(16, 22, 26, 0.15); }
+
+table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td:not(:first-child){
+ -webkit-box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15);
+ box-shadow:inset 1px 0 0 0 rgba(16, 22, 26, 0.15); }
+
+table.bp3-html-table.bp3-interactive tbody tr:hover td{
+ background-color:rgba(191, 204, 214, 0.3);
+ cursor:pointer; }
+
+table.bp3-html-table.bp3-interactive tbody tr:active td{
+ background-color:rgba(191, 204, 214, 0.4); }
+
+.bp3-dark table.bp3-html-table.bp3-html-table-striped tbody tr:nth-child(odd) td{
+ background:rgba(92, 112, 128, 0.15); }
+
+.bp3-dark table.bp3-html-table.bp3-html-table-bordered th:not(:first-child){
+ -webkit-box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15);
+ box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15); }
+
+.bp3-dark table.bp3-html-table.bp3-html-table-bordered tbody tr td{
+ -webkit-box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15);
+ box-shadow:inset 0 1px 0 0 rgba(255, 255, 255, 0.15); }
+ .bp3-dark table.bp3-html-table.bp3-html-table-bordered tbody tr td:not(:first-child){
+ -webkit-box-shadow:inset 1px 1px 0 0 rgba(255, 255, 255, 0.15);
+ box-shadow:inset 1px 1px 0 0 rgba(255, 255, 255, 0.15); }
+
+.bp3-dark table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td{
+ -webkit-box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15);
+ box-shadow:inset 1px 0 0 0 rgba(255, 255, 255, 0.15); }
+ .bp3-dark table.bp3-html-table.bp3-html-table-bordered.bp3-html-table-striped tbody tr:not(:first-child) td:first-child{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+
+.bp3-dark table.bp3-html-table.bp3-interactive tbody tr:hover td{
+ background-color:rgba(92, 112, 128, 0.3);
+ cursor:pointer; }
+
+.bp3-dark table.bp3-html-table.bp3-interactive tbody tr:active td{
+ background-color:rgba(92, 112, 128, 0.4); }
+
+.bp3-key-combo{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center; }
+ .bp3-key-combo > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-key-combo > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-key-combo::before,
+ .bp3-key-combo > *{
+ margin-right:5px; }
+ .bp3-key-combo:empty::before,
+ .bp3-key-combo > :last-child{
+ margin-right:0; }
+
+.bp3-hotkey-dialog{
+ top:40px;
+ padding-bottom:0; }
+ .bp3-hotkey-dialog .bp3-dialog-body{
+ margin:0;
+ padding:0; }
+ .bp3-hotkey-dialog .bp3-hotkey-label{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1; }
+
+.bp3-hotkey-column{
+ margin:auto;
+ max-height:80vh;
+ overflow-y:auto;
+ padding:30px; }
+ .bp3-hotkey-column .bp3-heading{
+ margin-bottom:20px; }
+ .bp3-hotkey-column .bp3-heading:not(:first-child){
+ margin-top:40px; }
+
+.bp3-hotkey{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:justify;
+ -ms-flex-pack:justify;
+ justify-content:space-between;
+ margin-right:0;
+ margin-left:0; }
+ .bp3-hotkey:not(:last-child){
+ margin-bottom:10px; }
+.bp3-icon{
+ display:inline-block;
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ vertical-align:text-bottom; }
+ .bp3-icon:not(:empty)::before{
+ content:"" !important;
+ content:unset !important; }
+ .bp3-icon > svg{
+ display:block; }
+ .bp3-icon > svg:not([fill]){
+ fill:currentColor; }
+
+.bp3-icon.bp3-intent-primary, .bp3-icon-standard.bp3-intent-primary, .bp3-icon-large.bp3-intent-primary{
+ color:#106ba3; }
+ .bp3-dark .bp3-icon.bp3-intent-primary, .bp3-dark .bp3-icon-standard.bp3-intent-primary, .bp3-dark .bp3-icon-large.bp3-intent-primary{
+ color:#48aff0; }
+
+.bp3-icon.bp3-intent-success, .bp3-icon-standard.bp3-intent-success, .bp3-icon-large.bp3-intent-success{
+ color:#0d8050; }
+ .bp3-dark .bp3-icon.bp3-intent-success, .bp3-dark .bp3-icon-standard.bp3-intent-success, .bp3-dark .bp3-icon-large.bp3-intent-success{
+ color:#3dcc91; }
+
+.bp3-icon.bp3-intent-warning, .bp3-icon-standard.bp3-intent-warning, .bp3-icon-large.bp3-intent-warning{
+ color:#bf7326; }
+ .bp3-dark .bp3-icon.bp3-intent-warning, .bp3-dark .bp3-icon-standard.bp3-intent-warning, .bp3-dark .bp3-icon-large.bp3-intent-warning{
+ color:#ffb366; }
+
+.bp3-icon.bp3-intent-danger, .bp3-icon-standard.bp3-intent-danger, .bp3-icon-large.bp3-intent-danger{
+ color:#c23030; }
+ .bp3-dark .bp3-icon.bp3-intent-danger, .bp3-dark .bp3-icon-standard.bp3-intent-danger, .bp3-dark .bp3-icon-large.bp3-intent-danger{
+ color:#ff7373; }
+
+span.bp3-icon-standard{
+ line-height:1;
+ font-family:"Icons16", sans-serif;
+ font-size:16px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ display:inline-block; }
+
+span.bp3-icon-large{
+ line-height:1;
+ font-family:"Icons20", sans-serif;
+ font-size:20px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ display:inline-block; }
+
+span.bp3-icon:empty{
+ line-height:1;
+ font-family:"Icons20";
+ font-size:inherit;
+ font-weight:400;
+ font-style:normal; }
+ span.bp3-icon:empty::before{
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased; }
+
+.bp3-icon-add::before{
+ content:""; }
+
+.bp3-icon-add-column-left::before{
+ content:""; }
+
+.bp3-icon-add-column-right::before{
+ content:""; }
+
+.bp3-icon-add-row-bottom::before{
+ content:""; }
+
+.bp3-icon-add-row-top::before{
+ content:""; }
+
+.bp3-icon-add-to-artifact::before{
+ content:""; }
+
+.bp3-icon-add-to-folder::before{
+ content:""; }
+
+.bp3-icon-airplane::before{
+ content:""; }
+
+.bp3-icon-align-center::before{
+ content:""; }
+
+.bp3-icon-align-justify::before{
+ content:""; }
+
+.bp3-icon-align-left::before{
+ content:""; }
+
+.bp3-icon-align-right::before{
+ content:""; }
+
+.bp3-icon-alignment-bottom::before{
+ content:""; }
+
+.bp3-icon-alignment-horizontal-center::before{
+ content:""; }
+
+.bp3-icon-alignment-left::before{
+ content:""; }
+
+.bp3-icon-alignment-right::before{
+ content:""; }
+
+.bp3-icon-alignment-top::before{
+ content:""; }
+
+.bp3-icon-alignment-vertical-center::before{
+ content:""; }
+
+.bp3-icon-annotation::before{
+ content:""; }
+
+.bp3-icon-application::before{
+ content:""; }
+
+.bp3-icon-applications::before{
+ content:""; }
+
+.bp3-icon-archive::before{
+ content:""; }
+
+.bp3-icon-arrow-bottom-left::before{
+ content:"↙"; }
+
+.bp3-icon-arrow-bottom-right::before{
+ content:"↘"; }
+
+.bp3-icon-arrow-down::before{
+ content:"↓"; }
+
+.bp3-icon-arrow-left::before{
+ content:"←"; }
+
+.bp3-icon-arrow-right::before{
+ content:"→"; }
+
+.bp3-icon-arrow-top-left::before{
+ content:"↖"; }
+
+.bp3-icon-arrow-top-right::before{
+ content:"↗"; }
+
+.bp3-icon-arrow-up::before{
+ content:"↑"; }
+
+.bp3-icon-arrows-horizontal::before{
+ content:"↔"; }
+
+.bp3-icon-arrows-vertical::before{
+ content:"↕"; }
+
+.bp3-icon-asterisk::before{
+ content:"*"; }
+
+.bp3-icon-automatic-updates::before{
+ content:""; }
+
+.bp3-icon-badge::before{
+ content:""; }
+
+.bp3-icon-ban-circle::before{
+ content:""; }
+
+.bp3-icon-bank-account::before{
+ content:""; }
+
+.bp3-icon-barcode::before{
+ content:""; }
+
+.bp3-icon-blank::before{
+ content:""; }
+
+.bp3-icon-blocked-person::before{
+ content:""; }
+
+.bp3-icon-bold::before{
+ content:""; }
+
+.bp3-icon-book::before{
+ content:""; }
+
+.bp3-icon-bookmark::before{
+ content:""; }
+
+.bp3-icon-box::before{
+ content:""; }
+
+.bp3-icon-briefcase::before{
+ content:""; }
+
+.bp3-icon-bring-data::before{
+ content:""; }
+
+.bp3-icon-build::before{
+ content:""; }
+
+.bp3-icon-calculator::before{
+ content:""; }
+
+.bp3-icon-calendar::before{
+ content:""; }
+
+.bp3-icon-camera::before{
+ content:""; }
+
+.bp3-icon-caret-down::before{
+ content:"⌄"; }
+
+.bp3-icon-caret-left::before{
+ content:"〈"; }
+
+.bp3-icon-caret-right::before{
+ content:"〉"; }
+
+.bp3-icon-caret-up::before{
+ content:"⌃"; }
+
+.bp3-icon-cell-tower::before{
+ content:""; }
+
+.bp3-icon-changes::before{
+ content:""; }
+
+.bp3-icon-chart::before{
+ content:""; }
+
+.bp3-icon-chat::before{
+ content:""; }
+
+.bp3-icon-chevron-backward::before{
+ content:""; }
+
+.bp3-icon-chevron-down::before{
+ content:""; }
+
+.bp3-icon-chevron-forward::before{
+ content:""; }
+
+.bp3-icon-chevron-left::before{
+ content:""; }
+
+.bp3-icon-chevron-right::before{
+ content:""; }
+
+.bp3-icon-chevron-up::before{
+ content:""; }
+
+.bp3-icon-circle::before{
+ content:""; }
+
+.bp3-icon-circle-arrow-down::before{
+ content:""; }
+
+.bp3-icon-circle-arrow-left::before{
+ content:""; }
+
+.bp3-icon-circle-arrow-right::before{
+ content:""; }
+
+.bp3-icon-circle-arrow-up::before{
+ content:""; }
+
+.bp3-icon-citation::before{
+ content:""; }
+
+.bp3-icon-clean::before{
+ content:""; }
+
+.bp3-icon-clipboard::before{
+ content:""; }
+
+.bp3-icon-cloud::before{
+ content:"☁"; }
+
+.bp3-icon-cloud-download::before{
+ content:""; }
+
+.bp3-icon-cloud-upload::before{
+ content:""; }
+
+.bp3-icon-code::before{
+ content:""; }
+
+.bp3-icon-code-block::before{
+ content:""; }
+
+.bp3-icon-cog::before{
+ content:""; }
+
+.bp3-icon-collapse-all::before{
+ content:""; }
+
+.bp3-icon-column-layout::before{
+ content:""; }
+
+.bp3-icon-comment::before{
+ content:""; }
+
+.bp3-icon-comparison::before{
+ content:""; }
+
+.bp3-icon-compass::before{
+ content:""; }
+
+.bp3-icon-compressed::before{
+ content:""; }
+
+.bp3-icon-confirm::before{
+ content:""; }
+
+.bp3-icon-console::before{
+ content:""; }
+
+.bp3-icon-contrast::before{
+ content:""; }
+
+.bp3-icon-control::before{
+ content:""; }
+
+.bp3-icon-credit-card::before{
+ content:""; }
+
+.bp3-icon-cross::before{
+ content:"✗"; }
+
+.bp3-icon-crown::before{
+ content:""; }
+
+.bp3-icon-cube::before{
+ content:""; }
+
+.bp3-icon-cube-add::before{
+ content:""; }
+
+.bp3-icon-cube-remove::before{
+ content:""; }
+
+.bp3-icon-curved-range-chart::before{
+ content:""; }
+
+.bp3-icon-cut::before{
+ content:""; }
+
+.bp3-icon-dashboard::before{
+ content:""; }
+
+.bp3-icon-data-lineage::before{
+ content:""; }
+
+.bp3-icon-database::before{
+ content:""; }
+
+.bp3-icon-delete::before{
+ content:""; }
+
+.bp3-icon-delta::before{
+ content:"Δ"; }
+
+.bp3-icon-derive-column::before{
+ content:""; }
+
+.bp3-icon-desktop::before{
+ content:""; }
+
+.bp3-icon-diagnosis::before{
+ content:""; }
+
+.bp3-icon-diagram-tree::before{
+ content:""; }
+
+.bp3-icon-direction-left::before{
+ content:""; }
+
+.bp3-icon-direction-right::before{
+ content:""; }
+
+.bp3-icon-disable::before{
+ content:""; }
+
+.bp3-icon-document::before{
+ content:""; }
+
+.bp3-icon-document-open::before{
+ content:""; }
+
+.bp3-icon-document-share::before{
+ content:""; }
+
+.bp3-icon-dollar::before{
+ content:"$"; }
+
+.bp3-icon-dot::before{
+ content:"•"; }
+
+.bp3-icon-double-caret-horizontal::before{
+ content:""; }
+
+.bp3-icon-double-caret-vertical::before{
+ content:""; }
+
+.bp3-icon-double-chevron-down::before{
+ content:""; }
+
+.bp3-icon-double-chevron-left::before{
+ content:""; }
+
+.bp3-icon-double-chevron-right::before{
+ content:""; }
+
+.bp3-icon-double-chevron-up::before{
+ content:""; }
+
+.bp3-icon-doughnut-chart::before{
+ content:""; }
+
+.bp3-icon-download::before{
+ content:""; }
+
+.bp3-icon-drag-handle-horizontal::before{
+ content:""; }
+
+.bp3-icon-drag-handle-vertical::before{
+ content:""; }
+
+.bp3-icon-draw::before{
+ content:""; }
+
+.bp3-icon-drive-time::before{
+ content:""; }
+
+.bp3-icon-duplicate::before{
+ content:""; }
+
+.bp3-icon-edit::before{
+ content:"✎"; }
+
+.bp3-icon-eject::before{
+ content:"⏏"; }
+
+.bp3-icon-endorsed::before{
+ content:""; }
+
+.bp3-icon-envelope::before{
+ content:"✉"; }
+
+.bp3-icon-equals::before{
+ content:""; }
+
+.bp3-icon-eraser::before{
+ content:""; }
+
+.bp3-icon-error::before{
+ content:""; }
+
+.bp3-icon-euro::before{
+ content:"€"; }
+
+.bp3-icon-exchange::before{
+ content:""; }
+
+.bp3-icon-exclude-row::before{
+ content:""; }
+
+.bp3-icon-expand-all::before{
+ content:""; }
+
+.bp3-icon-export::before{
+ content:""; }
+
+.bp3-icon-eye-off::before{
+ content:""; }
+
+.bp3-icon-eye-on::before{
+ content:""; }
+
+.bp3-icon-eye-open::before{
+ content:""; }
+
+.bp3-icon-fast-backward::before{
+ content:""; }
+
+.bp3-icon-fast-forward::before{
+ content:""; }
+
+.bp3-icon-feed::before{
+ content:""; }
+
+.bp3-icon-feed-subscribed::before{
+ content:""; }
+
+.bp3-icon-film::before{
+ content:""; }
+
+.bp3-icon-filter::before{
+ content:""; }
+
+.bp3-icon-filter-keep::before{
+ content:""; }
+
+.bp3-icon-filter-list::before{
+ content:""; }
+
+.bp3-icon-filter-open::before{
+ content:""; }
+
+.bp3-icon-filter-remove::before{
+ content:""; }
+
+.bp3-icon-flag::before{
+ content:"⚑"; }
+
+.bp3-icon-flame::before{
+ content:""; }
+
+.bp3-icon-flash::before{
+ content:""; }
+
+.bp3-icon-floppy-disk::before{
+ content:""; }
+
+.bp3-icon-flow-branch::before{
+ content:""; }
+
+.bp3-icon-flow-end::before{
+ content:""; }
+
+.bp3-icon-flow-linear::before{
+ content:""; }
+
+.bp3-icon-flow-review::before{
+ content:""; }
+
+.bp3-icon-flow-review-branch::before{
+ content:""; }
+
+.bp3-icon-flows::before{
+ content:""; }
+
+.bp3-icon-folder-close::before{
+ content:""; }
+
+.bp3-icon-folder-new::before{
+ content:""; }
+
+.bp3-icon-folder-open::before{
+ content:""; }
+
+.bp3-icon-folder-shared::before{
+ content:""; }
+
+.bp3-icon-folder-shared-open::before{
+ content:""; }
+
+.bp3-icon-follower::before{
+ content:""; }
+
+.bp3-icon-following::before{
+ content:""; }
+
+.bp3-icon-font::before{
+ content:""; }
+
+.bp3-icon-fork::before{
+ content:""; }
+
+.bp3-icon-form::before{
+ content:""; }
+
+.bp3-icon-full-circle::before{
+ content:""; }
+
+.bp3-icon-full-stacked-chart::before{
+ content:""; }
+
+.bp3-icon-fullscreen::before{
+ content:""; }
+
+.bp3-icon-function::before{
+ content:""; }
+
+.bp3-icon-gantt-chart::before{
+ content:""; }
+
+.bp3-icon-geolocation::before{
+ content:""; }
+
+.bp3-icon-geosearch::before{
+ content:""; }
+
+.bp3-icon-git-branch::before{
+ content:""; }
+
+.bp3-icon-git-commit::before{
+ content:""; }
+
+.bp3-icon-git-merge::before{
+ content:""; }
+
+.bp3-icon-git-new-branch::before{
+ content:""; }
+
+.bp3-icon-git-pull::before{
+ content:""; }
+
+.bp3-icon-git-push::before{
+ content:""; }
+
+.bp3-icon-git-repo::before{
+ content:""; }
+
+.bp3-icon-glass::before{
+ content:""; }
+
+.bp3-icon-globe::before{
+ content:""; }
+
+.bp3-icon-globe-network::before{
+ content:""; }
+
+.bp3-icon-graph::before{
+ content:""; }
+
+.bp3-icon-graph-remove::before{
+ content:""; }
+
+.bp3-icon-greater-than::before{
+ content:""; }
+
+.bp3-icon-greater-than-or-equal-to::before{
+ content:""; }
+
+.bp3-icon-grid::before{
+ content:""; }
+
+.bp3-icon-grid-view::before{
+ content:""; }
+
+.bp3-icon-group-objects::before{
+ content:""; }
+
+.bp3-icon-grouped-bar-chart::before{
+ content:""; }
+
+.bp3-icon-hand::before{
+ content:""; }
+
+.bp3-icon-hand-down::before{
+ content:""; }
+
+.bp3-icon-hand-left::before{
+ content:""; }
+
+.bp3-icon-hand-right::before{
+ content:""; }
+
+.bp3-icon-hand-up::before{
+ content:""; }
+
+.bp3-icon-header::before{
+ content:""; }
+
+.bp3-icon-header-one::before{
+ content:""; }
+
+.bp3-icon-header-two::before{
+ content:""; }
+
+.bp3-icon-headset::before{
+ content:""; }
+
+.bp3-icon-heart::before{
+ content:"♥"; }
+
+.bp3-icon-heart-broken::before{
+ content:""; }
+
+.bp3-icon-heat-grid::before{
+ content:""; }
+
+.bp3-icon-heatmap::before{
+ content:""; }
+
+.bp3-icon-help::before{
+ content:"?"; }
+
+.bp3-icon-helper-management::before{
+ content:""; }
+
+.bp3-icon-highlight::before{
+ content:""; }
+
+.bp3-icon-history::before{
+ content:""; }
+
+.bp3-icon-home::before{
+ content:"⌂"; }
+
+.bp3-icon-horizontal-bar-chart::before{
+ content:""; }
+
+.bp3-icon-horizontal-bar-chart-asc::before{
+ content:""; }
+
+.bp3-icon-horizontal-bar-chart-desc::before{
+ content:""; }
+
+.bp3-icon-horizontal-distribution::before{
+ content:""; }
+
+.bp3-icon-id-number::before{
+ content:""; }
+
+.bp3-icon-image-rotate-left::before{
+ content:""; }
+
+.bp3-icon-image-rotate-right::before{
+ content:""; }
+
+.bp3-icon-import::before{
+ content:""; }
+
+.bp3-icon-inbox::before{
+ content:""; }
+
+.bp3-icon-inbox-filtered::before{
+ content:""; }
+
+.bp3-icon-inbox-geo::before{
+ content:""; }
+
+.bp3-icon-inbox-search::before{
+ content:""; }
+
+.bp3-icon-inbox-update::before{
+ content:""; }
+
+.bp3-icon-info-sign::before{
+ content:"ℹ"; }
+
+.bp3-icon-inheritance::before{
+ content:""; }
+
+.bp3-icon-inner-join::before{
+ content:""; }
+
+.bp3-icon-insert::before{
+ content:""; }
+
+.bp3-icon-intersection::before{
+ content:""; }
+
+.bp3-icon-ip-address::before{
+ content:""; }
+
+.bp3-icon-issue::before{
+ content:""; }
+
+.bp3-icon-issue-closed::before{
+ content:""; }
+
+.bp3-icon-issue-new::before{
+ content:""; }
+
+.bp3-icon-italic::before{
+ content:""; }
+
+.bp3-icon-join-table::before{
+ content:""; }
+
+.bp3-icon-key::before{
+ content:""; }
+
+.bp3-icon-key-backspace::before{
+ content:""; }
+
+.bp3-icon-key-command::before{
+ content:""; }
+
+.bp3-icon-key-control::before{
+ content:""; }
+
+.bp3-icon-key-delete::before{
+ content:""; }
+
+.bp3-icon-key-enter::before{
+ content:""; }
+
+.bp3-icon-key-escape::before{
+ content:""; }
+
+.bp3-icon-key-option::before{
+ content:""; }
+
+.bp3-icon-key-shift::before{
+ content:""; }
+
+.bp3-icon-key-tab::before{
+ content:""; }
+
+.bp3-icon-known-vehicle::before{
+ content:""; }
+
+.bp3-icon-lab-test::before{
+ content:""; }
+
+.bp3-icon-label::before{
+ content:""; }
+
+.bp3-icon-layer::before{
+ content:""; }
+
+.bp3-icon-layers::before{
+ content:""; }
+
+.bp3-icon-layout::before{
+ content:""; }
+
+.bp3-icon-layout-auto::before{
+ content:""; }
+
+.bp3-icon-layout-balloon::before{
+ content:""; }
+
+.bp3-icon-layout-circle::before{
+ content:""; }
+
+.bp3-icon-layout-grid::before{
+ content:""; }
+
+.bp3-icon-layout-group-by::before{
+ content:""; }
+
+.bp3-icon-layout-hierarchy::before{
+ content:""; }
+
+.bp3-icon-layout-linear::before{
+ content:""; }
+
+.bp3-icon-layout-skew-grid::before{
+ content:""; }
+
+.bp3-icon-layout-sorted-clusters::before{
+ content:""; }
+
+.bp3-icon-learning::before{
+ content:""; }
+
+.bp3-icon-left-join::before{
+ content:""; }
+
+.bp3-icon-less-than::before{
+ content:""; }
+
+.bp3-icon-less-than-or-equal-to::before{
+ content:""; }
+
+.bp3-icon-lifesaver::before{
+ content:""; }
+
+.bp3-icon-lightbulb::before{
+ content:""; }
+
+.bp3-icon-link::before{
+ content:""; }
+
+.bp3-icon-list::before{
+ content:"☰"; }
+
+.bp3-icon-list-columns::before{
+ content:""; }
+
+.bp3-icon-list-detail-view::before{
+ content:""; }
+
+.bp3-icon-locate::before{
+ content:""; }
+
+.bp3-icon-lock::before{
+ content:""; }
+
+.bp3-icon-log-in::before{
+ content:""; }
+
+.bp3-icon-log-out::before{
+ content:""; }
+
+.bp3-icon-manual::before{
+ content:""; }
+
+.bp3-icon-manually-entered-data::before{
+ content:""; }
+
+.bp3-icon-map::before{
+ content:""; }
+
+.bp3-icon-map-create::before{
+ content:""; }
+
+.bp3-icon-map-marker::before{
+ content:""; }
+
+.bp3-icon-maximize::before{
+ content:""; }
+
+.bp3-icon-media::before{
+ content:""; }
+
+.bp3-icon-menu::before{
+ content:""; }
+
+.bp3-icon-menu-closed::before{
+ content:""; }
+
+.bp3-icon-menu-open::before{
+ content:""; }
+
+.bp3-icon-merge-columns::before{
+ content:""; }
+
+.bp3-icon-merge-links::before{
+ content:""; }
+
+.bp3-icon-minimize::before{
+ content:""; }
+
+.bp3-icon-minus::before{
+ content:"−"; }
+
+.bp3-icon-mobile-phone::before{
+ content:""; }
+
+.bp3-icon-mobile-video::before{
+ content:""; }
+
+.bp3-icon-moon::before{
+ content:""; }
+
+.bp3-icon-more::before{
+ content:""; }
+
+.bp3-icon-mountain::before{
+ content:""; }
+
+.bp3-icon-move::before{
+ content:""; }
+
+.bp3-icon-mugshot::before{
+ content:""; }
+
+.bp3-icon-multi-select::before{
+ content:""; }
+
+.bp3-icon-music::before{
+ content:""; }
+
+.bp3-icon-new-drawing::before{
+ content:""; }
+
+.bp3-icon-new-grid-item::before{
+ content:""; }
+
+.bp3-icon-new-layer::before{
+ content:""; }
+
+.bp3-icon-new-layers::before{
+ content:""; }
+
+.bp3-icon-new-link::before{
+ content:""; }
+
+.bp3-icon-new-object::before{
+ content:""; }
+
+.bp3-icon-new-person::before{
+ content:""; }
+
+.bp3-icon-new-prescription::before{
+ content:""; }
+
+.bp3-icon-new-text-box::before{
+ content:""; }
+
+.bp3-icon-ninja::before{
+ content:""; }
+
+.bp3-icon-not-equal-to::before{
+ content:""; }
+
+.bp3-icon-notifications::before{
+ content:""; }
+
+.bp3-icon-notifications-updated::before{
+ content:""; }
+
+.bp3-icon-numbered-list::before{
+ content:""; }
+
+.bp3-icon-numerical::before{
+ content:""; }
+
+.bp3-icon-office::before{
+ content:""; }
+
+.bp3-icon-offline::before{
+ content:""; }
+
+.bp3-icon-oil-field::before{
+ content:""; }
+
+.bp3-icon-one-column::before{
+ content:""; }
+
+.bp3-icon-outdated::before{
+ content:""; }
+
+.bp3-icon-page-layout::before{
+ content:""; }
+
+.bp3-icon-panel-stats::before{
+ content:""; }
+
+.bp3-icon-panel-table::before{
+ content:""; }
+
+.bp3-icon-paperclip::before{
+ content:""; }
+
+.bp3-icon-paragraph::before{
+ content:""; }
+
+.bp3-icon-path::before{
+ content:""; }
+
+.bp3-icon-path-search::before{
+ content:""; }
+
+.bp3-icon-pause::before{
+ content:""; }
+
+.bp3-icon-people::before{
+ content:""; }
+
+.bp3-icon-percentage::before{
+ content:""; }
+
+.bp3-icon-person::before{
+ content:""; }
+
+.bp3-icon-phone::before{
+ content:"☎"; }
+
+.bp3-icon-pie-chart::before{
+ content:""; }
+
+.bp3-icon-pin::before{
+ content:""; }
+
+.bp3-icon-pivot::before{
+ content:""; }
+
+.bp3-icon-pivot-table::before{
+ content:""; }
+
+.bp3-icon-play::before{
+ content:""; }
+
+.bp3-icon-plus::before{
+ content:"+"; }
+
+.bp3-icon-polygon-filter::before{
+ content:""; }
+
+.bp3-icon-power::before{
+ content:""; }
+
+.bp3-icon-predictive-analysis::before{
+ content:""; }
+
+.bp3-icon-prescription::before{
+ content:""; }
+
+.bp3-icon-presentation::before{
+ content:""; }
+
+.bp3-icon-print::before{
+ content:"⎙"; }
+
+.bp3-icon-projects::before{
+ content:""; }
+
+.bp3-icon-properties::before{
+ content:""; }
+
+.bp3-icon-property::before{
+ content:""; }
+
+.bp3-icon-publish-function::before{
+ content:""; }
+
+.bp3-icon-pulse::before{
+ content:""; }
+
+.bp3-icon-random::before{
+ content:""; }
+
+.bp3-icon-record::before{
+ content:""; }
+
+.bp3-icon-redo::before{
+ content:""; }
+
+.bp3-icon-refresh::before{
+ content:""; }
+
+.bp3-icon-regression-chart::before{
+ content:""; }
+
+.bp3-icon-remove::before{
+ content:""; }
+
+.bp3-icon-remove-column::before{
+ content:""; }
+
+.bp3-icon-remove-column-left::before{
+ content:""; }
+
+.bp3-icon-remove-column-right::before{
+ content:""; }
+
+.bp3-icon-remove-row-bottom::before{
+ content:""; }
+
+.bp3-icon-remove-row-top::before{
+ content:""; }
+
+.bp3-icon-repeat::before{
+ content:""; }
+
+.bp3-icon-reset::before{
+ content:""; }
+
+.bp3-icon-resolve::before{
+ content:""; }
+
+.bp3-icon-rig::before{
+ content:""; }
+
+.bp3-icon-right-join::before{
+ content:""; }
+
+.bp3-icon-ring::before{
+ content:""; }
+
+.bp3-icon-rotate-document::before{
+ content:""; }
+
+.bp3-icon-rotate-page::before{
+ content:""; }
+
+.bp3-icon-satellite::before{
+ content:""; }
+
+.bp3-icon-saved::before{
+ content:""; }
+
+.bp3-icon-scatter-plot::before{
+ content:""; }
+
+.bp3-icon-search::before{
+ content:""; }
+
+.bp3-icon-search-around::before{
+ content:""; }
+
+.bp3-icon-search-template::before{
+ content:""; }
+
+.bp3-icon-search-text::before{
+ content:""; }
+
+.bp3-icon-segmented-control::before{
+ content:""; }
+
+.bp3-icon-select::before{
+ content:""; }
+
+.bp3-icon-selection::before{
+ content:"⦿"; }
+
+.bp3-icon-send-to::before{
+ content:""; }
+
+.bp3-icon-send-to-graph::before{
+ content:""; }
+
+.bp3-icon-send-to-map::before{
+ content:""; }
+
+.bp3-icon-series-add::before{
+ content:""; }
+
+.bp3-icon-series-configuration::before{
+ content:""; }
+
+.bp3-icon-series-derived::before{
+ content:""; }
+
+.bp3-icon-series-filtered::before{
+ content:""; }
+
+.bp3-icon-series-search::before{
+ content:""; }
+
+.bp3-icon-settings::before{
+ content:""; }
+
+.bp3-icon-share::before{
+ content:""; }
+
+.bp3-icon-shield::before{
+ content:""; }
+
+.bp3-icon-shop::before{
+ content:""; }
+
+.bp3-icon-shopping-cart::before{
+ content:""; }
+
+.bp3-icon-signal-search::before{
+ content:""; }
+
+.bp3-icon-sim-card::before{
+ content:""; }
+
+.bp3-icon-slash::before{
+ content:""; }
+
+.bp3-icon-small-cross::before{
+ content:""; }
+
+.bp3-icon-small-minus::before{
+ content:""; }
+
+.bp3-icon-small-plus::before{
+ content:""; }
+
+.bp3-icon-small-tick::before{
+ content:""; }
+
+.bp3-icon-snowflake::before{
+ content:""; }
+
+.bp3-icon-social-media::before{
+ content:""; }
+
+.bp3-icon-sort::before{
+ content:""; }
+
+.bp3-icon-sort-alphabetical::before{
+ content:""; }
+
+.bp3-icon-sort-alphabetical-desc::before{
+ content:""; }
+
+.bp3-icon-sort-asc::before{
+ content:""; }
+
+.bp3-icon-sort-desc::before{
+ content:""; }
+
+.bp3-icon-sort-numerical::before{
+ content:""; }
+
+.bp3-icon-sort-numerical-desc::before{
+ content:""; }
+
+.bp3-icon-split-columns::before{
+ content:""; }
+
+.bp3-icon-square::before{
+ content:""; }
+
+.bp3-icon-stacked-chart::before{
+ content:""; }
+
+.bp3-icon-star::before{
+ content:"★"; }
+
+.bp3-icon-star-empty::before{
+ content:"☆"; }
+
+.bp3-icon-step-backward::before{
+ content:""; }
+
+.bp3-icon-step-chart::before{
+ content:""; }
+
+.bp3-icon-step-forward::before{
+ content:""; }
+
+.bp3-icon-stop::before{
+ content:""; }
+
+.bp3-icon-stopwatch::before{
+ content:""; }
+
+.bp3-icon-strikethrough::before{
+ content:""; }
+
+.bp3-icon-style::before{
+ content:""; }
+
+.bp3-icon-swap-horizontal::before{
+ content:""; }
+
+.bp3-icon-swap-vertical::before{
+ content:""; }
+
+.bp3-icon-symbol-circle::before{
+ content:""; }
+
+.bp3-icon-symbol-cross::before{
+ content:""; }
+
+.bp3-icon-symbol-diamond::before{
+ content:""; }
+
+.bp3-icon-symbol-square::before{
+ content:""; }
+
+.bp3-icon-symbol-triangle-down::before{
+ content:""; }
+
+.bp3-icon-symbol-triangle-up::before{
+ content:""; }
+
+.bp3-icon-tag::before{
+ content:""; }
+
+.bp3-icon-take-action::before{
+ content:""; }
+
+.bp3-icon-taxi::before{
+ content:""; }
+
+.bp3-icon-text-highlight::before{
+ content:""; }
+
+.bp3-icon-th::before{
+ content:""; }
+
+.bp3-icon-th-derived::before{
+ content:""; }
+
+.bp3-icon-th-disconnect::before{
+ content:""; }
+
+.bp3-icon-th-filtered::before{
+ content:""; }
+
+.bp3-icon-th-list::before{
+ content:""; }
+
+.bp3-icon-thumbs-down::before{
+ content:""; }
+
+.bp3-icon-thumbs-up::before{
+ content:""; }
+
+.bp3-icon-tick::before{
+ content:"✓"; }
+
+.bp3-icon-tick-circle::before{
+ content:""; }
+
+.bp3-icon-time::before{
+ content:"⏲"; }
+
+.bp3-icon-timeline-area-chart::before{
+ content:""; }
+
+.bp3-icon-timeline-bar-chart::before{
+ content:""; }
+
+.bp3-icon-timeline-events::before{
+ content:""; }
+
+.bp3-icon-timeline-line-chart::before{
+ content:""; }
+
+.bp3-icon-tint::before{
+ content:""; }
+
+.bp3-icon-torch::before{
+ content:""; }
+
+.bp3-icon-tractor::before{
+ content:""; }
+
+.bp3-icon-train::before{
+ content:""; }
+
+.bp3-icon-translate::before{
+ content:""; }
+
+.bp3-icon-trash::before{
+ content:""; }
+
+.bp3-icon-tree::before{
+ content:""; }
+
+.bp3-icon-trending-down::before{
+ content:""; }
+
+.bp3-icon-trending-up::before{
+ content:""; }
+
+.bp3-icon-truck::before{
+ content:""; }
+
+.bp3-icon-two-columns::before{
+ content:""; }
+
+.bp3-icon-unarchive::before{
+ content:""; }
+
+.bp3-icon-underline::before{
+ content:"⎁"; }
+
+.bp3-icon-undo::before{
+ content:"⎌"; }
+
+.bp3-icon-ungroup-objects::before{
+ content:""; }
+
+.bp3-icon-unknown-vehicle::before{
+ content:""; }
+
+.bp3-icon-unlock::before{
+ content:""; }
+
+.bp3-icon-unpin::before{
+ content:""; }
+
+.bp3-icon-unresolve::before{
+ content:""; }
+
+.bp3-icon-updated::before{
+ content:""; }
+
+.bp3-icon-upload::before{
+ content:""; }
+
+.bp3-icon-user::before{
+ content:""; }
+
+.bp3-icon-variable::before{
+ content:""; }
+
+.bp3-icon-vertical-bar-chart-asc::before{
+ content:""; }
+
+.bp3-icon-vertical-bar-chart-desc::before{
+ content:""; }
+
+.bp3-icon-vertical-distribution::before{
+ content:""; }
+
+.bp3-icon-video::before{
+ content:""; }
+
+.bp3-icon-volume-down::before{
+ content:""; }
+
+.bp3-icon-volume-off::before{
+ content:""; }
+
+.bp3-icon-volume-up::before{
+ content:""; }
+
+.bp3-icon-walk::before{
+ content:""; }
+
+.bp3-icon-warning-sign::before{
+ content:""; }
+
+.bp3-icon-waterfall-chart::before{
+ content:""; }
+
+.bp3-icon-widget::before{
+ content:""; }
+
+.bp3-icon-widget-button::before{
+ content:""; }
+
+.bp3-icon-widget-footer::before{
+ content:""; }
+
+.bp3-icon-widget-header::before{
+ content:""; }
+
+.bp3-icon-wrench::before{
+ content:""; }
+
+.bp3-icon-zoom-in::before{
+ content:""; }
+
+.bp3-icon-zoom-out::before{
+ content:""; }
+
+.bp3-icon-zoom-to-fit::before{
+ content:""; }
+.bp3-submenu > .bp3-popover-wrapper{
+ display:block; }
+
+.bp3-submenu .bp3-popover-target{
+ display:block; }
+
+.bp3-submenu.bp3-popover{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ padding:0 5px; }
+ .bp3-submenu.bp3-popover > .bp3-popover-content{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2); }
+ .bp3-dark .bp3-submenu.bp3-popover, .bp3-submenu.bp3-popover.bp3-dark{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-dark .bp3-submenu.bp3-popover > .bp3-popover-content, .bp3-submenu.bp3-popover.bp3-dark > .bp3-popover-content{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
+.bp3-menu{
+ margin:0;
+ border-radius:3px;
+ background:#ffffff;
+ min-width:180px;
+ padding:5px;
+ list-style:none;
+ text-align:left;
+ color:#182026; }
+
+.bp3-menu-divider{
+ display:block;
+ margin:5px;
+ border-top:1px solid rgba(16, 22, 26, 0.15); }
+ .bp3-dark .bp3-menu-divider{
+ border-top-color:rgba(255, 255, 255, 0.15); }
+
+.bp3-menu-item{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:start;
+ -ms-flex-align:start;
+ align-items:flex-start;
+ border-radius:2px;
+ padding:5px 7px;
+ text-decoration:none;
+ line-height:20px;
+ color:inherit;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-menu-item > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-menu-item > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-menu-item::before,
+ .bp3-menu-item > *{
+ margin-right:7px; }
+ .bp3-menu-item:empty::before,
+ .bp3-menu-item > :last-child{
+ margin-right:0; }
+ .bp3-menu-item > .bp3-fill{
+ word-break:break-word; }
+ .bp3-menu-item:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-menu-item{
+ background-color:rgba(167, 182, 194, 0.3);
+ cursor:pointer;
+ text-decoration:none; }
+ .bp3-menu-item.bp3-disabled{
+ background-color:inherit;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-dark .bp3-menu-item{
+ color:inherit; }
+ .bp3-dark .bp3-menu-item:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-menu-item{
+ background-color:rgba(138, 155, 168, 0.15);
+ color:inherit; }
+ .bp3-dark .bp3-menu-item.bp3-disabled{
+ background-color:inherit;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-menu-item.bp3-intent-primary{
+ color:#106ba3; }
+ .bp3-menu-item.bp3-intent-primary .bp3-icon{
+ color:inherit; }
+ .bp3-menu-item.bp3-intent-primary::before, .bp3-menu-item.bp3-intent-primary::after,
+ .bp3-menu-item.bp3-intent-primary .bp3-menu-item-label{
+ color:#106ba3; }
+ .bp3-menu-item.bp3-intent-primary:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-menu-item.bp3-intent-primary.bp3-active{
+ background-color:#137cbd; }
+ .bp3-menu-item.bp3-intent-primary:active{
+ background-color:#106ba3; }
+ .bp3-menu-item.bp3-intent-primary:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-menu-item.bp3-intent-primary:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::before, .bp3-menu-item.bp3-intent-primary:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::after,
+ .bp3-menu-item.bp3-intent-primary:hover .bp3-menu-item-label,
+ .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-primary:active, .bp3-menu-item.bp3-intent-primary:active::before, .bp3-menu-item.bp3-intent-primary:active::after,
+ .bp3-menu-item.bp3-intent-primary:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-primary.bp3-active, .bp3-menu-item.bp3-intent-primary.bp3-active::before, .bp3-menu-item.bp3-intent-primary.bp3-active::after,
+ .bp3-menu-item.bp3-intent-primary.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+ .bp3-menu-item.bp3-intent-success{
+ color:#0d8050; }
+ .bp3-menu-item.bp3-intent-success .bp3-icon{
+ color:inherit; }
+ .bp3-menu-item.bp3-intent-success::before, .bp3-menu-item.bp3-intent-success::after,
+ .bp3-menu-item.bp3-intent-success .bp3-menu-item-label{
+ color:#0d8050; }
+ .bp3-menu-item.bp3-intent-success:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-menu-item.bp3-intent-success.bp3-active{
+ background-color:#0f9960; }
+ .bp3-menu-item.bp3-intent-success:active{
+ background-color:#0d8050; }
+ .bp3-menu-item.bp3-intent-success:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-menu-item.bp3-intent-success:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::before, .bp3-menu-item.bp3-intent-success:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::after,
+ .bp3-menu-item.bp3-intent-success:hover .bp3-menu-item-label,
+ .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-success:active, .bp3-menu-item.bp3-intent-success:active::before, .bp3-menu-item.bp3-intent-success:active::after,
+ .bp3-menu-item.bp3-intent-success:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-success.bp3-active, .bp3-menu-item.bp3-intent-success.bp3-active::before, .bp3-menu-item.bp3-intent-success.bp3-active::after,
+ .bp3-menu-item.bp3-intent-success.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+ .bp3-menu-item.bp3-intent-warning{
+ color:#bf7326; }
+ .bp3-menu-item.bp3-intent-warning .bp3-icon{
+ color:inherit; }
+ .bp3-menu-item.bp3-intent-warning::before, .bp3-menu-item.bp3-intent-warning::after,
+ .bp3-menu-item.bp3-intent-warning .bp3-menu-item-label{
+ color:#bf7326; }
+ .bp3-menu-item.bp3-intent-warning:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-menu-item.bp3-intent-warning.bp3-active{
+ background-color:#d9822b; }
+ .bp3-menu-item.bp3-intent-warning:active{
+ background-color:#bf7326; }
+ .bp3-menu-item.bp3-intent-warning:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-menu-item.bp3-intent-warning:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::before, .bp3-menu-item.bp3-intent-warning:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::after,
+ .bp3-menu-item.bp3-intent-warning:hover .bp3-menu-item-label,
+ .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-warning:active, .bp3-menu-item.bp3-intent-warning:active::before, .bp3-menu-item.bp3-intent-warning:active::after,
+ .bp3-menu-item.bp3-intent-warning:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-warning.bp3-active, .bp3-menu-item.bp3-intent-warning.bp3-active::before, .bp3-menu-item.bp3-intent-warning.bp3-active::after,
+ .bp3-menu-item.bp3-intent-warning.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+ .bp3-menu-item.bp3-intent-danger{
+ color:#c23030; }
+ .bp3-menu-item.bp3-intent-danger .bp3-icon{
+ color:inherit; }
+ .bp3-menu-item.bp3-intent-danger::before, .bp3-menu-item.bp3-intent-danger::after,
+ .bp3-menu-item.bp3-intent-danger .bp3-menu-item-label{
+ color:#c23030; }
+ .bp3-menu-item.bp3-intent-danger:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-menu-item.bp3-intent-danger.bp3-active{
+ background-color:#db3737; }
+ .bp3-menu-item.bp3-intent-danger:active{
+ background-color:#c23030; }
+ .bp3-menu-item.bp3-intent-danger:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-menu-item.bp3-intent-danger:hover::before, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::before, .bp3-menu-item.bp3-intent-danger:hover::after, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::after,
+ .bp3-menu-item.bp3-intent-danger:hover .bp3-menu-item-label,
+ .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item .bp3-menu-item-label, .bp3-menu-item.bp3-intent-danger:active, .bp3-menu-item.bp3-intent-danger:active::before, .bp3-menu-item.bp3-intent-danger:active::after,
+ .bp3-menu-item.bp3-intent-danger:active .bp3-menu-item-label, .bp3-menu-item.bp3-intent-danger.bp3-active, .bp3-menu-item.bp3-intent-danger.bp3-active::before, .bp3-menu-item.bp3-intent-danger.bp3-active::after,
+ .bp3-menu-item.bp3-intent-danger.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+ .bp3-menu-item::before{
+ line-height:1;
+ font-family:"Icons16", sans-serif;
+ font-size:16px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ margin-right:7px; }
+ .bp3-menu-item::before,
+ .bp3-menu-item > .bp3-icon{
+ margin-top:2px;
+ color:#5c7080; }
+ .bp3-menu-item .bp3-menu-item-label{
+ color:#5c7080; }
+ .bp3-menu-item:hover, .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-menu-item{
+ color:inherit; }
+ .bp3-menu-item.bp3-active, .bp3-menu-item:active{
+ background-color:rgba(115, 134, 148, 0.3); }
+ .bp3-menu-item.bp3-disabled{
+ outline:none !important;
+ background-color:inherit !important;
+ cursor:not-allowed !important;
+ color:rgba(92, 112, 128, 0.6) !important; }
+ .bp3-menu-item.bp3-disabled::before,
+ .bp3-menu-item.bp3-disabled > .bp3-icon,
+ .bp3-menu-item.bp3-disabled .bp3-menu-item-label{
+ color:rgba(92, 112, 128, 0.6) !important; }
+ .bp3-large .bp3-menu-item{
+ padding:9px 7px;
+ line-height:22px;
+ font-size:16px; }
+ .bp3-large .bp3-menu-item .bp3-icon{
+ margin-top:3px; }
+ .bp3-large .bp3-menu-item::before{
+ line-height:1;
+ font-family:"Icons20", sans-serif;
+ font-size:20px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ margin-top:1px;
+ margin-right:10px; }
+
+button.bp3-menu-item{
+ border:none;
+ background:none;
+ width:100%;
+ text-align:left; }
+.bp3-menu-header{
+ display:block;
+ margin:5px;
+ border-top:1px solid rgba(16, 22, 26, 0.15);
+ cursor:default;
+ padding-left:2px; }
+ .bp3-dark .bp3-menu-header{
+ border-top-color:rgba(255, 255, 255, 0.15); }
+ .bp3-menu-header:first-of-type{
+ border-top:none; }
+ .bp3-menu-header > h6{
+ color:#182026;
+ font-weight:600;
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal;
+ margin:0;
+ padding:10px 7px 0 1px;
+ line-height:17px; }
+ .bp3-dark .bp3-menu-header > h6{
+ color:#f5f8fa; }
+ .bp3-menu-header:first-of-type > h6{
+ padding-top:0; }
+ .bp3-large .bp3-menu-header > h6{
+ padding-top:15px;
+ padding-bottom:5px;
+ font-size:18px; }
+ .bp3-large .bp3-menu-header:first-of-type > h6{
+ padding-top:0; }
+
+.bp3-dark .bp3-menu{
+ background:#30404d;
+ color:#f5f8fa; }
+
+.bp3-dark .bp3-menu-item.bp3-intent-primary{
+ color:#48aff0; }
+ .bp3-dark .bp3-menu-item.bp3-intent-primary .bp3-icon{
+ color:inherit; }
+ .bp3-dark .bp3-menu-item.bp3-intent-primary::before, .bp3-dark .bp3-menu-item.bp3-intent-primary::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-primary .bp3-menu-item-label{
+ color:#48aff0; }
+ .bp3-dark .bp3-menu-item.bp3-intent-primary:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active{
+ background-color:#137cbd; }
+ .bp3-dark .bp3-menu-item.bp3-intent-primary:active{
+ background-color:#106ba3; }
+ .bp3-dark .bp3-menu-item.bp3-intent-primary:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-primary:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-primary:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-primary:hover .bp3-menu-item-label,
+ .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item .bp3-menu-item-label,
+ .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-primary.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-primary:active, .bp3-dark .bp3-menu-item.bp3-intent-primary:active::before, .bp3-dark .bp3-menu-item.bp3-intent-primary:active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-primary:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-primary.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+
+.bp3-dark .bp3-menu-item.bp3-intent-success{
+ color:#3dcc91; }
+ .bp3-dark .bp3-menu-item.bp3-intent-success .bp3-icon{
+ color:inherit; }
+ .bp3-dark .bp3-menu-item.bp3-intent-success::before, .bp3-dark .bp3-menu-item.bp3-intent-success::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-success .bp3-menu-item-label{
+ color:#3dcc91; }
+ .bp3-dark .bp3-menu-item.bp3-intent-success:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active{
+ background-color:#0f9960; }
+ .bp3-dark .bp3-menu-item.bp3-intent-success:active{
+ background-color:#0d8050; }
+ .bp3-dark .bp3-menu-item.bp3-intent-success:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-success:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-success:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-success:hover .bp3-menu-item-label,
+ .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item .bp3-menu-item-label,
+ .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-success.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-success:active, .bp3-dark .bp3-menu-item.bp3-intent-success:active::before, .bp3-dark .bp3-menu-item.bp3-intent-success:active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-success:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-success.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+
+.bp3-dark .bp3-menu-item.bp3-intent-warning{
+ color:#ffb366; }
+ .bp3-dark .bp3-menu-item.bp3-intent-warning .bp3-icon{
+ color:inherit; }
+ .bp3-dark .bp3-menu-item.bp3-intent-warning::before, .bp3-dark .bp3-menu-item.bp3-intent-warning::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-warning .bp3-menu-item-label{
+ color:#ffb366; }
+ .bp3-dark .bp3-menu-item.bp3-intent-warning:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active{
+ background-color:#d9822b; }
+ .bp3-dark .bp3-menu-item.bp3-intent-warning:active{
+ background-color:#bf7326; }
+ .bp3-dark .bp3-menu-item.bp3-intent-warning:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-warning:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-warning:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-warning:hover .bp3-menu-item-label,
+ .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item .bp3-menu-item-label,
+ .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-warning.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-warning:active, .bp3-dark .bp3-menu-item.bp3-intent-warning:active::before, .bp3-dark .bp3-menu-item.bp3-intent-warning:active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-warning:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-warning.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+
+.bp3-dark .bp3-menu-item.bp3-intent-danger{
+ color:#ff7373; }
+ .bp3-dark .bp3-menu-item.bp3-intent-danger .bp3-icon{
+ color:inherit; }
+ .bp3-dark .bp3-menu-item.bp3-intent-danger::before, .bp3-dark .bp3-menu-item.bp3-intent-danger::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-danger .bp3-menu-item-label{
+ color:#ff7373; }
+ .bp3-dark .bp3-menu-item.bp3-intent-danger:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active{
+ background-color:#db3737; }
+ .bp3-dark .bp3-menu-item.bp3-intent-danger:active{
+ background-color:#c23030; }
+ .bp3-dark .bp3-menu-item.bp3-intent-danger:hover, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item, .bp3-dark .bp3-menu-item.bp3-intent-danger:hover::before, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::before, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::before, .bp3-dark .bp3-menu-item.bp3-intent-danger:hover::after, .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::after, .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-danger:hover .bp3-menu-item-label,
+ .bp3-dark .bp3-submenu .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item .bp3-menu-item-label,
+ .bp3-submenu .bp3-dark .bp3-popover-target.bp3-popover-open > .bp3-intent-danger.bp3-menu-item .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-danger:active, .bp3-dark .bp3-menu-item.bp3-intent-danger:active::before, .bp3-dark .bp3-menu-item.bp3-intent-danger:active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-danger:active .bp3-menu-item-label, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active::before, .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active::after,
+ .bp3-dark .bp3-menu-item.bp3-intent-danger.bp3-active .bp3-menu-item-label{
+ color:#ffffff; }
+
+.bp3-dark .bp3-menu-item::before,
+.bp3-dark .bp3-menu-item > .bp3-icon{
+ color:#a7b6c2; }
+
+.bp3-dark .bp3-menu-item .bp3-menu-item-label{
+ color:#a7b6c2; }
+
+.bp3-dark .bp3-menu-item.bp3-active, .bp3-dark .bp3-menu-item:active{
+ background-color:rgba(138, 155, 168, 0.3); }
+
+.bp3-dark .bp3-menu-item.bp3-disabled{
+ color:rgba(167, 182, 194, 0.6) !important; }
+ .bp3-dark .bp3-menu-item.bp3-disabled::before,
+ .bp3-dark .bp3-menu-item.bp3-disabled > .bp3-icon,
+ .bp3-dark .bp3-menu-item.bp3-disabled .bp3-menu-item-label{
+ color:rgba(167, 182, 194, 0.6) !important; }
+
+.bp3-dark .bp3-menu-divider,
+.bp3-dark .bp3-menu-header{
+ border-color:rgba(255, 255, 255, 0.15); }
+
+.bp3-dark .bp3-menu-header > h6{
+ color:#f5f8fa; }
+
+.bp3-label .bp3-menu{
+ margin-top:5px; }
+.bp3-navbar{
+ position:relative;
+ z-index:10;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.2);
+ background-color:#ffffff;
+ width:100%;
+ height:50px;
+ padding:0 15px; }
+ .bp3-navbar.bp3-dark,
+ .bp3-dark .bp3-navbar{
+ background-color:#394b59; }
+ .bp3-navbar.bp3-dark{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-navbar{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 0 0 rgba(16, 22, 26, 0), 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-navbar.bp3-fixed-top{
+ position:fixed;
+ top:0;
+ right:0;
+ left:0; }
+
+.bp3-navbar-heading{
+ margin-right:15px;
+ font-size:16px; }
+
+.bp3-navbar-group{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ height:50px; }
+ .bp3-navbar-group.bp3-align-left{
+ float:left; }
+ .bp3-navbar-group.bp3-align-right{
+ float:right; }
+
+.bp3-navbar-divider{
+ margin:0 10px;
+ border-left:1px solid rgba(16, 22, 26, 0.15);
+ height:20px; }
+ .bp3-dark .bp3-navbar-divider{
+ border-left-color:rgba(255, 255, 255, 0.15); }
+.bp3-non-ideal-state{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ width:100%;
+ height:100%;
+ text-align:center; }
+ .bp3-non-ideal-state > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-non-ideal-state > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-non-ideal-state::before,
+ .bp3-non-ideal-state > *{
+ margin-bottom:20px; }
+ .bp3-non-ideal-state:empty::before,
+ .bp3-non-ideal-state > :last-child{
+ margin-bottom:0; }
+ .bp3-non-ideal-state > *{
+ max-width:400px; }
+
+.bp3-non-ideal-state-visual{
+ color:rgba(92, 112, 128, 0.6);
+ font-size:60px; }
+ .bp3-dark .bp3-non-ideal-state-visual{
+ color:rgba(167, 182, 194, 0.6); }
+
+.bp3-overflow-list{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -ms-flex-wrap:nowrap;
+ flex-wrap:nowrap;
+ min-width:0; }
+
+.bp3-overflow-list-spacer{
+ -ms-flex-negative:1;
+ flex-shrink:1;
+ width:1px; }
+
+body.bp3-overlay-open{
+ overflow:hidden; }
+
+.bp3-overlay{
+ position:static;
+ top:0;
+ right:0;
+ bottom:0;
+ left:0;
+ z-index:20; }
+ .bp3-overlay:not(.bp3-overlay-open){
+ pointer-events:none; }
+ .bp3-overlay.bp3-overlay-container{
+ position:fixed;
+ overflow:hidden; }
+ .bp3-overlay.bp3-overlay-container.bp3-overlay-inline{
+ position:absolute; }
+ .bp3-overlay.bp3-overlay-scroll-container{
+ position:fixed;
+ overflow:auto; }
+ .bp3-overlay.bp3-overlay-scroll-container.bp3-overlay-inline{
+ position:absolute; }
+ .bp3-overlay.bp3-overlay-inline{
+ display:inline;
+ overflow:visible; }
+
+.bp3-overlay-content{
+ position:fixed;
+ z-index:20; }
+ .bp3-overlay-inline .bp3-overlay-content,
+ .bp3-overlay-scroll-container .bp3-overlay-content{
+ position:absolute; }
+
+.bp3-overlay-backdrop{
+ position:fixed;
+ top:0;
+ right:0;
+ bottom:0;
+ left:0;
+ opacity:1;
+ z-index:20;
+ background-color:rgba(16, 22, 26, 0.7);
+ overflow:auto;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-overlay-backdrop.bp3-overlay-enter, .bp3-overlay-backdrop.bp3-overlay-appear{
+ opacity:0; }
+ .bp3-overlay-backdrop.bp3-overlay-enter-active, .bp3-overlay-backdrop.bp3-overlay-appear-active{
+ opacity:1;
+ -webkit-transition-property:opacity;
+ transition-property:opacity;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-overlay-backdrop.bp3-overlay-exit{
+ opacity:1; }
+ .bp3-overlay-backdrop.bp3-overlay-exit-active{
+ opacity:0;
+ -webkit-transition-property:opacity;
+ transition-property:opacity;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-overlay-backdrop:focus{
+ outline:none; }
+ .bp3-overlay-inline .bp3-overlay-backdrop{
+ position:absolute; }
+.bp3-panel-stack{
+ position:relative;
+ overflow:hidden; }
+
+.bp3-panel-stack-header{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -ms-flex-negative:0;
+ flex-shrink:0;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-shadow:0 1px rgba(16, 22, 26, 0.15);
+ box-shadow:0 1px rgba(16, 22, 26, 0.15);
+ height:30px; }
+ .bp3-dark .bp3-panel-stack-header{
+ -webkit-box-shadow:0 1px rgba(255, 255, 255, 0.15);
+ box-shadow:0 1px rgba(255, 255, 255, 0.15); }
+ .bp3-panel-stack-header > span{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:1;
+ -ms-flex:1;
+ flex:1;
+ -webkit-box-align:stretch;
+ -ms-flex-align:stretch;
+ align-items:stretch; }
+ .bp3-panel-stack-header .bp3-heading{
+ margin:0 5px; }
+
+.bp3-button.bp3-panel-stack-header-back{
+ margin-left:5px;
+ padding-left:0;
+ white-space:nowrap; }
+ .bp3-button.bp3-panel-stack-header-back .bp3-icon{
+ margin:0 2px; }
+
+.bp3-panel-stack-view{
+ position:absolute;
+ top:0;
+ right:0;
+ bottom:0;
+ left:0;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ z-index:1;
+ margin-right:-1px;
+ border-right:1px solid rgba(16, 22, 26, 0.15);
+ background-color:#ffffff;
+ overflow-y:auto; }
+ .bp3-dark .bp3-panel-stack-view{
+ background-color:#30404d; }
+ .bp3-panel-stack-view:nth-last-child(n + 4){
+ display:none; }
+
+.bp3-panel-stack-push .bp3-panel-stack-enter, .bp3-panel-stack-push .bp3-panel-stack-appear{
+ -webkit-transform:translateX(100%);
+ transform:translateX(100%);
+ opacity:0; }
+
+.bp3-panel-stack-push .bp3-panel-stack-enter-active, .bp3-panel-stack-push .bp3-panel-stack-appear-active{
+ -webkit-transform:translate(0%);
+ transform:translate(0%);
+ opacity:1;
+ -webkit-transition-property:opacity, -webkit-transform;
+ transition-property:opacity, -webkit-transform;
+ transition-property:transform, opacity;
+ transition-property:transform, opacity, -webkit-transform;
+ -webkit-transition-duration:400ms;
+ transition-duration:400ms;
+ -webkit-transition-timing-function:ease;
+ transition-timing-function:ease;
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+
+.bp3-panel-stack-push .bp3-panel-stack-exit{
+ -webkit-transform:translate(0%);
+ transform:translate(0%);
+ opacity:1; }
+
+.bp3-panel-stack-push .bp3-panel-stack-exit-active{
+ -webkit-transform:translateX(-50%);
+ transform:translateX(-50%);
+ opacity:0;
+ -webkit-transition-property:opacity, -webkit-transform;
+ transition-property:opacity, -webkit-transform;
+ transition-property:transform, opacity;
+ transition-property:transform, opacity, -webkit-transform;
+ -webkit-transition-duration:400ms;
+ transition-duration:400ms;
+ -webkit-transition-timing-function:ease;
+ transition-timing-function:ease;
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+
+.bp3-panel-stack-pop .bp3-panel-stack-enter, .bp3-panel-stack-pop .bp3-panel-stack-appear{
+ -webkit-transform:translateX(-50%);
+ transform:translateX(-50%);
+ opacity:0; }
+
+.bp3-panel-stack-pop .bp3-panel-stack-enter-active, .bp3-panel-stack-pop .bp3-panel-stack-appear-active{
+ -webkit-transform:translate(0%);
+ transform:translate(0%);
+ opacity:1;
+ -webkit-transition-property:opacity, -webkit-transform;
+ transition-property:opacity, -webkit-transform;
+ transition-property:transform, opacity;
+ transition-property:transform, opacity, -webkit-transform;
+ -webkit-transition-duration:400ms;
+ transition-duration:400ms;
+ -webkit-transition-timing-function:ease;
+ transition-timing-function:ease;
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+
+.bp3-panel-stack-pop .bp3-panel-stack-exit{
+ -webkit-transform:translate(0%);
+ transform:translate(0%);
+ opacity:1; }
+
+.bp3-panel-stack-pop .bp3-panel-stack-exit-active{
+ -webkit-transform:translateX(100%);
+ transform:translateX(100%);
+ opacity:0;
+ -webkit-transition-property:opacity, -webkit-transform;
+ transition-property:opacity, -webkit-transform;
+ transition-property:transform, opacity;
+ transition-property:transform, opacity, -webkit-transform;
+ -webkit-transition-duration:400ms;
+ transition-duration:400ms;
+ -webkit-transition-timing-function:ease;
+ transition-timing-function:ease;
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+.bp3-popover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ -webkit-transform:scale(1);
+ transform:scale(1);
+ display:inline-block;
+ z-index:20;
+ border-radius:3px; }
+ .bp3-popover .bp3-popover-arrow{
+ position:absolute;
+ width:30px;
+ height:30px; }
+ .bp3-popover .bp3-popover-arrow::before{
+ margin:5px;
+ width:20px;
+ height:20px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-popover{
+ margin-top:-17px;
+ margin-bottom:17px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-popover > .bp3-popover-arrow{
+ bottom:-11px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-popover > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(-90deg);
+ transform:rotate(-90deg); }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-popover{
+ margin-left:17px; }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-popover > .bp3-popover-arrow{
+ left:-11px; }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-popover > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(0);
+ transform:rotate(0); }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-popover{
+ margin-top:17px; }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-popover > .bp3-popover-arrow{
+ top:-11px; }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-popover > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(90deg);
+ transform:rotate(90deg); }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-popover{
+ margin-right:17px;
+ margin-left:-17px; }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-popover > .bp3-popover-arrow{
+ right:-11px; }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-popover > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(180deg);
+ transform:rotate(180deg); }
+ .bp3-tether-element-attached-middle > .bp3-popover > .bp3-popover-arrow{
+ top:50%;
+ -webkit-transform:translateY(-50%);
+ transform:translateY(-50%); }
+ .bp3-tether-element-attached-center > .bp3-popover > .bp3-popover-arrow{
+ right:50%;
+ -webkit-transform:translateX(50%);
+ transform:translateX(50%); }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-top > .bp3-popover > .bp3-popover-arrow{
+ top:-0.3934px; }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-right > .bp3-popover > .bp3-popover-arrow{
+ right:-0.3934px; }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-left > .bp3-popover > .bp3-popover-arrow{
+ left:-0.3934px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-bottom > .bp3-popover > .bp3-popover-arrow{
+ bottom:-0.3934px; }
+ .bp3-tether-element-attached-top.bp3-tether-element-attached-left > .bp3-popover{
+ -webkit-transform-origin:top left;
+ transform-origin:top left; }
+ .bp3-tether-element-attached-top.bp3-tether-element-attached-center > .bp3-popover{
+ -webkit-transform-origin:top center;
+ transform-origin:top center; }
+ .bp3-tether-element-attached-top.bp3-tether-element-attached-right > .bp3-popover{
+ -webkit-transform-origin:top right;
+ transform-origin:top right; }
+ .bp3-tether-element-attached-middle.bp3-tether-element-attached-left > .bp3-popover{
+ -webkit-transform-origin:center left;
+ transform-origin:center left; }
+ .bp3-tether-element-attached-middle.bp3-tether-element-attached-center > .bp3-popover{
+ -webkit-transform-origin:center center;
+ transform-origin:center center; }
+ .bp3-tether-element-attached-middle.bp3-tether-element-attached-right > .bp3-popover{
+ -webkit-transform-origin:center right;
+ transform-origin:center right; }
+ .bp3-tether-element-attached-bottom.bp3-tether-element-attached-left > .bp3-popover{
+ -webkit-transform-origin:bottom left;
+ transform-origin:bottom left; }
+ .bp3-tether-element-attached-bottom.bp3-tether-element-attached-center > .bp3-popover{
+ -webkit-transform-origin:bottom center;
+ transform-origin:bottom center; }
+ .bp3-tether-element-attached-bottom.bp3-tether-element-attached-right > .bp3-popover{
+ -webkit-transform-origin:bottom right;
+ transform-origin:bottom right; }
+ .bp3-popover .bp3-popover-content{
+ background:#ffffff;
+ color:inherit; }
+ .bp3-popover .bp3-popover-arrow::before{
+ -webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2);
+ box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2); }
+ .bp3-popover .bp3-popover-arrow-border{
+ fill:#10161a;
+ fill-opacity:0.1; }
+ .bp3-popover .bp3-popover-arrow-fill{
+ fill:#ffffff; }
+ .bp3-popover-enter > .bp3-popover, .bp3-popover-appear > .bp3-popover{
+ -webkit-transform:scale(0.3);
+ transform:scale(0.3); }
+ .bp3-popover-enter-active > .bp3-popover, .bp3-popover-appear-active > .bp3-popover{
+ -webkit-transform:scale(1);
+ transform:scale(1);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:300ms;
+ transition-duration:300ms;
+ -webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-popover-exit > .bp3-popover{
+ -webkit-transform:scale(1);
+ transform:scale(1); }
+ .bp3-popover-exit-active > .bp3-popover{
+ -webkit-transform:scale(0.3);
+ transform:scale(0.3);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:300ms;
+ transition-duration:300ms;
+ -webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-popover .bp3-popover-content{
+ position:relative;
+ border-radius:3px; }
+ .bp3-popover.bp3-popover-content-sizing .bp3-popover-content{
+ max-width:350px;
+ padding:20px; }
+ .bp3-popover-target + .bp3-overlay .bp3-popover.bp3-popover-content-sizing{
+ width:350px; }
+ .bp3-popover.bp3-minimal{
+ margin:0 !important; }
+ .bp3-popover.bp3-minimal .bp3-popover-arrow{
+ display:none; }
+ .bp3-popover.bp3-minimal.bp3-popover{
+ -webkit-transform:scale(1);
+ transform:scale(1); }
+ .bp3-popover-enter > .bp3-popover.bp3-minimal.bp3-popover, .bp3-popover-appear > .bp3-popover.bp3-minimal.bp3-popover{
+ -webkit-transform:scale(1);
+ transform:scale(1); }
+ .bp3-popover-enter-active > .bp3-popover.bp3-minimal.bp3-popover, .bp3-popover-appear-active > .bp3-popover.bp3-minimal.bp3-popover{
+ -webkit-transform:scale(1);
+ transform:scale(1);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-popover-exit > .bp3-popover.bp3-minimal.bp3-popover{
+ -webkit-transform:scale(1);
+ transform:scale(1); }
+ .bp3-popover-exit-active > .bp3-popover.bp3-minimal.bp3-popover{
+ -webkit-transform:scale(1);
+ transform:scale(1);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-popover.bp3-dark,
+ .bp3-dark .bp3-popover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
+ .bp3-popover.bp3-dark .bp3-popover-content,
+ .bp3-dark .bp3-popover .bp3-popover-content{
+ background:#30404d;
+ color:inherit; }
+ .bp3-popover.bp3-dark .bp3-popover-arrow::before,
+ .bp3-dark .bp3-popover .bp3-popover-arrow::before{
+ -webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4);
+ box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4); }
+ .bp3-popover.bp3-dark .bp3-popover-arrow-border,
+ .bp3-dark .bp3-popover .bp3-popover-arrow-border{
+ fill:#10161a;
+ fill-opacity:0.2; }
+ .bp3-popover.bp3-dark .bp3-popover-arrow-fill,
+ .bp3-dark .bp3-popover .bp3-popover-arrow-fill{
+ fill:#30404d; }
+
+.bp3-popover-arrow::before{
+ display:block;
+ position:absolute;
+ -webkit-transform:rotate(45deg);
+ transform:rotate(45deg);
+ border-radius:2px;
+ content:""; }
+
+.bp3-tether-pinned .bp3-popover-arrow{
+ display:none; }
+
+.bp3-popover-backdrop{
+ background:rgba(255, 255, 255, 0); }
+
+.bp3-transition-container{
+ opacity:1;
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ z-index:20; }
+ .bp3-transition-container.bp3-popover-enter, .bp3-transition-container.bp3-popover-appear{
+ opacity:0; }
+ .bp3-transition-container.bp3-popover-enter-active, .bp3-transition-container.bp3-popover-appear-active{
+ opacity:1;
+ -webkit-transition-property:opacity;
+ transition-property:opacity;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-transition-container.bp3-popover-exit{
+ opacity:1; }
+ .bp3-transition-container.bp3-popover-exit-active{
+ opacity:0;
+ -webkit-transition-property:opacity;
+ transition-property:opacity;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-transition-container:focus{
+ outline:none; }
+ .bp3-transition-container.bp3-popover-leave .bp3-popover-content{
+ pointer-events:none; }
+ .bp3-transition-container[data-x-out-of-boundaries]{
+ display:none; }
+
+span.bp3-popover-target{
+ display:inline-block; }
+
+.bp3-popover-wrapper.bp3-fill{
+ width:100%; }
+
+.bp3-portal{
+ position:absolute;
+ top:0;
+ right:0;
+ left:0; }
+@-webkit-keyframes linear-progress-bar-stripes{
+ from{
+ background-position:0 0; }
+ to{
+ background-position:30px 0; } }
+@keyframes linear-progress-bar-stripes{
+ from{
+ background-position:0 0; }
+ to{
+ background-position:30px 0; } }
+
+.bp3-progress-bar{
+ display:block;
+ position:relative;
+ border-radius:40px;
+ background:rgba(92, 112, 128, 0.2);
+ width:100%;
+ height:8px;
+ overflow:hidden; }
+ .bp3-progress-bar .bp3-progress-meter{
+ position:absolute;
+ border-radius:40px;
+ background:linear-gradient(-45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%);
+ background-color:rgba(92, 112, 128, 0.8);
+ background-size:30px 30px;
+ width:100%;
+ height:100%;
+ -webkit-transition:width 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:width 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-progress-bar:not(.bp3-no-animation):not(.bp3-no-stripes) .bp3-progress-meter{
+ animation:linear-progress-bar-stripes 300ms linear infinite reverse; }
+ .bp3-progress-bar.bp3-no-stripes .bp3-progress-meter{
+ background-image:none; }
+
+.bp3-dark .bp3-progress-bar{
+ background:rgba(16, 22, 26, 0.5); }
+ .bp3-dark .bp3-progress-bar .bp3-progress-meter{
+ background-color:#8a9ba8; }
+
+.bp3-progress-bar.bp3-intent-primary .bp3-progress-meter{
+ background-color:#137cbd; }
+
+.bp3-progress-bar.bp3-intent-success .bp3-progress-meter{
+ background-color:#0f9960; }
+
+.bp3-progress-bar.bp3-intent-warning .bp3-progress-meter{
+ background-color:#d9822b; }
+
+.bp3-progress-bar.bp3-intent-danger .bp3-progress-meter{
+ background-color:#db3737; }
+@-webkit-keyframes skeleton-glow{
+ from{
+ border-color:rgba(206, 217, 224, 0.2);
+ background:rgba(206, 217, 224, 0.2); }
+ to{
+ border-color:rgba(92, 112, 128, 0.2);
+ background:rgba(92, 112, 128, 0.2); } }
+@keyframes skeleton-glow{
+ from{
+ border-color:rgba(206, 217, 224, 0.2);
+ background:rgba(206, 217, 224, 0.2); }
+ to{
+ border-color:rgba(92, 112, 128, 0.2);
+ background:rgba(92, 112, 128, 0.2); } }
+.bp3-skeleton{
+ border-color:rgba(206, 217, 224, 0.2) !important;
+ border-radius:2px;
+ -webkit-box-shadow:none !important;
+ box-shadow:none !important;
+ background:rgba(206, 217, 224, 0.2);
+ background-clip:padding-box !important;
+ cursor:default;
+ color:transparent !important;
+ -webkit-animation:1000ms linear infinite alternate skeleton-glow;
+ animation:1000ms linear infinite alternate skeleton-glow;
+ pointer-events:none;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-skeleton::before, .bp3-skeleton::after,
+ .bp3-skeleton *{
+ visibility:hidden !important; }
+.bp3-slider{
+ width:100%;
+ min-width:150px;
+ height:40px;
+ position:relative;
+ outline:none;
+ cursor:default;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-slider:hover{
+ cursor:pointer; }
+ .bp3-slider:active{
+ cursor:-webkit-grabbing;
+ cursor:grabbing; }
+ .bp3-slider.bp3-disabled{
+ opacity:0.5;
+ cursor:not-allowed; }
+ .bp3-slider.bp3-slider-unlabeled{
+ height:16px; }
+
+.bp3-slider-track,
+.bp3-slider-progress{
+ top:5px;
+ right:0;
+ left:0;
+ height:6px;
+ position:absolute; }
+
+.bp3-slider-track{
+ border-radius:3px;
+ overflow:hidden; }
+
+.bp3-slider-progress{
+ background:rgba(92, 112, 128, 0.2); }
+ .bp3-dark .bp3-slider-progress{
+ background:rgba(16, 22, 26, 0.5); }
+ .bp3-slider-progress.bp3-intent-primary{
+ background-color:#137cbd; }
+ .bp3-slider-progress.bp3-intent-success{
+ background-color:#0f9960; }
+ .bp3-slider-progress.bp3-intent-warning{
+ background-color:#d9822b; }
+ .bp3-slider-progress.bp3-intent-danger{
+ background-color:#db3737; }
+
+.bp3-slider-handle{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-color:#f5f8fa;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.8)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0));
+ color:#182026;
+ position:absolute;
+ top:0;
+ left:0;
+ border-radius:3px;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
+ cursor:pointer;
+ width:16px;
+ height:16px; }
+ .bp3-slider-handle:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-clip:padding-box;
+ background-color:#ebf1f5; }
+ .bp3-slider-handle:active, .bp3-slider-handle.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#d8e1e8;
+ background-image:none; }
+ .bp3-slider-handle:disabled, .bp3-slider-handle.bp3-disabled{
+ outline:none;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(206, 217, 224, 0.5);
+ background-image:none;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-slider-handle:disabled.bp3-active, .bp3-slider-handle:disabled.bp3-active:hover, .bp3-slider-handle.bp3-disabled.bp3-active, .bp3-slider-handle.bp3-disabled.bp3-active:hover{
+ background:rgba(206, 217, 224, 0.7); }
+ .bp3-slider-handle:focus{
+ z-index:1; }
+ .bp3-slider-handle:hover{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 -1px 0 rgba(16, 22, 26, 0.1);
+ background-clip:padding-box;
+ background-color:#ebf1f5;
+ z-index:2;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 1px 1px rgba(16, 22, 26, 0.2);
+ cursor:-webkit-grab;
+ cursor:grab; }
+ .bp3-slider-handle.bp3-active{
+ -webkit-box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:inset 0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#d8e1e8;
+ background-image:none;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 1px rgba(16, 22, 26, 0.1);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), inset 0 1px 1px rgba(16, 22, 26, 0.1);
+ cursor:-webkit-grabbing;
+ cursor:grabbing; }
+ .bp3-disabled .bp3-slider-handle{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:#bfccd6;
+ pointer-events:none; }
+ .bp3-dark .bp3-slider-handle{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#394b59;
+ background-image:-webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0.05)), to(rgba(255, 255, 255, 0)));
+ background-image:linear-gradient(to bottom, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0));
+ color:#f5f8fa; }
+ .bp3-dark .bp3-slider-handle:hover, .bp3-dark .bp3-slider-handle:active, .bp3-dark .bp3-slider-handle.bp3-active{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-slider-handle:hover{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.4);
+ background-color:#30404d; }
+ .bp3-dark .bp3-slider-handle:active, .bp3-dark .bp3-slider-handle.bp3-active{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.6), inset 0 1px 2px rgba(16, 22, 26, 0.2);
+ background-color:#202b33;
+ background-image:none; }
+ .bp3-dark .bp3-slider-handle:disabled, .bp3-dark .bp3-slider-handle.bp3-disabled{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(57, 75, 89, 0.5);
+ background-image:none;
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-slider-handle:disabled.bp3-active, .bp3-dark .bp3-slider-handle.bp3-disabled.bp3-active{
+ background:rgba(57, 75, 89, 0.7); }
+ .bp3-dark .bp3-slider-handle .bp3-button-spinner .bp3-spinner-head{
+ background:rgba(16, 22, 26, 0.5);
+ stroke:#8a9ba8; }
+ .bp3-dark .bp3-slider-handle, .bp3-dark .bp3-slider-handle:hover{
+ background-color:#394b59; }
+ .bp3-dark .bp3-slider-handle.bp3-active{
+ background-color:#293742; }
+ .bp3-dark .bp3-disabled .bp3-slider-handle{
+ border-color:#5c7080;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:#5c7080; }
+ .bp3-slider-handle .bp3-slider-label{
+ margin-left:8px;
+ border-radius:3px;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ background:#394b59;
+ color:#f5f8fa; }
+ .bp3-dark .bp3-slider-handle .bp3-slider-label{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ background:#e1e8ed;
+ color:#394b59; }
+ .bp3-disabled .bp3-slider-handle .bp3-slider-label{
+ -webkit-box-shadow:none;
+ box-shadow:none; }
+ .bp3-slider-handle.bp3-start, .bp3-slider-handle.bp3-end{
+ width:8px; }
+ .bp3-slider-handle.bp3-start{
+ border-top-right-radius:0;
+ border-bottom-right-radius:0; }
+ .bp3-slider-handle.bp3-end{
+ margin-left:8px;
+ border-top-left-radius:0;
+ border-bottom-left-radius:0; }
+ .bp3-slider-handle.bp3-end .bp3-slider-label{
+ margin-left:0; }
+
+.bp3-slider-label{
+ -webkit-transform:translate(-50%, 20px);
+ transform:translate(-50%, 20px);
+ display:inline-block;
+ position:absolute;
+ padding:2px 5px;
+ vertical-align:top;
+ line-height:1;
+ font-size:12px; }
+
+.bp3-slider.bp3-vertical{
+ width:40px;
+ min-width:40px;
+ height:150px; }
+ .bp3-slider.bp3-vertical .bp3-slider-track,
+ .bp3-slider.bp3-vertical .bp3-slider-progress{
+ top:0;
+ bottom:0;
+ left:5px;
+ width:6px;
+ height:auto; }
+ .bp3-slider.bp3-vertical .bp3-slider-progress{
+ top:auto; }
+ .bp3-slider.bp3-vertical .bp3-slider-label{
+ -webkit-transform:translate(20px, 50%);
+ transform:translate(20px, 50%); }
+ .bp3-slider.bp3-vertical .bp3-slider-handle{
+ top:auto; }
+ .bp3-slider.bp3-vertical .bp3-slider-handle .bp3-slider-label{
+ margin-top:-8px;
+ margin-left:0; }
+ .bp3-slider.bp3-vertical .bp3-slider-handle.bp3-end, .bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start{
+ margin-left:0;
+ width:16px;
+ height:8px; }
+ .bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start{
+ border-top-left-radius:0;
+ border-bottom-right-radius:3px; }
+ .bp3-slider.bp3-vertical .bp3-slider-handle.bp3-start .bp3-slider-label{
+ -webkit-transform:translate(20px);
+ transform:translate(20px); }
+ .bp3-slider.bp3-vertical .bp3-slider-handle.bp3-end{
+ margin-bottom:8px;
+ border-top-left-radius:3px;
+ border-bottom-left-radius:0;
+ border-bottom-right-radius:0; }
+
+@-webkit-keyframes pt-spinner-animation{
+ from{
+ -webkit-transform:rotate(0deg);
+ transform:rotate(0deg); }
+ to{
+ -webkit-transform:rotate(360deg);
+ transform:rotate(360deg); } }
+
+@keyframes pt-spinner-animation{
+ from{
+ -webkit-transform:rotate(0deg);
+ transform:rotate(0deg); }
+ to{
+ -webkit-transform:rotate(360deg);
+ transform:rotate(360deg); } }
+
+.bp3-spinner{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -webkit-box-pack:center;
+ -ms-flex-pack:center;
+ justify-content:center;
+ overflow:visible;
+ vertical-align:middle; }
+ .bp3-spinner svg{
+ display:block; }
+ .bp3-spinner path{
+ fill-opacity:0; }
+ .bp3-spinner .bp3-spinner-head{
+ -webkit-transform-origin:center;
+ transform-origin:center;
+ -webkit-transition:stroke-dashoffset 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:stroke-dashoffset 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ stroke:rgba(92, 112, 128, 0.8);
+ stroke-linecap:round; }
+ .bp3-spinner .bp3-spinner-track{
+ stroke:rgba(92, 112, 128, 0.2); }
+
+.bp3-spinner-animation{
+ -webkit-animation:pt-spinner-animation 500ms linear infinite;
+ animation:pt-spinner-animation 500ms linear infinite; }
+ .bp3-no-spin > .bp3-spinner-animation{
+ -webkit-animation:none;
+ animation:none; }
+
+.bp3-dark .bp3-spinner .bp3-spinner-head{
+ stroke:#8a9ba8; }
+
+.bp3-dark .bp3-spinner .bp3-spinner-track{
+ stroke:rgba(16, 22, 26, 0.5); }
+
+.bp3-spinner.bp3-intent-primary .bp3-spinner-head{
+ stroke:#137cbd; }
+
+.bp3-spinner.bp3-intent-success .bp3-spinner-head{
+ stroke:#0f9960; }
+
+.bp3-spinner.bp3-intent-warning .bp3-spinner-head{
+ stroke:#d9822b; }
+
+.bp3-spinner.bp3-intent-danger .bp3-spinner-head{
+ stroke:#db3737; }
+.bp3-tabs.bp3-vertical{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex; }
+ .bp3-tabs.bp3-vertical > .bp3-tab-list{
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ -webkit-box-align:start;
+ -ms-flex-align:start;
+ align-items:flex-start; }
+ .bp3-tabs.bp3-vertical > .bp3-tab-list .bp3-tab{
+ border-radius:3px;
+ width:100%;
+ padding:0 10px; }
+ .bp3-tabs.bp3-vertical > .bp3-tab-list .bp3-tab[aria-selected="true"]{
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:rgba(19, 124, 189, 0.2); }
+ .bp3-tabs.bp3-vertical > .bp3-tab-list .bp3-tab-indicator-wrapper .bp3-tab-indicator{
+ top:0;
+ right:0;
+ bottom:0;
+ left:0;
+ border-radius:3px;
+ background-color:rgba(19, 124, 189, 0.2);
+ height:auto; }
+ .bp3-tabs.bp3-vertical > .bp3-tab-panel{
+ margin-top:0;
+ padding-left:20px; }
+
+.bp3-tab-list{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ -webkit-box-align:end;
+ -ms-flex-align:end;
+ align-items:flex-end;
+ position:relative;
+ margin:0;
+ border:none;
+ padding:0;
+ list-style:none; }
+ .bp3-tab-list > *:not(:last-child){
+ margin-right:20px; }
+
+.bp3-tab{
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal;
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ position:relative;
+ cursor:pointer;
+ max-width:100%;
+ vertical-align:top;
+ line-height:30px;
+ color:#182026;
+ font-size:14px; }
+ .bp3-tab a{
+ display:block;
+ text-decoration:none;
+ color:inherit; }
+ .bp3-tab-indicator-wrapper ~ .bp3-tab{
+ -webkit-box-shadow:none !important;
+ box-shadow:none !important;
+ background-color:transparent !important; }
+ .bp3-tab[aria-disabled="true"]{
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-tab[aria-selected="true"]{
+ border-radius:0;
+ -webkit-box-shadow:inset 0 -3px 0 #106ba3;
+ box-shadow:inset 0 -3px 0 #106ba3; }
+ .bp3-tab[aria-selected="true"], .bp3-tab:not([aria-disabled="true"]):hover{
+ color:#106ba3; }
+ .bp3-tab:focus{
+ -moz-outline-radius:0; }
+ .bp3-large > .bp3-tab{
+ line-height:40px;
+ font-size:16px; }
+
+.bp3-tab-panel{
+ margin-top:20px; }
+ .bp3-tab-panel[aria-hidden="true"]{
+ display:none; }
+
+.bp3-tab-indicator-wrapper{
+ position:absolute;
+ top:0;
+ left:0;
+ -webkit-transform:translateX(0), translateY(0);
+ transform:translateX(0), translateY(0);
+ -webkit-transition:height, width, -webkit-transform;
+ transition:height, width, -webkit-transform;
+ transition:height, transform, width;
+ transition:height, transform, width, -webkit-transform;
+ -webkit-transition-duration:200ms;
+ transition-duration:200ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ pointer-events:none; }
+ .bp3-tab-indicator-wrapper .bp3-tab-indicator{
+ position:absolute;
+ right:0;
+ bottom:0;
+ left:0;
+ background-color:#106ba3;
+ height:3px; }
+ .bp3-tab-indicator-wrapper.bp3-no-animation{
+ -webkit-transition:none;
+ transition:none; }
+
+.bp3-dark .bp3-tab{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-tab[aria-disabled="true"]{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-tab[aria-selected="true"]{
+ -webkit-box-shadow:inset 0 -3px 0 #48aff0;
+ box-shadow:inset 0 -3px 0 #48aff0; }
+ .bp3-dark .bp3-tab[aria-selected="true"], .bp3-dark .bp3-tab:not([aria-disabled="true"]):hover{
+ color:#48aff0; }
+
+.bp3-dark .bp3-tab-indicator{
+ background-color:#48aff0; }
+
+.bp3-flex-expander{
+ -webkit-box-flex:1;
+ -ms-flex:1 1;
+ flex:1 1; }
+.bp3-tag{
+ display:-webkit-inline-box;
+ display:-ms-inline-flexbox;
+ display:inline-flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ position:relative;
+ border:none;
+ border-radius:3px;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background-color:#5c7080;
+ min-width:20px;
+ max-width:100%;
+ min-height:20px;
+ padding:2px 6px;
+ line-height:16px;
+ color:#f5f8fa;
+ font-size:12px; }
+ .bp3-tag.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-interactive:hover{
+ background-color:rgba(92, 112, 128, 0.85); }
+ .bp3-tag.bp3-interactive.bp3-active, .bp3-tag.bp3-interactive:active{
+ background-color:rgba(92, 112, 128, 0.7); }
+ .bp3-tag > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-tag > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-tag::before,
+ .bp3-tag > *{
+ margin-right:4px; }
+ .bp3-tag:empty::before,
+ .bp3-tag > :last-child{
+ margin-right:0; }
+ .bp3-tag:focus{
+ outline:rgba(19, 124, 189, 0.6) auto 2px;
+ outline-offset:0;
+ -moz-outline-radius:6px; }
+ .bp3-tag.bp3-round{
+ border-radius:30px;
+ padding-right:8px;
+ padding-left:8px; }
+ .bp3-dark .bp3-tag{
+ background-color:#bfccd6;
+ color:#182026; }
+ .bp3-dark .bp3-tag.bp3-interactive{
+ cursor:pointer; }
+ .bp3-dark .bp3-tag.bp3-interactive:hover{
+ background-color:rgba(191, 204, 214, 0.85); }
+ .bp3-dark .bp3-tag.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-interactive:active{
+ background-color:rgba(191, 204, 214, 0.7); }
+ .bp3-dark .bp3-tag > .bp3-icon, .bp3-dark .bp3-tag .bp3-icon-standard, .bp3-dark .bp3-tag .bp3-icon-large{
+ fill:currentColor; }
+ .bp3-tag > .bp3-icon, .bp3-tag .bp3-icon-standard, .bp3-tag .bp3-icon-large{
+ fill:#ffffff; }
+ .bp3-tag.bp3-large,
+ .bp3-large .bp3-tag{
+ min-width:30px;
+ min-height:30px;
+ padding:0 10px;
+ line-height:20px;
+ font-size:14px; }
+ .bp3-tag.bp3-large::before,
+ .bp3-tag.bp3-large > *,
+ .bp3-large .bp3-tag::before,
+ .bp3-large .bp3-tag > *{
+ margin-right:7px; }
+ .bp3-tag.bp3-large:empty::before,
+ .bp3-tag.bp3-large > :last-child,
+ .bp3-large .bp3-tag:empty::before,
+ .bp3-large .bp3-tag > :last-child{
+ margin-right:0; }
+ .bp3-tag.bp3-large.bp3-round,
+ .bp3-large .bp3-tag.bp3-round{
+ padding-right:12px;
+ padding-left:12px; }
+ .bp3-tag.bp3-intent-primary{
+ background:#137cbd;
+ color:#ffffff; }
+ .bp3-tag.bp3-intent-primary.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-intent-primary.bp3-interactive:hover{
+ background-color:rgba(19, 124, 189, 0.85); }
+ .bp3-tag.bp3-intent-primary.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-primary.bp3-interactive:active{
+ background-color:rgba(19, 124, 189, 0.7); }
+ .bp3-tag.bp3-intent-success{
+ background:#0f9960;
+ color:#ffffff; }
+ .bp3-tag.bp3-intent-success.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-intent-success.bp3-interactive:hover{
+ background-color:rgba(15, 153, 96, 0.85); }
+ .bp3-tag.bp3-intent-success.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-success.bp3-interactive:active{
+ background-color:rgba(15, 153, 96, 0.7); }
+ .bp3-tag.bp3-intent-warning{
+ background:#d9822b;
+ color:#ffffff; }
+ .bp3-tag.bp3-intent-warning.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-intent-warning.bp3-interactive:hover{
+ background-color:rgba(217, 130, 43, 0.85); }
+ .bp3-tag.bp3-intent-warning.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-warning.bp3-interactive:active{
+ background-color:rgba(217, 130, 43, 0.7); }
+ .bp3-tag.bp3-intent-danger{
+ background:#db3737;
+ color:#ffffff; }
+ .bp3-tag.bp3-intent-danger.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-intent-danger.bp3-interactive:hover{
+ background-color:rgba(219, 55, 55, 0.85); }
+ .bp3-tag.bp3-intent-danger.bp3-interactive.bp3-active, .bp3-tag.bp3-intent-danger.bp3-interactive:active{
+ background-color:rgba(219, 55, 55, 0.7); }
+ .bp3-tag.bp3-fill{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ width:100%; }
+ .bp3-tag.bp3-minimal > .bp3-icon, .bp3-tag.bp3-minimal .bp3-icon-standard, .bp3-tag.bp3-minimal .bp3-icon-large{
+ fill:#5c7080; }
+ .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]){
+ background-color:rgba(138, 155, 168, 0.2);
+ color:#182026; }
+ .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:hover{
+ background-color:rgba(92, 112, 128, 0.3); }
+ .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive.bp3-active, .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:active{
+ background-color:rgba(92, 112, 128, 0.4); }
+ .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]){
+ color:#f5f8fa; }
+ .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive{
+ cursor:pointer; }
+ .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:hover{
+ background-color:rgba(191, 204, 214, 0.3); }
+ .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]).bp3-interactive:active{
+ background-color:rgba(191, 204, 214, 0.4); }
+ .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]) > .bp3-icon, .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]) .bp3-icon-standard, .bp3-dark .bp3-tag.bp3-minimal:not([class*="bp3-intent-"]) .bp3-icon-large{
+ fill:#a7b6c2; }
+ .bp3-tag.bp3-minimal.bp3-intent-primary{
+ background-color:rgba(19, 124, 189, 0.15);
+ color:#106ba3; }
+ .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:hover{
+ background-color:rgba(19, 124, 189, 0.25); }
+ .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:active{
+ background-color:rgba(19, 124, 189, 0.35); }
+ .bp3-tag.bp3-minimal.bp3-intent-primary > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-primary .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-primary .bp3-icon-large{
+ fill:#137cbd; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary{
+ background-color:rgba(19, 124, 189, 0.25);
+ color:#48aff0; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive{
+ cursor:pointer; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:hover{
+ background-color:rgba(19, 124, 189, 0.35); }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-primary.bp3-interactive:active{
+ background-color:rgba(19, 124, 189, 0.45); }
+ .bp3-tag.bp3-minimal.bp3-intent-success{
+ background-color:rgba(15, 153, 96, 0.15);
+ color:#0d8050; }
+ .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:hover{
+ background-color:rgba(15, 153, 96, 0.25); }
+ .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:active{
+ background-color:rgba(15, 153, 96, 0.35); }
+ .bp3-tag.bp3-minimal.bp3-intent-success > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-success .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-success .bp3-icon-large{
+ fill:#0f9960; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success{
+ background-color:rgba(15, 153, 96, 0.25);
+ color:#3dcc91; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive{
+ cursor:pointer; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:hover{
+ background-color:rgba(15, 153, 96, 0.35); }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-success.bp3-interactive:active{
+ background-color:rgba(15, 153, 96, 0.45); }
+ .bp3-tag.bp3-minimal.bp3-intent-warning{
+ background-color:rgba(217, 130, 43, 0.15);
+ color:#bf7326; }
+ .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:hover{
+ background-color:rgba(217, 130, 43, 0.25); }
+ .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:active{
+ background-color:rgba(217, 130, 43, 0.35); }
+ .bp3-tag.bp3-minimal.bp3-intent-warning > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-warning .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-warning .bp3-icon-large{
+ fill:#d9822b; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning{
+ background-color:rgba(217, 130, 43, 0.25);
+ color:#ffb366; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive{
+ cursor:pointer; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:hover{
+ background-color:rgba(217, 130, 43, 0.35); }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-warning.bp3-interactive:active{
+ background-color:rgba(217, 130, 43, 0.45); }
+ .bp3-tag.bp3-minimal.bp3-intent-danger{
+ background-color:rgba(219, 55, 55, 0.15);
+ color:#c23030; }
+ .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive{
+ cursor:pointer; }
+ .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:hover{
+ background-color:rgba(219, 55, 55, 0.25); }
+ .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive.bp3-active, .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:active{
+ background-color:rgba(219, 55, 55, 0.35); }
+ .bp3-tag.bp3-minimal.bp3-intent-danger > .bp3-icon, .bp3-tag.bp3-minimal.bp3-intent-danger .bp3-icon-standard, .bp3-tag.bp3-minimal.bp3-intent-danger .bp3-icon-large{
+ fill:#db3737; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger{
+ background-color:rgba(219, 55, 55, 0.25);
+ color:#ff7373; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive{
+ cursor:pointer; }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:hover{
+ background-color:rgba(219, 55, 55, 0.35); }
+ .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive.bp3-active, .bp3-dark .bp3-tag.bp3-minimal.bp3-intent-danger.bp3-interactive:active{
+ background-color:rgba(219, 55, 55, 0.45); }
+
+.bp3-tag-remove{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ opacity:0.5;
+ margin-top:-2px;
+ margin-right:-6px !important;
+ margin-bottom:-2px;
+ border:none;
+ background:none;
+ cursor:pointer;
+ padding:2px;
+ padding-left:0;
+ color:inherit; }
+ .bp3-tag-remove:hover{
+ opacity:0.8;
+ background:none;
+ text-decoration:none; }
+ .bp3-tag-remove:active{
+ opacity:1; }
+ .bp3-tag-remove:empty::before{
+ line-height:1;
+ font-family:"Icons16", sans-serif;
+ font-size:16px;
+ font-weight:400;
+ font-style:normal;
+ -moz-osx-font-smoothing:grayscale;
+ -webkit-font-smoothing:antialiased;
+ content:""; }
+ .bp3-large .bp3-tag-remove{
+ margin-right:-10px !important;
+ padding:5px;
+ padding-left:0; }
+ .bp3-large .bp3-tag-remove:empty::before{
+ line-height:1;
+ font-family:"Icons20", sans-serif;
+ font-size:20px;
+ font-weight:400;
+ font-style:normal; }
+.bp3-tag-input{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -webkit-box-align:start;
+ -ms-flex-align:start;
+ align-items:flex-start;
+ cursor:text;
+ height:auto;
+ min-height:30px;
+ padding-right:0;
+ padding-left:5px;
+ line-height:inherit; }
+ .bp3-tag-input > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-tag-input > .bp3-tag-input-values{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-tag-input .bp3-tag-input-icon{
+ margin-top:7px;
+ margin-right:7px;
+ margin-left:2px;
+ color:#5c7080; }
+ .bp3-tag-input .bp3-tag-input-values{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-orient:horizontal;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:row;
+ flex-direction:row;
+ -ms-flex-wrap:wrap;
+ flex-wrap:wrap;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ -ms-flex-item-align:stretch;
+ align-self:stretch;
+ margin-top:5px;
+ margin-right:7px;
+ min-width:0; }
+ .bp3-tag-input .bp3-tag-input-values > *{
+ -webkit-box-flex:0;
+ -ms-flex-positive:0;
+ flex-grow:0;
+ -ms-flex-negative:0;
+ flex-shrink:0; }
+ .bp3-tag-input .bp3-tag-input-values > .bp3-fill{
+ -webkit-box-flex:1;
+ -ms-flex-positive:1;
+ flex-grow:1;
+ -ms-flex-negative:1;
+ flex-shrink:1; }
+ .bp3-tag-input .bp3-tag-input-values::before,
+ .bp3-tag-input .bp3-tag-input-values > *{
+ margin-right:5px; }
+ .bp3-tag-input .bp3-tag-input-values:empty::before,
+ .bp3-tag-input .bp3-tag-input-values > :last-child{
+ margin-right:0; }
+ .bp3-tag-input .bp3-tag-input-values:first-child .bp3-input-ghost:first-child{
+ padding-left:5px; }
+ .bp3-tag-input .bp3-tag-input-values > *{
+ margin-bottom:5px; }
+ .bp3-tag-input .bp3-tag{
+ overflow-wrap:break-word; }
+ .bp3-tag-input .bp3-tag.bp3-active{
+ outline:rgba(19, 124, 189, 0.6) auto 2px;
+ outline-offset:0;
+ -moz-outline-radius:6px; }
+ .bp3-tag-input .bp3-input-ghost{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ width:80px;
+ line-height:20px; }
+ .bp3-tag-input .bp3-input-ghost:disabled, .bp3-tag-input .bp3-input-ghost.bp3-disabled{
+ cursor:not-allowed; }
+ .bp3-tag-input .bp3-button,
+ .bp3-tag-input .bp3-spinner{
+ margin:3px;
+ margin-left:0; }
+ .bp3-tag-input .bp3-button{
+ min-width:24px;
+ min-height:24px;
+ padding:0 7px; }
+ .bp3-tag-input.bp3-large{
+ height:auto;
+ min-height:40px; }
+ .bp3-tag-input.bp3-large::before,
+ .bp3-tag-input.bp3-large > *{
+ margin-right:10px; }
+ .bp3-tag-input.bp3-large:empty::before,
+ .bp3-tag-input.bp3-large > :last-child{
+ margin-right:0; }
+ .bp3-tag-input.bp3-large .bp3-tag-input-icon{
+ margin-top:10px;
+ margin-left:5px; }
+ .bp3-tag-input.bp3-large .bp3-input-ghost{
+ line-height:30px; }
+ .bp3-tag-input.bp3-large .bp3-button{
+ min-width:30px;
+ min-height:30px;
+ padding:5px 10px;
+ margin:5px;
+ margin-left:0; }
+ .bp3-tag-input.bp3-large .bp3-spinner{
+ margin:8px;
+ margin-left:0; }
+ .bp3-tag-input.bp3-active{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ background-color:#ffffff; }
+ .bp3-tag-input.bp3-active.bp3-intent-primary{
+ -webkit-box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-tag-input.bp3-active.bp3-intent-success{
+ -webkit-box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-tag-input.bp3-active.bp3-intent-warning{
+ -webkit-box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-tag-input.bp3-active.bp3-intent-danger{
+ -webkit-box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.2); }
+ .bp3-dark .bp3-tag-input .bp3-tag-input-icon, .bp3-tag-input.bp3-dark .bp3-tag-input-icon{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-tag-input .bp3-input-ghost, .bp3-tag-input.bp3-dark .bp3-input-ghost{
+ color:#f5f8fa; }
+ .bp3-dark .bp3-tag-input .bp3-input-ghost::-webkit-input-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::-webkit-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-tag-input .bp3-input-ghost::-moz-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::-moz-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-tag-input .bp3-input-ghost:-ms-input-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost:-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-tag-input .bp3-input-ghost::-ms-input-placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::-ms-input-placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-tag-input .bp3-input-ghost::placeholder, .bp3-tag-input.bp3-dark .bp3-input-ghost::placeholder{
+ color:rgba(167, 182, 194, 0.6); }
+ .bp3-dark .bp3-tag-input.bp3-active, .bp3-tag-input.bp3-dark.bp3-active{
+ -webkit-box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #137cbd, 0 0 0 1px #137cbd, 0 0 0 3px rgba(19, 124, 189, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ background-color:rgba(16, 22, 26, 0.3); }
+ .bp3-dark .bp3-tag-input.bp3-active.bp3-intent-primary, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-primary{
+ -webkit-box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #106ba3, 0 0 0 3px rgba(16, 107, 163, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-tag-input.bp3-active.bp3-intent-success, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-success{
+ -webkit-box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #0d8050, 0 0 0 3px rgba(13, 128, 80, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-tag-input.bp3-active.bp3-intent-warning, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-warning{
+ -webkit-box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #bf7326, 0 0 0 3px rgba(191, 115, 38, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+ .bp3-dark .bp3-tag-input.bp3-active.bp3-intent-danger, .bp3-tag-input.bp3-dark.bp3-active.bp3-intent-danger{
+ -webkit-box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px #c23030, 0 0 0 3px rgba(194, 48, 48, 0.3), inset 0 0 0 1px rgba(16, 22, 26, 0.3), inset 0 1px 1px rgba(16, 22, 26, 0.4); }
+
+.bp3-input-ghost{
+ border:none;
+ -webkit-box-shadow:none;
+ box-shadow:none;
+ background:none;
+ padding:0; }
+ .bp3-input-ghost::-webkit-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input-ghost::-moz-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input-ghost:-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input-ghost::-ms-input-placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input-ghost::placeholder{
+ opacity:1;
+ color:rgba(92, 112, 128, 0.6); }
+ .bp3-input-ghost:focus{
+ outline:none !important; }
+.bp3-toast{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:start;
+ -ms-flex-align:start;
+ align-items:flex-start;
+ position:relative !important;
+ margin:20px 0 0;
+ border-radius:3px;
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ background-color:#ffffff;
+ min-width:300px;
+ max-width:500px;
+ pointer-events:all; }
+ .bp3-toast.bp3-toast-enter, .bp3-toast.bp3-toast-appear{
+ -webkit-transform:translateY(-40px);
+ transform:translateY(-40px); }
+ .bp3-toast.bp3-toast-enter-active, .bp3-toast.bp3-toast-appear-active{
+ -webkit-transform:translateY(0);
+ transform:translateY(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:300ms;
+ transition-duration:300ms;
+ -webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-toast.bp3-toast-enter ~ .bp3-toast, .bp3-toast.bp3-toast-appear ~ .bp3-toast{
+ -webkit-transform:translateY(-40px);
+ transform:translateY(-40px); }
+ .bp3-toast.bp3-toast-enter-active ~ .bp3-toast, .bp3-toast.bp3-toast-appear-active ~ .bp3-toast{
+ -webkit-transform:translateY(0);
+ transform:translateY(0);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:300ms;
+ transition-duration:300ms;
+ -webkit-transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ transition-timing-function:cubic-bezier(0.54, 1.12, 0.38, 1.11);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-toast.bp3-toast-exit{
+ opacity:1;
+ -webkit-filter:blur(0);
+ filter:blur(0); }
+ .bp3-toast.bp3-toast-exit-active{
+ opacity:0;
+ -webkit-filter:blur(10px);
+ filter:blur(10px);
+ -webkit-transition-property:opacity, -webkit-filter;
+ transition-property:opacity, -webkit-filter;
+ transition-property:opacity, filter;
+ transition-property:opacity, filter, -webkit-filter;
+ -webkit-transition-duration:300ms;
+ transition-duration:300ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-toast.bp3-toast-exit ~ .bp3-toast{
+ -webkit-transform:translateY(0);
+ transform:translateY(0); }
+ .bp3-toast.bp3-toast-exit-active ~ .bp3-toast{
+ -webkit-transform:translateY(-40px);
+ transform:translateY(-40px);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:50ms;
+ transition-delay:50ms; }
+ .bp3-toast .bp3-button-group{
+ -webkit-box-flex:0;
+ -ms-flex:0 0 auto;
+ flex:0 0 auto;
+ padding:5px;
+ padding-left:0; }
+ .bp3-toast > .bp3-icon{
+ margin:12px;
+ margin-right:0;
+ color:#5c7080; }
+ .bp3-toast.bp3-dark,
+ .bp3-dark .bp3-toast{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ background-color:#394b59; }
+ .bp3-toast.bp3-dark > .bp3-icon,
+ .bp3-dark .bp3-toast > .bp3-icon{
+ color:#a7b6c2; }
+ .bp3-toast[class*="bp3-intent-"] a{
+ color:rgba(255, 255, 255, 0.7); }
+ .bp3-toast[class*="bp3-intent-"] a:hover{
+ color:#ffffff; }
+ .bp3-toast[class*="bp3-intent-"] > .bp3-icon{
+ color:#ffffff; }
+ .bp3-toast[class*="bp3-intent-"] .bp3-button, .bp3-toast[class*="bp3-intent-"] .bp3-button::before,
+ .bp3-toast[class*="bp3-intent-"] .bp3-button .bp3-icon, .bp3-toast[class*="bp3-intent-"] .bp3-button:active{
+ color:rgba(255, 255, 255, 0.7) !important; }
+ .bp3-toast[class*="bp3-intent-"] .bp3-button:focus{
+ outline-color:rgba(255, 255, 255, 0.5); }
+ .bp3-toast[class*="bp3-intent-"] .bp3-button:hover{
+ background-color:rgba(255, 255, 255, 0.15) !important;
+ color:#ffffff !important; }
+ .bp3-toast[class*="bp3-intent-"] .bp3-button:active{
+ background-color:rgba(255, 255, 255, 0.3) !important;
+ color:#ffffff !important; }
+ .bp3-toast[class*="bp3-intent-"] .bp3-button::after{
+ background:rgba(255, 255, 255, 0.3) !important; }
+ .bp3-toast.bp3-intent-primary{
+ background-color:#137cbd;
+ color:#ffffff; }
+ .bp3-toast.bp3-intent-success{
+ background-color:#0f9960;
+ color:#ffffff; }
+ .bp3-toast.bp3-intent-warning{
+ background-color:#d9822b;
+ color:#ffffff; }
+ .bp3-toast.bp3-intent-danger{
+ background-color:#db3737;
+ color:#ffffff; }
+
+.bp3-toast-message{
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ padding:11px;
+ word-break:break-word; }
+
+.bp3-toast-container{
+ display:-webkit-box !important;
+ display:-ms-flexbox !important;
+ display:flex !important;
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:normal;
+ -ms-flex-direction:column;
+ flex-direction:column;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ position:fixed;
+ right:0;
+ left:0;
+ z-index:40;
+ overflow:hidden;
+ padding:0 20px 20px;
+ pointer-events:none; }
+ .bp3-toast-container.bp3-toast-container-top{
+ top:0; }
+ .bp3-toast-container.bp3-toast-container-bottom{
+ -webkit-box-orient:vertical;
+ -webkit-box-direction:reverse;
+ -ms-flex-direction:column-reverse;
+ flex-direction:column-reverse;
+ top:auto;
+ bottom:0; }
+ .bp3-toast-container.bp3-toast-container-left{
+ -webkit-box-align:start;
+ -ms-flex-align:start;
+ align-items:flex-start; }
+ .bp3-toast-container.bp3-toast-container-right{
+ -webkit-box-align:end;
+ -ms-flex-align:end;
+ align-items:flex-end; }
+
+.bp3-toast-container-bottom .bp3-toast.bp3-toast-enter:not(.bp3-toast-enter-active),
+.bp3-toast-container-bottom .bp3-toast.bp3-toast-enter:not(.bp3-toast-enter-active) ~ .bp3-toast, .bp3-toast-container-bottom .bp3-toast.bp3-toast-appear:not(.bp3-toast-appear-active),
+.bp3-toast-container-bottom .bp3-toast.bp3-toast-appear:not(.bp3-toast-appear-active) ~ .bp3-toast,
+.bp3-toast-container-bottom .bp3-toast.bp3-toast-exit-active ~ .bp3-toast,
+.bp3-toast-container-bottom .bp3-toast.bp3-toast-leave-active ~ .bp3-toast{
+ -webkit-transform:translateY(60px);
+ transform:translateY(60px); }
+.bp3-tooltip{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.1), 0 2px 4px rgba(16, 22, 26, 0.2), 0 8px 24px rgba(16, 22, 26, 0.2);
+ -webkit-transform:scale(1);
+ transform:scale(1); }
+ .bp3-tooltip .bp3-popover-arrow{
+ position:absolute;
+ width:22px;
+ height:22px; }
+ .bp3-tooltip .bp3-popover-arrow::before{
+ margin:4px;
+ width:14px;
+ height:14px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-tooltip{
+ margin-top:-11px;
+ margin-bottom:11px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-tooltip > .bp3-popover-arrow{
+ bottom:-8px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-top > .bp3-tooltip > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(-90deg);
+ transform:rotate(-90deg); }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-tooltip{
+ margin-left:11px; }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-tooltip > .bp3-popover-arrow{
+ left:-8px; }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-right > .bp3-tooltip > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(0);
+ transform:rotate(0); }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-tooltip{
+ margin-top:11px; }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-tooltip > .bp3-popover-arrow{
+ top:-8px; }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-bottom > .bp3-tooltip > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(90deg);
+ transform:rotate(90deg); }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-tooltip{
+ margin-right:11px;
+ margin-left:-11px; }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-tooltip > .bp3-popover-arrow{
+ right:-8px; }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-left > .bp3-tooltip > .bp3-popover-arrow svg{
+ -webkit-transform:rotate(180deg);
+ transform:rotate(180deg); }
+ .bp3-tether-element-attached-middle > .bp3-tooltip > .bp3-popover-arrow{
+ top:50%;
+ -webkit-transform:translateY(-50%);
+ transform:translateY(-50%); }
+ .bp3-tether-element-attached-center > .bp3-tooltip > .bp3-popover-arrow{
+ right:50%;
+ -webkit-transform:translateX(50%);
+ transform:translateX(50%); }
+ .bp3-tether-element-attached-top.bp3-tether-target-attached-top > .bp3-tooltip > .bp3-popover-arrow{
+ top:-0.22183px; }
+ .bp3-tether-element-attached-right.bp3-tether-target-attached-right > .bp3-tooltip > .bp3-popover-arrow{
+ right:-0.22183px; }
+ .bp3-tether-element-attached-left.bp3-tether-target-attached-left > .bp3-tooltip > .bp3-popover-arrow{
+ left:-0.22183px; }
+ .bp3-tether-element-attached-bottom.bp3-tether-target-attached-bottom > .bp3-tooltip > .bp3-popover-arrow{
+ bottom:-0.22183px; }
+ .bp3-tether-element-attached-top.bp3-tether-element-attached-left > .bp3-tooltip{
+ -webkit-transform-origin:top left;
+ transform-origin:top left; }
+ .bp3-tether-element-attached-top.bp3-tether-element-attached-center > .bp3-tooltip{
+ -webkit-transform-origin:top center;
+ transform-origin:top center; }
+ .bp3-tether-element-attached-top.bp3-tether-element-attached-right > .bp3-tooltip{
+ -webkit-transform-origin:top right;
+ transform-origin:top right; }
+ .bp3-tether-element-attached-middle.bp3-tether-element-attached-left > .bp3-tooltip{
+ -webkit-transform-origin:center left;
+ transform-origin:center left; }
+ .bp3-tether-element-attached-middle.bp3-tether-element-attached-center > .bp3-tooltip{
+ -webkit-transform-origin:center center;
+ transform-origin:center center; }
+ .bp3-tether-element-attached-middle.bp3-tether-element-attached-right > .bp3-tooltip{
+ -webkit-transform-origin:center right;
+ transform-origin:center right; }
+ .bp3-tether-element-attached-bottom.bp3-tether-element-attached-left > .bp3-tooltip{
+ -webkit-transform-origin:bottom left;
+ transform-origin:bottom left; }
+ .bp3-tether-element-attached-bottom.bp3-tether-element-attached-center > .bp3-tooltip{
+ -webkit-transform-origin:bottom center;
+ transform-origin:bottom center; }
+ .bp3-tether-element-attached-bottom.bp3-tether-element-attached-right > .bp3-tooltip{
+ -webkit-transform-origin:bottom right;
+ transform-origin:bottom right; }
+ .bp3-tooltip .bp3-popover-content{
+ background:#394b59;
+ color:#f5f8fa; }
+ .bp3-tooltip .bp3-popover-arrow::before{
+ -webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2);
+ box-shadow:1px 1px 6px rgba(16, 22, 26, 0.2); }
+ .bp3-tooltip .bp3-popover-arrow-border{
+ fill:#10161a;
+ fill-opacity:0.1; }
+ .bp3-tooltip .bp3-popover-arrow-fill{
+ fill:#394b59; }
+ .bp3-popover-enter > .bp3-tooltip, .bp3-popover-appear > .bp3-tooltip{
+ -webkit-transform:scale(0.8);
+ transform:scale(0.8); }
+ .bp3-popover-enter-active > .bp3-tooltip, .bp3-popover-appear-active > .bp3-tooltip{
+ -webkit-transform:scale(1);
+ transform:scale(1);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-popover-exit > .bp3-tooltip{
+ -webkit-transform:scale(1);
+ transform:scale(1); }
+ .bp3-popover-exit-active > .bp3-tooltip{
+ -webkit-transform:scale(0.8);
+ transform:scale(0.8);
+ -webkit-transition-property:-webkit-transform;
+ transition-property:-webkit-transform;
+ transition-property:transform;
+ transition-property:transform, -webkit-transform;
+ -webkit-transition-duration:100ms;
+ transition-duration:100ms;
+ -webkit-transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition-timing-function:cubic-bezier(0.4, 1, 0.75, 0.9);
+ -webkit-transition-delay:0;
+ transition-delay:0; }
+ .bp3-tooltip .bp3-popover-content{
+ padding:10px 12px; }
+ .bp3-tooltip.bp3-dark,
+ .bp3-dark .bp3-tooltip{
+ -webkit-box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4);
+ box-shadow:0 0 0 1px rgba(16, 22, 26, 0.2), 0 2px 4px rgba(16, 22, 26, 0.4), 0 8px 24px rgba(16, 22, 26, 0.4); }
+ .bp3-tooltip.bp3-dark .bp3-popover-content,
+ .bp3-dark .bp3-tooltip .bp3-popover-content{
+ background:#e1e8ed;
+ color:#394b59; }
+ .bp3-tooltip.bp3-dark .bp3-popover-arrow::before,
+ .bp3-dark .bp3-tooltip .bp3-popover-arrow::before{
+ -webkit-box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4);
+ box-shadow:1px 1px 6px rgba(16, 22, 26, 0.4); }
+ .bp3-tooltip.bp3-dark .bp3-popover-arrow-border,
+ .bp3-dark .bp3-tooltip .bp3-popover-arrow-border{
+ fill:#10161a;
+ fill-opacity:0.2; }
+ .bp3-tooltip.bp3-dark .bp3-popover-arrow-fill,
+ .bp3-dark .bp3-tooltip .bp3-popover-arrow-fill{
+ fill:#e1e8ed; }
+ .bp3-tooltip.bp3-intent-primary .bp3-popover-content{
+ background:#137cbd;
+ color:#ffffff; }
+ .bp3-tooltip.bp3-intent-primary .bp3-popover-arrow-fill{
+ fill:#137cbd; }
+ .bp3-tooltip.bp3-intent-success .bp3-popover-content{
+ background:#0f9960;
+ color:#ffffff; }
+ .bp3-tooltip.bp3-intent-success .bp3-popover-arrow-fill{
+ fill:#0f9960; }
+ .bp3-tooltip.bp3-intent-warning .bp3-popover-content{
+ background:#d9822b;
+ color:#ffffff; }
+ .bp3-tooltip.bp3-intent-warning .bp3-popover-arrow-fill{
+ fill:#d9822b; }
+ .bp3-tooltip.bp3-intent-danger .bp3-popover-content{
+ background:#db3737;
+ color:#ffffff; }
+ .bp3-tooltip.bp3-intent-danger .bp3-popover-arrow-fill{
+ fill:#db3737; }
+
+.bp3-tooltip-indicator{
+ border-bottom:dotted 1px;
+ cursor:help; }
+.bp3-tree .bp3-icon, .bp3-tree .bp3-icon-standard, .bp3-tree .bp3-icon-large{
+ color:#5c7080; }
+ .bp3-tree .bp3-icon.bp3-intent-primary, .bp3-tree .bp3-icon-standard.bp3-intent-primary, .bp3-tree .bp3-icon-large.bp3-intent-primary{
+ color:#137cbd; }
+ .bp3-tree .bp3-icon.bp3-intent-success, .bp3-tree .bp3-icon-standard.bp3-intent-success, .bp3-tree .bp3-icon-large.bp3-intent-success{
+ color:#0f9960; }
+ .bp3-tree .bp3-icon.bp3-intent-warning, .bp3-tree .bp3-icon-standard.bp3-intent-warning, .bp3-tree .bp3-icon-large.bp3-intent-warning{
+ color:#d9822b; }
+ .bp3-tree .bp3-icon.bp3-intent-danger, .bp3-tree .bp3-icon-standard.bp3-intent-danger, .bp3-tree .bp3-icon-large.bp3-intent-danger{
+ color:#db3737; }
+
+.bp3-tree-node-list{
+ margin:0;
+ padding-left:0;
+ list-style:none; }
+
+.bp3-tree-root{
+ position:relative;
+ background-color:transparent;
+ cursor:default;
+ padding-left:0; }
+
+.bp3-tree-node-content-0{
+ padding-left:0px; }
+
+.bp3-tree-node-content-1{
+ padding-left:23px; }
+
+.bp3-tree-node-content-2{
+ padding-left:46px; }
+
+.bp3-tree-node-content-3{
+ padding-left:69px; }
+
+.bp3-tree-node-content-4{
+ padding-left:92px; }
+
+.bp3-tree-node-content-5{
+ padding-left:115px; }
+
+.bp3-tree-node-content-6{
+ padding-left:138px; }
+
+.bp3-tree-node-content-7{
+ padding-left:161px; }
+
+.bp3-tree-node-content-8{
+ padding-left:184px; }
+
+.bp3-tree-node-content-9{
+ padding-left:207px; }
+
+.bp3-tree-node-content-10{
+ padding-left:230px; }
+
+.bp3-tree-node-content-11{
+ padding-left:253px; }
+
+.bp3-tree-node-content-12{
+ padding-left:276px; }
+
+.bp3-tree-node-content-13{
+ padding-left:299px; }
+
+.bp3-tree-node-content-14{
+ padding-left:322px; }
+
+.bp3-tree-node-content-15{
+ padding-left:345px; }
+
+.bp3-tree-node-content-16{
+ padding-left:368px; }
+
+.bp3-tree-node-content-17{
+ padding-left:391px; }
+
+.bp3-tree-node-content-18{
+ padding-left:414px; }
+
+.bp3-tree-node-content-19{
+ padding-left:437px; }
+
+.bp3-tree-node-content-20{
+ padding-left:460px; }
+
+.bp3-tree-node-content{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center;
+ width:100%;
+ height:30px;
+ padding-right:5px; }
+ .bp3-tree-node-content:hover{
+ background-color:rgba(191, 204, 214, 0.4); }
+
+.bp3-tree-node-caret,
+.bp3-tree-node-caret-none{
+ min-width:30px; }
+
+.bp3-tree-node-caret{
+ color:#5c7080;
+ -webkit-transform:rotate(0deg);
+ transform:rotate(0deg);
+ cursor:pointer;
+ padding:7px;
+ -webkit-transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:-webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9);
+ transition:transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9), -webkit-transform 200ms cubic-bezier(0.4, 1, 0.75, 0.9); }
+ .bp3-tree-node-caret:hover{
+ color:#182026; }
+ .bp3-dark .bp3-tree-node-caret{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-tree-node-caret:hover{
+ color:#f5f8fa; }
+ .bp3-tree-node-caret.bp3-tree-node-caret-open{
+ -webkit-transform:rotate(90deg);
+ transform:rotate(90deg); }
+ .bp3-tree-node-caret.bp3-icon-standard::before{
+ content:""; }
+
+.bp3-tree-node-icon{
+ position:relative;
+ margin-right:7px; }
+
+.bp3-tree-node-label{
+ overflow:hidden;
+ text-overflow:ellipsis;
+ white-space:nowrap;
+ word-wrap:normal;
+ -webkit-box-flex:1;
+ -ms-flex:1 1 auto;
+ flex:1 1 auto;
+ position:relative;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-tree-node-label span{
+ display:inline; }
+
+.bp3-tree-node-secondary-label{
+ padding:0 5px;
+ -webkit-user-select:none;
+ -moz-user-select:none;
+ -ms-user-select:none;
+ user-select:none; }
+ .bp3-tree-node-secondary-label .bp3-popover-wrapper,
+ .bp3-tree-node-secondary-label .bp3-popover-target{
+ display:-webkit-box;
+ display:-ms-flexbox;
+ display:flex;
+ -webkit-box-align:center;
+ -ms-flex-align:center;
+ align-items:center; }
+
+.bp3-tree-node.bp3-disabled .bp3-tree-node-content{
+ background-color:inherit;
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+
+.bp3-tree-node.bp3-disabled .bp3-tree-node-caret,
+.bp3-tree-node.bp3-disabled .bp3-tree-node-icon{
+ cursor:not-allowed;
+ color:rgba(92, 112, 128, 0.6); }
+
+.bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content{
+ background-color:#137cbd; }
+ .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content,
+ .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-icon, .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-icon-standard, .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-icon-large{
+ color:#ffffff; }
+ .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-tree-node-caret::before{
+ color:rgba(255, 255, 255, 0.7); }
+ .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content .bp3-tree-node-caret:hover::before{
+ color:#ffffff; }
+
+.bp3-dark .bp3-tree-node-content:hover{
+ background-color:rgba(92, 112, 128, 0.3); }
+
+.bp3-dark .bp3-tree .bp3-icon, .bp3-dark .bp3-tree .bp3-icon-standard, .bp3-dark .bp3-tree .bp3-icon-large{
+ color:#a7b6c2; }
+ .bp3-dark .bp3-tree .bp3-icon.bp3-intent-primary, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-primary, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-primary{
+ color:#137cbd; }
+ .bp3-dark .bp3-tree .bp3-icon.bp3-intent-success, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-success, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-success{
+ color:#0f9960; }
+ .bp3-dark .bp3-tree .bp3-icon.bp3-intent-warning, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-warning, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-warning{
+ color:#d9822b; }
+ .bp3-dark .bp3-tree .bp3-icon.bp3-intent-danger, .bp3-dark .bp3-tree .bp3-icon-standard.bp3-intent-danger, .bp3-dark .bp3-tree .bp3-icon-large.bp3-intent-danger{
+ color:#db3737; }
+
+.bp3-dark .bp3-tree-node.bp3-tree-node-selected > .bp3-tree-node-content{
+ background-color:#137cbd; }
+/*# sourceMappingURL=blueprint.css.map */ \ No newline at end of file
diff --git a/sw-ui/src/main/resources/favicon.ico b/sw-ui/src/main/resources/favicon.ico
new file mode 100644
index 00000000..5c125de5
--- /dev/null
+++ b/sw-ui/src/main/resources/favicon.ico
Binary files differ
diff --git a/sw-ui/src/components/game/background-papyrus.jpg b/sw-ui/src/main/resources/images/background-papyrus1.jpg
index 57bdffcf..57bdffcf 100644
--- a/sw-ui/src/components/game/background-papyrus.jpg
+++ b/sw-ui/src/main/resources/images/background-papyrus1.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/background-papyrus2.jpg b/sw-ui/src/main/resources/images/background-papyrus2.jpg
new file mode 100644
index 00000000..b6c8dc5f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/background-papyrus2.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/background-papyrus3.jpg b/sw-ui/src/main/resources/images/background-papyrus3.jpg
new file mode 100644
index 00000000..90350045
--- /dev/null
+++ b/sw-ui/src/main/resources/images/background-papyrus3.jpg
Binary files differ
diff --git a/sw-ui/src/components/home/background-zeus-temple.jpg b/sw-ui/src/main/resources/images/background-zeus-temple.jpg
index 5a28e933..5a28e933 100644
--- a/sw-ui/src/components/home/background-zeus-temple.jpg
+++ b/sw-ui/src/main/resources/images/background-zeus-temple.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/academy.png b/sw-ui/src/main/resources/images/cards/academy.png
new file mode 100644
index 00000000..d2a75075
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/academy.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/altar.png b/sw-ui/src/main/resources/images/cards/altar.png
new file mode 100644
index 00000000..bbde8f2f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/altar.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/apothecary.png b/sw-ui/src/main/resources/images/cards/apothecary.png
new file mode 100644
index 00000000..01804c0a
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/apothecary.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/aqueduct.png b/sw-ui/src/main/resources/images/cards/aqueduct.png
new file mode 100644
index 00000000..c29d9566
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/aqueduct.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/archeryrange.png b/sw-ui/src/main/resources/images/cards/archeryrange.png
new file mode 100644
index 00000000..15c6edda
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/archeryrange.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/arena.png b/sw-ui/src/main/resources/images/cards/arena.png
new file mode 100644
index 00000000..7dc76961
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/arena.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/arsenal.png b/sw-ui/src/main/resources/images/cards/arsenal.png
new file mode 100644
index 00000000..fc3f4a27
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/arsenal.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/back/age1.png b/sw-ui/src/main/resources/images/cards/back/age1.png
new file mode 100644
index 00000000..a06332d7
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/back/age1.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/back/age2.png b/sw-ui/src/main/resources/images/cards/back/age2.png
new file mode 100644
index 00000000..9b52aa4e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/back/age2.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/back/age3.png b/sw-ui/src/main/resources/images/cards/back/age3.png
new file mode 100644
index 00000000..86c983ee
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/back/age3.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/barracks.png b/sw-ui/src/main/resources/images/cards/barracks.png
new file mode 100644
index 00000000..f5a68c17
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/barracks.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/baths.png b/sw-ui/src/main/resources/images/cards/baths.png
new file mode 100644
index 00000000..3d99d59d
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/baths.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/bazar.png b/sw-ui/src/main/resources/images/cards/bazar.png
new file mode 100644
index 00000000..f36e25c2
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/bazar.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/brickyard.png b/sw-ui/src/main/resources/images/cards/brickyard.png
new file mode 100644
index 00000000..ae0b7e9b
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/brickyard.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/buildersguild.png b/sw-ui/src/main/resources/images/cards/buildersguild.png
new file mode 100644
index 00000000..f5402611
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/buildersguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/caravansery.png b/sw-ui/src/main/resources/images/cards/caravansery.png
new file mode 100644
index 00000000..997bb102
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/caravansery.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/chamberofcommerce.png b/sw-ui/src/main/resources/images/cards/chamberofcommerce.png
new file mode 100644
index 00000000..44b5af28
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/chamberofcommerce.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/circus.png b/sw-ui/src/main/resources/images/cards/circus.png
new file mode 100644
index 00000000..b1ec4d8b
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/circus.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/claypit.png b/sw-ui/src/main/resources/images/cards/claypit.png
new file mode 100644
index 00000000..5442248e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/claypit.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/claypool.png b/sw-ui/src/main/resources/images/cards/claypool.png
new file mode 100644
index 00000000..873cad47
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/claypool.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/courthouse.png b/sw-ui/src/main/resources/images/cards/courthouse.png
new file mode 100644
index 00000000..394901f2
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/courthouse.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/craftsmensguild.png b/sw-ui/src/main/resources/images/cards/craftsmensguild.png
new file mode 100644
index 00000000..09bff60e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/craftsmensguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/dispensary.png b/sw-ui/src/main/resources/images/cards/dispensary.png
new file mode 100644
index 00000000..4917166b
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/dispensary.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/easttradingpost.png b/sw-ui/src/main/resources/images/cards/easttradingpost.png
new file mode 100644
index 00000000..0c67cc78
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/easttradingpost.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/excavation.png b/sw-ui/src/main/resources/images/cards/excavation.png
new file mode 100644
index 00000000..0fe1b01f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/excavation.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/forestcave.png b/sw-ui/src/main/resources/images/cards/forestcave.png
new file mode 100644
index 00000000..262fffc6
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/forestcave.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/fortifications.png b/sw-ui/src/main/resources/images/cards/fortifications.png
new file mode 100644
index 00000000..3e113473
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/fortifications.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/forum.png b/sw-ui/src/main/resources/images/cards/forum.png
new file mode 100644
index 00000000..d6262158
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/forum.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/foundry.png b/sw-ui/src/main/resources/images/cards/foundry.png
new file mode 100644
index 00000000..da95a48e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/foundry.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/gardens.png b/sw-ui/src/main/resources/images/cards/gardens.png
new file mode 100644
index 00000000..9a49a0ad
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/gardens.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/glassworks.png b/sw-ui/src/main/resources/images/cards/glassworks.png
new file mode 100644
index 00000000..285d7d54
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/glassworks.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/guardtower.png b/sw-ui/src/main/resources/images/cards/guardtower.png
new file mode 100644
index 00000000..524b06f3
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/guardtower.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/haven.png b/sw-ui/src/main/resources/images/cards/haven.png
new file mode 100644
index 00000000..e0b345b2
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/haven.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/laboratory.png b/sw-ui/src/main/resources/images/cards/laboratory.png
new file mode 100644
index 00000000..4c29e81f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/laboratory.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/library.png b/sw-ui/src/main/resources/images/cards/library.png
new file mode 100644
index 00000000..7495a2ca
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/library.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/lighthouse.png b/sw-ui/src/main/resources/images/cards/lighthouse.png
new file mode 100644
index 00000000..2124811b
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/lighthouse.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/lodge.png b/sw-ui/src/main/resources/images/cards/lodge.png
new file mode 100644
index 00000000..22758688
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/lodge.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/loom.png b/sw-ui/src/main/resources/images/cards/loom.png
new file mode 100644
index 00000000..70bdf375
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/loom.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/lumberyard.png b/sw-ui/src/main/resources/images/cards/lumberyard.png
new file mode 100644
index 00000000..8558af1a
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/lumberyard.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/magistratesguild.png b/sw-ui/src/main/resources/images/cards/magistratesguild.png
new file mode 100644
index 00000000..d7deabb3
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/magistratesguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/marketplace.png b/sw-ui/src/main/resources/images/cards/marketplace.png
new file mode 100644
index 00000000..cd3676d4
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/marketplace.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/mine.png b/sw-ui/src/main/resources/images/cards/mine.png
new file mode 100644
index 00000000..4062775c
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/mine.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/observatory.png b/sw-ui/src/main/resources/images/cards/observatory.png
new file mode 100644
index 00000000..1da3d7b4
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/observatory.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/orevein.png b/sw-ui/src/main/resources/images/cards/orevein.png
new file mode 100644
index 00000000..fabea674
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/orevein.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/palace.png b/sw-ui/src/main/resources/images/cards/palace.png
new file mode 100644
index 00000000..1a24890e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/palace.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/pantheon.png b/sw-ui/src/main/resources/images/cards/pantheon.png
new file mode 100644
index 00000000..264bae02
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/pantheon.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/pawnshop.png b/sw-ui/src/main/resources/images/cards/pawnshop.png
new file mode 100644
index 00000000..30bb3807
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/pawnshop.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/philosophersguild.png b/sw-ui/src/main/resources/images/cards/philosophersguild.png
new file mode 100644
index 00000000..f72590f6
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/philosophersguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/press.png b/sw-ui/src/main/resources/images/cards/press.png
new file mode 100644
index 00000000..c932df06
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/press.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/quarry.png b/sw-ui/src/main/resources/images/cards/quarry.png
new file mode 100644
index 00000000..8cdbdb22
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/quarry.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/sawmill.png b/sw-ui/src/main/resources/images/cards/sawmill.png
new file mode 100644
index 00000000..5abff473
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/sawmill.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/school.png b/sw-ui/src/main/resources/images/cards/school.png
new file mode 100644
index 00000000..ab2218d0
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/school.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/scientistsguild.png b/sw-ui/src/main/resources/images/cards/scientistsguild.png
new file mode 100644
index 00000000..7ee639e3
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/scientistsguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/scriptorium.png b/sw-ui/src/main/resources/images/cards/scriptorium.png
new file mode 100644
index 00000000..36dca27a
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/scriptorium.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/senate.png b/sw-ui/src/main/resources/images/cards/senate.png
new file mode 100644
index 00000000..ee878ea6
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/senate.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/shipownersguild.png b/sw-ui/src/main/resources/images/cards/shipownersguild.png
new file mode 100644
index 00000000..3eecd2da
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/shipownersguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/siegeworkshop.png b/sw-ui/src/main/resources/images/cards/siegeworkshop.png
new file mode 100644
index 00000000..bacf8309
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/siegeworkshop.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/spiesguild.png b/sw-ui/src/main/resources/images/cards/spiesguild.png
new file mode 100644
index 00000000..85e28d9e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/spiesguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/stables.png b/sw-ui/src/main/resources/images/cards/stables.png
new file mode 100644
index 00000000..48c963f0
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/stables.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/statue.png b/sw-ui/src/main/resources/images/cards/statue.png
new file mode 100644
index 00000000..55aaa5cb
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/statue.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/stockade.png b/sw-ui/src/main/resources/images/cards/stockade.png
new file mode 100644
index 00000000..37741429
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/stockade.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/stonepit.png b/sw-ui/src/main/resources/images/cards/stonepit.png
new file mode 100644
index 00000000..724900c7
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/stonepit.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/strategistsguild.png b/sw-ui/src/main/resources/images/cards/strategistsguild.png
new file mode 100644
index 00000000..ae186a4b
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/strategistsguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/study.png b/sw-ui/src/main/resources/images/cards/study.png
new file mode 100644
index 00000000..d8b9ebf9
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/study.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/tavern.png b/sw-ui/src/main/resources/images/cards/tavern.png
new file mode 100644
index 00000000..418b0fb2
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/tavern.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/temple.png b/sw-ui/src/main/resources/images/cards/temple.png
new file mode 100644
index 00000000..9a8d89dc
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/temple.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/theater.png b/sw-ui/src/main/resources/images/cards/theater.png
new file mode 100644
index 00000000..0d5b2b01
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/theater.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/timberyard.png b/sw-ui/src/main/resources/images/cards/timberyard.png
new file mode 100644
index 00000000..0f20547f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/timberyard.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/townhall.png b/sw-ui/src/main/resources/images/cards/townhall.png
new file mode 100644
index 00000000..d0638739
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/townhall.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/tradersguild.png b/sw-ui/src/main/resources/images/cards/tradersguild.png
new file mode 100644
index 00000000..15777e77
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/tradersguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/trainingground.png b/sw-ui/src/main/resources/images/cards/trainingground.png
new file mode 100644
index 00000000..d59ef4f8
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/trainingground.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/treefarm.png b/sw-ui/src/main/resources/images/cards/treefarm.png
new file mode 100644
index 00000000..18cf228f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/treefarm.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/university.png b/sw-ui/src/main/resources/images/cards/university.png
new file mode 100644
index 00000000..c9ca8a80
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/university.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/vineyard.png b/sw-ui/src/main/resources/images/cards/vineyard.png
new file mode 100644
index 00000000..58fa8ee1
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/vineyard.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/walls.png b/sw-ui/src/main/resources/images/cards/walls.png
new file mode 100644
index 00000000..3823c62f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/walls.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/westtradingpost.png b/sw-ui/src/main/resources/images/cards/westtradingpost.png
new file mode 100644
index 00000000..b536269f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/westtradingpost.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/workersguild.png b/sw-ui/src/main/resources/images/cards/workersguild.png
new file mode 100644
index 00000000..de4f452f
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/workersguild.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/cards/workshop.png b/sw-ui/src/main/resources/images/cards/workshop.png
new file mode 100644
index 00000000..8f585d61
--- /dev/null
+++ b/sw-ui/src/main/resources/images/cards/workshop.png
Binary files differ
diff --git a/sw-ui/src/components/home/logo-7-wonders.png b/sw-ui/src/main/resources/images/logo-7-wonders.png
index 96974d3e..96974d3e 100644
--- a/sw-ui/src/components/home/logo-7-wonders.png
+++ b/sw-ui/src/main/resources/images/logo-7-wonders.png
Binary files differ
diff --git a/sw-ui/src/components/lobby/round-table.png b/sw-ui/src/main/resources/images/round-table.png
index f277376d..f277376d 100644
--- a/sw-ui/src/components/lobby/round-table.png
+++ b/sw-ui/src/main/resources/images/round-table.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/coin.png b/sw-ui/src/main/resources/images/tokens/coin.png
new file mode 100644
index 00000000..f4813042
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/coin.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/resources/clay.png b/sw-ui/src/main/resources/images/tokens/resources/clay.png
new file mode 100644
index 00000000..72fc0b0e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/resources/clay.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/resources/glass.png b/sw-ui/src/main/resources/images/tokens/resources/glass.png
new file mode 100644
index 00000000..61fd2be5
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/resources/glass.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/resources/loom.png b/sw-ui/src/main/resources/images/tokens/resources/loom.png
new file mode 100644
index 00000000..294adcb2
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/resources/loom.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/resources/ore.png b/sw-ui/src/main/resources/images/tokens/resources/ore.png
new file mode 100644
index 00000000..c2149daa
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/resources/ore.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/resources/papyrus.png b/sw-ui/src/main/resources/images/tokens/resources/papyrus.png
new file mode 100644
index 00000000..91a59221
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/resources/papyrus.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/resources/stone.png b/sw-ui/src/main/resources/images/tokens/resources/stone.png
new file mode 100644
index 00000000..674c40db
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/resources/stone.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/tokens/resources/wood.png b/sw-ui/src/main/resources/images/tokens/resources/wood.png
new file mode 100644
index 00000000..09a4ede8
--- /dev/null
+++ b/sw-ui/src/main/resources/images/tokens/resources/wood.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/alexandriaA.png b/sw-ui/src/main/resources/images/wonders/alexandriaA.png
new file mode 100644
index 00000000..0d4135f3
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/alexandriaA.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/alexandriaB.png b/sw-ui/src/main/resources/images/wonders/alexandriaB.png
new file mode 100644
index 00000000..dd072f8a
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/alexandriaB.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/babylonA.png b/sw-ui/src/main/resources/images/wonders/babylonA.png
new file mode 100644
index 00000000..ae323c78
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/babylonA.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/babylonB.png b/sw-ui/src/main/resources/images/wonders/babylonB.png
new file mode 100644
index 00000000..3780dc9d
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/babylonB.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/ephesosA.png b/sw-ui/src/main/resources/images/wonders/ephesosA.png
new file mode 100644
index 00000000..307794ba
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/ephesosA.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/ephesosB.png b/sw-ui/src/main/resources/images/wonders/ephesosB.png
new file mode 100644
index 00000000..ec2e9cb7
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/ephesosB.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/agrigentoA.jpg b/sw-ui/src/main/resources/images/wonders/extra/agrigentoA.jpg
new file mode 100644
index 00000000..76ba8195
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/agrigentoA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/angkorwatA.jpg b/sw-ui/src/main/resources/images/wonders/extra/angkorwatA.jpg
new file mode 100644
index 00000000..32f52514
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/angkorwatA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/angkorwatB.jpg b/sw-ui/src/main/resources/images/wonders/extra/angkorwatB.jpg
new file mode 100644
index 00000000..c3f4304e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/angkorwatB.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/avalonA.jpg b/sw-ui/src/main/resources/images/wonders/extra/avalonA.jpg
new file mode 100644
index 00000000..7f7f0678
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/avalonA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/ctesiphonB.jpg b/sw-ui/src/main/resources/images/wonders/extra/ctesiphonB.jpg
new file mode 100644
index 00000000..c00b40ac
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/ctesiphonB.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/iramA.jpg b/sw-ui/src/main/resources/images/wonders/extra/iramA.jpg
new file mode 100644
index 00000000..d2c24e95
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/iramA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/persepolisA.jpg b/sw-ui/src/main/resources/images/wonders/extra/persepolisA.jpg
new file mode 100644
index 00000000..2caa4f89
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/persepolisA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/romaA.jpg b/sw-ui/src/main/resources/images/wonders/extra/romaA.jpg
new file mode 100644
index 00000000..c54bc820
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/romaA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/sangri-laA.jpg b/sw-ui/src/main/resources/images/wonders/extra/sangri-laA.jpg
new file mode 100644
index 00000000..1c5dad97
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/sangri-laA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/spahanA.jpg b/sw-ui/src/main/resources/images/wonders/extra/spahanA.jpg
new file mode 100644
index 00000000..ab2cfc84
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/spahanA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/the-great-wallA.jpg b/sw-ui/src/main/resources/images/wonders/extra/the-great-wallA.jpg
new file mode 100644
index 00000000..4aacd39b
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/the-great-wallA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/veniseA.jpg b/sw-ui/src/main/resources/images/wonders/extra/veniseA.jpg
new file mode 100644
index 00000000..55ec00b5
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/veniseA.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/extra/veniseB.jpg b/sw-ui/src/main/resources/images/wonders/extra/veniseB.jpg
new file mode 100644
index 00000000..e18f3a12
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/extra/veniseB.jpg
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/gizahA.png b/sw-ui/src/main/resources/images/wonders/gizahA.png
new file mode 100644
index 00000000..e66735fb
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/gizahA.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/gizahB.png b/sw-ui/src/main/resources/images/wonders/gizahB.png
new file mode 100644
index 00000000..ed55ed45
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/gizahB.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/halikarnassusA.png b/sw-ui/src/main/resources/images/wonders/halikarnassusA.png
new file mode 100644
index 00000000..659f706e
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/halikarnassusA.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/halikarnassusB.png b/sw-ui/src/main/resources/images/wonders/halikarnassusB.png
new file mode 100644
index 00000000..b6ae1f93
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/halikarnassusB.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/olympiaA.png b/sw-ui/src/main/resources/images/wonders/olympiaA.png
new file mode 100644
index 00000000..478ed503
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/olympiaA.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/olympiaB.png b/sw-ui/src/main/resources/images/wonders/olympiaB.png
new file mode 100644
index 00000000..a97a9524
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/olympiaB.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/rhodosA.png b/sw-ui/src/main/resources/images/wonders/rhodosA.png
new file mode 100644
index 00000000..0c11a71a
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/rhodosA.png
Binary files differ
diff --git a/sw-ui/src/main/resources/images/wonders/rhodosB.png b/sw-ui/src/main/resources/images/wonders/rhodosB.png
new file mode 100644
index 00000000..43e5d594
--- /dev/null
+++ b/sw-ui/src/main/resources/images/wonders/rhodosB.png
Binary files differ
diff --git a/sw-ui/src/main/resources/index.html b/sw-ui/src/main/resources/index.html
new file mode 100644
index 00000000..3ff6d320
--- /dev/null
+++ b/sw-ui/src/main/resources/index.html
@@ -0,0 +1,15 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <link rel="shortcut icon" href="${publicPath}favicon.ico">
+ <title>Seven Wonders</title>
+ <link href="css/blueprint-icons.css" rel="stylesheet" />
+ <link href="css/blueprint.css" rel="stylesheet" />
+ </head>
+ <body>
+ <div id="root"></div>
+ <script src="${bundle}"></script>
+ </body>
+</html>
diff --git a/sw-ui/src/react-app-env.d.ts b/sw-ui/src/react-app-env.d.ts
deleted file mode 100644
index 6431bc5f..00000000
--- a/sw-ui/src/react-app-env.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-/// <reference types="react-scripts" />
diff --git a/sw-ui/src/reducers.ts b/sw-ui/src/reducers.ts
deleted file mode 100644
index f885f642..00000000
--- a/sw-ui/src/reducers.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { routerReducer } from 'react-router-redux';
-import { combineReducers } from 'redux';
-import { ApiPlayer } from './api/model';
-import { CurrentGameState, EMPTY_CURRENT_GAME } from './redux/currentGame';
-import { createCurrentGameReducer } from './redux/currentGame';
-import { EMPTY_GAMES, GamesState } from './redux/games';
-import { createGamesReducer } from './redux/games';
-import { currentUserReducer } from './redux/user';
-
-export type GlobalState = {
- currentGame: CurrentGameState;
- currentUser: ApiPlayer | null;
- games: GamesState;
- routing: any;
-}
-
-export const INITIAL_STATE: GlobalState = {
- currentGame: EMPTY_CURRENT_GAME,
- currentUser: null,
- games: EMPTY_GAMES,
- routing: null,
-};
-
-export function createReducer() {
- return combineReducers({
- currentGame: createCurrentGameReducer(),
- currentUser: currentUserReducer,
- games: createGamesReducer(),
- routing: routerReducer,
- });
-}
diff --git a/sw-ui/src/redux/actions/all.ts b/sw-ui/src/redux/actions/all.ts
deleted file mode 100644
index 57d2a443..00000000
--- a/sw-ui/src/redux/actions/all.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { GameAction } from './game';
-import { LobbyAction } from './lobby';
-import { PlayerAction } from './user';
-
-export type Action = PlayerAction | LobbyAction | GameAction
diff --git a/sw-ui/src/redux/actions/game.ts b/sw-ui/src/redux/actions/game.ts
deleted file mode 100644
index b67ea1dc..00000000
--- a/sw-ui/src/redux/actions/game.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { ApiPlayerMove, ApiPlayerTurnInfo, ApiPreparedCard, ApiTable } from '../../api/model';
-
-export const REQUEST_SAY_READY = 'GAME/REQUEST_SAY_READY';
-export const REQUEST_PREPARE_MOVE = 'GAME/REQUEST_PREPARE_MOVE';
-export const PLAYER_READY_RECEIVED = 'GAME/PLAYER_READY_RECEIVED';
-export const TABLE_UPDATE_RECEIVED = 'GAME/TABLE_UPDATE_RECEIVED';
-export const PREPARED_CARD_RECEIVED = 'GAME/PREPARED_CARD_RECEIVED';
-export const TURN_INFO_RECEIVED = 'GAME/TURN_INFO_RECEIVED';
-
-export type SayReadyAction = { type: typeof REQUEST_SAY_READY };
-export type PrepareMoveAction = { type: typeof REQUEST_PREPARE_MOVE, move: ApiPlayerMove };
-export type PlayerReadyEvent = { type: typeof PLAYER_READY_RECEIVED, username: string };
-export type TableUpdateEvent = { type: typeof TABLE_UPDATE_RECEIVED, table: ApiTable };
-export type PreparedCardEvent = { type: typeof PREPARED_CARD_RECEIVED, card: ApiPreparedCard };
-export type TurnInfoEvent = { type: typeof TURN_INFO_RECEIVED, turnInfo: ApiPlayerTurnInfo };
-
-export type GameAction =
- SayReadyAction
- | PrepareMoveAction
- | PlayerReadyEvent
- | TableUpdateEvent
- | PreparedCardEvent
- | TurnInfoEvent;
-
-export const actions = {
- sayReady: () => ({ type: REQUEST_SAY_READY }),
- prepareMove: (move: ApiPlayerMove) => ({ type: REQUEST_PREPARE_MOVE, move }),
- receivePlayerReady: (username: string) => ({ type: PLAYER_READY_RECEIVED, username }),
- receiveTableUpdate: (table: ApiTable) => ({ type: TABLE_UPDATE_RECEIVED, table }),
- receivePreparedCard: (card: ApiPreparedCard) => ({ type: PREPARED_CARD_RECEIVED, card }),
- receiveTurnInfo: (turnInfo: ApiPlayerTurnInfo) => ({ type: TURN_INFO_RECEIVED, turnInfo }),
-};
diff --git a/sw-ui/src/redux/actions/lobby.ts b/sw-ui/src/redux/actions/lobby.ts
deleted file mode 100644
index c121b022..00000000
--- a/sw-ui/src/redux/actions/lobby.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import { ApiLobby } from '../../api/model';
-
-export const UPDATE_GAMES = 'GAMES/UPDATE_GAMES';
-export const REQUEST_CREATE_GAME = 'GAMES/REQUEST_CREATE_GAME';
-export const REQUEST_JOIN_GAME = 'GAMES/REQUEST_JOIN_GAME';
-export const REQUEST_START_GAME = 'GAMES/REQUEST_START_GAME';
-export const ENTER_LOBBY = 'GAMES/ENTER_LOBBY';
-export const ENTER_GAME = 'GAMES/ENTER_GAME';
-
-export type UpdateGamesAction = { type: typeof UPDATE_GAMES, games: ApiLobby[]};
-export type RequestCreateGameAction = { type: typeof REQUEST_CREATE_GAME, gameName: string };
-export type RequestJoinGameAction = { type: typeof REQUEST_JOIN_GAME, gameId: number };
-export type RequestStartGameAction = { type: typeof REQUEST_START_GAME };
-export type EnterLobbyAction = { type: typeof ENTER_LOBBY, gameId: number };
-export type EnterGameAction = { type: typeof ENTER_GAME, gameId: number };
-
-export type LobbyAction =
- | UpdateGamesAction
- | RequestCreateGameAction
- | RequestJoinGameAction
- | RequestStartGameAction
- | EnterLobbyAction
- | EnterGameAction;
-
-export const actions = {
- updateGames: (games: ApiLobby[]): UpdateGamesAction => ({ type: UPDATE_GAMES, games }),
- requestJoinGame: (gameId: number): RequestJoinGameAction => ({ type: REQUEST_JOIN_GAME, gameId }),
- requestCreateGame: (gameName: string): RequestCreateGameAction => ({ type: REQUEST_CREATE_GAME, gameName }),
- requestStartGame: (): RequestStartGameAction => ({ type: REQUEST_START_GAME }),
- enterLobby: (gameId: number): EnterLobbyAction => ({ type: ENTER_LOBBY, gameId }),
- enterGame: (gameId: number): EnterGameAction => ({ type: ENTER_GAME, gameId }),
-};
diff --git a/sw-ui/src/redux/actions/user.ts b/sw-ui/src/redux/actions/user.ts
deleted file mode 100644
index 29c85707..00000000
--- a/sw-ui/src/redux/actions/user.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { Map } from 'immutable';
-import { ApiPlayer } from '../../api/model';
-
-export const REQUEST_CHOOSE_USERNAME = 'USER/REQUEST_CHOOSE_USERNAME';
-export const SET_CURRENT_PLAYER = 'USER/SET_CURRENT_PLAYER';
-export const UPDATE_PLAYERS = 'USER/UPDATE_PLAYERS';
-
-export type RequestChooseUsernameAction = { type: typeof REQUEST_CHOOSE_USERNAME, username: string };
-export type SetCurrentPlayerAction = { type: typeof SET_CURRENT_PLAYER, player: ApiPlayer };
-export type UpdatePlayersAction = { type: typeof UPDATE_PLAYERS, players: Map<string, ApiPlayer> };
-
-export type PlayerAction = RequestChooseUsernameAction | SetCurrentPlayerAction | UpdatePlayersAction;
-
-export const actions = {
- chooseUsername: (username: string): RequestChooseUsernameAction => ({ type: REQUEST_CHOOSE_USERNAME, username }),
- setCurrentPlayer: (player: ApiPlayer): SetCurrentPlayerAction => ({ type: SET_CURRENT_PLAYER, player }),
-};
diff --git a/sw-ui/src/redux/currentGame.ts b/sw-ui/src/redux/currentGame.ts
deleted file mode 100644
index 5e015d60..00000000
--- a/sw-ui/src/redux/currentGame.ts
+++ /dev/null
@@ -1,46 +0,0 @@
-import { combineReducers } from 'redux';
-import { ApiPlayerTurnInfo, ApiTable } from '../api/model';
-import { GlobalState } from '../reducers';
-import { Action } from './actions/all';
-import { TABLE_UPDATE_RECEIVED, TURN_INFO_RECEIVED } from './actions/game';
-
-export type CurrentGameState = {
- turnInfo: ApiPlayerTurnInfo | null;
- table: ApiTable | null;
-}
-
-export const EMPTY_CURRENT_GAME: CurrentGameState = {
- turnInfo: null,
- table: null,
-};
-
-export function createCurrentGameReducer() {
- return combineReducers({
- turnInfo: turnInfoReducer,
- table: tableUpdatesReducer,
- });
-}
-
-const turnInfoReducer = (state: ApiPlayerTurnInfo | null = null, action: Action) => {
- switch (action.type) {
- case TURN_INFO_RECEIVED:
- return action.turnInfo;
- case TABLE_UPDATE_RECEIVED:
- return null;
- default:
- return state;
- }
-};
-
-const tableUpdatesReducer = (state: ApiTable | null = null, action: Action) => {
- switch (action.type) {
- case TURN_INFO_RECEIVED:
- return action.turnInfo.table;
- case TABLE_UPDATE_RECEIVED:
- return action.table;
- default:
- return state;
- }
-};
-
-export const getCurrentTurnInfo = (state: GlobalState): ApiPlayerTurnInfo | null => state.currentGame.turnInfo;
diff --git a/sw-ui/src/redux/games.ts b/sw-ui/src/redux/games.ts
deleted file mode 100644
index 4df2f1da..00000000
--- a/sw-ui/src/redux/games.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-import { List, Map } from 'immutable';
-import { combineReducers } from 'redux';
-import { ApiLobby } from '../api/model';
-import { GlobalState } from '../reducers';
-import { Action } from './actions/all';
-import { ENTER_LOBBY, UPDATE_GAMES } from './actions/lobby';
-
-export type GamesState = {
- all: Map<string, ApiLobby>,
- current: string | null
-};
-
-export const EMPTY_GAMES: GamesState = {
- all: Map(),
- current: null,
-};
-
-export const createGamesReducer = () => {
- return combineReducers({
- all: allGamesReducer,
- current: currentGameIdReducer
- })
-};
-
-export const allGamesReducer = (state: Map<string, ApiLobby> = Map(), action: Action) => {
- switch (action.type) {
- case UPDATE_GAMES:
- const newGames = mapify(action.games);
- return state.merge(newGames);
- default:
- return state;
- }
-};
-
-function mapify(games: ApiLobby[]): Map<string, ApiLobby> {
- let newGames: {[id:string]:ApiLobby} = {};
- games.forEach(g => newGames[`${g.id}`] = g);
- return Map(newGames);
-}
-
-export const currentGameIdReducer = (state: string | null = null, action: Action) => {
- switch (action.type) {
- case ENTER_LOBBY:
- return `${action.gameId}`;
- default:
- return state;
- }
-};
-
-export const getAllGames = (state: GlobalState): List<ApiLobby> => state.games.all.toList();
-export const getCurrentGame = (state: GlobalState): ApiLobby | null => {
- if (state.games.current == null) {
- return null;
- }
- return state.games.all.get(state.games.current) || null;
-};
diff --git a/sw-ui/src/redux/user.ts b/sw-ui/src/redux/user.ts
deleted file mode 100644
index 2cc25cc0..00000000
--- a/sw-ui/src/redux/user.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { ApiPlayer } from '../api/model';
-import { GlobalState } from '../reducers';
-import { Action } from './actions/all';
-import { SET_CURRENT_PLAYER } from './actions/user';
-import { getCurrentGame } from './games';
-
-export type User = {
- username: string,
- displayName: string,
-}
-
-export const currentUserReducer = (state: User | null = null, action: Action) => {
- switch (action.type) {
- case SET_CURRENT_PLAYER:
- return {
- username: action.player.username,
- displayName: action.player.displayName
- };
- default:
- return state;
- }
-};
-
-export function getCurrentUser(state: GlobalState): User | null {
- return state.currentUser
-}
-
-export function getCurrentPlayer(state: GlobalState): ApiPlayer | null {
- if (state.currentUser == null) {
- return null;
- }
- let game = getCurrentGame(state);
- if (game == null) {
- return null;
- }
- for (let i = 0; i < game.players.length; i++) {
- let player = game.players[i];
- if (player.username === state.currentUser.username) {
- return player;
- }
- }
- return null;
-}
diff --git a/sw-ui/src/sagas.ts b/sw-ui/src/sagas.ts
deleted file mode 100644
index 03c71b63..00000000
--- a/sw-ui/src/sagas.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import { SagaIterator } from 'redux-saga';
-import { call, fork } from 'redux-saga/effects';
-import { connectToGame, SevenWondersSession } from './api/sevenWondersApi';
-import { errorHandlingSaga } from './sagas/errors';
-import { gameSaga } from './sagas/game';
-import { gameBrowserSaga } from './sagas/gameBrowser';
-import { homeSaga } from './sagas/home';
-import { lobbySaga } from './sagas/lobby';
-
-export function* rootSaga(): SagaIterator {
- let sevenWondersSession: SevenWondersSession;
- try {
- sevenWondersSession = yield call(connectToGame);
- } catch (error) {
- console.error('Could not connect to socket', error);
- return;
- }
- yield fork(errorHandlingSaga, sevenWondersSession);
- yield fork(homeSaga, sevenWondersSession);
- yield fork(gameBrowserSaga, sevenWondersSession);
- yield fork(lobbySaga, sevenWondersSession);
- yield fork(gameSaga, sevenWondersSession);
-}
diff --git a/sw-ui/src/sagas/errors.ts b/sw-ui/src/sagas/errors.ts
deleted file mode 100644
index b27dfa95..00000000
--- a/sw-ui/src/sagas/errors.ts
+++ /dev/null
@@ -1,36 +0,0 @@
-import {Toaster} from '@blueprintjs/core';
-import {Channel, eventChannel} from 'redux-saga';
-import {apply, cancelled, take} from 'redux-saga/effects';
-import {ApiError} from '../api/model';
-import {SevenWondersSession} from '../api/sevenWondersApi';
-
-const ErrorToaster = Toaster.create();
-
-export function* errorHandlingSaga(session: SevenWondersSession): any {
- const errorChannel: Channel<ApiError> = yield eventChannel(session.watchErrors());
- try {
- while (true) {
- const error: ApiError = yield take(errorChannel);
- yield* handleOneError(error);
- }
- } finally {
- if (yield cancelled()) {
- console.log('Error management saga cancelled');
- yield apply(errorChannel, errorChannel.close);
- }
- }
-}
-
-function* handleOneError(err: ApiError): any {
- console.error('Error received on web socket channel', err);
- const msg = buildMsg(err);
- yield apply(ErrorToaster, ErrorToaster.show, [{ intent: 'danger', icon: 'error', message: msg }]);
-}
-
-function buildMsg(err: ApiError): string {
- if (err.details.length > 0) {
- return err.details.map(d => d.message).join('\n');
- } else {
- return err.message;
- }
-}
diff --git a/sw-ui/src/sagas/game.ts b/sw-ui/src/sagas/game.ts
deleted file mode 100644
index a60ab2d3..00000000
--- a/sw-ui/src/sagas/game.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { eventChannel, SagaIterator } from 'redux-saga';
-import { apply, call, put, take } from 'redux-saga/effects';
-import { ApiPlayerTurnInfo, ApiPreparedCard, ApiTable } from '../api/model';
-import { SevenWondersSession } from '../api/sevenWondersApi';
-import { actions, REQUEST_PREPARE_MOVE, REQUEST_SAY_READY } from '../redux/actions/game';
-import { ENTER_GAME } from '../redux/actions/lobby';
-
-function* watchPlayerReady(session: SevenWondersSession, gameId: number) {
- const channel = yield eventChannel(session.watchPlayerReady(gameId));
- try {
- while (true) {
- const username = yield take(channel);
- yield put(actions.receivePlayerReady(username));
- }
- } finally {
- yield apply(channel, channel.close);
- }
-}
-
-function* watchTableUpdates(session: SevenWondersSession, gameId: number) {
- const channel = yield eventChannel(session.watchTableUpdates(gameId));
- try {
- while (true) {
- const table: ApiTable = yield take(channel);
- yield put(actions.receiveTableUpdate(table));
- }
- } finally {
- yield apply(channel, channel.close);
- }
-}
-
-function* watchPreparedCards(session: SevenWondersSession, gameId: number) {
- const channel = yield eventChannel(session.watchPreparedCards(gameId));
- try {
- while (true) {
- const preparedCard: ApiPreparedCard = yield take(channel);
- yield put(actions.receivePreparedCard(preparedCard));
- }
- } finally {
- yield apply(channel, channel.close);
- }
-}
-
-function* sayReady(session: SevenWondersSession): SagaIterator {
- while (true) {
- yield take(REQUEST_SAY_READY);
- yield apply(session, session.sayReady);
- }
-}
-
-function* prepareMove(session: SevenWondersSession): SagaIterator {
- while (true) {
- let action = yield take(REQUEST_PREPARE_MOVE);
- yield apply(session, session.prepareMove, [action.move]);
- }
-}
-
-function* watchTurnInfo(session: SevenWondersSession) {
- const channel = yield eventChannel(session.watchTurnInfo());
- try {
- while (true) {
- const turnInfo: ApiPlayerTurnInfo = yield take(channel);
- yield put(actions.receiveTurnInfo(turnInfo));
- }
- } finally {
- yield apply(channel, channel.close);
- }
-}
-
-export function* gameSaga(session: SevenWondersSession): SagaIterator {
- const { gameId } = yield take(ENTER_GAME);
- console.log('Entered game!', gameId);
- yield [
- call(watchPlayerReady, session, gameId),
- call(watchTableUpdates, session, gameId),
- call(watchPreparedCards, session, gameId),
- call(sayReady, session),
- call(prepareMove, session),
- call(watchTurnInfo, session)
- ];
-}
diff --git a/sw-ui/src/sagas/gameBrowser.ts b/sw-ui/src/sagas/gameBrowser.ts
deleted file mode 100644
index 868ec471..00000000
--- a/sw-ui/src/sagas/gameBrowser.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { push } from 'react-router-redux';
-import { eventChannel, SagaIterator } from 'redux-saga';
-import { all, apply, call, put, take } from 'redux-saga/effects';
-import { ApiLobby } from '../api/model';
-import { SevenWondersSession } from '../api/sevenWondersApi';
-import { actions as gameActions, REQUEST_CREATE_GAME, REQUEST_JOIN_GAME } from '../redux/actions/lobby';
-
-function* watchGames(session: SevenWondersSession): any {
- const gamesChannel = yield eventChannel(session.watchGames());
- try {
- while (true) {
- const gameList = yield take(gamesChannel);
- yield put(gameActions.updateGames(gameList));
- }
- } finally {
- yield apply(gamesChannel, gamesChannel.close);
- }
-}
-
-function* watchLobbyJoined(session: SevenWondersSession): any {
- const joinedLobbyChannel = yield eventChannel(session.watchLobbyJoined());
- try {
- const joinedLobby: ApiLobby = yield take(joinedLobbyChannel);
- yield put(gameActions.updateGames([joinedLobby]));
- yield put(gameActions.enterLobby(joinedLobby.id));
- yield put(push(`/lobby/${joinedLobby.id}`));
- } finally {
- yield apply(joinedLobbyChannel, joinedLobbyChannel.close);
- }
-}
-
-function* createGame(session: SevenWondersSession): SagaIterator {
- while (true) {
- const { gameName } = yield take(REQUEST_CREATE_GAME);
- // $FlowFixMe
- yield apply(session, session.createGame, [gameName]);
- }
-}
-
-function* joinGame(session: SevenWondersSession): SagaIterator {
- while (true) {
- const { gameId } = yield take(REQUEST_JOIN_GAME);
- // $FlowFixMe
- yield apply(session, session.joinGame, [gameId]);
- }
-}
-
-export function* gameBrowserSaga(session: SevenWondersSession): SagaIterator {
- yield all([
- call(watchGames, session),
- call(watchLobbyJoined, session),
- call(createGame, session),
- call(joinGame, session),
- ]);
-}
diff --git a/sw-ui/src/sagas/home.ts b/sw-ui/src/sagas/home.ts
deleted file mode 100644
index 585c536e..00000000
--- a/sw-ui/src/sagas/home.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import { push } from 'react-router-redux';
-import { eventChannel, SagaIterator } from 'redux-saga';
-import { all, apply, call, put, take } from 'redux-saga/effects';
-import { ApiPlayer } from '../api/model';
-import { SevenWondersSession } from '../api/sevenWondersApi';
-import { actions, REQUEST_CHOOSE_USERNAME } from '../redux/actions/user';
-
-function* sendUsername(session: SevenWondersSession): SagaIterator {
- while (true) {
- const { username } = yield take(REQUEST_CHOOSE_USERNAME);
- // $FlowFixMe
- yield apply(session, session.chooseName, [username]);
- }
-}
-
-function* validateUsername(session: SevenWondersSession): any {
- const usernameChannel = yield eventChannel(session.watchNameChoice());
- while (true) {
- const user: ApiPlayer = yield take(usernameChannel);
- yield put(actions.setCurrentPlayer(user));
- yield apply(usernameChannel, usernameChannel.close);
- yield put(push('/games'));
- }
-}
-
-export function* homeSaga(session: SevenWondersSession): SagaIterator {
- yield all([call(sendUsername, session), call(validateUsername, session)]);
-}
diff --git a/sw-ui/src/sagas/lobby.ts b/sw-ui/src/sagas/lobby.ts
deleted file mode 100644
index 09360b02..00000000
--- a/sw-ui/src/sagas/lobby.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { push } from 'react-router-redux';
-import { Channel, eventChannel, SagaIterator } from 'redux-saga';
-import { all, apply, call, put, take } from 'redux-saga/effects';
-import { SevenWondersSession } from '../api/sevenWondersApi';
-import { actions as gameActions, ENTER_LOBBY, REQUEST_START_GAME } from '../redux/actions/lobby';
-
-function* watchLobbyUpdates(session: SevenWondersSession, lobbyId: number): any {
- const lobbyUpdatesChannel: Channel<Object> = yield eventChannel(session.watchLobbyUpdated(lobbyId));
- try {
- while (true) {
- const lobby = yield take(lobbyUpdatesChannel);
- yield put(gameActions.updateGames([lobby]));
- }
- } finally {
- yield apply(lobbyUpdatesChannel, lobbyUpdatesChannel.close);
- }
-}
-
-function* watchGameStart(session: SevenWondersSession, lobbyId: number): any {
- const gameStartedChannel = yield eventChannel(session.watchGameStarted(lobbyId));
- try {
- yield take(gameStartedChannel);
- yield put(gameActions.enterGame(lobbyId));
- yield put(push(`/game/${lobbyId}`));
- } finally {
- yield apply(gameStartedChannel, gameStartedChannel.close);
- }
-}
-
-function* startGame(session: SevenWondersSession): SagaIterator {
- while (true) {
- yield take(REQUEST_START_GAME);
- yield apply(session, session.startGame);
- }
-}
-
-export function* lobbySaga(session: SevenWondersSession): SagaIterator {
- const { gameId } = yield take(ENTER_LOBBY);
- yield all([
- call(watchLobbyUpdates, session, gameId),
- call(watchGameStart, session, gameId),
- call(startGame, session)
- ]);
-}
diff --git a/sw-ui/src/setupProxy.js b/sw-ui/src/setupProxy.js
deleted file mode 100644
index 88831e6e..00000000
--- a/sw-ui/src/setupProxy.js
+++ /dev/null
@@ -1,8 +0,0 @@
-const proxy = require('http-proxy-middleware');
-
-module.exports = function(app) {
- app.use(proxy('/seven-wonders-websocket', {
- "target": "http://localhost:8080",
- "ws": true
- }));
-};
diff --git a/sw-ui/src/store.ts b/sw-ui/src/store.ts
deleted file mode 100644
index 54a65509..00000000
--- a/sw-ui/src/store.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-import createHistory from 'history/createBrowserHistory';
-import { routerMiddleware } from 'react-router-redux';
-import { applyMiddleware, createStore } from 'redux';
-import { composeWithDevTools } from 'redux-devtools-extension';
-import createSagaMiddleware from 'redux-saga';
-import { GlobalState } from './reducers';
-import { createReducer } from './reducers';
-import { rootSaga } from './sagas';
-
-export function configureStore(initialState: GlobalState) {
- const sagaMiddleware = createSagaMiddleware();
-
- const history = createHistory();
-
- const middlewares = [sagaMiddleware, routerMiddleware(history)];
-
- const enhancers = [applyMiddleware(...middlewares)];
-
- const store = createStore(createReducer(), initialState, composeWithDevTools(...enhancers));
-
- sagaMiddleware.run(rootSaga);
-
- return {
- store,
- history,
- };
-}
diff --git a/sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFrameworkTest.kt b/sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFrameworkTest.kt
new file mode 100644
index 00000000..8182401f
--- /dev/null
+++ b/sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/redux/sagas/SagasFrameworkTest.kt
@@ -0,0 +1,91 @@
+package org.luxons.sevenwonders.ui.redux.sagas
+
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.promise
+import redux.RAction
+import redux.Store
+import redux.WrapperAction
+import redux.applyMiddleware
+import redux.compose
+import redux.createStore
+import redux.rEnhancer
+import kotlin.test.Test
+import kotlin.test.assertEquals
+
+private data class State(val data: String)
+
+private data class UpdateData(val newData: String): RAction
+private class DuplicateData: RAction
+private class SideEffectAction(val data: String): RAction
+
+private fun reduce(state: State, action: RAction): State = when (action) {
+ is UpdateData -> State(action.newData)
+ is DuplicateData -> State(state.data + state.data)
+ else -> state
+}
+
+private fun configureTestStore(initialState: State): TestRedux {
+ val sagaMiddlewareFactory = SagaManager<State, RAction, WrapperAction>()
+ val sagaMiddleware = sagaMiddlewareFactory.createMiddleware()
+ val enhancers = compose(applyMiddleware(sagaMiddleware), rEnhancer())
+ val store = createStore(::reduce, initialState, enhancers)
+ return TestRedux(store, sagaMiddlewareFactory)
+}
+
+private data class TestRedux(
+ val store: Store<State, RAction, WrapperAction>,
+ val sagas: SagaManager<State, RAction, WrapperAction>
+)
+
+@OptIn(ExperimentalCoroutinesApi::class)
+class SagaContextTest {
+
+ @Test
+ fun dispatch(): dynamic = GlobalScope.promise {
+
+ val redux = configureTestStore(State("initial"))
+
+ redux.sagas.runSaga {
+ dispatch(UpdateData("Bob"))
+ }
+
+ assertEquals(State("Bob"), redux.store.getState(), "state is not as expected")
+ }
+
+ @Test
+ fun next(): dynamic = GlobalScope.promise {
+ val redux = configureTestStore(State("initial"))
+
+ val job = redux.sagas.launchSaga(this) {
+ val action = next<SideEffectAction>()
+ dispatch(UpdateData("effect-${action.data}"))
+ }
+
+ assertEquals(State("initial"), redux.store.getState())
+
+ redux.store.dispatch(SideEffectAction("data"))
+ job.join()
+ assertEquals(State("effect-data"), redux.store.getState())
+ }
+
+ @Test
+ fun onEach(): dynamic = GlobalScope.promise {
+
+ val redux = configureTestStore(State("initial"))
+
+ val job = redux.sagas.launchSaga(this) {
+ onEach<SideEffectAction> {
+ dispatch(UpdateData("effect-${it.data}"))
+ }
+ }
+
+ assertEquals(State("initial"), redux.store.getState())
+
+ redux.store.dispatch(SideEffectAction("data"))
+ delay(50)
+ assertEquals(State("effect-data"), redux.store.getState())
+ job.cancel()
+ }
+}
diff --git a/sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/utils/CoroutineUtilsTest.kt b/sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/utils/CoroutineUtilsTest.kt
new file mode 100644
index 00000000..d633f6f2
--- /dev/null
+++ b/sw-ui/src/test/kotlin/org/luxons/sevenwonders/ui/utils/CoroutineUtilsTest.kt
@@ -0,0 +1,24 @@
+package org.luxons.sevenwonders.ui.utils
+
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.promise
+import kotlin.test.Test
+import kotlin.test.assertEquals
+
+class CoroutineUtilsTest {
+
+ @Test
+ fun awaitFirstTest(): dynamic = GlobalScope.promise {
+ val s = awaitFirst(
+ { delay(100); "1" },
+ { delay(200); "2" }
+ )
+ assertEquals("1", s)
+ val s2 = awaitFirst(
+ { delay(150); "1" },
+ { delay(50); "2" }
+ )
+ assertEquals("2", s2)
+ }
+}
bgstack15