Skip to content

Commit 2328731

Browse files
hh
1 parent 110b243 commit 2328731

65 files changed

Lines changed: 11161 additions & 402 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

components.json

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"$schema": "https://ui.shadcn.com/schema.json",
3+
"style": "radix-mira",
4+
"rsc": false,
5+
"tsx": true,
6+
"tailwind": {
7+
"config": "tailwind.config.js",
8+
"css": "styles/globals.css",
9+
"baseColor": "neutral",
10+
"cssVariables": true,
11+
"prefix": ""
12+
},
13+
"iconLibrary": "hugeicons",
14+
"rtl": false,
15+
"aliases": {
16+
"components": "@/components",
17+
"utils": "@/lib/utils",
18+
"ui": "@/components/ui",
19+
"lib": "@/lib",
20+
"hooks": "@/hooks"
21+
},
22+
"menuColor": "default",
23+
"menuAccent": "subtle",
24+
"registries": {}
25+
}

components/Yugioh/GridView.js

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import { useCallback, useMemo, useState } from "react";
1+
import { useCallback, useMemo, useState } from "react";
22
import Link from "next/link";
33
import Notification from "@/components/Notification";
44
import PriceTrendIndicator from "@/components/Yugioh/PriceTrendIndicator";
5-
import cardData from "@/public/card-data/Yugioh/card_data.json";
65

76
const FALLBACK_IMAGE = "/images/yugioh-card.png";
87

@@ -106,13 +105,6 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
106105

107106
const getFullImagePath = useCallback( ( cardId ) => `/images/yugiohImages/${ String( cardId ) }.jpg`, [] );
108107

109-
const getCardImage = useCallback(
110-
( cardName ) => {
111-
const cardInfo = cardData.find( ( item ) => item.name === cardName );
112-
return cardInfo ? getFullImagePath( cardInfo.id ) : null;
113-
},
114-
[ getFullImagePath ],
115-
);
116108

117109
const memoizedAggregatedData = useMemo( () => {
118110
if ( !Array.isArray( aggregatedData ) ) return [];
@@ -209,10 +201,8 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
209201
{ memoizedAggregatedData.map( ( card ) => {
210202
if ( !card ) return null;
211203

212-
const cardImage = getCardImage( card.productName );
213-
const cardInfo = cardData.find( ( item ) => item.name === card.productName );
214204
const cardIdImage = card.cardId ? getFullImagePath( card.cardId ) : null;
215-
const imageSrc = cardImage || cardIdImage || card.remoteImageUrl || FALLBACK_IMAGE;
205+
const imageSrc = cardIdImage || card.remoteImageUrl || FALLBACK_IMAGE;
216206
const isFlipped = Boolean( flippedCards[ card._id ] );
217207
const quantity = Number( card.quantity ) || 0;
218208
const totalMarketPrice = ( Number( card.marketPrice ) || 0 ) * quantity;
@@ -235,7 +225,7 @@ const GridView = ( { aggregatedData, onDeleteCard, onUpdateCard, sortConfig, han
235225
const cardDetailsQuery = ( () => {
236226
const query = { source: "collection" };
237227

238-
if ( cardInfo?.id ) query.card = cardInfo.id;
228+
if ( card.cardId ) query.card = card.cardId;
239229
if ( computedLetter ) query.letter = computedLetter;
240230
if ( card.setName ) query.set_name = card.setName;
241231
if ( card.productName ) query.card_name = card.productName;

components/ui/accordion.tsx

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import * as React from "react"
2+
import { Accordion as AccordionPrimitive } from "radix-ui"
3+
4+
import { cn } from "@/lib/utils"
5+
import { HugeiconsIcon } from "@/components/ui/hugeicons-icon"
6+
import { ArrowDown01Icon, ArrowUp01Icon } from "@hugeicons/core-free-icons"
7+
8+
function Accordion({
9+
className,
10+
...props
11+
}: React.ComponentProps<typeof AccordionPrimitive.Root>) {
12+
return (
13+
<AccordionPrimitive.Root
14+
data-slot="accordion"
15+
className={cn(
16+
"flex w-full flex-col overflow-hidden rounded-md border",
17+
className
18+
)}
19+
{...props}
20+
/>
21+
)
22+
}
23+
24+
function AccordionItem({
25+
className,
26+
...props
27+
}: React.ComponentProps<typeof AccordionPrimitive.Item>) {
28+
return (
29+
<AccordionPrimitive.Item
30+
data-slot="accordion-item"
31+
className={cn("not-last:border-b data-open:bg-muted/50", className)}
32+
{...props}
33+
/>
34+
)
35+
}
36+
37+
function AccordionTrigger({
38+
className,
39+
children,
40+
...props
41+
}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {
42+
return (
43+
<AccordionPrimitive.Header className="flex">
44+
<AccordionPrimitive.Trigger
45+
data-slot="accordion-trigger"
46+
className={cn(
47+
"group/accordion-trigger relative flex flex-1 items-start justify-between gap-6 border border-transparent p-2 text-left text-xs/relaxed font-medium transition-all outline-none hover:underline disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground",
48+
className
49+
)}
50+
{...props}
51+
>
52+
{children}
53+
<HugeiconsIcon icon={ArrowDown01Icon} strokeWidth={2} data-slot="accordion-trigger-icon" className="pointer-events-none shrink-0 group-aria-expanded/accordion-trigger:hidden" />
54+
<HugeiconsIcon icon={ArrowUp01Icon} strokeWidth={2} data-slot="accordion-trigger-icon" className="pointer-events-none hidden shrink-0 group-aria-expanded/accordion-trigger:inline" />
55+
</AccordionPrimitive.Trigger>
56+
</AccordionPrimitive.Header>
57+
)
58+
}
59+
60+
function AccordionContent({
61+
className,
62+
children,
63+
...props
64+
}: React.ComponentProps<typeof AccordionPrimitive.Content>) {
65+
return (
66+
<AccordionPrimitive.Content
67+
data-slot="accordion-content"
68+
className="overflow-hidden px-2 text-xs/relaxed data-open:animate-accordion-down data-closed:animate-accordion-up"
69+
{...props}
70+
>
71+
<div
72+
className={cn(
73+
"h-(--radix-accordion-content-height) pt-0 pb-4 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
74+
className
75+
)}
76+
>
77+
{children}
78+
</div>
79+
</AccordionPrimitive.Content>
80+
)
81+
}
82+
83+
export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }

components/ui/alert-dialog.tsx

Lines changed: 197 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,197 @@
1+
import * as React from "react"
2+
import { AlertDialog as AlertDialogPrimitive } from "radix-ui"
3+
4+
import { cn } from "@/lib/utils"
5+
import { Button } from "@/components/ui/button"
6+
7+
function AlertDialog({
8+
...props
9+
}: React.ComponentProps<typeof AlertDialogPrimitive.Root>) {
10+
return <AlertDialogPrimitive.Root data-slot="alert-dialog" {...props} />
11+
}
12+
13+
function AlertDialogTrigger({
14+
...props
15+
}: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>) {
16+
return (
17+
<AlertDialogPrimitive.Trigger data-slot="alert-dialog-trigger" {...props} />
18+
)
19+
}
20+
21+
function AlertDialogPortal({
22+
...props
23+
}: React.ComponentProps<typeof AlertDialogPrimitive.Portal>) {
24+
return (
25+
<AlertDialogPrimitive.Portal data-slot="alert-dialog-portal" {...props} />
26+
)
27+
}
28+
29+
function AlertDialogOverlay({
30+
className,
31+
...props
32+
}: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>) {
33+
return (
34+
<AlertDialogPrimitive.Overlay
35+
data-slot="alert-dialog-overlay"
36+
className={cn(
37+
"fixed inset-0 z-50 bg-black/80 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
38+
className
39+
)}
40+
{...props}
41+
/>
42+
)
43+
}
44+
45+
function AlertDialogContent({
46+
className,
47+
size = "default",
48+
...props
49+
}: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {
50+
size?: "default" | "sm"
51+
}) {
52+
return (
53+
<AlertDialogPortal>
54+
<AlertDialogOverlay />
55+
<AlertDialogPrimitive.Content
56+
data-slot="alert-dialog-content"
57+
data-size={size}
58+
className={cn(
59+
"group/alert-dialog-content fixed top-1/2 left-1/2 z-50 grid w-full -translate-x-1/2 -translate-y-1/2 gap-3 rounded-xl bg-popover p-4 text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none data-[size=default]:max-w-xs data-[size=sm]:max-w-64 data-[size=default]:sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
60+
className
61+
)}
62+
{...props}
63+
/>
64+
</AlertDialogPortal>
65+
)
66+
}
67+
68+
function AlertDialogHeader({
69+
className,
70+
...props
71+
}: React.ComponentProps<"div">) {
72+
return (
73+
<div
74+
data-slot="alert-dialog-header"
75+
className={cn(
76+
"grid grid-rows-[auto_1fr] place-items-center gap-1 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-4 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]",
77+
className
78+
)}
79+
{...props}
80+
/>
81+
)
82+
}
83+
84+
function AlertDialogFooter({
85+
className,
86+
...props
87+
}: React.ComponentProps<"div">) {
88+
return (
89+
<div
90+
data-slot="alert-dialog-footer"
91+
className={cn(
92+
"flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end",
93+
className
94+
)}
95+
{...props}
96+
/>
97+
)
98+
}
99+
100+
function AlertDialogMedia({
101+
className,
102+
...props
103+
}: React.ComponentProps<"div">) {
104+
return (
105+
<div
106+
data-slot="alert-dialog-media"
107+
className={cn(
108+
"mb-2 inline-flex size-8 items-center justify-center rounded-md bg-muted sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-4",
109+
className
110+
)}
111+
{...props}
112+
/>
113+
)
114+
}
115+
116+
function AlertDialogTitle({
117+
className,
118+
...props
119+
}: React.ComponentProps<typeof AlertDialogPrimitive.Title>) {
120+
return (
121+
<AlertDialogPrimitive.Title
122+
data-slot="alert-dialog-title"
123+
className={cn(
124+
"font-heading text-sm font-medium sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2",
125+
className
126+
)}
127+
{...props}
128+
/>
129+
)
130+
}
131+
132+
function AlertDialogDescription({
133+
className,
134+
...props
135+
}: React.ComponentProps<typeof AlertDialogPrimitive.Description>) {
136+
return (
137+
<AlertDialogPrimitive.Description
138+
data-slot="alert-dialog-description"
139+
className={cn(
140+
"text-xs/relaxed text-balance text-muted-foreground md:text-pretty *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
141+
className
142+
)}
143+
{...props}
144+
/>
145+
)
146+
}
147+
148+
function AlertDialogAction({
149+
className,
150+
variant = "default",
151+
size = "default",
152+
...props
153+
}: React.ComponentProps<typeof AlertDialogPrimitive.Action> &
154+
Pick<React.ComponentProps<typeof Button>, "variant" | "size">) {
155+
return (
156+
<Button variant={variant} size={size} asChild>
157+
<AlertDialogPrimitive.Action
158+
data-slot="alert-dialog-action"
159+
className={cn(className)}
160+
{...props}
161+
/>
162+
</Button>
163+
)
164+
}
165+
166+
function AlertDialogCancel({
167+
className,
168+
variant = "outline",
169+
size = "default",
170+
...props
171+
}: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> &
172+
Pick<React.ComponentProps<typeof Button>, "variant" | "size">) {
173+
return (
174+
<Button variant={variant} size={size} asChild>
175+
<AlertDialogPrimitive.Cancel
176+
data-slot="alert-dialog-cancel"
177+
className={cn(className)}
178+
{...props}
179+
/>
180+
</Button>
181+
)
182+
}
183+
184+
export {
185+
AlertDialog,
186+
AlertDialogAction,
187+
AlertDialogCancel,
188+
AlertDialogContent,
189+
AlertDialogDescription,
190+
AlertDialogFooter,
191+
AlertDialogHeader,
192+
AlertDialogMedia,
193+
AlertDialogOverlay,
194+
AlertDialogPortal,
195+
AlertDialogTitle,
196+
AlertDialogTrigger,
197+
}

0 commit comments

Comments
 (0)