parent
f5fb40dc07
commit
26ab2153e2
2 changed files with 152 additions and 0 deletions
@ -0,0 +1,60 @@ |
||||
.App { |
||||
text-align: center; |
||||
} |
||||
|
||||
.App-header { |
||||
display: flex; |
||||
flex-direction: column; |
||||
align-items: center; |
||||
justify-content: center; |
||||
font-size: calc(10px + 1.5vmin); |
||||
} |
||||
|
||||
.App-link { |
||||
color: #61dafb; |
||||
} |
||||
|
||||
@keyframes App-logo-spin { |
||||
from { |
||||
transform: rotate(0deg); |
||||
} |
||||
to { |
||||
transform: rotate(360deg); |
||||
} |
||||
} |
||||
|
||||
.characters { |
||||
list-style: none; |
||||
padding-left: 0; |
||||
} |
||||
|
||||
.characters li { |
||||
display: flex; |
||||
align-items: center; |
||||
border: solid 2px #d0d0d0; |
||||
border-radius: 0.2em; |
||||
padding: 0.5em 0.8em 0.5em 0.5em; |
||||
margin-bottom: 1em; |
||||
} |
||||
|
||||
.characters p { |
||||
max-width: none; |
||||
font-weight: bold; |
||||
margin: 0; |
||||
} |
||||
|
||||
.characters-thumb { |
||||
overflow: hidden; |
||||
flex-shrink: 0; |
||||
width: 2em; |
||||
height: 2em; |
||||
background-color: #e8e8e8; |
||||
padding: 0.5em; |
||||
margin-right: 0.5em; |
||||
} |
||||
|
||||
.characters-thumb img { |
||||
display: block; |
||||
width: 100%; |
||||
height: auto; |
||||
} |
@ -0,0 +1,92 @@ |
||||
import React, { useState } from "react"; |
||||
import { DragDropContext, Droppable, Draggable } from "react-beautiful-dnd"; |
||||
import "./App.css"; |
||||
|
||||
const finalSpaceCharacters = [ |
||||
{ |
||||
id: "gary", |
||||
name: "Gary Goodspeed", |
||||
thumb: "/images/gary.png", |
||||
}, |
||||
{ |
||||
id: "cato", |
||||
name: "Little Cato", |
||||
thumb: "/images/cato.png", |
||||
}, |
||||
{ |
||||
id: "kvn", |
||||
name: "KVN", |
||||
thumb: "/images/kvn.png", |
||||
}, |
||||
{ |
||||
id: "mooncake", |
||||
name: "Mooncake", |
||||
thumb: "/images/mooncake.png", |
||||
}, |
||||
{ |
||||
id: "quinn", |
||||
name: "Quinn Ergon", |
||||
thumb: "/images/quinn.png", |
||||
}, |
||||
]; |
||||
|
||||
function Testt() { |
||||
const [characters, updateCharacters] = useState(finalSpaceCharacters); |
||||
|
||||
function handleOnDragEnd(result) { |
||||
if (!result.destination) return; |
||||
|
||||
const items = Array.from(characters); |
||||
const [reorderedItem] = items.splice(result.source.index, 1); |
||||
items.splice(result.destination.index, 0, reorderedItem); |
||||
|
||||
updateCharacters(items); |
||||
} |
||||
|
||||
return ( |
||||
<div className="App"> |
||||
<header className="App-header"> |
||||
<h1>Final Space Characters</h1> |
||||
<DragDropContext onDragEnd={handleOnDragEnd}> |
||||
<Droppable droppableId="characters"> |
||||
{(provided) => ( |
||||
<ul |
||||
className="characters" |
||||
{...provided.droppableProps} |
||||
ref={provided.innerRef} |
||||
> |
||||
{characters.map(({ id, name, thumb }, index) => { |
||||
return ( |
||||
<Draggable key={id} draggableId={id} index={index}> |
||||
{(provided) => ( |
||||
<li |
||||
ref={provided.innerRef} |
||||
{...provided.draggableProps} |
||||
{...provided.dragHandleProps} |
||||
> |
||||
<div className="characters-thumb"> |
||||
<img src={thumb} alt={`${name} Thumb`} /> |
||||
</div> |
||||
<p>{name}</p> |
||||
</li> |
||||
)} |
||||
</Draggable> |
||||
); |
||||
})} |
||||
{provided.placeholder} |
||||
</ul> |
||||
)} |
||||
</Droppable> |
||||
</DragDropContext> |
||||
</header> |
||||
<p> |
||||
Images from{" "} |
||||
<a href="https://final-space.fandom.com/wiki/Final_Space_Wiki"> |
||||
Final Space Wiki |
||||
</a> |
||||
</p> |
||||
</div> |
||||
); |
||||
} |
||||
|
||||
export default Testt; |
Loading…
Reference in new issue