#11 update creature portal to match other types layout

This commit is contained in:
Daniel 2020-12-14 01:41:58 -05:00
parent fbea66e0ce
commit f50d0c7995
19 changed files with 327 additions and 327 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -15,11 +15,11 @@ export function LocationIcon(props) {
}
export function Rarity(props) {
const { set, rarity } = props;
const { set, rarity, iconOnly=false } = props;
return (
<span>
{set !== 'PE1' && <img className={props.size || "icon16"} style={{ verticalAlign: 'middle' }} src={("/public/img/icons/set/" + set + "/" + rarity + ".png").toLowerCase()} />}
{!props.notext && <>{API.sets[props.set]}&nbsp;|&nbsp;{props.rarity}</>}
{!iconOnly && <>{API.sets[props.set]}&nbsp;|&nbsp;{props.rarity}</>}
</span>
);
}

View File

@ -1,6 +1,6 @@
export const Tribes = ['Danian', 'Mipedian', "M'arrillian", 'OverWorld', 'UnderWorld', 'Frozen'] as const;
export const CreatureTribes = ['Danian', 'Mipedian', "M'arrillian", 'OverWorld', 'UnderWorld', 'Frozen', 'Tribeless'] as const;
export const MugicTribes = ['Danian', 'Mipedian', "M'arrillian", 'OverWorld', 'UnderWorld', 'Frozen', 'Generic'] as const;
export const Tribes = ['Danian', 'Mipedian', "M'arrillian", 'OverWorld', 'UnderWorld'] as const;
export const CreatureTribes = ['Danian', 'Mipedian', "M'arrillian", 'OverWorld', 'UnderWorld', 'Tribeless'] as const;
export const MugicTribes = ['Danian', 'Mipedian', "M'arrillian", 'OverWorld', 'UnderWorld', 'Generic'] as const;
export type Tribe = typeof Tribes[number];
export type CreatureTribe = typeof CreatureTribes[number];

View File

@ -2,7 +2,7 @@ import loki from 'lokijs';
import { observable } from 'mobx';
import { inject, observer } from 'mobx-react';
import React from 'react';
import { Route } from 'react-router-dom';
import { Route, Link } from 'react-router-dom';
import { Loading } from '../../Snippets';
import API from '../../SpreadsheetData';
@ -70,7 +70,7 @@ export default class Tribes extends React.Component {
if (base_path) {
return (<div className="entry tribe base_path">
<div className="cat_title">{path[2]}</div>
<div className="cat_title">{tribe}</div>
<div className="entry_nav">{bottom_nav}</div>
</div>);
}
@ -80,7 +80,7 @@ export default class Tribes extends React.Component {
<Route path={`${this.props.match.url}/Creatures/:card`} component={Creature} />
<Route path={`${this.props.match.url}/Mugic/:card`} component={Mugic} />
</div>
<div className="cat_title">{path[2]}</div>
<div className="cat_title"><Link to={`/portal/${tribe}`}>{tribe}</Link></div>
<div className="entry_nav">{bottom_nav}</div>
</div>);
}

View File

