diff --git a/apps/web/app/[locale]/(public)/design-system/page.tsx b/apps/web/app/[locale]/(public)/design-system/page.tsx new file mode 100644 index 0000000..9d824c4 --- /dev/null +++ b/apps/web/app/[locale]/(public)/design-system/page.tsx @@ -0,0 +1,258 @@ +'use client'; + +import { + Activity, + Bell, + Building2, + Home, + LineChart, + Map, + User2, +} from 'lucide-react'; +import { + CompactHeader, + DashboardLayout, + DataTable, + MarketIndex, + PriceDelta, + StatCard, + TickerStrip, + type DataTableColumn, +} from '@/components/design-system'; + +type DistrictRow = { + id: string; + code: string; + name: string; + price: number; // tr/m² + changePercent: number; + volume: number; + area: number; +}; + +const tickerItems = [ + { id: 't-q1', label: 'Q1', changePercent: 2.3 }, + { id: 't-q2', label: 'Q2', changePercent: 0.5 }, + { id: 't-q7', label: 'Q7', changePercent: -1.1 }, + { id: 't-bt', label: 'BT', changePercent: 0.0 }, + { id: 't-td', label: 'TĐ', changePercent: 1.8 }, + { id: 't-gv', label: 'GV', changePercent: -0.4 }, + { id: 't-q9', label: 'Q9', changePercent: 3.1 }, + { id: 't-tb', label: 'TB', changePercent: 0.2 }, +]; + +const rows: DistrictRow[] = [ + { id: 'q1', code: 'Q1', name: 'Quận 1', price: 152.4, changePercent: 2.3, volume: 42, area: 78 }, + { id: 'q2', code: 'Q2', name: 'Quận 2', price: 98.7, changePercent: 0.5, volume: 55, area: 120 }, + { id: 'q7', code: 'Q7', name: 'Quận 7', price: 85.2, changePercent: -1.1, volume: 67, area: 95 }, + { id: 'bt', code: 'BT', name: 'Bình Thạnh', price: 72.0, changePercent: 0.0, volume: 29, area: 88 }, + { id: 'td', code: 'TĐ', name: 'Thủ Đức', price: 58.9, changePercent: 1.8, volume: 91, area: 102 }, + { id: 'q9', code: 'Q9', name: 'Quận 9', price: 45.2, changePercent: 3.1, volume: 112, area: 110 }, + { id: 'tb', code: 'TB', name: 'Tân Bình', price: 76.5, changePercent: 0.2, volume: 38, area: 82 }, + { id: 'gv', code: 'GV', name: 'Gò Vấp', price: 62.3, changePercent: -0.4, volume: 44, area: 76 }, +]; + +const columns: DataTableColumn[] = [ + { + id: 'code', + header: 'Mã', + cell: (r) => {r.code}, + width: '64px', + sortable: true, + sortValue: (r) => r.code, + }, + { + id: 'name', + header: 'Khu vực', + cell: (r) => {r.name}, + sortable: true, + sortValue: (r) => r.name, + }, + { + id: 'price', + header: 'Giá TB (tr/m²)', + cell: (r) => r.price.toFixed(1), + align: 'right', + numeric: true, + sortable: true, + sortValue: (r) => r.price, + }, + { + id: 'delta', + header: 'Δ 7d', + cell: (r) => , + align: 'right', + sortable: true, + sortValue: (r) => r.changePercent, + }, + { + id: 'area', + header: 'DT TB (m²)', + cell: (r) => r.area, + align: 'right', + numeric: true, + sortable: true, + sortValue: (r) => r.area, + }, + { + id: 'volume', + header: 'KL', + cell: (r) => r.volume, + align: 'right', + numeric: true, + sortable: true, + sortValue: (r) => r.volume, + }, +]; + +const sidebarItems = [ + { icon: Home, label: 'Trang chủ' }, + { icon: Building2, label: 'Listings' }, + { icon: Map, label: 'Bản đồ' }, + { icon: LineChart, label: 'Thị trường' }, + { icon: Activity, label: 'Hoạt động' }, +]; + +export default function DesignSystemDemoPage() { + return ( + } + sidebar={ + + } + header={ + + GOODGO + + } + breadcrumb={ + + / Design System{' '} + / Demo + + } + actions={ + <> + + + + } + /> + } + statusBar={ + <> + + + Online + + Cập nhật: 14:32:07 + GGX 1,245.82 +1.3% + + } + > +
+
+ +
+ 24h + 7d + 30d +
+
+ +
+ + + + +
+ +
+

+ Bảng giá top khu vực +

+ r.id} + defaultSortId="price" + defaultSortDir="desc" + /> +
+ +
+
+

+ PriceDelta variants +

+
+ + + + +
+
+
+

+ Signal palette +

+
+
+ signal-up +
+
+ signal-down +
+
+ signal-neutral +
+
+
+
+

+ Typography +

+
+ 1,245.82 + 45.2 tr/m² + +1.32% + Inter body +
+
+
+
+
+ ); +} diff --git a/apps/web/app/[locale]/layout.tsx b/apps/web/app/[locale]/layout.tsx index 26bcc4b..047504f 100644 --- a/apps/web/app/[locale]/layout.tsx +++ b/apps/web/app/[locale]/layout.tsx @@ -1,5 +1,5 @@ import type { Metadata, Viewport } from 'next'; -import { Inter } from 'next/font/google'; +import { Inter, JetBrains_Mono } from 'next/font/google'; import { notFound } from 'next/navigation'; import { NextIntlClientProvider } from 'next-intl'; import { getMessages, getTranslations } from 'next-intl/server'; @@ -20,6 +20,12 @@ const inter = Inter({ variable: '--font-inter', }); +const jetbrainsMono = JetBrains_Mono({ + subsets: ['latin'], + display: 'swap', + variable: '--font-jetbrains-mono', +}); + const siteUrl = process.env['NEXT_PUBLIC_SITE_URL'] || 'https://goodgo.vn'; export const viewport: Viewport = { @@ -111,7 +117,11 @@ export default async function LocaleLayout({ const t = await getTranslations({ locale, namespace: 'common' }); return ( - +