+
{tabs.map(({ href, labelKey, labelDefault, icon: Icon, match }) => {
const active = match(pathname);
const label = t(labelKey, { defaultValue: labelDefault });
diff --git a/src/components/layout/player-panel.tsx b/src/components/layout/player-panel.tsx
index d2a7680..426b87f 100644
--- a/src/components/layout/player-panel.tsx
+++ b/src/components/layout/player-panel.tsx
@@ -7,12 +7,15 @@ import { Bell, ChevronLeft } from "lucide-react";
import { useTranslation } from "react-i18next";
import { LanguageSwitcher } from "@/components/language-switcher";
+import {
+ playerHeaderControl,
+ playerPageHeader,
+ playerPageInset,
+} from "@/lib/player-spacing";
import { cn } from "@/lib/utils";
type PlayerPanelProps = {
title: string;
- subtitle?: string;
- eyebrow?: string;
children: ReactNode;
backHref?: string;
backLabel?: string;
@@ -22,7 +25,6 @@ type PlayerPanelProps = {
export function PlayerPanel({
title,
- subtitle,
children,
backHref = "/hall",
backLabel,
@@ -37,42 +39,53 @@ export function PlayerPanel({
-
-
-
- {resolvedBackLabel}
-
-
diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx
index 40cac5f..1ebe9c0 100644
--- a/src/components/ui/card.tsx
+++ b/src/components/ui/card.tsx
@@ -12,7 +12,7 @@ function Card({
data-slot="card"
data-size={size}
className={cn(
- "group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
+ "group/card flex flex-col gap-3 overflow-hidden rounded-xl bg-card py-3 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-2 data-[size=sm]:py-2 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
className
)}
{...props}
@@ -25,7 +25,7 @@ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
-
+
+
+
+
+
+
+
+ {resolvedBackLabel}
+
+
+
+
+
{title}
- {subtitle ? (
-
- {subtitle}
-
- ) : null}
-
-
-
+
+
+ {resolvedBackLabel}
+
+
+
+
+
- {title}
- {subtitle ? ( -- {subtitle} -
- ) : null}
+
+
+
+
{children}
) {
return (
)
@@ -84,7 +84,7 @@ function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
{
return (
- ),
- info: (
-
- ),
- warning: (
-
- ),
- error: (
-
- ),
- loading: (
-
- ),
+ success: ,
+ info: ,
+ warning: ,
+ error: ,
+ loading: ,
}}
style={
{
"--normal-bg": "var(--popover)",
"--normal-text": "var(--popover-foreground)",
"--normal-border": "var(--border)",
- "--border-radius": "var(--radius)",
+ "--border-radius": "calc(var(--radius) * 0.8)",
+ "--width": "min(280px, calc(100vw - 24px))",
} as React.CSSProperties
}
toastOptions={{
classNames: {
- toast: "cn-toast",
+ toast:
+ "cn-toast !min-h-0 !w-full !max-w-[min(280px,calc(100vw-24px))] !items-center !gap-2 !rounded-lg !border !px-3 !py-2 !text-xs !shadow-md",
+ title: "!text-xs !font-semibold !leading-snug",
+ description: "!text-[11px] !leading-snug !text-muted-foreground",
+ icon: "!mr-0 !size-3.5",
},
}}
{...props}
diff --git a/src/features/hall/hall-bet-preview-dialog.tsx b/src/features/hall/hall-bet-preview-dialog.tsx
index 3e5600e..d9c4655 100644
--- a/src/features/hall/hall-bet-preview-dialog.tsx
+++ b/src/features/hall/hall-bet-preview-dialog.tsx
@@ -4,6 +4,7 @@ import {
AlertTriangleIcon,
CheckCircle2,
LoaderCircle,
+ Lock,
WalletCards,
XIcon,
} from "lucide-react";
@@ -137,7 +138,7 @@ export function HallBetPreviewDialog({
showCloseButton={false}
className="flex max-h-[calc(100dvh-24px)] flex-col gap-0 overflow-hidden rounded-2xl border-[#e4ebf6] bg-white p-0 shadow-[0_18px_60px_rgba(15,23,42,0.18)] ring-[#e8eef7] sm:max-h-[min(92vh,760px)] sm:max-w-lg"
>
-
+
-
+
-
{!data ? (
{t("hall.preview.empty")}
) : ( @@ -291,7 +292,7 @@ export function HallBetPreviewDialog({
+