@ -1,5 +1,5 @@
import React from 'react';
import { Route } from 'react-router-dom';
import { Link, Route } from 'react-router-dom';
import { observable } from 'mobx';
import { observer, inject } from 'mobx-react';
@ -108,7 +108,7 @@ export default class Category extends React.Component {
return (
<div className={`entry ${this.type}`}>
<div className="entry_content">{top_content}</div>
<div className="cat_title">{cat_title}</div>
<div className="cat_title"><Link to={`/portal/${this.props.type}`}>{cat_title}</Link></div>
<div className="entry_nav">{bottom_nav}</div>
</div>
);

View File

@ -8,11 +8,11 @@ import { Card } from "../../common/definitions";
import API from '../../SpreadsheetData';
export function cleanCardName (card: Card) {
return card.gsx$name.split(",")[0].replace(/\(Unused\)/, "");
return card.gsx$name.split(",")[0].replace(/\(Unused\)[ ]/, "");
}
export function sortCardName (a: Card, b: Card) {
return (a.gsx$name.toLowerCase().replace(/\(unused\)/, "") > b.gsx$name.toLowerCase().replace(/\(unused\)/, "") ? 1 : -1);
return (a.gsx$name.toLowerCase().replace(/\(unused\)[ ]/, "") > b.gsx$name.toLowerCase().replace(/\(unused\)[ ]/, "") ? 1 : -1);
}
export function text_link (card: Card, i: number) {
@ -31,7 +31,6 @@ export function text_link (card: Card, i: number) {
export function thumb_link (portalCard: Card, i: number, url?: string) {
let collectionCard: Card | null = null;
console.log(portalCard, i, url);
if (["Attacks", "Battlegear", "Creatures", "Locations", "Mugic"].includes(portalCard.gsx$type)) {
if (!url) url = `/portal/${portalCard.gsx$type}/${portalCard.gsx$name}`;
collectionCard = API.cards[portalCard.gsx$type.toLowerCase()].findOne({ 'gsx$name': portalCard.gsx$name });

View File

@ -146,10 +146,9 @@ class DBSearch extends React.Component {
API.cards.battlegear.chain()
.find({ 'gsx$name': { '$regex': new RegExp(string, 'i') }})
.where((obj) => {return (obj.gsx$splash != ('') )}).data(),
// TODO after rewriting Single Creature
// API.cards.creatures.chain()
// .find({'gsx$name': {'$regex': new RegExp(string, 'i')}})
// .where((obj) => {return (obj.gsx$splash != ('') )}).data(),
API.cards.creatures.chain()
.find({ 'gsx$name': { '$regex': new RegExp(string, 'i') }})
.where((obj) => {return (obj.gsx$splash != ('') )}).data(),
API.cards.locations.chain()
.find({ 'gsx$name': { '$regex': new RegExp(string, 'i') }})
.where((obj) => {return (obj.gsx$splash != ('') )}).data(),
@ -158,6 +157,8 @@ class DBSearch extends React.Component {
.where((obj) => {return (obj.gsx$splash != ('') )}).data()
)
.sort(sortCardName)
// dedupe fullart results
.filter((val, i, arr) => (i == 0 || val.gsx$name != arr[i - 1].gsx$name))
.map((val, i) => thumb_link(val, i));
// Check Artists

View File

@ -24,24 +24,30 @@ export default class SingleAttack extends React.Component {
const card_data = API.cards.attacks.findOne({ 'gsx$name': name });
if (attack) {
const sections = [];
if (attack.gsx$attributes) {
sections.push(["Attributes", attack.gsx$attributes]);
}
if (attack.gsx$background) {
sections.push(["Background", attack.gsx$background]);
}
if (attack.gsx$details) {
sections.push(["Details", attack.gsx$details]);
}
return (<Single
card={card_data}
col2={<>
<div>
<strong>Attributes:</strong><br />
{attack.gsx$attributes}
</div>
<hr />
<div>
<strong>Background:</strong><br />
{attack.gsx$background}
</div>
<hr />
<div>
<strong>Details:</strong><br />
{attack.gsx$details}
</div>
</>}
col2={
sections.map((val, i) => {
return (<React.Fragment key={i} >
<div>
<strong>{val[0]}:</strong><br />
{val[1]}
</div>
{i !== sections.length - 1 && <hr />}
</React.Fragment>);
})
}
/>
);
}

View File

@ -24,24 +24,30 @@ export default class SingleBattlegear extends React.Component {
const card_data = API.cards.battlegear.findOne({ 'gsx$name': name });
if (battlegear) {
const sections = [];
if (battlegear.gsx$attributes) {
sections.push(["Attributes", battlegear.gsx$attributes]);
}
if (battlegear.gsx$background) {
sections.push(["Background", battlegear.gsx$background]);
}
if (battlegear.gsx$details) {
sections.push(["Details", battlegear.gsx$details]);
}
return (<Single
card={card_data}
col2={<>
<div>
<strong>Attributes:</strong><br />
{battlegear.gsx$attributes}
</div>
<hr />
<div>
<strong>Background:</strong><br />
{battlegear.gsx$background}
</div>
<hr />
<div>
<strong>Details:</strong><br />
{battlegear.gsx$details}
</div>
</>}
col2={
sections.map((val, i) => {
return (<React.Fragment key={i} >
<div>
<strong>{val[0]}:</strong><br />
{val[1]}
</div>
{i !== sections.length - 1 && <hr />}
</React.Fragment>);
})
}
/>);
}
else if (card_data) {

View File

@ -5,7 +5,7 @@ import API from '../../SpreadsheetData';
import s from '../../../styles/app.style';
import { observer, inject } from 'mobx-react';
import Single from './_base';
import { PageNotFound, Element, Mugic, Discipline, Ability, Tribe } from '../../Snippets';
import { PageNotFound, Element, Mugic, Discipline, Tribe } from '../../Snippets';
function Artist(props) {
const artists = [];
@ -33,157 +33,150 @@ export default class SingleCreature extends React.Component {
})();
const creature = API.portal.creatures.findOne({ 'gsx$name': name });
if (!creature) {
return (<PageNotFound location={this.props.location}/>);
}
const tribe = creature.gsx$tribe;
const card_data = API.cards.creatures.findOne({ 'gsx$name': name });
const locations = creature.gsx$location.split(/[;]+\s*/).map((item, i) => {
return <p key={i}><Interactive as={Link} {...s.link} to={"/portal/Locations/"+item}><span>{item}</span></Interactive></p>;
});
if (creature) {
const tribe = creature.gsx$tribe;
const battlegear = creature.gsx$battlegear.split(/[;]+\s*/).map((item, i) => {
return <p key={i}><Interactive as={Link} {...s.link} to={"/portal/Battlegear/"+item}><span>{item}</span></Interactive></p>;
});
const mugic = [];
for (let i = 0; i < parseInt(card_data.gsx$mugicability || 0); i++) {
mugic.push(<Mugic key={i} tribe={tribe} />);
}
const mugic = [];
for (let i = 0; i < card_data.gsx$mugicability; i++) {
mugic.push(<Mugic key={i} tribe={tribe} />);
}
const col2 = [];
if (creature.gsx$attributes) {
col2.push(["Appearance", creature.gsx$attributes]);
}
if (creature.gsx$background) {
col2.push(["Background", creature.gsx$background]);
}
if (creature.gsx$details) {
col2.push(["Details", creature.gsx$details]);
}
if (creature.gsx$battlegear) {
col2.push(["Favorite Battlegear(s)", creature.gsx$battlegear.split(/[;]+\s*/).map((item, i) =>
<p key={i}><Interactive as={Link} {...s.link} to={"/portal/Battlegear/"+item}><span>{item}</span></Interactive></p>
)]);
}
if (creature.gsx$location) {
col2.push(["Favorite Location(s)", creature.gsx$location.split(/[;]+\s*/).map((item, i) =>
<p key={i}><Interactive as={Link} {...s.link} to={"/portal/Locations/"+item}><span>{item}</span></Interactive></p>
)]);
}
if (creature.gsx$height) {
col2.push(["Height (ft)", creature.gsx$height]);
}
if (creature.gsx$specialabilities) {
col2.push(["Special Abilities", creature.gsx$specialabilities]);
}
if (creature.gsx$weight) {
col2.push(["Weight (lb)", creature.gsx$weight]);
}
// TODO readd creature to Portal Search after rewrite
return (<Single
card={card_data}
text={<>
<hr />
{creature.gsx$appearance && <>
return (<Single
card={card_data}
col0={<>
<div>
<strong>Appearance:</strong><br />
{creature.gsx$appearance}
<strong>Tribe: </strong>
<Tribe tribe={tribe} />&nbsp;
{tribe}
</div>
<hr />
</>}
<div>
<strong>Background:</strong><br />
{creature.gsx$background}
</div>
<hr />
<div>
<strong>Details:</strong><br />
{creature.gsx$details}
</div>
<hr />
<div>
<strong>Favorite Battlegear(s):</strong><br />
{battlegear}
</div>
<hr />
<div>
<strong>Favorite Location(s):</strong><br />
{locations}
</div>
<hr />
<div>
<strong>Height (ft):</strong><br />
{creature.gsx$height}
</div>
<hr />
<div>
<strong>Special Abilities:</strong><br />
{creature.gsx$specialabilities}
</div>
<hr />
<div>
<strong>Weight (lb):</strong><br />
{creature.gsx$weight}
</div>
<hr />
{card_data.gsx$artist && <>
<div>
<strong>Artist(s):</strong>
<Artist artist={card_data.gsx$artist} />
<strong>Disciplines: </strong>
{card_data.gsx$courage}
<Discipline discipline="courage" />&nbsp;
{card_data.gsx$power}
<Discipline discipline="power" />&nbsp;
{card_data.gsx$speed}
<Discipline discipline="speed" />&nbsp;
{card_data.gsx$wisdom}
<Discipline discipline="wisdom" />
</div>
<hr />
</>}
<div>
<strong>Card ID: </strong>
{card_data.gsx$id}
</div>
<hr />
<div>
<strong>Set: </strong>
{card_data.gsx$set}
</div>
<hr />
<div>
<strong>Rarity: </strong>
{card_data.gsx$rarity}
</div>
<hr />
<div>
<strong>Tribe: </strong>
<Tribe tribe={tribe} />
</div>
<hr />
<div>
<strong>Ability:</strong><br />
<Ability ability={card_data.gsx$ability} tribe={card_data.gsx$tribe} />
</div>
<hr />
<div>
<strong>Courage: </strong>
{card_data.gsx$courage}
<Discipline discipline="courage" />
</div>
<hr />
<div>
<strong>Power: </strong>
{card_data.gsx$power}
<Discipline discipline="power" />
</div>
<hr />
<div>
<strong>Speed: </strong>
{card_data.gsx$speed}
<Discipline discipline="speed" />
</div>
<hr />
<div>
<strong>Wisdom: </strong>
{card_data.gsx$wisdom}
<Discipline discipline="wisdom" />
</div>
<hr />
<div>
<strong>Energy: </strong>
{card_data.gsx$energy}
</div>
<hr />
<div>
<strong>Elements: </strong>
<div>
<strong>Energy: </strong>
{card_data.gsx$energy}
</div>
<hr />
<div>
<strong>Elements: </strong>
<Element element="fire" value={card_data.gsx$elements.toLowerCase().indexOf("fire") >=0} />&nbsp;
<Element element="air" value={card_data.gsx$elements.toLowerCase().indexOf("air") >=0} />&nbsp;
<Element element="earth" value={card_data.gsx$elements.toLowerCase().indexOf("earth") >=0} />&nbsp;
<Element element="water" value={card_data.gsx$elements.toLowerCase().indexOf("water") >=0} />
</div>
</div>
<hr />
<div>
<strong>Flavortext:</strong><br />
{card_data.gsx$flavortext}
</div>
<hr />
<div>
<strong>Mugic Ability: </strong>
{mugic}
</div>
</>}
/>);
<hr />
<div>
<strong>Mugic Ability: </strong>
{mugic}
</div>
</>}
col2={
col2.map((val, i) => {
return (<React.Fragment key={i} >
<div>
<strong>{val[0]}:</strong><br />
{val[1]}
</div>
{i !== col2.length - 1 && <hr />}
</React.Fragment>);
})
}
/>);
}
else if (card_data) {
if (card_data.gsx$splash) {
const tribe = card_data.gsx$tribe;
const mugic = [];
for (let i = 0; i < parseInt(card_data.gsx$mugicability || 0); i++) {
mugic.push(<Mugic key={i} tribe={tribe} />);
}
return (<Single
card={card_data}
col0={<>
<div>
<strong>Tribe: </strong>
<Tribe tribe={tribe} />&nbsp;
{tribe}
</div>
<hr />
<div>
<strong>Disciplines: </strong>
{card_data.gsx$courage}
<Discipline discipline="courage" />&nbsp;
{card_data.gsx$power}
<Discipline discipline="power" />&nbsp;
{card_data.gsx$speed}
<Discipline discipline="speed" />&nbsp;
{card_data.gsx$wisdom}
<Discipline discipline="wisdom" />
</div>
<hr />
<div>
<strong>Energy: </strong>
{card_data.gsx$energy}
</div>
<hr />
<div>
<strong>Elements: </strong>
<Element element="fire" value={card_data.gsx$elements.toLowerCase().indexOf("fire") >=0} />&nbsp;
<Element element="air" value={card_data.gsx$elements.toLowerCase().indexOf("air") >=0} />&nbsp;
<Element element="earth" value={card_data.gsx$elements.toLowerCase().indexOf("earth") >=0} />&nbsp;
<Element element="water" value={card_data.gsx$elements.toLowerCase().indexOf("water") >=0} />
</div>
<hr />
<div>
<strong>Mugic Ability: </strong>
{mugic}
</div>
</>}
/>);
}
}
return (<PageNotFound location={this.props.location}/>);
}
}

View File

@ -23,30 +23,38 @@ export default class SingleLocation extends React.Component {
const card_data = API.cards.locations.findOne({ 'gsx$name': name });
if (location) {
const sections = [];
if (location.gsx$localfeatures) {
sections.push(["Local Features", location.gsx$localfeatures]);
}
if (location.gsx$background) {
sections.push(["Background", location.gsx$background]);
}
if (location.gsx$details) {
sections.push(["Details", location.gsx$details]);
}
return (<Single
card={card_data}
col0={<>
<div>
<strong>Initiative: </strong>
<Initiative initiative={card_data.gsx$initiative} notitle="true"/>
</div>
</>}
col2={<>
<div>
<strong>Local Features:</strong><br />
{location.gsx$localfeatures}
</div>
<hr />
<div>
<strong>Background:</strong><br />
{location.gsx$background}
</div>
<hr />
<div>
<strong>Details:</strong><br />
{location.gsx$details}
</div>
{card_data.gsx$initiative && (
<div>
<strong>Initiative: </strong>
<Initiative initiative={card_data.gsx$initiative} notitle="true"/>
</div>
)}
</>}
col2={
sections.map((val, i) => {
return (<React.Fragment key={i} >
<div>
<strong>{val[0]}:</strong><br />
{val[1]}
</div>
{i !== sections.length - 1 && <hr />}
</React.Fragment>);
})
}
/>);
}
else if (card_data) {
@ -54,10 +62,12 @@ export default class SingleLocation extends React.Component {
return (<Single
card={card_data}
col0={<>
<div>
<strong>Initiative: </strong>
<Initiative initiative={card_data.gsx$initiative} notitle="true"/>
</div>
{card_data.gsx$initiative && (
<div>
<strong>Initiative: </strong>
<Initiative initiative={card_data.gsx$initiative} notitle="true"/>
</div>
)}
</>}
/>);
}

View File

@ -25,7 +25,7 @@ export default class SingleMugic extends React.Component {
const mugic = API.portal.mugic.findOne({ 'gsx$name': name });
const card_data = API.cards.mugic.findOne({ 'gsx$name': name });
const cost = () => {
const cost = (tribe) => {
const cost = [];
if (card_data.gsx$cost == 0) {
cost.push(<span key={0}>0</span>);
@ -34,54 +34,68 @@ export default class SingleMugic extends React.Component {
cost.push(<span key={0}>X</span>);
}
else {
for (let i = 0; i < card_data.gsx$cost; i++) {
cost.push(<Mugic tribe={card_data.gsx$tribe} key={i} />);
for (let i = 0; i < parseInt(card_data.gsx$cost); i++) {
cost.push(<Mugic tribe={tribe} key={i} />);
}
}
return cost;
};
if (mugic) {
const tribe = mugic.gsx$tribe;
return (<Single
card={card_data}
col0={<>
<div>
<strong>Tribe: </strong>
<Tribe tribe={mugic.gsx$tribe} />
</div>
<hr />
<div>
<strong>Cost: </strong>
{cost()}
<Tribe tribe={tribe} />&nbsp;
{tribe}
</div>
{card_data.gsx$cost !== "" && (<>
<hr />
<div>
<strong>Cost: </strong>
{cost(tribe)}
</div>
</>)}
</>}
col2={<>
<div>
<strong>Background:</strong><br />
{mugic.gsx$background}
</div>
<hr />
<div>
<strong>Details:</strong><br />
{mugic.gsx$details}
</div>
{mugic.gsx$background && (
<div>
<strong>Background:</strong><br />
{mugic.gsx$background}
</div>
)}
{(mugic.gsx$background && mugic.gsx$details) && <hr />}
{mugic.gsx$details && (
<div>
<strong>Details:</strong><br />
{mugic.gsx$details}
</div>
)}
</>}
/>);
}
else if (card_data) {
if (card_data.gsx$splash) {
const tribe = card_data.gsx$tribe;
return (<Single
card={card_data}
col0={<>
<div>
<strong>Tribe: </strong>
<Tribe tribe={card_data.gsx$tribe} />
</div>
<hr />
<div>
<strong>Cost: </strong>
{cost()}
<Tribe tribe={tribe} />&nbsp;
{tribe}
</div>
{card_data.gsx$cost !== "" && (<>
<hr />
<div>
<strong>Cost: </strong>
{cost(tribe)}
</div>
</>)}
</>}
/>);
}

View File

@ -58,68 +58,61 @@ export default class Single extends React.Component {
<Name name={card.gsx$name} />
<hr />
</div>
{this.props.text && (
<div className="nocolumn">{this.props.text}</div>
)}
{!this.props.text &&
<div className="column">
{card.gsx$artist && (<>
<div>
<strong>Artist(s):</strong>
<Artist artist={card.gsx$artist} />
</div>
<hr />
</>)}
{card.gsx$set && (<>
<div>
<strong>Set: </strong>
{`${API.sets[card.gsx$set]} (${card.gsx$set})`}
</div>
<hr />
</>)}
{card.gsx$rarity && (<>
<div>
<strong>Rarity: </strong>
<Rarity set={card.gsx$set} rarity={card.gsx$rarity} notext="true" />
{card.gsx$rarity}
</div>
<hr />
</>)}
{card.gsx$id && (<>
<div>
<strong>Card ID: </strong>
{card.gsx$id}
</div>
</>)}
{this.props.col0 && (<>
<hr />
{this.props.col0}
</>)}
{card.gsx$ability && (<>
<hr />
<div>
<strong>Ability:</strong>
<Ability ability={card.gsx$ability} />
</div>
</>)}
{card.gsx$flavortext && (<>
<hr />
<div>
<strong>Card Flavor:</strong><br />
{card.gsx$flavortext}
</div>
</>)}
{this.props.col1 && (<>
<hr />
this.props.col1
</>)}
</div>
}
{!this.props.text &&
<div className="column">
{this.props.col2}
</div>
}
<div className="column">
{card.gsx$artist && (<>
<div>
<strong>Artist(s):</strong>
<Artist artist={card.gsx$artist} />
</div>
<hr />
</>)}
{card.gsx$set && (<>
<div>
<strong>Set: </strong>
{`${API.sets[card.gsx$set]} (${card.gsx$set})`}
</div>
<hr />
</>)}
{card.gsx$rarity && (<>
<div>
<strong>Rarity: </strong>
<Rarity set={card.gsx$set} rarity={card.gsx$rarity} iconOnly />&nbsp;
{card.gsx$rarity}
</div>
<hr />
</>)}
{card.gsx$id && (<>
<div>
<strong>Card ID: </strong>
{card.gsx$id}
</div>
<hr />
</>)}
{this.props.col0 && (<>
{this.props.col0}
</>)}
{card.gsx$ability && (<>
<hr />
<div>
<strong>Ability:</strong>
<Ability ability={card.gsx$ability} />
</div>
</>)}
{card.gsx$flavortext && (<>
<hr />
<div>
<strong>Card Flavor:</strong><br />
{card.gsx$flavortext}
</div>
</>)}
{this.props.col1 && (<>
<hr />
this.props.col1
</>)}
</div>
<div className="column">
{this.props.col2}
</div>
</div>
</>);
}

View File

@ -242,7 +242,8 @@
background-color: #1a1a1a;
font-weight: bold;
font-size: 16px;
padding-top: 1px;
padding-top: 4px;
padding-bottom: 2px;
padding-left: 4px;
}

View File

@ -37,18 +37,4 @@ s.title = {
marginBottom: '0.5vh',
};
s.repoLink = {
fontSize: '14px',
};
s.mapMenu = {
margin: '3vh 0',
};
s.creditLine = {
color: '#A0A0A0',
fontSize: '14px',
marginTop: '50px',
};
export default s;

View File

@ -1,9 +0,0 @@
import style from './style';
const s = Object.create(style);
s.pageLinkContainer = {
margin: '1vh 0',
};
export default s;

View File

@ -2,16 +2,16 @@ import React from 'react';
const link = {
normal: {
borderBottom: '1px dotted rgb(0, 168, 0)',
borderBottom: '1px dotted rgb(66, 140, 195)',
},
hover: {
borderBottom: '1px solid rgb(0, 168, 0)',
color: 'black',
borderBottom: '1px solid rgb(66, 140, 195)',
color: 'rgb(66, 140, 195)',
},
active: 'hover',
touchActive: {
borderBottom: '1px dashed rgb(0, 168, 0)',
color: 'black',
borderBottom: '1px dashed rgb(66, 140, 195)',
color: 'rgb(66, 140, 195)',
},
focusFromTab: {
outline: '2px solid rgb(0, 152, 0)',