diff options
author | Joffrey Bion <joffrey.bion@booking.com> | 2020-04-06 18:55:25 +0200 |
---|---|---|
committer | Joffrey Bion <joffrey.bion@booking.com> | 2020-04-06 18:55:58 +0200 |
commit | d4d20533556928f63c8759437f67e76336bab55e (patch) | |
tree | 34e7bb151b5d21497665131b6ab8d875254e7666 /sw-ui/src | |
parent | Refactoring in GameScene.kt (diff) | |
download | seven-wonders-d4d20533556928f63c8759437f67e76336bab55e.tar.gz seven-wonders-d4d20533556928f63c8759437f67e76336bab55e.tar.bz2 seven-wonders-d4d20533556928f63c8759437f67e76336bab55e.zip |
Delete old React/TypeScript UI
Diffstat (limited to 'sw-ui/src')
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 Binary files differnew file mode 100644 index 00000000..5c125de5 --- /dev/null +++ b/sw-ui/src/main/resources/favicon.ico diff --git a/sw-ui/src/components/game/background-papyrus.jpg b/sw-ui/src/main/resources/images/background-papyrus1.jpg Binary files differindex 57bdffcf..57bdffcf 100644 --- a/sw-ui/src/components/game/background-papyrus.jpg +++ b/sw-ui/src/main/resources/images/background-papyrus1.jpg diff --git a/sw-ui/src/main/resources/images/background-papyrus2.jpg b/sw-ui/src/main/resources/images/background-papyrus2.jpg Binary files differnew file mode 100644 index 00000000..b6c8dc5f --- /dev/null +++ b/sw-ui/src/main/resources/images/background-papyrus2.jpg diff --git a/sw-ui/src/main/resources/images/background-papyrus3.jpg b/sw-ui/src/main/resources/images/background-papyrus3.jpg Binary files differnew file mode 100644 index 00000000..90350045 --- /dev/null +++ b/sw-ui/src/main/resources/images/background-papyrus3.jpg diff --git a/sw-ui/src/components/home/background-zeus-temple.jpg b/sw-ui/src/main/resources/images/background-zeus-temple.jpg Binary files differindex 5a28e933..5a28e933 100644 --- a/sw-ui/src/components/home/background-zeus-temple.jpg +++ b/sw-ui/src/main/resources/images/background-zeus-temple.jpg diff --git a/sw-ui/src/main/resources/images/cards/academy.png b/sw-ui/src/main/resources/images/cards/academy.png Binary files differnew file mode 100644 index 00000000..d2a75075 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/academy.png diff --git a/sw-ui/src/main/resources/images/cards/altar.png b/sw-ui/src/main/resources/images/cards/altar.png Binary files differnew file mode 100644 index 00000000..bbde8f2f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/altar.png diff --git a/sw-ui/src/main/resources/images/cards/apothecary.png b/sw-ui/src/main/resources/images/cards/apothecary.png Binary files differnew file mode 100644 index 00000000..01804c0a --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/apothecary.png diff --git a/sw-ui/src/main/resources/images/cards/aqueduct.png b/sw-ui/src/main/resources/images/cards/aqueduct.png Binary files differnew file mode 100644 index 00000000..c29d9566 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/aqueduct.png diff --git a/sw-ui/src/main/resources/images/cards/archeryrange.png b/sw-ui/src/main/resources/images/cards/archeryrange.png Binary files differnew file mode 100644 index 00000000..15c6edda --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/archeryrange.png diff --git a/sw-ui/src/main/resources/images/cards/arena.png b/sw-ui/src/main/resources/images/cards/arena.png Binary files differnew file mode 100644 index 00000000..7dc76961 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/arena.png diff --git a/sw-ui/src/main/resources/images/cards/arsenal.png b/sw-ui/src/main/resources/images/cards/arsenal.png Binary files differnew file mode 100644 index 00000000..fc3f4a27 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/arsenal.png diff --git a/sw-ui/src/main/resources/images/cards/back/age1.png b/sw-ui/src/main/resources/images/cards/back/age1.png Binary files differnew file mode 100644 index 00000000..a06332d7 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/back/age1.png diff --git a/sw-ui/src/main/resources/images/cards/back/age2.png b/sw-ui/src/main/resources/images/cards/back/age2.png Binary files differnew file mode 100644 index 00000000..9b52aa4e --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/back/age2.png diff --git a/sw-ui/src/main/resources/images/cards/back/age3.png b/sw-ui/src/main/resources/images/cards/back/age3.png Binary files differnew file mode 100644 index 00000000..86c983ee --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/back/age3.png diff --git a/sw-ui/src/main/resources/images/cards/barracks.png b/sw-ui/src/main/resources/images/cards/barracks.png Binary files differnew file mode 100644 index 00000000..f5a68c17 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/barracks.png diff --git a/sw-ui/src/main/resources/images/cards/baths.png b/sw-ui/src/main/resources/images/cards/baths.png Binary files differnew file mode 100644 index 00000000..3d99d59d --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/baths.png diff --git a/sw-ui/src/main/resources/images/cards/bazar.png b/sw-ui/src/main/resources/images/cards/bazar.png Binary files differnew file mode 100644 index 00000000..f36e25c2 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/bazar.png diff --git a/sw-ui/src/main/resources/images/cards/brickyard.png b/sw-ui/src/main/resources/images/cards/brickyard.png Binary files differnew file mode 100644 index 00000000..ae0b7e9b --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/brickyard.png diff --git a/sw-ui/src/main/resources/images/cards/buildersguild.png b/sw-ui/src/main/resources/images/cards/buildersguild.png Binary files differnew file mode 100644 index 00000000..f5402611 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/buildersguild.png diff --git a/sw-ui/src/main/resources/images/cards/caravansery.png b/sw-ui/src/main/resources/images/cards/caravansery.png Binary files differnew file mode 100644 index 00000000..997bb102 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/caravansery.png diff --git a/sw-ui/src/main/resources/images/cards/chamberofcommerce.png b/sw-ui/src/main/resources/images/cards/chamberofcommerce.png Binary files differnew file mode 100644 index 00000000..44b5af28 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/chamberofcommerce.png diff --git a/sw-ui/src/main/resources/images/cards/circus.png b/sw-ui/src/main/resources/images/cards/circus.png Binary files differnew file mode 100644 index 00000000..b1ec4d8b --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/circus.png diff --git a/sw-ui/src/main/resources/images/cards/claypit.png b/sw-ui/src/main/resources/images/cards/claypit.png Binary files differnew file mode 100644 index 00000000..5442248e --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/claypit.png diff --git a/sw-ui/src/main/resources/images/cards/claypool.png b/sw-ui/src/main/resources/images/cards/claypool.png Binary files differnew file mode 100644 index 00000000..873cad47 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/claypool.png diff --git a/sw-ui/src/main/resources/images/cards/courthouse.png b/sw-ui/src/main/resources/images/cards/courthouse.png Binary files differnew file mode 100644 index 00000000..394901f2 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/courthouse.png diff --git a/sw-ui/src/main/resources/images/cards/craftsmensguild.png b/sw-ui/src/main/resources/images/cards/craftsmensguild.png Binary files differnew file mode 100644 index 00000000..09bff60e --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/craftsmensguild.png diff --git a/sw-ui/src/main/resources/images/cards/dispensary.png b/sw-ui/src/main/resources/images/cards/dispensary.png Binary files differnew file mode 100644 index 00000000..4917166b --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/dispensary.png diff --git a/sw-ui/src/main/resources/images/cards/easttradingpost.png b/sw-ui/src/main/resources/images/cards/easttradingpost.png Binary files differnew file mode 100644 index 00000000..0c67cc78 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/easttradingpost.png diff --git a/sw-ui/src/main/resources/images/cards/excavation.png b/sw-ui/src/main/resources/images/cards/excavation.png Binary files differnew file mode 100644 index 00000000..0fe1b01f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/excavation.png diff --git a/sw-ui/src/main/resources/images/cards/forestcave.png b/sw-ui/src/main/resources/images/cards/forestcave.png Binary files differnew file mode 100644 index 00000000..262fffc6 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/forestcave.png diff --git a/sw-ui/src/main/resources/images/cards/fortifications.png b/sw-ui/src/main/resources/images/cards/fortifications.png Binary files differnew file mode 100644 index 00000000..3e113473 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/fortifications.png diff --git a/sw-ui/src/main/resources/images/cards/forum.png b/sw-ui/src/main/resources/images/cards/forum.png Binary files differnew file mode 100644 index 00000000..d6262158 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/forum.png diff --git a/sw-ui/src/main/resources/images/cards/foundry.png b/sw-ui/src/main/resources/images/cards/foundry.png Binary files differnew file mode 100644 index 00000000..da95a48e --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/foundry.png diff --git a/sw-ui/src/main/resources/images/cards/gardens.png b/sw-ui/src/main/resources/images/cards/gardens.png Binary files differnew file mode 100644 index 00000000..9a49a0ad --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/gardens.png diff --git a/sw-ui/src/main/resources/images/cards/glassworks.png b/sw-ui/src/main/resources/images/cards/glassworks.png Binary files differnew file mode 100644 index 00000000..285d7d54 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/glassworks.png diff --git a/sw-ui/src/main/resources/images/cards/guardtower.png b/sw-ui/src/main/resources/images/cards/guardtower.png Binary files differnew file mode 100644 index 00000000..524b06f3 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/guardtower.png diff --git a/sw-ui/src/main/resources/images/cards/haven.png b/sw-ui/src/main/resources/images/cards/haven.png Binary files differnew file mode 100644 index 00000000..e0b345b2 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/haven.png diff --git a/sw-ui/src/main/resources/images/cards/laboratory.png b/sw-ui/src/main/resources/images/cards/laboratory.png Binary files differnew file mode 100644 index 00000000..4c29e81f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/laboratory.png diff --git a/sw-ui/src/main/resources/images/cards/library.png b/sw-ui/src/main/resources/images/cards/library.png Binary files differnew file mode 100644 index 00000000..7495a2ca --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/library.png diff --git a/sw-ui/src/main/resources/images/cards/lighthouse.png b/sw-ui/src/main/resources/images/cards/lighthouse.png Binary files differnew file mode 100644 index 00000000..2124811b --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/lighthouse.png diff --git a/sw-ui/src/main/resources/images/cards/lodge.png b/sw-ui/src/main/resources/images/cards/lodge.png Binary files differnew file mode 100644 index 00000000..22758688 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/lodge.png diff --git a/sw-ui/src/main/resources/images/cards/loom.png b/sw-ui/src/main/resources/images/cards/loom.png Binary files differnew file mode 100644 index 00000000..70bdf375 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/loom.png diff --git a/sw-ui/src/main/resources/images/cards/lumberyard.png b/sw-ui/src/main/resources/images/cards/lumberyard.png Binary files differnew file mode 100644 index 00000000..8558af1a --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/lumberyard.png diff --git a/sw-ui/src/main/resources/images/cards/magistratesguild.png b/sw-ui/src/main/resources/images/cards/magistratesguild.png Binary files differnew file mode 100644 index 00000000..d7deabb3 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/magistratesguild.png diff --git a/sw-ui/src/main/resources/images/cards/marketplace.png b/sw-ui/src/main/resources/images/cards/marketplace.png Binary files differnew file mode 100644 index 00000000..cd3676d4 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/marketplace.png diff --git a/sw-ui/src/main/resources/images/cards/mine.png b/sw-ui/src/main/resources/images/cards/mine.png Binary files differnew file mode 100644 index 00000000..4062775c --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/mine.png diff --git a/sw-ui/src/main/resources/images/cards/observatory.png b/sw-ui/src/main/resources/images/cards/observatory.png Binary files differnew file mode 100644 index 00000000..1da3d7b4 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/observatory.png diff --git a/sw-ui/src/main/resources/images/cards/orevein.png b/sw-ui/src/main/resources/images/cards/orevein.png Binary files differnew file mode 100644 index 00000000..fabea674 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/orevein.png diff --git a/sw-ui/src/main/resources/images/cards/palace.png b/sw-ui/src/main/resources/images/cards/palace.png Binary files differnew file mode 100644 index 00000000..1a24890e --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/palace.png diff --git a/sw-ui/src/main/resources/images/cards/pantheon.png b/sw-ui/src/main/resources/images/cards/pantheon.png Binary files differnew file mode 100644 index 00000000..264bae02 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/pantheon.png diff --git a/sw-ui/src/main/resources/images/cards/pawnshop.png b/sw-ui/src/main/resources/images/cards/pawnshop.png Binary files differnew file mode 100644 index 00000000..30bb3807 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/pawnshop.png diff --git a/sw-ui/src/main/resources/images/cards/philosophersguild.png b/sw-ui/src/main/resources/images/cards/philosophersguild.png Binary files differnew file mode 100644 index 00000000..f72590f6 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/philosophersguild.png diff --git a/sw-ui/src/main/resources/images/cards/press.png b/sw-ui/src/main/resources/images/cards/press.png Binary files differnew file mode 100644 index 00000000..c932df06 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/press.png diff --git a/sw-ui/src/main/resources/images/cards/quarry.png b/sw-ui/src/main/resources/images/cards/quarry.png Binary files differnew file mode 100644 index 00000000..8cdbdb22 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/quarry.png diff --git a/sw-ui/src/main/resources/images/cards/sawmill.png b/sw-ui/src/main/resources/images/cards/sawmill.png Binary files differnew file mode 100644 index 00000000..5abff473 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/sawmill.png diff --git a/sw-ui/src/main/resources/images/cards/school.png b/sw-ui/src/main/resources/images/cards/school.png Binary files differnew file mode 100644 index 00000000..ab2218d0 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/school.png diff --git a/sw-ui/src/main/resources/images/cards/scientistsguild.png b/sw-ui/src/main/resources/images/cards/scientistsguild.png Binary files differnew file mode 100644 index 00000000..7ee639e3 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/scientistsguild.png diff --git a/sw-ui/src/main/resources/images/cards/scriptorium.png b/sw-ui/src/main/resources/images/cards/scriptorium.png Binary files differnew file mode 100644 index 00000000..36dca27a --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/scriptorium.png diff --git a/sw-ui/src/main/resources/images/cards/senate.png b/sw-ui/src/main/resources/images/cards/senate.png Binary files differnew file mode 100644 index 00000000..ee878ea6 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/senate.png diff --git a/sw-ui/src/main/resources/images/cards/shipownersguild.png b/sw-ui/src/main/resources/images/cards/shipownersguild.png Binary files differnew file mode 100644 index 00000000..3eecd2da --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/shipownersguild.png diff --git a/sw-ui/src/main/resources/images/cards/siegeworkshop.png b/sw-ui/src/main/resources/images/cards/siegeworkshop.png Binary files differnew file mode 100644 index 00000000..bacf8309 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/siegeworkshop.png diff --git a/sw-ui/src/main/resources/images/cards/spiesguild.png b/sw-ui/src/main/resources/images/cards/spiesguild.png Binary files differnew file mode 100644 index 00000000..85e28d9e --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/spiesguild.png diff --git a/sw-ui/src/main/resources/images/cards/stables.png b/sw-ui/src/main/resources/images/cards/stables.png Binary files differnew file mode 100644 index 00000000..48c963f0 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/stables.png diff --git a/sw-ui/src/main/resources/images/cards/statue.png b/sw-ui/src/main/resources/images/cards/statue.png Binary files differnew file mode 100644 index 00000000..55aaa5cb --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/statue.png diff --git a/sw-ui/src/main/resources/images/cards/stockade.png b/sw-ui/src/main/resources/images/cards/stockade.png Binary files differnew file mode 100644 index 00000000..37741429 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/stockade.png diff --git a/sw-ui/src/main/resources/images/cards/stonepit.png b/sw-ui/src/main/resources/images/cards/stonepit.png Binary files differnew file mode 100644 index 00000000..724900c7 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/stonepit.png diff --git a/sw-ui/src/main/resources/images/cards/strategistsguild.png b/sw-ui/src/main/resources/images/cards/strategistsguild.png Binary files differnew file mode 100644 index 00000000..ae186a4b --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/strategistsguild.png diff --git a/sw-ui/src/main/resources/images/cards/study.png b/sw-ui/src/main/resources/images/cards/study.png Binary files differnew file mode 100644 index 00000000..d8b9ebf9 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/study.png diff --git a/sw-ui/src/main/resources/images/cards/tavern.png b/sw-ui/src/main/resources/images/cards/tavern.png Binary files differnew file mode 100644 index 00000000..418b0fb2 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/tavern.png diff --git a/sw-ui/src/main/resources/images/cards/temple.png b/sw-ui/src/main/resources/images/cards/temple.png Binary files differnew file mode 100644 index 00000000..9a8d89dc --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/temple.png diff --git a/sw-ui/src/main/resources/images/cards/theater.png b/sw-ui/src/main/resources/images/cards/theater.png Binary files differnew file mode 100644 index 00000000..0d5b2b01 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/theater.png diff --git a/sw-ui/src/main/resources/images/cards/timberyard.png b/sw-ui/src/main/resources/images/cards/timberyard.png Binary files differnew file mode 100644 index 00000000..0f20547f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/timberyard.png diff --git a/sw-ui/src/main/resources/images/cards/townhall.png b/sw-ui/src/main/resources/images/cards/townhall.png Binary files differnew file mode 100644 index 00000000..d0638739 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/townhall.png diff --git a/sw-ui/src/main/resources/images/cards/tradersguild.png b/sw-ui/src/main/resources/images/cards/tradersguild.png Binary files differnew file mode 100644 index 00000000..15777e77 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/tradersguild.png diff --git a/sw-ui/src/main/resources/images/cards/trainingground.png b/sw-ui/src/main/resources/images/cards/trainingground.png Binary files differnew file mode 100644 index 00000000..d59ef4f8 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/trainingground.png diff --git a/sw-ui/src/main/resources/images/cards/treefarm.png b/sw-ui/src/main/resources/images/cards/treefarm.png Binary files differnew file mode 100644 index 00000000..18cf228f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/treefarm.png diff --git a/sw-ui/src/main/resources/images/cards/university.png b/sw-ui/src/main/resources/images/cards/university.png Binary files differnew file mode 100644 index 00000000..c9ca8a80 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/university.png diff --git a/sw-ui/src/main/resources/images/cards/vineyard.png b/sw-ui/src/main/resources/images/cards/vineyard.png Binary files differnew file mode 100644 index 00000000..58fa8ee1 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/vineyard.png diff --git a/sw-ui/src/main/resources/images/cards/walls.png b/sw-ui/src/main/resources/images/cards/walls.png Binary files differnew file mode 100644 index 00000000..3823c62f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/walls.png diff --git a/sw-ui/src/main/resources/images/cards/westtradingpost.png b/sw-ui/src/main/resources/images/cards/westtradingpost.png Binary files differnew file mode 100644 index 00000000..b536269f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/westtradingpost.png diff --git a/sw-ui/src/main/resources/images/cards/workersguild.png b/sw-ui/src/main/resources/images/cards/workersguild.png Binary files differnew file mode 100644 index 00000000..de4f452f --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/workersguild.png diff --git a/sw-ui/src/main/resources/images/cards/workshop.png b/sw-ui/src/main/resources/images/cards/workshop.png Binary files differnew file mode 100644 index 00000000..8f585d61 --- /dev/null +++ b/sw-ui/src/main/resources/images/cards/workshop.png diff --git a/sw-ui/src/components/home/logo-7-wonders.png b/sw-ui/src/main/resources/images/logo-7-wonders.png Binary files differindex 96974d3e..96974d3e 100644 --- a/sw-ui/src/components/home/logo-7-wonders.png +++ b/sw-ui/src/main/resources/images/logo-7-wonders.png diff --git a/sw-ui/src/components/lobby/round-table.png b/sw-ui/src/main/resources/images/round-table.png Binary files differindex f277376d..f277376d 100644 --- a/sw-ui/src/components/lobby/round-table.png +++ b/sw-ui/src/main/resources/images/round-table.png diff --git a/sw-ui/src/main/resources/images/tokens/coin.png b/sw-ui/src/main/resources/images/tokens/coin.png Binary files differnew file mode 100644 index 00000000..f4813042 --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/coin.png diff --git a/sw-ui/src/main/resources/images/tokens/resources/clay.png b/sw-ui/src/main/resources/images/tokens/resources/clay.png Binary files differnew file mode 100644 index 00000000..72fc0b0e --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/resources/clay.png diff --git a/sw-ui/src/main/resources/images/tokens/resources/glass.png b/sw-ui/src/main/resources/images/tokens/resources/glass.png Binary files differnew file mode 100644 index 00000000..61fd2be5 --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/resources/glass.png diff --git a/sw-ui/src/main/resources/images/tokens/resources/loom.png b/sw-ui/src/main/resources/images/tokens/resources/loom.png Binary files differnew file mode 100644 index 00000000..294adcb2 --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/resources/loom.png diff --git a/sw-ui/src/main/resources/images/tokens/resources/ore.png b/sw-ui/src/main/resources/images/tokens/resources/ore.png Binary files differnew file mode 100644 index 00000000..c2149daa --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/resources/ore.png diff --git a/sw-ui/src/main/resources/images/tokens/resources/papyrus.png b/sw-ui/src/main/resources/images/tokens/resources/papyrus.png Binary files differnew file mode 100644 index 00000000..91a59221 --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/resources/papyrus.png diff --git a/sw-ui/src/main/resources/images/tokens/resources/stone.png b/sw-ui/src/main/resources/images/tokens/resources/stone.png Binary files differnew file mode 100644 index 00000000..674c40db --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/resources/stone.png diff --git a/sw-ui/src/main/resources/images/tokens/resources/wood.png b/sw-ui/src/main/resources/images/tokens/resources/wood.png Binary files differnew file mode 100644 index 00000000..09a4ede8 --- /dev/null +++ b/sw-ui/src/main/resources/images/tokens/resources/wood.png diff --git a/sw-ui/src/main/resources/images/wonders/alexandriaA.png b/sw-ui/src/main/resources/images/wonders/alexandriaA.png Binary files differnew file mode 100644 index 00000000..0d4135f3 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/alexandriaA.png diff --git a/sw-ui/src/main/resources/images/wonders/alexandriaB.png b/sw-ui/src/main/resources/images/wonders/alexandriaB.png Binary files differnew file mode 100644 index 00000000..dd072f8a --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/alexandriaB.png diff --git a/sw-ui/src/main/resources/images/wonders/babylonA.png b/sw-ui/src/main/resources/images/wonders/babylonA.png Binary files differnew file mode 100644 index 00000000..ae323c78 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/babylonA.png diff --git a/sw-ui/src/main/resources/images/wonders/babylonB.png b/sw-ui/src/main/resources/images/wonders/babylonB.png Binary files differnew file mode 100644 index 00000000..3780dc9d --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/babylonB.png diff --git a/sw-ui/src/main/resources/images/wonders/ephesosA.png b/sw-ui/src/main/resources/images/wonders/ephesosA.png Binary files differnew file mode 100644 index 00000000..307794ba --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/ephesosA.png diff --git a/sw-ui/src/main/resources/images/wonders/ephesosB.png b/sw-ui/src/main/resources/images/wonders/ephesosB.png Binary files differnew file mode 100644 index 00000000..ec2e9cb7 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/ephesosB.png diff --git a/sw-ui/src/main/resources/images/wonders/extra/agrigentoA.jpg b/sw-ui/src/main/resources/images/wonders/extra/agrigentoA.jpg Binary files differnew file mode 100644 index 00000000..76ba8195 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/agrigentoA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/angkorwatA.jpg b/sw-ui/src/main/resources/images/wonders/extra/angkorwatA.jpg Binary files differnew file mode 100644 index 00000000..32f52514 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/angkorwatA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/angkorwatB.jpg b/sw-ui/src/main/resources/images/wonders/extra/angkorwatB.jpg Binary files differnew file mode 100644 index 00000000..c3f4304e --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/angkorwatB.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/avalonA.jpg b/sw-ui/src/main/resources/images/wonders/extra/avalonA.jpg Binary files differnew file mode 100644 index 00000000..7f7f0678 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/avalonA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/ctesiphonB.jpg b/sw-ui/src/main/resources/images/wonders/extra/ctesiphonB.jpg Binary files differnew file mode 100644 index 00000000..c00b40ac --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/ctesiphonB.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/iramA.jpg b/sw-ui/src/main/resources/images/wonders/extra/iramA.jpg Binary files differnew file mode 100644 index 00000000..d2c24e95 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/iramA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/persepolisA.jpg b/sw-ui/src/main/resources/images/wonders/extra/persepolisA.jpg Binary files differnew file mode 100644 index 00000000..2caa4f89 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/persepolisA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/romaA.jpg b/sw-ui/src/main/resources/images/wonders/extra/romaA.jpg Binary files differnew file mode 100644 index 00000000..c54bc820 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/romaA.jpg 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 Binary files differnew file mode 100644 index 00000000..1c5dad97 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/sangri-laA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/spahanA.jpg b/sw-ui/src/main/resources/images/wonders/extra/spahanA.jpg Binary files differnew file mode 100644 index 00000000..ab2cfc84 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/spahanA.jpg 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 Binary files differnew file mode 100644 index 00000000..4aacd39b --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/the-great-wallA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/veniseA.jpg b/sw-ui/src/main/resources/images/wonders/extra/veniseA.jpg Binary files differnew file mode 100644 index 00000000..55ec00b5 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/veniseA.jpg diff --git a/sw-ui/src/main/resources/images/wonders/extra/veniseB.jpg b/sw-ui/src/main/resources/images/wonders/extra/veniseB.jpg Binary files differnew file mode 100644 index 00000000..e18f3a12 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/extra/veniseB.jpg diff --git a/sw-ui/src/main/resources/images/wonders/gizahA.png b/sw-ui/src/main/resources/images/wonders/gizahA.png Binary files differnew file mode 100644 index 00000000..e66735fb --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/gizahA.png diff --git a/sw-ui/src/main/resources/images/wonders/gizahB.png b/sw-ui/src/main/resources/images/wonders/gizahB.png Binary files differnew file mode 100644 index 00000000..ed55ed45 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/gizahB.png diff --git a/sw-ui/src/main/resources/images/wonders/halikarnassusA.png b/sw-ui/src/main/resources/images/wonders/halikarnassusA.png Binary files differnew file mode 100644 index 00000000..659f706e --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/halikarnassusA.png diff --git a/sw-ui/src/main/resources/images/wonders/halikarnassusB.png b/sw-ui/src/main/resources/images/wonders/halikarnassusB.png Binary files differnew file mode 100644 index 00000000..b6ae1f93 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/halikarnassusB.png diff --git a/sw-ui/src/main/resources/images/wonders/olympiaA.png b/sw-ui/src/main/resources/images/wonders/olympiaA.png Binary files differnew file mode 100644 index 00000000..478ed503 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/olympiaA.png diff --git a/sw-ui/src/main/resources/images/wonders/olympiaB.png b/sw-ui/src/main/resources/images/wonders/olympiaB.png Binary files differnew file mode 100644 index 00000000..a97a9524 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/olympiaB.png diff --git a/sw-ui/src/main/resources/images/wonders/rhodosA.png b/sw-ui/src/main/resources/images/wonders/rhodosA.png Binary files differnew file mode 100644 index 00000000..0c11a71a --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/rhodosA.png diff --git a/sw-ui/src/main/resources/images/wonders/rhodosB.png b/sw-ui/src/main/resources/images/wonders/rhodosB.png Binary files differnew file mode 100644 index 00000000..43e5d594 --- /dev/null +++ b/sw-ui/src/main/resources/images/wonders/rhodosB.png 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) + } +} |