+
{item.costCredits > 0 && (
-
- {item.costCredits}c{" "}
+
+
+ {item.costCredits}
)}
{item.costPoints > 0 && (
-
- {item.costPoints} {pts.label}{" "}
+
+
+ {item.costPoints}
)}
{item.costCredits === 0 &&
diff --git a/src/app/admin/users/[id]/user-quick-actions.tsx b/src/app/admin/users/[id]/user-quick-actions.tsx
index e6e72607..38eaffac 100644
--- a/src/app/admin/users/[id]/user-quick-actions.tsx
+++ b/src/app/admin/users/[id]/user-quick-actions.tsx
@@ -2,7 +2,6 @@
import {
Check,
- Coins,
Copy,
KeyRound,
MessageCircle,
@@ -19,6 +18,7 @@ import {
sendCredits,
unmuteUser,
} from "@/actions/users";
+import { CurrencyIcon } from "@/components/shared/currency-icon";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
@@ -229,7 +229,8 @@ export function UserQuickActions({
disabled={isPending}
size="sm"
>
- Send Credits
+ {" "}
+ Send Credits
diff --git a/src/app/admin/users/_components/user-hero.tsx b/src/app/admin/users/_components/user-hero.tsx
index 0d00f6dc..99e5b94f 100644
--- a/src/app/admin/users/_components/user-hero.tsx
+++ b/src/app/admin/users/_components/user-hero.tsx
@@ -1,20 +1,17 @@
import {
ArrowLeftRight,
- Coins,
- Diamond,
DoorOpen,
Eye,
- Gem,
MessageSquare,
Pencil,
Shield,
- Sparkles,
Wifi,
WifiOff,
} from "lucide-react";
import Link from "next/link";
import { AdminBreadcrumb } from "@/components/admin/admin-breadcrumb";
import { UserWatchToggle } from "@/components/admin/user-watch-toggle";
+import { CurrencyIcon } from "@/components/shared/currency-icon";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { getAvatarUrl } from "@/lib/imager";
@@ -159,28 +156,28 @@ export function UserHero({
{/* Currency row */}
-
+
{user.credits.toLocaleString()}
credits
-
+
{diamonds.toLocaleString()}
diamonds
-
+
{duckets.toLocaleString()}
duckets
-
+
{user.pixels.toLocaleString()}
diff --git a/src/app/admin/users/users-table.tsx b/src/app/admin/users/users-table.tsx
index 22fa03cb..c478f6de 100644
--- a/src/app/admin/users/users-table.tsx
+++ b/src/app/admin/users/users-table.tsx
@@ -11,6 +11,7 @@ import {
bulkUnban,
} from "@/actions/bulk-users";
import { DataTable } from "@/components/admin/data-table";
+import { CurrencyIcon } from "@/components/shared/currency-icon";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import {
@@ -436,9 +437,22 @@ export function UsersTable({ data, canEdit, canBan }: UsersTableProps) {
- Credits
- Pixels (Duckets)
- Points (Diamonds)
+
+
+ Credits
+
+
+
+
+ Pixels (Duckets)
+
+
+
+
+ Points
+ (Diamonds)
+
+
diff --git a/src/components/admin/catalog/items-shop-preview.tsx b/src/components/admin/catalog/items-shop-preview.tsx
index f52b4d87..e39e77a3 100644
--- a/src/components/admin/catalog/items-shop-preview.tsx
+++ b/src/components/admin/catalog/items-shop-preview.tsx
@@ -3,6 +3,10 @@
import { Crown, Image as ImageIcon, Package, Sparkles } from "lucide-react";
import type { CatalogItemData } from "@/app/admin/catalog/[id]/catalog-items-table/types";
import { getPointsLabel } from "@/app/admin/catalog/[id]/catalog-items-table/types";
+import {
+ CurrencyIcon,
+ currencyKindFromPointsType,
+} from "@/components/shared/currency-icon";
import { Badge } from "@/components/ui/badge";
import { getHabboCdnIconUrl, getLocalIconUrl } from "@/lib/furni/classname";
import { cn } from "@/lib/utils";
@@ -113,13 +117,20 @@ export function ItemsShopPreview({
{item.costCredits > 0 && (
-
- {item.costCredits}c
+
+
+ {item.costCredits}
)}
{item.costPoints > 0 && (
-
- {item.costPoints} {points.label.slice(0, 3)}
+
+
+ {item.costPoints}
)}
{item.costCredits === 0 && item.costPoints === 0 && (
diff --git a/src/components/shared/currency-icon.tsx b/src/components/shared/currency-icon.tsx
new file mode 100644
index 00000000..59613fbb
--- /dev/null
+++ b/src/components/shared/currency-icon.tsx
@@ -0,0 +1,55 @@
+/**
+ * Habbo-style currency icons used across admin (and reusable on public).
+ * Files live at /assets/images/icons/currency/{name}.png
+ */
+
+export type CurrencyKind =
+ | "credits"
+ | "duckets"
+ | "diamonds"
+ | "pixels"
+ | "points";
+
+const CURRENCY_FILES: Record = {
+ credits: "credits",
+ duckets: "duckets",
+ diamonds: "diamonds",
+ // No dedicated pixels asset — activity points share the duckets icon.
+ pixels: "duckets",
+ points: "duckets",
+};
+
+/** Map emulator `points_type` (catalog / users_currency) to an icon. */
+export function currencyKindFromPointsType(type: number): CurrencyKind {
+ if (type === 5) return "diamonds";
+ return "duckets";
+}
+
+export function currencyIconSrc(kind: CurrencyKind): string {
+ return `/assets/images/icons/currency/${CURRENCY_FILES[kind]}.png`;
+}
+
+export function CurrencyIcon({
+ kind,
+ size = 16,
+ className = "",
+ alt,
+}: {
+ kind: CurrencyKind;
+ size?: number;
+ className?: string;
+ alt?: string;
+}) {
+ return (
+ // biome-ignore lint/performance/noImgElement: small pixel art asset, not Next Image optimized
+
+ );
+}