Dev/v1.1 (#2)
Build Docker Image / build-backend (push) Successful in 46s
Build Docker Image / build-frontend (push) Failing after 11s

Co-authored-by: ISMAIL MASSERAN <topaz@ISMAILs-Macbook.local>
Reviewed-on: #2
This commit was merged in pull request #2.
This commit is contained in:
2026-07-02 10:09:08 +08:00
parent 2e2d94f0d6
commit 421775d3ff
41 changed files with 1210 additions and 971 deletions
@@ -156,9 +156,8 @@ onMounted(async () => {
<div
class="mt-6 flex flex-1 items-center justify-center border-t border-foreground/15 px-5 pt-5 lg:mt-0 lg:border-0 lg:pt-0">
<div
class="relative aspect-[1.75/1] w-full max-w-[17rem] overflow-hidden rounded-2xl bg-gradient-to-br from-primary via-primary/95 to-primary/75 p-4 text-primary-foreground shadow-lg ring-1 ring-white/20 sm:max-w-xs sm:p-5"
role="img"
aria-label="Kad digital anggota">
class="relative aspect-1.75/1 w-full max-w-68 overflow-hidden rounded-2xl bg-linear-to-br from-primary via-primary/95 to-primary/75 p-4 text-primary-foreground shadow-lg ring-1 ring-white/20 sm:max-w-xs sm:p-5"
role="img" aria-label="Kad digital anggota">
<div class="pointer-events-none absolute inset-0 bg-noise opacity-30" />
<div class="pointer-events-none absolute -right-10 -top-10 size-36 rounded-full bg-white/10" />
<div class="pointer-events-none absolute -bottom-12 -left-8 size-40 rounded-full bg-white/5" />
@@ -212,9 +211,6 @@ onMounted(async () => {
<TabsTrigger class="w-1/4 inline-flex items-center justify-center" value="2">
<Lucide class="mr-2 size-4" icon="Lock" /> Kata Laluan
</TabsTrigger>
<TabsTrigger class="w-1/4 inline-flex items-center justify-center" value="4">
<Lucide class="mr-2 size-4" icon="MoreHorizontal" /> Lain-lain
</TabsTrigger>
</TabsList>
</div>
</Box>
@@ -238,357 +234,6 @@ onMounted(async () => {
<TabsContent value="6" class="mt-8">
<HeirTab embedded />
</TabsContent>
<!-- Perkhidmatan -->
<TabsContent value="4" class="mt-8">
<div class="grid grid-cols-12 gap-x-6 gap-y-8">
<!-- BEGIN: Latest Uploads -->
<Box raised="single" class="col-span-12 p-0 lg:col-span-6">
<div class="flex items-center border-b border-foreground/15 px-5 py-5 sm:py-3">
<h2 class="mr-auto text-base font-medium">Latest Uploads</h2>
<MenuRoot class="w-auto ml-auto sm:hidden">
<MenuTrigger as-child>
<a class="block size-5" href="#">
<Lucide class="size-5 opacity-70" icon="MoreHorizontal" />
</a>
</MenuTrigger>
<MenuPositioner>
<MenuContent class="w-40">
<MenuItem value="all">All Files</MenuItem>
</MenuContent>
</MenuPositioner>
</MenuRoot>
<Button variant="ghost" class="shadow-none border border-foreground/15 hidden sm:flex">All Files</Button>
</div>
<div class="p-5">
<div class="flex items-center">
<FileIcon class="w-12" variant="directory" />
<div class="ml-4">
<a class="font-medium" href="">Documentation</a>
<div class="mt-0.5 text-xs opacity-70">40 KB</div>
</div>
<MenuRoot class="w-auto ml-auto">
<MenuTrigger as-child>
<a class="block size-5" href="#">
<Lucide class="size-5 opacity-70" icon="MoreHorizontal" />
</a>
</MenuTrigger>
<MenuPositioner>
<MenuContent class="w-40">
<MenuItem value="share">
<Lucide class="mr-2 size-4" icon="Users" /> Share File
</MenuItem>
<MenuItem value="delete">
<Lucide class="mr-2 size-4" icon="Trash" /> Delete
</MenuItem>
</MenuContent>
</MenuPositioner>
</MenuRoot>
</div>
<div class="mt-5 flex items-center">
<FileIcon class="w-12 text-xs" variant="file" type="MP3" />
<div class="ml-4">
<a class="font-medium" href="">Celine Dion - Ashes</a>
<div class="mt-0.5 text-xs opacity-70">40 KB</div>
</div>
<MenuRoot class="w-auto ml-auto">
<MenuTrigger as-child>
<a class="block size-5" href="#">
<Lucide class="size-5 opacity-70" icon="MoreHorizontal" />
</a>
</MenuTrigger>
<MenuPositioner>
<MenuContent class="w-40">
<MenuItem value="share">
<Lucide class="mr-2 size-4" icon="Users" /> Share File
</MenuItem>
<MenuItem value="delete">
<Lucide class="mr-2 size-4" icon="Trash" /> Delete
</MenuItem>
</MenuContent>
</MenuPositioner>
</MenuRoot>
</div>
<div class="mt-5 flex items-center">
<FileIcon class="w-12" variant="empty-directory" />
<div class="ml-4">
<a class="font-medium" href="">Resources</a>
<div class="mt-0.5 text-xs opacity-70">0 KB</div>
</div>
<MenuRoot class="w-auto ml-auto">
<MenuTrigger as-child>
<a class="block size-5" href="#">
<Lucide class="size-5 opacity-70" icon="MoreHorizontal" />
</a>
</MenuTrigger>
<MenuPositioner>
<MenuContent class="w-40">
<MenuItem value="share">
<Lucide class="mr-2 size-4" icon="Users" /> Share File
</MenuItem>
<MenuItem value="delete">
<Lucide class="mr-2 size-4" icon="Trash" /> Delete
</MenuItem>
</MenuContent>
</MenuPositioner>
</MenuRoot>
</div>
</div>
</Box>
<!-- END: Latest Uploads -->
<!-- BEGIN: Work In Progress -->
<Box raised="single" class="col-span-12 p-0 lg:col-span-6">
<TabsRoot defaultValue="wip-0">
<div class="relative flex items-center border-b border-foreground/15 p-5">
<h2 class="mr-auto text-base font-medium">Work In Progress</h2>
<MenuRoot class="w-auto ml-auto sm:hidden">
<MenuTrigger as-child>
<a class="block size-5" href="#">
<Lucide class="size-5 opacity-70" icon="MoreHorizontal" />
</a>
</MenuTrigger>
<MenuPositioner>
<MenuContent class="w-40">
<MenuItem value="new">New</MenuItem>
<MenuItem value="last-week">Last Week</MenuItem>
</MenuContent>
</MenuPositioner>
</MenuRoot>
<TabsList class="absolute inset-y-0 h-[2.8rem] right-5 my-auto hidden w-auto sm:flex">
<TabsTrigger value="wip-0">New</TabsTrigger>
<TabsTrigger value="wip-1">Last Week</TabsTrigger>
</TabsList>
</div>
<TabsContent value="wip-0" class="p-5">
<div>
<div class="flex">
<div class="mr-auto">Pending Tasks</div>
<div>20%</div>
</div>
<ProgressRoot :defaultValue="50" class="mt-2">
<ProgressTrack>
<ProgressRange />
</ProgressTrack>
</ProgressRoot>
</div>
<div class="mt-5">
<div class="flex">
<div class="mr-auto">Completed Tasks</div>
<div>2 / 20</div>
</div>
<ProgressRoot :defaultValue="25" class="mt-2">
<ProgressTrack>
<ProgressRange />
</ProgressTrack>
</ProgressRoot>
</div>
<div class="mt-5">
<div class="flex">
<div class="mr-auto">Tasks In Progress</div>
<div>42</div>
</div>
<ProgressRoot :defaultValue="75" class="mt-2">
<ProgressTrack>
<ProgressRange />
</ProgressTrack>
</ProgressRoot>
</div>
<div class="text-center">
<Button variant="ghost" class="border border-foreground/15 shadow-none mx-auto mt-5 inline-block"
as="a" href="">
View More Details
</Button>
</div>
</TabsContent>
</TabsRoot>
</Box>
<!-- END: Work In Progress -->
<!-- BEGIN: Daily Sales -->
<Box raised="single" class="col-span-12 p-0 lg:col-span-6">
<div class="flex items-center border-b border-foreground/15 px-5 py-5 sm:py-3">
<h2 class="mr-auto text-base font-medium">Daily Sales</h2>
<MenuRoot class="w-auto ml-auto sm:hidden">
<MenuTrigger as-child>
<a class="block size-5" href="#">
<Lucide class="size-5 opacity-70" icon="MoreHorizontal" />
</a>
</MenuTrigger>
<MenuPositioner>
<MenuContent class="w-40">
<MenuItem value="download">
<Lucide class="mr-2 size-4" icon="File" /> Download Excel
</MenuItem>
</MenuContent>
</MenuPositioner>
</MenuRoot>
<Button variant="ghost" class="shadow-none border border-foreground/15 hidden sm:flex">
<Lucide class="mr-2 size-4" icon="File" /> Download Excel
</Button>
</div>
<div class="p-5">
<div v-for="(faker, index) in fakers.slice(0, 3)" :key="index" :class="{ 'mt-5': index > 0 }"
class="relative flex items-center">
<AvatarRoot class="size-12 bg-background rounded-full">
<AvatarFallback>IM</AvatarFallback>
<AvatarImage :src="faker['photos'][0]" />
</AvatarRoot>
<div class="ml-4 mr-auto">
<a class="font-medium" href="">{{ faker['users'][0]!['name'] }}</a>
<div class="mr-5 opacity-70 sm:mr-5">
{{
index === 0
? 'Bootstrap 4 HTML Admin Template'
: index === 1
? 'Tailwind Admin Dashboard Template'
: 'Vuejs HTML Admin Template'
}}
</div>
</div>
<div class="font-medium">
{{ index === 0 ? '+$19' : index === 1 ? '+$25' : '+$21' }}
</div>
</div>
</div>
</Box>
<!-- END: Daily Sales -->
<!-- BEGIN: Latest Tasks -->
<Box raised="single" class="col-span-12 p-0 lg:col-span-6">
<TabsRoot defaultValue="lt-0">
<div class="relative flex items-center border-b border-foreground/15 p-5">
<h2 class="mr-auto text-base font-medium">Latest Tasks</h2>
<MenuRoot class="w-auto ml-auto sm:hidden">
<MenuTrigger as-child>
<a class="block size-5" href="#">
<Lucide class="size-5 opacity-70" icon="MoreHorizontal" />
</a>
</MenuTrigger>
<MenuPositioner>
<MenuContent class="w-40">
<MenuItem value="new">New</MenuItem>
<MenuItem value="last-week">Last Week</MenuItem>
</MenuContent>
</MenuPositioner>
</MenuRoot>
<TabsList class="absolute inset-y-0 h-[2.8rem] right-5 my-auto hidden w-auto sm:flex">
<TabsTrigger value="lt-0">New</TabsTrigger>
<TabsTrigger value="lt-1">Last Week</TabsTrigger>
</TabsList>
</div>
<div class="p-5">
<TabsContent value="lt-0">
<div class="flex items-center">
<div class="border-l-4 border-primary/20 pl-4">
<a class="font-medium" href="">Create New Campaign</a>
<div class="opacity-70">10:00 AM</div>
</div>
<div class="ml-auto">
<SwitchRoot>
<SwitchControl />
</SwitchRoot>
</div>
</div>
<div class="mt-5 flex items-center">
<div class="border-l-4 border-primary/20 pl-4">
<a class="font-medium" href="">Meeting With Client</a>
<div class="opacity-70">02:00 PM</div>
</div>
<div class="ml-auto">
<SwitchRoot>
<SwitchControl />
</SwitchRoot>
</div>
</div>
<div class="mt-5 flex items-center">
<div class="border-l-4 border-primary/20 pl-4">
<a class="font-medium" href="">Create New Repository</a>
<div class="opacity-70">04:00 PM</div>
</div>
<div class="ml-auto">
<SwitchRoot>
<SwitchControl />
</SwitchRoot>
</div>
</div>
</TabsContent>
</div>
</TabsRoot>
</Box>
<!-- END: Latest Tasks -->
<Box raised="single" class="col-span-12 p-0">
<CarouselRoot :default-page="0" :slide-count="fakers.slice(0, 5).length">
<div class="flex items-center border-b border-foreground/15 px-5 py-3">
<h2 class="mr-auto text-base font-medium">New Products</h2>
<CarouselPrevTrigger as-child>
<Button variant="ghost" class="shadow-none border border-foreground/15 mr-2">
<Lucide class="size-4" icon="ChevronLeft" />
</Button>
</CarouselPrevTrigger>
<CarouselNextTrigger as-child>
<Button variant="ghost" class="shadow-none border border-foreground/15">
<Lucide class="size-4" icon="ChevronRight" />
</Button>
</CarouselNextTrigger>
</div>
<div class="px-5">
<CarouselItemGroup class="py-5">
<CarouselItem v-for="(faker, index) in fakers.slice(0, 5)" :key="index" :index="index" class="px-5"
as-child>
<div>
<div class="flex flex-col items-center pb-5 lg:flex-row">
<div class="flex flex-col items-center pr-5 sm:flex-row lg:border-r border-foreground/15">
<div class="sm:mr-5">
<AvatarRoot class="size-20 bg-background rounded-full">
<AvatarFallback>IM</AvatarFallback>
<AvatarImage :src="faker['images'][0]" />
</AvatarRoot>
</div>
<div class="mr-auto mt-3 text-center sm:mt-0 sm:text-left">
<a class="text-lg font-medium" href="">
{{ faker['products'][0]!['name'] }}
</a>
<div class="mt-1 opacity-70 sm:mt-0">
{{ faker['news'][0]!['shortContent'] }}
</div>
</div>
</div>
<div
class="mt-6 flex w-full flex-1 items-center justify-center border-t border-foreground/15 px-5 pt-4 lg:mt-0 lg:w-auto lg:border-t-0 lg:pt-0">
<div class="w-20 rounded-md py-3 text-center">
<div class="text-xl font-medium">{{ faker['totals'][0] }}</div>
<div class="opacity-70">Orders</div>
</div>
<div class="w-20 rounded-md py-3 text-center">
<div class="text-xl font-medium">{{ faker['totals'][1] }}k</div>
<div class="opacity-70">Purchases</div>
</div>
<div class="w-20 rounded-md py-3 text-center">
<div class="text-xl font-medium">{{ faker['totals'][0] }}</div>
<div class="opacity-70">Reviews</div>
</div>
</div>
</div>
<div class="flex flex-col items-center border-t border-foreground/15 pt-5 sm:flex-row">
<div
class="flex w-full items-center justify-center border-b border-foreground/15 pb-5 sm:w-auto sm:justify-start sm:border-b-0 sm:pb-0">
<Badge look="outline" class="mr-3 px-3 py-2">{{
faker['dates'][0]
}}</Badge>
<div class="opacity-70">Date of Release</div>
</div>
<div class="mt-5 flex sm:ml-auto sm:mt-0">
<Button variant="ghost"
class="border border-foreground/15 shadow-none ml-auto">Preview</Button>
<Button variant="ghost" class="border border-foreground/15 shadow-none ml-2">Details</Button>
</div>
</div>
</div>
</CarouselItem>
</CarouselItemGroup>
</div>
</CarouselRoot>
</Box>
<!-- END: New Products -->
</div>
</TabsContent>
</TabsRoot>
</div>
</template>