MARIANA Design System
Typography
Heading
Sub Heading
Body
Colors
Ocean Depth
Sunlit
Lagoon
Neutral
Component Colors
Text Colors
Gradients
Effects
Components
Calendar
Figma Layout (Desktop + Mobile)
February 2026
Feb 2nd - Assignment A dateline
Feb 5th - Lorem ipsum
Feb 14th - Skibidi Sigma
Feb 15th - awikwokawikwok
February 2026
Feb 2nd - Assignment A dateline
Feb 5th - Lorem ipsum
Feb 14th - Skibidi Sigma
Feb 15th - awikwokawikwok
Controlled Month Example
This variant controls the month externally and updates legend items from a month-to-events mapping.
March 2026
Mar 2nd - Sprint planning
Mar 5th - Lorem ipsum
Mar 14th - Skibidi Sigma
Mar 15th - awikwokawikwok
March 2026
Mar 2nd - Sprint planning
Mar 5th - Lorem ipsum
Mar 14th - Skibidi Sigma
Mar 15th - awikwokawikwok
Events in March 2026
- Mar 2nd - Sprint planning
- Mar 5th - Lorem ipsum
- Mar 14th - Skibidi Sigma
- Mar 15th - awikwokawikwok
Minimal Variant (No Legend)
Use this version when you only want highlighted days without additional text items.
April 2026
April 2026
Date Picker with Dropdown Navigation
Use dropdowns to quickly navigate to any month and year. Click on a day to select it.
Selected Date
No date selected. Click on a day to select.
Usage
import React from "react"
import { Calendar, sharedCalendarProps } from "~/components/ui/calendar"
const FEBRUARY_2026 = new Date(2026, 1, 1)
const MARCH_2026 = new Date(2026, 2, 1)
/**
* JavaScript Date month index is 0-based:
* 0 = January, 1 = February, ..., 11 = December.
* Example: new Date(2026, 1, 2) means February 2nd, 2026.
*/
const CALENDAR_EVENTS = [
{ id: "feb-2", date: new Date(2026, 1, 2), title: "Assignment A dateline" },
{ id: "feb-5", date: new Date(2026, 1, 5), title: "Lorem ipsum" },
{ id: "feb-14", date: new Date(2026, 1, 14), title: "Skibidi Sigma" },
{ id: "feb-15", date: new Date(2026, 1, 15), title: "awikwokawikwok" },
]
const CALENDAR_LEGEND_GRADIENT = {
backgroundImage:
"linear-gradient(126.828deg, var(--sunlit-100) 0%, var(--lagoon-500) 20%, var(--ocean-depth-500) 80%)",
WebkitTextFillColor: "transparent",
}
const calendarProps = sharedCalendarProps({
events: CALENDAR_EVENTS,
defaultMonth: FEBRUARY_2026,
legendGradientStyle: CALENDAR_LEGEND_GRADIENT,
accentTextDays: [],
})
export function MyComponent() {
const [month, setMonth] = React.useState(MARCH_2026)
return (
<Calendar
className="w-full max-w-[766px]"
desktop
month={month}
onMonthChange={setMonth}
{...calendarProps}
/>
)
}Card
Complete Card
Card with Action
Card with Asset
Simple Card
This is a simple card with only content. No header or footer needed.
Usage
import {
Card,
CardHeader,
CardTitle,
CardDescription,
CardContent,
CardFooter,
CardAction
} from '~/components/ui/card'
import { Button } from '~/components/ui/button'
export function MyComponent() {
return (
<Card className="max-w-md">
<CardHeader>
<CardTitle>Card Title</CardTitle>
<CardDescription>
This is a complete card with all sub-components
</CardDescription>
</CardHeader>
<CardContent>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do
eiusmod tempor incididunt ut labore et dolore magna aliqua.
</p>
</CardContent>
<CardFooter className="gap-2">
<Button variant="outline">Cancel</Button>
<Button>Save Changes</Button>
</CardFooter>
</Card>
)
}Chip
Variants
Usage
import { Chip } from '~/components/ui/chip'
export function MyComponent() {
return (
<div className="flex gap-2">
<Chip>
<Star className="text-text-1000 group-hover:text-lagoon-500" />
<span className="flex group-hover:bg-theme-gradient group-hover:text-transparent group-hover:bg-clip-text">
Chip
</span>
</Chip>
</div>
)
}Countdown
Basic Usage
Controls
Usage
import { Countdown } from '~/components/ui/countdown'
export function MyComponent() {
const targetDate = new Date('2024-12-31T23:59:59')
return (
<Countdown
targetDate={targetDate}
onComplete={() => alert('Countdown finished!')}
/>
)
}Disclosure
Single Collapsible
Only one item can be open at a time, and you can close all items
Multiple
Multiple items can be open at the same time
Usage
import { Disclosure, DisclosureItem, DisclosureTrigger, DisclosureContent } from '~/components/ui/disclosure'
// Single collapsible disclosure
export function MyDisclosure() {
return (
<Disclosure type="single" collapsible>
<DisclosureItem value="item-1">
<DisclosureTrigger>What is this?</DisclosureTrigger>
<DisclosureContent>
This is an disclosure component
</DisclosureContent>
</DisclosureItem>
<DisclosureItem value="item-2">
<DisclosureTrigger>How does it work?</DisclosureTrigger>
<DisclosureContent>
Click the trigger to expand or collapse content
</DisclosureContent>
</DisclosureItem>
</Disclosure>
)
}File Input
Basic Usage (Uncontrolled)

