Commit 0d3c3239 authored by timel's avatar timel

fix: small

parent 5c3a29b6
Pipeline #23025 failed with stages
in 16 minutes and 42 seconds
...@@ -2,8 +2,9 @@ import { ...@@ -2,8 +2,9 @@ import {
DeleteOutlined, DeleteOutlined,
DownloadOutlined, DownloadOutlined,
PlusOutlined, PlusOutlined,
FileAddOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
import { Button } from "antd"; import { Button, Dropdown, MenuProps } from "antd";
import styles from "./DeckSelect.module.scss"; import styles from "./DeckSelect.module.scss";
...@@ -15,6 +16,20 @@ export const DeckSelect: React.FC<{ ...@@ -15,6 +16,20 @@ export const DeckSelect: React.FC<{
onDownload: (deckName: string) => void; onDownload: (deckName: string) => void;
onAdd: () => void; onAdd: () => void;
}> = ({ decks, selected, onSelect, onDelete, onDownload, onAdd }) => { }> = ({ decks, selected, onSelect, onDelete, onDownload, onAdd }) => {
const items: MenuProps["items"] = [
{
key: "1",
label: "新建卡组",
icon: <PlusOutlined />,
onClick: () => {},
},
{
key: "2",
label: "导入卡组",
icon: <FileAddOutlined />,
onClick: () => {},
},
];
return ( return (
<> <>
<div className={styles["deck-select"]}> <div className={styles["deck-select"]}>
...@@ -44,14 +59,16 @@ export const DeckSelect: React.FC<{ ...@@ -44,14 +59,16 @@ export const DeckSelect: React.FC<{
</div> </div>
))} ))}
</div> </div>
<Button <Dropdown menu={{ items }} placement="top" arrow trigger={["click"]}>
className={styles["btn-add"]} <Button
icon={<PlusOutlined />} className={styles["btn-add"]}
shape="circle" icon={<PlusOutlined />}
type="text" shape="circle"
onClick={onAdd} type="text"
size="large" onClick={onAdd}
/> size="large"
/>
</Dropdown>
</> </>
); );
}; };
......
...@@ -59,9 +59,17 @@ ...@@ -59,9 +59,17 @@
.main, .main,
.extra, .extra,
.side { .side {
transition: 0.2s;
position: relative; position: relative;
border-bottom: 1px solid rgba(255, 255, 255, 0.1); border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding: 0.75rem; padding: 0.75rem;
&.over {
background-color: hsla(0, 0%, 100%, 0.05);
}
&.not-allow-to-drop {
background-color: rgba(255, 0, 0, 0.15);
cursor: not-allowed;
}
} }
.main { .main {
flex: 3; flex: 3;
......
...@@ -13,7 +13,7 @@ import { ...@@ -13,7 +13,7 @@ import {
Button, Button,
ConfigProvider, ConfigProvider,
Input, Input,
message, Dropdown,
Space, Space,
type ThemeConfig, type ThemeConfig,
} from "antd"; } from "antd";
...@@ -48,6 +48,7 @@ import { ...@@ -48,6 +48,7 @@ import {
iDeckToEditingDeck, iDeckToEditingDeck,
type Type, type Type,
} from "./utils"; } from "./utils";
import classNames from "classnames";
const theme: ThemeConfig = { const theme: ThemeConfig = {
components: { components: {
...@@ -85,9 +86,11 @@ export const Component: React.FC = () => { ...@@ -85,9 +86,11 @@ export const Component: React.FC = () => {
if (result) { if (result) {
setSelectedDeck(tmpIDeck); setSelectedDeck(tmpIDeck);
message.info("保存成功"); message.info("保存成功");
editDeckStore.edited = false;
} else { } else {
editDeckStore.set(await iDeckToEditingDeck(selectedDeck)); editDeckStore.set(await iDeckToEditingDeck(selectedDeck));
message.error("保存失败"); message.error("保存失败");
editDeckStore.edited = false;
} }
}; };
...@@ -182,7 +185,7 @@ const DeckEditor: React.FC<{ ...@@ -182,7 +185,7 @@ const DeckEditor: React.FC<{
重置 重置
</Button> </Button>
<Button <Button
type="text" type={snapEditDeck.edited ? "primary" : "text"}
size="small" size="small"
icon={<CheckOutlined />} icon={<CheckOutlined />}
onClick={() => onSave()} onClick={() => onSave()}
...@@ -202,7 +205,7 @@ const DeckEditor: React.FC<{ ...@@ -202,7 +205,7 @@ const DeckEditor: React.FC<{
/** 卡片库,选择卡片加入正在编辑的卡组 */ /** 卡片库,选择卡片加入正在编辑的卡组 */
const Search: React.FC = () => { const Search: React.FC = () => {
const { message, notification, modal } = App.useApp(); const { modal } = App.useApp();
const [searchWord, setSearchWord] = useState(""); const [searchWord, setSearchWord] = useState("");
const [searchResult, setSearchResult] = useState<CardMeta[]>([]); const [searchResult, setSearchResult] = useState<CardMeta[]>([]);
const handleSearch = async () => { const handleSearch = async () => {
...@@ -238,6 +241,7 @@ const Search: React.FC = () => { ...@@ -238,6 +241,7 @@ const Search: React.FC = () => {
value={searchWord} value={searchWord}
onChange={(e) => setSearchWord(e.target.value)} onChange={(e) => setSearchWord(e.target.value)}
onKeyUp={(e) => e.key === "Enter" && handleSearch()} onKeyUp={(e) => e.key === "Enter" && handleSearch()}
allowClear
/> />
</div> </div>
<div className={styles["select-btns"]}> <div className={styles["select-btns"]}>
...@@ -293,7 +297,8 @@ const DeckZone: React.FC<{ ...@@ -293,7 +297,8 @@ const DeckZone: React.FC<{
}> = ({ type }) => { }> = ({ type }) => {
const { message } = App.useApp(); const { message } = App.useApp();
const cards = useSnapshot(editDeckStore)[type]; const cards = useSnapshot(editDeckStore)[type];
const [_, dropRef] = useDrop({ const [allowToDrop, setAllowToDrop] = useState(false);
const [{ isOver }, dropRef] = useDrop({
accept: ["Card"], // 指明该区域允许接收的拖放物。可以是单个,也可以是数组 accept: ["Card"], // 指明该区域允许接收的拖放物。可以是单个,也可以是数组
// 里面的值就是useDrag所定义的type // 里面的值就是useDrag所定义的type
// 当拖拽物在这个拖放区域放下时触发,这个item就是拖拽物的item(拖拽物携带的数据) // 当拖拽物在这个拖放区域放下时触发,这个item就是拖拽物的item(拖拽物携带的数据)
...@@ -309,9 +314,23 @@ const DeckZone: React.FC<{ ...@@ -309,9 +314,23 @@ const DeckZone: React.FC<{
message.error(reason); message.error(reason);
} }
}, },
hover: ({ value, source }) => {
setAllowToDrop(
type !== source ? canAdd(value, type, editDeckStore).result : true
);
},
collect: (monitor) => ({
isOver: monitor.isOver(),
}),
}); });
return ( return (
<div className={styles[type]} ref={dropRef}> <div
className={classNames(styles[type], {
[styles.over]: isOver,
[styles["not-allow-to-drop"]]: isOver && !allowToDrop,
})}
ref={dropRef}
>
<div className={styles["card-continer"]}> <div className={styles["card-continer"]}>
{cards.map((item, i) => ( {cards.map((item, i) => (
<Card <Card
...@@ -390,11 +409,13 @@ const editDeckStore = proxy({ ...@@ -390,11 +409,13 @@ const editDeckStore = proxy({
add(type: Type, card: CardMeta) { add(type: Type, card: CardMeta) {
editDeckStore[type].push(card); editDeckStore[type].push(card);
editDeckStore[type].sort(compareCards); editDeckStore[type].sort(compareCards);
editDeckStore.edited = true;
}, },
remove(type: Type, card: CardMeta) { remove(type: Type, card: CardMeta) {
const index = editDeckStore[type].findIndex((item) => item.id === card.id); const index = editDeckStore[type].findIndex((item) => item.id === card.id);
if (index !== -1) { if (index !== -1) {
editDeckStore[type].splice(index, 1); editDeckStore[type].splice(index, 1);
editDeckStore.edited = true;
} }
}, },
set(deck: EditingDeck) { set(deck: EditingDeck) {
...@@ -402,10 +423,13 @@ const editDeckStore = proxy({ ...@@ -402,10 +423,13 @@ const editDeckStore = proxy({
editDeckStore.main = deck.main.sort(compareCards); editDeckStore.main = deck.main.sort(compareCards);
editDeckStore.extra = deck.extra.sort(compareCards); editDeckStore.extra = deck.extra.sort(compareCards);
editDeckStore.side = deck.side.sort(compareCards); editDeckStore.side = deck.side.sort(compareCards);
editDeckStore.edited = false;
}, },
clear() { clear() {
editDeckStore.main = []; editDeckStore.main = [];
editDeckStore.extra = []; editDeckStore.extra = [];
editDeckStore.side = []; editDeckStore.side = [];
editDeckStore.edited = true;
}, },
edited: false,
}) satisfies EditingDeck; }) satisfies EditingDeck;
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
.block { .block {
height: var(--block-height-m); height: var(--block-height-m);
width: var(--block-width); width: var(--block-width);
background: #ffffff1c; background-color: #ffffff1c;
position: relative; position: relative;
&.extra { &.extra {
margin-inline: calc(var(--block-width) / 2 + var(--col-gap) / 2); margin-inline: calc(var(--block-width) / 2 + var(--col-gap) / 2);
...@@ -28,41 +28,42 @@ ...@@ -28,41 +28,42 @@
&.highlight { &.highlight {
background: #ffffff35; background: #ffffff35;
cursor: pointer; cursor: pointer;
.triangle {
--color: #006eff;
transform: scale(1.5);
}
&:hover { &:hover {
opacity: 0.7; opacity: 0.7;
.triangle {
transform: scale(1.2);
}
} }
} }
.triangle { .triangle {
width: 0; display: none;
height: 0; --color: red;
--color: #333;
border-width: 4px;
border-style: solid;
position: absolute; position: absolute;
transition: 0.3s; transition: 0.3s;
transform: scale(1.2);
.triangle-atom {
width: 20px;
height: 5px;
background-color: red;
position: absolute;
&:last-of-type {
transform: rotate(90deg);
transform-origin: 2.5px 2.5px;
}
}
&:nth-of-type(1) { &:nth-of-type(1) {
border-color: var(--color) transparent transparent var(--color); left: 0;
} }
&:nth-of-type(2) { &:nth-of-type(2) {
border-color: var(--color) var(--color) transparent transparent; transform: rotate(90deg);
right: 0;
}
&:nth-of-type(3) {
border-color: transparent var(--color) var(--color) transparent;
right: 0; right: 0;
bottom: 0;
}
&:nth-of-type(4) {
border-color: transparent transparent var(--color) var(--color);
bottom: 0;
} }
// &:nth-of-type(3) {
// transform: rotate(180deg);
// right: 0;
// bottom: 0;
// }
// &:nth-of-type(4) {
// transform: rotate(270deg);
// bottom: 0;
// }
} }
} }
......
...@@ -32,7 +32,7 @@ const BgBlock: React.FC< ...@@ -32,7 +32,7 @@ const BgBlock: React.FC<
[styles.glowing]: glowing, [styles.glowing]: glowing,
})} })}
> >
{/* {<DecoTriangles />} */} {<DecoTriangles />}
{<DisabledCross disabled={disabled} />} {<DisabledCross disabled={disabled} />}
</div> </div>
); );
...@@ -129,8 +129,11 @@ const onBlockClick = (placeInteractivity: PlaceInteractivity) => { ...@@ -129,8 +129,11 @@ const onBlockClick = (placeInteractivity: PlaceInteractivity) => {
const DecoTriangles: React.FC = () => ( const DecoTriangles: React.FC = () => (
<> <>
{Array.from({ length: 4 }).map((_, i) => ( {Array.from({ length: 2 }).map((_, i) => (
<div className={styles.triangle} key={i} /> <div className={styles.triangle} key={i}>
<div className={styles["triangle-atom"]} />
<div className={styles["triangle-atom"]} />
</div>
))} ))}
</> </>
); );
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
} }
.inner { .inner {
transform: translateY(40%); transform: translateY(50%);
width: 60vw; width: 60vw;
height: 100vh; height: 100vh;
background: radial-gradient(#00814f, #1c0161); background: radial-gradient(#00814f, #1c0161);
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
transition: 0.5s; transition: 0.5s;
} }
.opponent .inner { .opponent .inner {
background: radial-gradient(#ff5100, #54005f98); background: radial-gradient(#810000, #54005f98);
transform: translateY(-50%); transform: translateY(-50%);
filter: blur(602px); filter: blur(602px);
opacity: 0.8; opacity: 0.8;
......
...@@ -29,5 +29,8 @@ export const theme: ThemeConfig = { ...@@ -29,5 +29,8 @@ export const theme: ThemeConfig = {
lineWidth: 0, lineWidth: 0,
colorBgContainer: "hsla(0, 0%, 100%, 0.05)", colorBgContainer: "hsla(0, 0%, 100%, 0.05)",
}, },
Dropdown: {
colorBgElevated: "hsla(0, 0%, 100%, 0.15)",
},
}, },
}; };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment