Added InfoDialog feature (partially done)
parent
ff92db699d
commit
6acabeb91a
|
@ -0,0 +1,350 @@
|
|||
html {
|
||||
--pokename: #000;
|
||||
--cardborder: #fff;
|
||||
--pokenumber: hsl(228, 28%, 20%);
|
||||
--info: #fff;
|
||||
--bggradient: url('assets/bg.png');
|
||||
--bgcolor: none;
|
||||
}
|
||||
|
||||
html[data-theme='dark'] {
|
||||
--pokename: hsl(228, 28%, 20%);
|
||||
--cardborder: hsl(228, 28%, 20%);
|
||||
--pokenumber: hsl(228, 28%, 20%);
|
||||
--info: hsl(228, 28%, 20%);
|
||||
--bggradient: none;
|
||||
--bgcolor: #16171f;
|
||||
}
|
||||
|
||||
.info__container {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.info__container__data {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
margin-left: 40px;
|
||||
}
|
||||
|
||||
.info__container__img {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-evenly;
|
||||
align-items: center;
|
||||
border-radius: 1rem;
|
||||
background: #ffffff78;
|
||||
padding: 20px 20px;
|
||||
}
|
||||
|
||||
.info__container__img img {
|
||||
width: 120px;
|
||||
height: 147px;
|
||||
padding: 1rem 1rem;
|
||||
margin: 0.3rem;
|
||||
border-radius: 1.2rem;
|
||||
}
|
||||
|
||||
.pokemon__name {
|
||||
font-size: 22px;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.pokemon__id {
|
||||
color: var(--pokenumber);
|
||||
font-family: 'Teko', sans-serif;
|
||||
font-weight: 400;
|
||||
font-size: 40px;
|
||||
}
|
||||
|
||||
.info__container__data__header {
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.info__container__data__type {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.info__container__data__type img {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.info__container__headings {
|
||||
font-family: 'VT323', monospace;
|
||||
font-size: 27px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.info__container__data__abilities {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: flex-start;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.info__container__data__data {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
grid-gap: 0px 15px;
|
||||
gap: 0px 15px;
|
||||
align-items: center;
|
||||
margin: 0px 0;
|
||||
justify-content: space-between;
|
||||
background-color: #ffffff40;
|
||||
padding: 10px;
|
||||
border-radius: 1rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.info__container__stat__columns {
|
||||
width: 135px;
|
||||
margin-right: 0px;
|
||||
}
|
||||
|
||||
.MuiDialog-paperFullWidth {
|
||||
width: 63%;
|
||||
border-radius: 1rem;
|
||||
box-shadow: 0 10px 20px rgba(175, 136, 136, 0.29),
|
||||
0 6px 6px rgba(0, 0, 0, 0.43);
|
||||
}
|
||||
|
||||
.MuiDialog-container {
|
||||
background-color: var(--bgcolor);
|
||||
background-image: var(--bggradient);
|
||||
}
|
||||
|
||||
.MuiBackdrop-root {
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
.info__container__data__dimensions {
|
||||
display: flex;
|
||||
gap: 0 30px;
|
||||
}
|
||||
|
||||
.info__container__stat__columns__name {
|
||||
text-transform: uppercase;
|
||||
color: crimson;
|
||||
}
|
||||
|
||||
.dialog__bg {
|
||||
background-image: url('assets/bg.png');
|
||||
background-repeat: repeat;
|
||||
}
|
||||
|
||||
.dialog__content {
|
||||
font-family: 'VT323', monospace;
|
||||
font-size: 21px;
|
||||
}
|
||||
|
||||
.pokemon__name {
|
||||
font-family: 'Press Start 2P', cursive;
|
||||
}
|
||||
|
||||
.close__btn {
|
||||
width: 30px !important;
|
||||
}
|
||||
|
||||
.ability {
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.right__box {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: -webkit-fill-available;
|
||||
justify-content: space-evenly;
|
||||
gap: 3px 0px;
|
||||
}
|
||||
|
||||
.noselect {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.evolution__box {
|
||||
display: flex;
|
||||
gap: 0 0px;
|
||||
}
|
||||
|
||||
.evolution__sub__box {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.evolution__box .evo_img {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
margin: auto;
|
||||
display: flex;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* .evolution__img__div:hover {
|
||||
transform: scale(1.05);
|
||||
} */
|
||||
|
||||
.evolution__img__div {
|
||||
height: 113px;
|
||||
width: 113px;
|
||||
display: flex;
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 5px 15px 4px rgb(0 0 0 / 30%);
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: all 0.35s;
|
||||
margin-top: 3vh;
|
||||
}
|
||||
|
||||
.evolution__poke__name {
|
||||
text-transform: capitalize;
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.arrow__right {
|
||||
font-size: 1.75rem;
|
||||
margin: 0 10px;
|
||||
}
|
||||
|
||||
.MuiDialogContent-root:first-child {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.ability__list {
|
||||
display: flex;
|
||||
gap: 0 30px;
|
||||
padding-inline-start: 1em;
|
||||
}
|
||||
|
||||
.ability__list__bg {
|
||||
background-color: #ffffff40;
|
||||
padding: 5px;
|
||||
border-radius: 1rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.MuiTooltip-tooltip {
|
||||
font-size: 15px !important;
|
||||
}
|
||||
|
||||
.separator {
|
||||
border: 0;
|
||||
border-radius: 20px;
|
||||
height: 80;
|
||||
background-image: linear-gradient(
|
||||
to bottom,
|
||||
rgb(77, 77, 77),
|
||||
rgb(77, 77, 77)
|
||||
);
|
||||
width: 1%;
|
||||
margin-left: 2vw;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.transparency__div {
|
||||
background: #ffffff40;
|
||||
height: 113px;
|
||||
width: 113px;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.desc {
|
||||
background-color: #ffffff40;
|
||||
padding: 10px;
|
||||
border-radius: 1rem;
|
||||
margin-top: 0.5rem;
|
||||
}
|
||||
|
||||
.fa-mars {
|
||||
color: #7070ff;
|
||||
}
|
||||
|
||||
.fa-venus {
|
||||
color: rgb(224, 61, 88);
|
||||
}
|
||||
|
||||
.dimensions {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.pokemon__genera {
|
||||
padding: 3px 10px;
|
||||
border-radius: 10px;
|
||||
margin-top: 1.5vh;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* phone */
|
||||
|
||||
@media screen and (max-width: 767px) {
|
||||
.MuiDialog-paperFullWidth {
|
||||
width: 75%;
|
||||
height: 100%;
|
||||
}
|
||||
.info__container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
.info__container__img {
|
||||
margin-left: 0px;
|
||||
}
|
||||
.info__container__data {
|
||||
margin-left: 0px;
|
||||
}
|
||||
.right__box {
|
||||
margin-top: 20px;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.info__container__data__data {
|
||||
justify-content: center;
|
||||
}
|
||||
.info__container__stat__columns__name,
|
||||
.info__container__stat__columns__val,
|
||||
.stats,
|
||||
.dimensions,
|
||||
.ability {
|
||||
text-align: center;
|
||||
}
|
||||
.info__container__data__abilities {
|
||||
margin-top: 20px;
|
||||
align-items: center;
|
||||
gap: 0px;
|
||||
}
|
||||
.right__box .desc {
|
||||
text-align: center;
|
||||
}
|
||||
.info__container__headings {
|
||||
text-align: center;
|
||||
margin-top: 10px;
|
||||
}
|
||||
.evolution__box {
|
||||
flex-direction: column;
|
||||
}
|
||||
.evolution__sub__box {
|
||||
flex-direction: column;
|
||||
}
|
||||
.arrow__right {
|
||||
transform: rotate(90deg);
|
||||
}
|
||||
.evolution__poke__name {
|
||||
margin: 12px;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
import InfoDialog, { InfoDialogProps } from './InfoDialog';
|
||||
import { ComponentMeta, ComponentStory } from '@storybook/react';
|
||||
|
||||
export default {
|
||||
title: 'Features/InfoDialog',
|
||||
component: InfoDialog,
|
||||
} as ComponentMeta<typeof InfoDialog>;
|
||||
|
||||
const Template: ComponentStory<typeof InfoDialog> = (args: InfoDialogProps) => (
|
||||
<InfoDialog {...args} />
|
||||
);
|
|
@ -0,0 +1,132 @@
|
|||
import { Dialog, DialogContent, Tooltip, Zoom } from '@mui/material';
|
||||
|
||||
import { findPokeTypeAsset } from 'components/PokemonTypes';
|
||||
import { colorTypeGradients } from 'components/PokemonCard/utils';
|
||||
import GenderRate from 'components/GenderRate';
|
||||
|
||||
export interface InfoDialogProps {
|
||||
open: boolean;
|
||||
cancel: boolean;
|
||||
id: number;
|
||||
name: string;
|
||||
genere: string;
|
||||
types: string[];
|
||||
height: number;
|
||||
weight: number;
|
||||
genderRatio: number;
|
||||
description: string;
|
||||
abilities: string[];
|
||||
stats: {
|
||||
hp: number;
|
||||
attack: number;
|
||||
defense: number;
|
||||
spAttack: number;
|
||||
spDefense: number;
|
||||
speed: number;
|
||||
};
|
||||
image: string;
|
||||
}
|
||||
|
||||
const InfoDialog = (props: InfoDialogProps) => {
|
||||
let finalColor;
|
||||
|
||||
if (props.types.length === 2) {
|
||||
finalColor = colorTypeGradients(
|
||||
props.types[0],
|
||||
props.types[1],
|
||||
props.types.length,
|
||||
);
|
||||
} else {
|
||||
finalColor = colorTypeGradients(
|
||||
props.types[0],
|
||||
props.types[0],
|
||||
props.types.length,
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Dialog
|
||||
aria-labelledby="customized-dialog-title"
|
||||
open={props.open}
|
||||
fullWidth
|
||||
maxWidth="md"
|
||||
className="dialog__bg noselect"
|
||||
>
|
||||
<DialogContent
|
||||
style={{
|
||||
background: `linear-gradient(${finalColor[0]}, ${finalColor[1]})`,
|
||||
}}
|
||||
className="dialog__content"
|
||||
>
|
||||
<div className="info__container">
|
||||
<div className="info__container__img">
|
||||
<div className="pokemon__id">
|
||||
#{String(props.id).padStart(3, '0')}
|
||||
</div>
|
||||
<div className="pokemon__name">{props.name}</div>
|
||||
<div
|
||||
className="pokemon__genera"
|
||||
style={{ background: finalColor[0] }}
|
||||
>
|
||||
{props.genere}
|
||||
</div>
|
||||
<div>
|
||||
<img src={props.image} alt="poke-img" />
|
||||
</div>
|
||||
<div className="info__container__data__type">
|
||||
{props.types.map(type => (
|
||||
<Tooltip
|
||||
title={type}
|
||||
key={type}
|
||||
TransitionComponent={Zoom}
|
||||
arrow
|
||||
>
|
||||
<div className={`poke__type__bg ${type}`}>
|
||||
<img src={findPokeTypeAsset(type)} alt="poke-type" />
|
||||
</div>
|
||||
</Tooltip>
|
||||
))}
|
||||
</div>
|
||||
<div className="dimensions">
|
||||
<p>
|
||||
<span
|
||||
className="info__container__headings"
|
||||
style={{ fontSize: '20px' }}
|
||||
>
|
||||
Height
|
||||
</span>
|
||||
</p>
|
||||
<p>
|
||||
<span
|
||||
className="info__container__headings"
|
||||
style={{ fontSize: '20px' }}
|
||||
>
|
||||
Weight
|
||||
</span>
|
||||
</p>
|
||||
</div>
|
||||
<div className="gender__container">
|
||||
{props.genderRatio === -1 ? (
|
||||
'Genderless'
|
||||
) : (
|
||||
<GenderRate genderRatio={props.genderRatio} />
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<div className="info__container__data">
|
||||
<div className={'right__box'}>
|
||||
<div>
|
||||
<div className={'info__container__headings'}>About</div>
|
||||
<div className={'desc'}>{props.description}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</DialogContent>
|
||||
</Dialog>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default InfoDialog;
|
|
@ -0,0 +1,2 @@
|
|||
export * from './InfoDialog';
|
||||
export { default } from './InfoDialog';
|
Loading…
Reference in New Issue