From 2ee4121308bac8388c5e13a1f519e6bb8359c730 Mon Sep 17 00:00:00 2001 From: speakeloudest Date: Fri, 8 Aug 2025 23:07:54 -0700 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/(main)/(content)/(user)/Header.tsx | 3 +- .../components/Announcement/Popup.tsx | 4 +- .../(content)/(user)/dashboard/content.tsx | 34 +++++++++---- .../(main)/(content)/(user)/sidebar-left.tsx | 29 ++++++----- .../(main)/(content)/(user)/wallet/page.tsx | 11 ++-- apps/user/components/SvgIcon.tsx | 33 ++++++++++++ apps/user/components/affiliate/index.tsx | 47 +++++++++++------- apps/user/components/user-nav.tsx | 43 ++++++++++------ apps/user/config/navs.ts | 8 +++ apps/user/next.config.ts | 10 +++- apps/user/package.json | 1 + apps/user/public/list.png | Bin 0 -> 9685 bytes apps/user/public/shrink.png | Bin 0 -> 1585 bytes apps/user/public/svg-icon/affiliate.svg | 3 ++ apps/user/public/svg-icon/copy.svg | 10 ++++ apps/user/public/svg-icon/dashboard.svg | 3 ++ apps/user/public/svg-icon/document.svg | 10 ++++ apps/user/public/svg-icon/exit.svg | 3 ++ apps/user/public/svg-icon/notes.svg | 3 ++ apps/user/public/svg-icon/profile.svg | 3 ++ apps/user/public/svg-icon/qrcode.svg | 12 +++++ apps/user/public/svg-icon/shop.svg | 3 ++ apps/user/public/svg-icon/ticket.svg | 10 ++++ apps/user/public/svg-icon/wallet.svg | 3 ++ packages/airo-ui/src/components/sidebar.tsx | 6 +-- 25 files changed, 222 insertions(+), 70 deletions(-) create mode 100644 apps/user/components/SvgIcon.tsx create mode 100644 apps/user/public/list.png create mode 100644 apps/user/public/shrink.png create mode 100644 apps/user/public/svg-icon/affiliate.svg create mode 100644 apps/user/public/svg-icon/copy.svg create mode 100644 apps/user/public/svg-icon/dashboard.svg create mode 100644 apps/user/public/svg-icon/document.svg create mode 100644 apps/user/public/svg-icon/exit.svg create mode 100644 apps/user/public/svg-icon/notes.svg create mode 100644 apps/user/public/svg-icon/profile.svg create mode 100644 apps/user/public/svg-icon/qrcode.svg create mode 100644 apps/user/public/svg-icon/shop.svg create mode 100644 apps/user/public/svg-icon/ticket.svg create mode 100644 apps/user/public/svg-icon/wallet.svg diff --git a/apps/user/app/(main)/(content)/(user)/Header.tsx b/apps/user/app/(main)/(content)/(user)/Header.tsx index 16edee3..30de089 100644 --- a/apps/user/app/(main)/(content)/(user)/Header.tsx +++ b/apps/user/app/(main)/(content)/(user)/Header.tsx @@ -18,9 +18,8 @@ export function Header() { const pathname = usePathname(); const items = useMemo(() => findNavByUrl(pathname), [pathname]); return ( -
+
- {items.map((item, index) => { diff --git a/apps/user/app/(main)/(content)/(user)/dashboard/components/Announcement/Popup.tsx b/apps/user/app/(main)/(content)/(user)/dashboard/components/Announcement/Popup.tsx index 7ecf853..042cc0c 100644 --- a/apps/user/app/(main)/(content)/(user)/dashboard/components/Announcement/Popup.tsx +++ b/apps/user/app/(main)/(content)/(user)/dashboard/components/Announcement/Popup.tsx @@ -39,11 +39,11 @@ export const Popup = ({ ref }: PopupProps) => { return ( - + {data.title} -
+
{data.title}
{data.content}
diff --git a/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx b/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx index 0d1500f..95f453d 100644 --- a/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx +++ b/apps/user/app/(main)/(content)/(user)/dashboard/content.tsx @@ -30,6 +30,7 @@ import { PopupRef, } from '@/app/(main)/(content)/(user)/dashboard/components/Announcement/Popup'; import { Empty } from '@/components/empty'; +import SvgIcon from '@/components/SvgIcon'; import { queryAnnouncement } from '@/services/user/announcement'; import { Popover, PopoverContent, PopoverTrigger } from '@workspace/airo-ui/components/popover'; import { @@ -46,6 +47,7 @@ import { import { Tabs, TabsList, TabsTrigger } from '@workspace/ui/components/tabs'; import { differenceInDays, formatDate } from '@workspace/ui/utils'; import { QRCodeCanvas } from 'qrcode.react'; +import { CopyToClipboard } from 'react-copy-to-clipboard'; const platforms: (keyof API.ApplicationPlatform)[] = [ 'windows', @@ -351,12 +353,12 @@ export default function Content() { onValueChange={setProtocol} className='w-full max-w-full md:w-auto' > - + {['all', ...(data?.protocol || [])].map((item) => ( {item} @@ -399,20 +401,32 @@ export default function Content() { -
-
- {userSubscribeProtocolCurrent} +
+
+
+ {userSubscribeProtocolCurrent} +
+ { + if (result) { + toast.success(t('copySuccess')); + } + }} + > + + + +
-
+
+ +
diff --git a/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx b/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx index db6aa80..33d01a0 100644 --- a/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx +++ b/apps/user/app/(main)/(content)/(user)/sidebar-left.tsx @@ -1,4 +1,5 @@ 'use client'; +import SvgIcon from '@/components/SvgIcon'; import { UserNav } from '@/components/user-nav'; import { navs } from '@/config/navs'; import { @@ -10,9 +11,8 @@ import { SidebarMenuItem, useSidebar, } from '@workspace/airo-ui/components/sidebar'; -import { Icon } from '@workspace/ui/custom-components/icon'; import { useTranslations } from 'next-intl'; -import Image from 'next/legacy/image'; +import Image from 'next/image'; import Link from 'next/link'; import { usePathname } from 'next/navigation'; @@ -21,18 +21,21 @@ export function SidebarLeft({ ...props }: React.ComponentProps) const pathname = usePathname(); const { toggleSidebar } = useSidebar(); return ( - +
+
+ close +
-
+
)
- + {navs .filter((v) => !v.hidden) .map((nav, navIndex) => ( - - {nav.icon && } + +
+ +
{t(nav.title)}
@@ -73,7 +78,7 @@ export function SidebarLeft({ ...props }: React.ComponentProps)
- +
diff --git a/apps/user/app/(main)/(content)/(user)/wallet/page.tsx b/apps/user/app/(main)/(content)/(user)/wallet/page.tsx index ac18767..2fe6809 100644 --- a/apps/user/app/(main)/(content)/(user)/wallet/page.tsx +++ b/apps/user/app/(main)/(content)/(user)/wallet/page.tsx @@ -10,15 +10,16 @@ import { useRef } from 'react'; import { Empty } from '@/components/empty'; import Recharge from '@/components/subscribe/recharge'; +import SvgIcon from '@/components/SvgIcon'; import { Button } from '@workspace/ui/components/button'; import { formatDate } from '@workspace/ui/utils'; -import { Copy } from 'lucide-react'; import Link from 'next/link'; import { CopyToClipboard } from 'react-copy-to-clipboard'; import { toast } from 'sonner'; export default function Page() { const t = useTranslations('wallet'); + const dashboardT = useTranslations('dashboard'); const { user } = useGlobalStore(); const ref = useRef(null); const totalAssets = (user?.balance || 0) + (user?.commission || 0) + (user?.gift_amount || 0); @@ -44,7 +45,7 @@ export default function Page() {
-
+

账户余额

@@ -80,12 +81,12 @@ export default function Page() { text={`${location?.origin}/?invite=${user?.refer_code}`} onCopy={(text, result) => { if (result) { - toast.success(t('copySuccess')); + toast.success(dashboardT('copySuccess')); } }} > -

diff --git a/apps/user/components/SvgIcon.tsx b/apps/user/components/SvgIcon.tsx new file mode 100644 index 0000000..bd1db95 --- /dev/null +++ b/apps/user/components/SvgIcon.tsx @@ -0,0 +1,33 @@ +import { useEffect, useState } from 'react'; + +const SvgIcon = ({ name, ...props }) => { + const [Icon, setIcon] = useState(null); + + useEffect(() => { + let isMounted = true; + + import(`public/svg-icon/${name}.svg`) + .then((module) => { + if (isMounted) { + setIcon(() => module.default); + } + }) + .catch(() => { + if (isMounted) { + setIcon(null); + } + }); + + return () => { + isMounted = false; + }; + }, [name]); + + if (!Icon) { + return null; + } + + return ; +}; + +export default SvgIcon; diff --git a/apps/user/components/affiliate/index.tsx b/apps/user/components/affiliate/index.tsx index 98141be..571f145 100644 --- a/apps/user/components/affiliate/index.tsx +++ b/apps/user/components/affiliate/index.tsx @@ -6,13 +6,13 @@ import { } from '@/components/affiliate/components/AffiliateDialog'; import { Display } from '@/components/display'; import { Empty } from '@/components/empty'; +import SvgIcon from '@/components/SvgIcon'; import useGlobalStore from '@/config/use-global'; import { queryUserAffiliate, queryUserAffiliateList } from '@/services/user/user'; import { useQuery } from '@tanstack/react-query'; import { Button } from '@workspace/ui/components/button'; import { Card, CardContent } from '@workspace/ui/components/card'; import { formatDate } from '@workspace/ui/utils'; -import { Copy } from 'lucide-react'; import { useTranslations } from 'next-intl'; import { useRef, useState } from 'react'; import { CopyToClipboard } from 'react-copy-to-clipboard'; @@ -58,7 +58,7 @@ export default function Affiliate() {
历史推荐用户:7
-
+

佣金总额

@@ -67,21 +67,23 @@ export default function Affiliate() {

- - 返佣邀请码 - { - if (result) { - toast.success(t('copySuccess')); - } - }} + 返佣邀请码 + { + if (result) { + toast.success(t('copySuccess')); + } + }} + > + - - + + +

{user?.refer_code} @@ -93,8 +95,12 @@ export default function Affiliate() { } }} > -

@@ -105,7 +111,10 @@ export default function Affiliate() {

邀请记录

- dialogRef.current.open()}> + dialogRef.current.open()} + > 更多
diff --git a/apps/user/components/user-nav.tsx b/apps/user/components/user-nav.tsx index d8de3cc..0ecc6e8 100644 --- a/apps/user/components/user-nav.tsx +++ b/apps/user/components/user-nav.tsx @@ -1,8 +1,10 @@ 'use client'; +import SvgIcon from '@/components/SvgIcon.tsx'; import useGlobalStore from '@/config/use-global'; import { Logout } from '@/utils/common'; import { useSidebar } from '@workspace/airo-ui/components/sidebar'; +import { useIsMobile } from '@workspace/airo-ui/hooks/use-mobile'; import { Avatar, AvatarFallback, AvatarImage } from '@workspace/ui/components/avatar'; import { DropdownMenu, @@ -20,29 +22,30 @@ export function UserNav({ from = '' }: { from?: string }) { const router = useRouter(); const pathname = usePathname(); const { toggleSidebar } = useSidebar(); + const isMobile = useIsMobile(); if (user) { return ( {from === 'profile' ? (
- + - + {user?.auth_methods?.[0]?.auth_identifier.toUpperCase().charAt(0)} -
+
{user?.auth_methods?.[0]?.auth_identifier.split('@')[0]}
) : ( - + -
- +
+ - + {user?.auth_methods?.[0]?.auth_identifier.toUpperCase().charAt(0)}
-

+

{user?.auth_methods?.[0]?.auth_identifier.split('@')[0]}

-

+

{user?.auth_methods?.[0]?.auth_identifier}

@@ -84,7 +90,7 @@ export function UserNav({ from = '' }: { from?: string }) { { title: 'profile', url: '/profile', - icon: 'uil:dashboard', + icon: 'profile', }, ].map((item) => ( - + {t(item.title)} ))} @@ -106,9 +112,14 @@ export function UserNav({ from = '' }: { from?: string }) { Logout(); setUser(); }} - className='flex cursor-pointer items-center gap-3 rounded-full px-5 py-2 text-base font-medium text-[#0F2C53] focus:bg-[#E22C2E] focus:text-white sm:text-xl' + className='flex cursor-pointer items-center gap-3 rounded-full bg-[#E22C2E] px-5 py-2 text-base font-medium text-white focus:bg-[#E22C2E] focus:text-white md:bg-white md:text-xl md:text-[#0F2C53]' > - + {t('logout')} diff --git a/apps/user/config/navs.ts b/apps/user/config/navs.ts index 249fe98..a787b77 100644 --- a/apps/user/config/navs.ts +++ b/apps/user/config/navs.ts @@ -3,42 +3,50 @@ export const navs = [ title: 'dashboard', url: '/dashboard', icon: 'uil:dashboard', + image: 'dashboard', }, { url: '/subscribe', icon: 'uil:shop', title: 'subscribe', + image: 'shop', }, { url: '/order', icon: 'uil:notes', title: 'order', + image: 'notes', }, { url: '/wallet', icon: 'uil:wallet', title: 'wallet', + image: 'wallet', }, { url: '/affiliate', icon: 'uil:users-alt', title: 'affiliate', + image: 'affiliate', }, { url: '/document', icon: 'uil:book-alt', title: 'document', + image: 'document', }, { url: '/profile', icon: 'uil:megaphone', title: 'profile', hidden: true, + image: 'profile', }, { url: '/ticket', icon: 'uil:message', title: 'ticket', + image: 'ticket', }, ]; diff --git a/apps/user/next.config.ts b/apps/user/next.config.ts index 9ecfd4c..5029ba2 100644 --- a/apps/user/next.config.ts +++ b/apps/user/next.config.ts @@ -4,7 +4,7 @@ import createNextIntlPlugin from 'next-intl/plugin'; const withNextIntl = createNextIntlPlugin('./locales/request.ts'); const nextConfig: NextConfig = { - transpilePackages: ['@workspace/ui'], + transpilePackages: ['@workspace/ui', '@workspace/airo-ui'], output: 'standalone', images: { remotePatterns: [ @@ -18,6 +18,14 @@ const nextConfig: NextConfig = { }, ], }, + turbopack: { + rules: { + './public/svg-icon/*.svg': { + loaders: ['@svgr/webpack'], + as: '*.js', + }, + }, + }, }; export default withNextIntl(nextConfig); diff --git a/apps/user/package.json b/apps/user/package.json index 42c2f03..3fc615f 100644 --- a/apps/user/package.json +++ b/apps/user/package.json @@ -42,6 +42,7 @@ "zustand": "^5.0.3" }, "devDependencies": { + "@svgr/webpack": "^8.1.0", "@types/node": "^22.10.5", "@types/react": "^19.0.4", "@types/react-copy-to-clipboard": "^5.0.7", diff --git a/apps/user/public/list.png b/apps/user/public/list.png new file mode 100644 index 0000000000000000000000000000000000000000..55e3bf8c8ce9706ce906f3c062fda196e0bc4532 GIT binary patch literal 9685 zcmV;`B`Vs9P)@*2PZ8W;uxwh047jZMo#l*S;`hWKb1O{c&X{;J(7;Gifz}OO^ zAoz$>qBE#}G(ONKJ_s;sNsG!re2g%RF9u~mK?UyFU7vN=ci(mP-TT}-_c3#4n3e3a z_u0?i{;j><>$iTT?1jCs7xuz@q2i~m>&lj9C;#J^mOT~*W%)F3%&6;MP9dGvQ9)O&r_Kn4hc{cYQ}t=hbKv#(i7d>EX=e_Q*0yUvly zJ#GWq4Bbv&lTSI5jBX)=uA3Xl*4u)sQl(Pzp3uJ z>#kx*slWd9uU9XA@rw)p0k#i0&z{{N!_FT;3`orHkl(3Hi`^wh=FUQ3l@*f28XIbZ zCDKW-ub=`Dpz#zrTLo^PV^IPPWh2c23PX z`|PvNNT=HM{$Gf<`_?=MuxHls(a^qHtU4nzaR{ikGQA9BU{`Hxkmgry;f2t_Fia4dOr``!f>rem(%! zLeR6G^{nPRkjYw9*+ynoc+$JplAFs-dz}l6*lF3mvKOByQwr1|wkHf}`>@#8zb}jJ z+s``37u(*S#Sr!^7DLnl_WuB_4M_*G*tRdvdCqeVvh~5NV|!$+b7P<1heh|dk7R!q zwSjeNm$y^xj%6TQa-7qkECDQq7MhLVwnxM@$@qG!Q2$XnydA+RE7&BI20MNH@y7?S zMHZuw!IMuuIT#Ly+;dueQ`F+^Oy;H&N4mHG8tm$+^lrM%XM-2CP_OqYu+aTxg!w>g`|E#sI zOmTw={@XPmbi$C

}tvK%yP@HP1K1(zb!IY*&Ifk2Z2W_rqLaO&dZ>_O`RlJGa=vg0bTAt(=R(%9ob zib%Sy0%^K;uuYIQIP9>){F#OvRR4jo-g?D~73HzV9>b=q_-||7r*5?;YgWE(NE?Do z?yG%<)Y_;VOk*3?CO2y#7cj&PQKnF0ter#Ilh}~S^l>D%5tzHKED#nAfo&}_YnK4j zBdt=V0F)Q%zuE$u&`Usd z8F?TMjLvGs%@&t;b#8yM1{z=?wnI%vX>(JY+D zV%ywfz&_UOW6e_HqhZ_bF|hj%;<|xRbn{I6kQ!yksLlJ#km&LmwlBFIAEwJjTy-T} zep#uZpX80ITXD?!z`UK=ZI4Q@i4l!6xx2DG=Ncu56I(1($a9L*xkhPH$LTP?cOc6j zYY2mS1_vH^U}2%N4>;g}^1I*t&Tsg{6Hiq9x25JeY}>l#xScPmuGzNxxQw%V;)$v4 zIW8j&p~Vn6v~_K)yM`hSkxh>WMWVIhK&b7*bUW4dIZH(@%C?O@Y5Fg@;M#0{hhQNz zTxAmhhz2%3OTI!hHdu=&k1tjV3fdkQa1PW)r-6vfA_IX!mO9?ged8P7c-YxzpM9*! z)YGixMG!@#?S+AFZ=rd2W)CU-XPJA0(7{fY_!U zp0!Px3gHf$p=H8)*amshD#ePCaVRBaioFctS&Fh(P}SSt{`M8`e)qfA7%Mx+e48hk zVzHtu5bVAiO}kuw>#eumY4?7ReROCbbBJt(O2b!*MhhZ`*7inY-FM%8hf;FTRKqRk zzSit453wSzO�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 XT7LgS#1e$!00000NkvXXu0mjf&_eOD literal 0 HcmV?d00001 diff --git a/apps/user/public/shrink.png b/apps/user/public/shrink.png new file mode 100644 index 0000000000000000000000000000000000000000..a20115fdc7a17b4c5d93c5a5a70e904c888f472b GIT binary patch literal 1585 zcmV-12G043P)LE za#1cmm}qLkwtc}yQ%JNBEig5-4`KphLEX#zJZD^%z0B-|nc3SX+04#um+zkQJHIpM zcVJ)>vUk=ch5~NRxy(Q~%YirGVHcfBxKv@l6ySWD3$P@B;15aCqT*}Y1{+{tAtX`= zg!&lcZWQPS6X1{F=b(P&bnv+qU$+7lVTs^6&lhCL0ka~FAn}Z`p(mpqelUqC!FCJP zL17H~S4TVN;E)_juHw30XIH|hdkyc3xg&I`IEtyzzVflCX?#Jga{a_t-cFhYWsBA2$ zpt>OkkjSPtacs7nG_>ZyL|2#v|p@FY0cX+ zk74<@Ez7K_2Q3It&~kyr>`x~o)X18TQQX}ho`dh(Uu+c_3$1=gWM;64bk?-nWi!A< z7M8&RdNBaq^yt?M$Yp09C@Az<&a7#GEP+M5qGQpKnV)m&vYC)|AwC=0FUoN9dLx{u zDuY5ntUS{(2o`a?svO0YNB1kroKXLUOLO=0r>nHg{n;P8@NY2JGyee$i*@wSAcIAa z;E&qg!aTSNPP|sGd(HHHMH|x#xer_ltMN=e!gy^IE6Ct3NeuptWaEJY`cG zn|ok4wCpOn-syOk*;I~Qe!8t$l3wKAG(XdJA9}An8Rf|3aSC1%Up;e8#&2o?8=?7^ zrX=4tziL0i5r+u1$138kp`md3+;Ql6uMTQouYkYs9`XPyVFH_E`6}FzKyr6-d!w;V zf^Xy0MoEelE>8tL7FikGf;>WQ-5wFI2NeLOaafpzsvZKBJ@Db!4|#+vc;mB&aH;=m zZELkF6BMwbB_2$w@8QM`d1hmCS9{U4mCowfLLEW0jTG_n@76}pSl`(Tm`+cfVYPZ? zqFafsJk)xo<}qx$p#&j!ULE_OncfQr2g5^9qA+%#En#h`B(1EhjdfP<@5DVVm7<5^7*e?Al9u9u9}Xy?CiDovb-VafFjSHc7BDK`Z8J(YrR|>d?wW zato7g#ba%(YZ&hsfntU8k<~lhKD|?hB_35eGKiZ+C_Wa~?sOTpM;Z#Iyc3gcnyeKl z9u&-|+EQJRvWTaN4y(l?n#4BijoVlG4Qh8#dbDc_H6G|T!kzyhcbii0>{*OQhNLZhDr7V>{IXRVPY z88?`KL~;n + + diff --git a/apps/user/public/svg-icon/copy.svg b/apps/user/public/svg-icon/copy.svg new file mode 100644 index 0000000..2deeaa6 --- /dev/null +++ b/apps/user/public/svg-icon/copy.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/user/public/svg-icon/dashboard.svg b/apps/user/public/svg-icon/dashboard.svg new file mode 100644 index 0000000..62325d0 --- /dev/null +++ b/apps/user/public/svg-icon/dashboard.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/user/public/svg-icon/document.svg b/apps/user/public/svg-icon/document.svg new file mode 100644 index 0000000..b8f1dec --- /dev/null +++ b/apps/user/public/svg-icon/document.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/user/public/svg-icon/exit.svg b/apps/user/public/svg-icon/exit.svg new file mode 100644 index 0000000..ca7deeb --- /dev/null +++ b/apps/user/public/svg-icon/exit.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/user/public/svg-icon/notes.svg b/apps/user/public/svg-icon/notes.svg new file mode 100644 index 0000000..8a4556d --- /dev/null +++ b/apps/user/public/svg-icon/notes.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/user/public/svg-icon/profile.svg b/apps/user/public/svg-icon/profile.svg new file mode 100644 index 0000000..630443d --- /dev/null +++ b/apps/user/public/svg-icon/profile.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/user/public/svg-icon/qrcode.svg b/apps/user/public/svg-icon/qrcode.svg new file mode 100644 index 0000000..b2dcf31 --- /dev/null +++ b/apps/user/public/svg-icon/qrcode.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/apps/user/public/svg-icon/shop.svg b/apps/user/public/svg-icon/shop.svg new file mode 100644 index 0000000..c70a78e --- /dev/null +++ b/apps/user/public/svg-icon/shop.svg @@ -0,0 +1,3 @@ + + + diff --git a/apps/user/public/svg-icon/ticket.svg b/apps/user/public/svg-icon/ticket.svg new file mode 100644 index 0000000..4cb78be --- /dev/null +++ b/apps/user/public/svg-icon/ticket.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/apps/user/public/svg-icon/wallet.svg b/apps/user/public/svg-icon/wallet.svg new file mode 100644 index 0000000..7bc089d --- /dev/null +++ b/apps/user/public/svg-icon/wallet.svg @@ -0,0 +1,3 @@ + + + diff --git a/packages/airo-ui/src/components/sidebar.tsx b/packages/airo-ui/src/components/sidebar.tsx index f744ce7..4d3e35d 100644 --- a/packages/airo-ui/src/components/sidebar.tsx +++ b/packages/airo-ui/src/components/sidebar.tsx @@ -2,7 +2,7 @@ import { Slot } from '@radix-ui/react-slot'; import { VariantProps, cva } from 'class-variance-authority'; -import { PanelLeft } from 'lucide-react'; +import Image from 'next/image'; import * as React from 'react'; import { Button } from '@workspace/airo-ui/components/button'; @@ -270,14 +270,14 @@ const SidebarTrigger = React.forwardRef< data-sidebar='trigger' variant='ghost' size='icon' - className={cn('h-7 w-7', className)} + className={cn('size-14', className)} onClick={(event) => { onClick?.(event); toggleSidebar(); }} {...props} > - + Toggle Sidebar );