Drag atau upload file kamu di sini!
Drag and drop or click to select
Controlled with File State

Drag atau upload file kamu di sini!
Supports any file type
With File Type Restriction

Drag atau upload file kamu di sini!
Only image files accepted
Custom Text

Drag atau upload file kamu di sini!
PDF format preferred
Disabled State

Drag atau upload file kamu di sini!
File upload is disabled
Usage
import { FileInput } from '~/components/ui/file-input'
export function MyComponent() {
const [file, setFile] = React.useState<File | null>(null)
return (
<FileInput
label="Upload Document"
accept=".pdf,.doc,.docx"
value={file}
onChange={setFile}
secondaryMessage="Supports PDF, DOC, DOCX"
/>
)
}Input
Basic Input
With Label
With Icons
Left Icon
Right Icon
Both Icons
Alignment
Left Aligned (default)
Center Aligned
States
Default
Hover (hover over input)
Selected/Focused (click input)
Error State
Disabled
Complex Examples
Search with Icon + Center Alignment
Password with Icons + Label + Error
Usage
import { Input } from '~/components/ui/input';
import { Search, Lock, Eye } from "lucide-react";
export function MyComponent() {
return (
<div>
{/* Basic Input */}
<Input placeholder="Enter text..." />
{/* Input with Label */}
<Input
label="Email Address"
placeholder="Enter your email"
/>
{/* Input with Left Icon */}
<Input
leftIcon={<Search size={24} />}
placeholder="Search..."
/>
{/* Input with Right Icon */}
<Input
rightIcon={<Eye size={24} />}
type="password"
placeholder="Enter password"
/>
{/* Input with Both Icons */}
<Input
leftIcon={<Lock size={24} />}
rightIcon={<Eye size={24} />}
type="password"
placeholder="Enter password"
/>
{/* Center Aligned Input */}
<Input
alignment="center"
placeholder="Center aligned text"
/>
{/* Error State */}
<Input
label="Email"
placeholder="Enter email"
error="Please enter a valid email address"
/>
{/* Disabled State */}
<Input
placeholder="Disabled input"
disabled
/>
{/* Mobile Size */}
<Input
inputSize="mobile"
placeholder="Mobile sized input"
/>
</div>
);
}Modal
Basic Modal
Modal with Asset
Modal Wide
Usage
import {
Modal,
ModalTrigger,
ModalContent,
ModalHeader,
ModalTitle,
ModalDescription,
ModalFooter,
ModalClose,
} from '~/components/ui/modal'
import { Button } from '~/components/ui/button'
export function MyModal() {
return (
<Modal>
<ModalTrigger asChild>
<Button>Open Modal</Button>
</ModalTrigger>
<ModalContent>
<Image src="/icons/gradient/check-circle.svg" alt="icon" />
<ModalHeader>
<ModalTitle className="text-center">Edit Profile</ModalTitle>
<ModalDescription className="text-center">
Make changes to your profile here. Click save when you're
done.
</ModalDescription>
</ModalHeader>
<ModalFooter>
<ModalClose asChild>
<Button>Cancel</Button>
</ModalClose>
<Button>Save</Button>
</ModalFooter>
</ModalContent>
</Modal>
)
}Notes
SE
Note to SE
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut porta lectus, sed lacinia arcu.
EDM
Note to EDM
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut porta lectus, sed lacinia arcu.
Product Owner
Note to Product Owner
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut porta lectus, sed lacinia arcu.
Designer
Note to Designer
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut porta lectus, sed lacinia arcu.
Usage
import { Notes } from '~/components/ui/notes'
export function MyComponent() {
return (
<Notes variant="SE">
<p>This is an informational note.</p>
</Notes>
)
}ProgressBar
Basic Usage
Progress bar standar tanpa label.
Label Positioning
Label Bottom (Default)
Label Top
Custom Labels & Max Values
Menggunakan prop label untuk teks custom dan max untuk skala berbeda.
Interactive Example
Grid Layout
Contoh tampilan dalam layout 2 kolom.
Usage
import { ProgressBar } from '~/components/ui/progress-bar'
export function MyComponent() {
return (
<ProgressBar
value={75}
max={100}
showLabel
labelPosition="top"
/>
)
}Select
Basic Select
Grouped Options
Disabled State
Usage
import {
Select,
SelectContent,
SelectGroup,
SelectItem,
SelectLabel,
SelectTrigger,
SelectValue,
} from '~/components/ui/select'
export function MyComponent() {
const [value, setValue] = useState('')
return (
<Select value={value} onValueChange={setValue}>
<SelectTrigger className="w-full">
<SelectValue placeholder="Select an option" />
</SelectTrigger>
<SelectContent>
<SelectItem value="option-1">Option 1</SelectItem>
<SelectItem value="option-2">Option 2</SelectItem>
</SelectContent>
</Select>
)
}Tabs
Default Variant
Vertical Orientation
Usage
import { Tabs, TabsList, TabsTrigger, TabsContent } from '~/components/ui/tabs'
export function MyComponent() {
return (
<Tabs defaultValue="tab1">
<TabsList>
<TabsTrigger value="tab1">Tab 1</TabsTrigger>
<TabsTrigger value="tab2">Tab 2</TabsTrigger>
<TabsTrigger value="tab3">Tab 3</TabsTrigger>
</TabsList>
<TabsContent value="tab1">Content for tab 1</TabsContent>
<TabsContent value="tab2">Content for tab 2</TabsContent>
<TabsContent value="tab3">Content for tab 3</TabsContent>
</Tabs>
)
}Text Overflow
Single Line (Default)
Multi-Line (2 lines)
Multi-Line (3 lines)
Short Text (No Truncation)
Usage
import { TextOverflow } from '~/components/ui/text-overflow'
export function MyComponent() {
return (
<TextOverflow lines={2}>
This is a long text that will be truncated with an ellipsis
when it exceeds the specified number of lines.
</TextOverflow>
)
}Tip Card
Basic Usage
Usage
import { TipCard } from '~/components/ui/tip-card'
import { Info } from "lucide-react"
export function MyComponent() {
return (
<TipCard
title="Pro Tip"
description="Use keyboard shortcuts to navigate faster through the application."
icon={(<Image src="/icons/gradient/info-circle.svg" alt="icon" />)
}
/>
)
}Toaster
import { toast } from "sonner";
// Default toast
toast("Default message");
// Toast variants
toast.success("Success message");
toast.error("Error message");
toast.warning("Warning message");
toast.info("Info message");
toast.loading("Loading...");
// Toast with action
toast("Message", {
action: { label: "Undo", onClick: () => {} },
});
// Toast with description
toast("Title", {
description: "Description text",
});Toggle
Default
Usage
import { Toggle } from '~/components/ui/toggle'
export function MyComponent() {
const [checked, setChecked] = React.useState(false)
return (
<div className="flex gap-4">
<Toggle checked={checked} onCheckedChange={setChecked} />
</div>
)
}Tooltip
Positions
Usage
import {
Tooltip,
TooltipTrigger,
TooltipContent,
TooltipProvider,
} from '~/components/ui/tooltip'
import { Button } from '~/components/ui/button'
export function MyComponent() {
return (
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<Button>Hover me</Button>
</TooltipTrigger>
<TooltipContent>
This is a tooltip
</TooltipContent>
</Tooltip>
</TooltipProvider>
)
}FAQ
Need more help?
Temukan berbagai pertanyaan serta jawaban seputar Main Event di sini!

Popover
Quiz Navigator
Select to navigate through questions
Testimonial

Ahmad Fauzan 0
COMPFEST 17 Participant

Sarah Putri 1
Academy Batch 3 Graduate

Michael Tanoto 2
Hackathon Winner 2024

Diana Kusuma 3
Event Volunteer

Rizki Pratama 4
SDC Finalist

Lisa Amanda 5
Academy Batch 5 Student

Budi Santoso 6
Tech Talk Speaker

Nina Wahyuni 7
UI/UX Competition Winner

Kevin Hartono 8
Data Science Academy Alum







