Lefi
PIC IT Dev
Lorem ipsum dolor sit amet et ornare dignissim bibendum et. Dictum pretium ullamcorper dignissim pellentesque id bibendum sed.
Open House Fasilkom UI 2026
Official Design System of OH26 Fasilkom UI
Foundation
Text styles, fonts, and headings used across the application.
Bold display hierarchy for section titles and page headings.
Aa
60px / 40px
font-size 60px, line-height 40px
Aa
48px / 40px
font-size 48px, line-height 40px
Aa
36px / 40px
font-size 36px, line-height 40px
Aa
30px / 36px
font-size 30px, line-height 36px
Aa
24px / 32px
font-size 24px, line-height 32px
Aa
20px / 28px
font-size 20px, line-height 28px
Aa
16px / 24px
font-size 16px, line-height 24px
Aa
14px / 20px
font-size 14px, line-height 20px
Aa
12px / 16px
font-size 12px, line-height 16px
Supporting hierarchy for labels, cards, and compact sections.
Aa
60px / 60px
font-size 60px, line-height 60px
Aa
48px / 48px
font-size 48px, line-height 48px
Aa
36px / 40px
font-size 36px, line-height 40px
Aa
30px / 36px
font-size 30px, line-height 36px
Aa
24px / 32px
font-size 24px, line-height 32px
Aa
20px / 28px
font-size 20px, line-height 28px
Aa
16px / 24px
font-size 16px, line-height 24px
Aa
14px / 20px
font-size 14px, line-height 20px
Aa
12px / 16px
font-size 12px, line-height 16px
Reading and interface copy scale for content-heavy surfaces.
Aa
60px / 60px
font-size 60px, line-height 60px
Aa
48px / 48px
font-size 48px, line-height 48px
Aa
36px / 40px
font-size 36px, line-height 40px
Aa
30px / 36px
font-size 30px, line-height 36px
Aa
24px / 32px
font-size 24px, line-height 32px
Aa
20px / 28px
font-size 20px, line-height 28px
Aa
16px / 24px
font-size 16px, line-height 24px
Aa
14px / 20px
font-size 14px, line-height 20px
Aa
12px / 16px
font-size 12px, line-height 16px
<h1 className="font-league-spartan font-bold text-h1 text-primary-10">Heading</h1>
<p className="font-aileron text-b7 text-primary-20">Body copy</p>Color palette using the project tokens declared in app.css.
Main brand purple surfaces and emphasis.
primary-10
#E7DEF9
bg-primary-10
primary-20
#D6C3FC
bg-primary-20
primary-30
#B89CEF
bg-primary-30
primary-40
#946AE7
bg-primary-40
primary-50
#7139DF
bg-primary-50
primary-60
#551FBF
bg-primary-60
primary-70
#3F178D
bg-primary-70
primary-80
#2D1165
bg-primary-80
primary-90
#1C0A3E
bg-primary-90
Blue support palette for depth and layout gradients.
secondary-10
#D9E1F4
bg-secondary-10
secondary-20
#C0D2F8
bg-secondary-20
secondary-30
#99B5F2
bg-secondary-30
secondary-40
#6590EB
bg-secondary-40
secondary-50
#326BE5
bg-secondary-50
secondary-60
#194FC4
bg-secondary-60
secondary-70
#133B91
bg-secondary-70
secondary-80
#0C265E
bg-secondary-80
secondary-90
#07183A
bg-secondary-90
Aqua accent palette for highlights and active states.
tertiary-10
#D6F5F2
bg-tertiary-10
tertiary-20
#C0FCF7
bg-tertiary-20
tertiary-30
#82F9EF
bg-tertiary-30
tertiary-40
#43F5E7
bg-tertiary-40
tertiary-50
#0CEBD9
bg-tertiary-50
tertiary-60
#0AC1B2
bg-tertiary-60
tertiary-70
#08978B
bg-tertiary-70
tertiary-80
#066D64
bg-tertiary-80
tertiary-90
#06554E
bg-tertiary-90
Text, dividers, and low-emphasis interface elements.
neutral-10
#333333
bg-neutral-10
neutral-100
#FFFFFF
bg-neutral-100
neutral-200
#E8E8E8
bg-neutral-200
neutral-300
#D2D2D2
bg-neutral-300
neutral-400
#BBBBBB
bg-neutral-400
neutral-500
#A4A4A4
bg-neutral-500
neutral-600
#8E8E8E
bg-neutral-600
neutral-700
#777777
bg-neutral-700
neutral-800
#606060
bg-neutral-800
neutral-900
#4A4A4A
bg-neutral-900
neutral-1000
#333333
bg-neutral-1000
Status colors for alerts, success, and warnings.
red-10
#FB3748
bg-red-10
red-100
#FB3748
bg-red-100
red-200
#D00416
bg-red-200
yellow-10
#FFDB43
bg-yellow-10
yellow-100
#FFDB43
bg-yellow-100
yellow-200
#DFB400
bg-yellow-200
green-10
#1FC16B
bg-green-10
green-100
#84EBB4
bg-green-100
green-200
#1FC16B
bg-green-200
<div className="bg-primary-80 text-primary-10">Primary surface</div>
<div className="bg-tertiary-50 text-primary-90">Accent surface</div>Brand logo placeholder.
<div className="text-xl font-bold">
Brand<span className="text-primary">.</span>
</div>Core controls
Interactive button element used for actions.
import { Button } from "~/components/ui/button";
// Primary Button
<Button variant="primary">
<LucideBiohazard />
Primary
<LucideBiohazard />
</Button>
<Button variant="primary" disabled>
<LucideBiohazard />
Disabled
<LucideBiohazard />
</Button>
// Secondary Button
<Button variant="secondary">
<LucideBiohazard />
Secondary
<LucideBiohazard />
</Button>
<Button variant="secondary" disabled>
<LucideBiohazard />
Disabled
<LucideBiohazard />
</Button>
// Tertiary Button
<Button variant="tertiary">
<LucideBiohazard />
Tertiary
<LucideBiohazard />
</Button>
<Button variant="tertiary" disabled>
<LucideBiohazard />
Disabled
<LucideBiohazard />
</Button>
// Ghost Button
<Button variant="ghost">
<LucideBiohazard />
Ghost
<LucideBiohazard />
</Button>
<Button variant="ghost" disabled>
<LucideBiohazard />
Disabled
<LucideBiohazard />
</Button>
Alert message placeholder.
import {
Alert,
AlertAction,
AlertDescription,
AlertIcon,
AlertTitle,
} from "~/components/ui/alert";
<Alert variant="info">
<AlertIcon />
<AlertTitle>Info</AlertTitle>
<AlertDescription>
Lorem ipsum dolor sit amet, consectetur adipiscing elit
</AlertDescription>
<AlertAction />
</Alert>
<Alert variant="error">
<AlertIcon />
<AlertTitle>Error</AlertTitle>
<AlertDescription>
Lorem ipsum dolor sit amet, consectetur adipiscing elit
</AlertDescription>
<AlertAction />
</Alert>
<Alert variant="success">
<AlertIcon />
<AlertTitle>Success</AlertTitle>
<AlertDescription>
Lorem ipsum dolor sit amet, consectetur adipiscing elit
</AlertDescription>
<AlertAction />
</Alert>
<Alert variant="warning">
<AlertIcon />
<AlertTitle>Warning</AlertTitle>
<AlertDescription>
Lorem ipsum dolor sit amet, consectetur adipiscing elit
</AlertDescription>
<AlertAction />
</Alert>Small status indicators or tags.
import { useState } from "react";
import { Chip } from "~/components/ui/chip";
export function ChipExample() {
const [active, setActive] = useState(false);
return (
<>
{/* Regular */}
<Chip>Chips</Chip>
{/* Starts selected on first render */}
<Chip defaultSelected>Chips</Chip>
{/* Controlled */}
<Chip selected={active} onSelectedChange={setActive}>
Chips
</Chip>
</>
);
}Brief notification pill in 4 variants: error, loading, success, warning.
import { toast } from "~/components/ui/toast";
<Button onClick={() => toast.error("Error message")}>Error</Button>
<Button onClick={() => toast.loading("Loading")}>Loading</Button>
<Button onClick={() => toast.success("Success message")}>Success</Button>
<Button onClick={() => toast.warning("Warning message")}>Warning</Button>Floating contextual information with info icon. Supports 4 directions and responsive desktop/mobile sizes.
import { Tooltip } from "~/components/ui/tooltip";
<Tooltip title="Tooltip Title" description="Lorem ipsum dolor sit amet, consectetur adipiscing elit." direction="top">
<button>Hover me</button>
</Tooltip>Checkbox states with configurable shape and palette.
import { Checkbox } from "~/components/ui/checkbox";
<Checkbox type="outline" color="primary" defaultChecked />
<Checkbox type="solid" color="secondary-light" defaultChecked />
<Checkbox type="circle" color="tertiary" defaultChecked />
<Checkbox type="solid" color="orange" />Radio button states with configurable palette.
import { RadioGroup, RadioGroupItem } from "~/components/ui/radio-group";
<RadioGroup defaultValue="primary">
<RadioGroupItem color="primary" value="primary" />
<RadioGroupItem color="secondary-light" value="secondary-light" />
<RadioGroupItem color="orange" value="orange" />
</RadioGroup>Composed patterns
Text input fields and variants.
Error Message
import { Input } from "~/components/ui/input";
<Input type="email" variant="email" placeholder="Email" leftSection={<Mail />} rightSection={<Mail />} />
// Left and right sections are optional, and can be any icons. If not provided, the default left and right sections for the variant will be used.
// Types and variants can be different, it is only for semantics.Vertically stacked set of interactive headings.
import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "~/components/ui/accordion";
<Accordion type="single" collapsible>
<AccordionItem value="item-1">
<AccordionTrigger>Is it accessible?</AccordionTrigger>
<AccordionContent>Yes. It adheres to the WAI-ARIA design pattern.</AccordionContent>
</AccordionItem>
</Accordion>Displays a menu to the user — such as a set of actions or functions — triggered by a button.
Primary
Secondary
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "~/components/ui/dropdown-menu";
<DropdownMenu variant="primary">
<DropdownMenuTrigger>Open</DropdownMenuTrigger>
<DropdownMenuContent>
<DropdownMenuItem>Profile</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>Displays content and actions on a single topic.
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "~/components/ui/card";
<Card>
<CardHeader>
<CardTitle>Title</CardTitle>
</CardHeader>
<CardContent>...</CardContent>
</Card>12 variations across Center / Wide alignment, 0–2 buttons, and optional close icon. All responsive — desktop card on larger screens, bottom-sheet on mobile.
import { CircleAlert } from "lucide-react";
import {
Modal,
ModalContent,
ModalHeader,
ModalTitle,
ModalDescription,
ModalFooter,
ModalTrigger,
ModalClose,
ModalAction,
} from "~/components/ui/modal";
<Modal>
<ModalTrigger>Open</ModalTrigger>
<ModalContent
alignment="center"
icon={<CircleAlert strokeWidth={2.5} />}
iconClassName="size-12 text-red-200"
showCloseButton
showIcon
>
<ModalHeader>
<ModalTitle>Heading</ModalTitle>
<ModalDescription>Description</ModalDescription>
</ModalHeader>
<ModalFooter>
<ModalClose asChild>
<ModalAction variant="primary">Confirm</ModalAction>
</ModalClose>
</ModalFooter>
</ModalContent>
</Modal>A set of layered sections of content demonstrating all horizontal and vertical configurations.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
Make changes to your account here.
import { Tabs, TabsContent, TabsList, TabsTrigger } from "~/components/ui/tabs";
<Tabs defaultValue="account" orientation="vertical">
<TabsList>
<TabsTrigger value="account">Account</TabsTrigger>
</TabsList>
<TabsContent value="account">...</TabsContent>
</Tabs>File upload control.
Click to open the File Input
import { FileInput } from "~/components/ui/file-input";
import { Button } from "~/components/ui/button";
<FileInput
trigger={(open) => (
<Button
className="w-fit rounded-lg bg-secondary-50 px-8 py-3 font-bold text-neutral-100!"
onClick={open}
type="button"
>
Upload Document
</Button>
)}
/>Application Sections
Component to display contact details.
import ContactPerson from "~/components/elements/ContactPerson";
<ContactPerson
firstContactUrl="https://wa.me/6289504139150"
secondContactUrl="https://wa.me/6289504139150"
/>A calendar date picker with day, month, and year views. Click the title to switch views. Supports min/max date constraints.
import { DatePicker } from "~/components/ui/date-picker";
export function MyDatePicker() {
return (
<DatePicker
minDate={new Date(2025, 2, 1)} // Mar 1, 2025
maxDate={new Date(2027, 8, 30)} // Sep 30, 2027
onChange={(date) => console.log(date)}
/>
);
}User feedback and review display.

PIC IT Dev
Lorem ipsum dolor sit amet et ornare dignissim bibendum et. Dictum pretium ullamcorper dignissim pellentesque id bibendum sed.

VPIC IT Dev
Lorem ipsum dolor sit amet consectetur. Et ornare dignissim bibendum et. Viverra auctor interdum eleifend neque quis faucibus nunc scelerisque.

Staff Ahli IT Dev
Dictum pretium ullamcorper dignissim pellentesque id bibendum sed. Viverra auctor interdum eleifend neque quis faucibus nunc scelerisque.

PIC UI/UX
Sem non euismod risus viverra adipiscing natoque. Dictum pretium ullamcorper dignissim pellentesque id bibendum sed.

VPIC UI/UX
Lorem ipsum dolor sit amet et ornare dignissim bibendum et. Viverra auctor interdum eleifend neque quis faucibus nunc scelerisque.
// Placeholder for Testimonials component usageTimer component.
import Countdown from "~/components/elements/Countdown"
<Countdown targetDate={new Date('2026-06-25T23:59:59+07:00')}/>