MARIANA Design System

Typography

Heading

H712/120
H616/120
H520/120
H424/120
H332/120
H248/120
H164/120

Sub Heading

S612/200
S516/200
S420/200
S324/200
S232/200
S148/200

Body

B48/150
B312/150
B216/150
B124/150

Colors

Ocean Depth

050#F2F7FD
100#E4EDFA
300#8DBAEC
500#2A7ACD
700#174B8D
900#183B62
950#050B14

Sunlit

050#FEFEE8
100#FEFFC2
300#FFF34E
500#ECC906
700#A37005
900#724811
950#432605

Lagoon

050#EFFEFD
100#C7FFFB
200#76FFF6
500#04C5C8
700#057A80
900#0D5054
950#002D33

Neutral

050#FFFFFF
100#D9D9D9
300#B3B3B3
500#888888
700#626262
900#323232
1000#000000

Component Colors

Frame
Light: #CAE0FF
Dark: Ocean Depth/950
Card
Light: #F2F7FD
Dark: #1A2337
Card Hover
Light: #FFFFFF
Dark: #2B3A58
Border
Light: Lagoon/100
Dark: Lagoon/950
Error
Light: #C15B5C
Dark: #C15B5C
Success
Light: #00C990
Dark: #00C990

Text Colors

Aa
Text 1000
Light: Lagoon/900
Dark: Lagoon/100
Aa
Text 100
Light: Lagoon/100
Dark: Lagoon/900

Gradients

Testimonial
Linear (155deg)
8%: Sunlit/100
41%: Ocean Depth/100
70%: Lagoon/200
100%: Ocean Depth/700
Theme Gradient
Linear (155deg)
0%: Sunlit/100
20%: Lagoon/500
80%: Ocean Depth/500
Academy
Linear (90deg)
0%: Dark Purple
50%: Purple
100%: Light Purple
Competition
Linear (90deg)
0%: Dark Red
50%: Red
100%: Orange Red
Event
Linear (90deg)
0%: Dark Magenta
50%: Magenta
100%: Pink
Bulb Mid
Radial
0%: Light Cyan
40%: Cyan
99%: Blue
Bulb Top
Radial
51%: Dark Blue
74%: Blue
100%: Light Blue
Bulb Shine
Radial
0%: Light Yellow
30%: Yellow
100%: Orange/Gold
Bulb White Shine
Radial
68%: Light Blue
100%: Warm White
Wave 500
Linear (105deg)
28%: Ocean Depth/300
75%: Dark Blue
Error
Radial
0%: Light Red
100%: Dark Red
Success
Radial
0%: Light Green
100%: Dark Green

Effects

Drop Shadow Light
Light: 0 0 28px Sunlit/100
Drop Shadow Dark
Dark: 0 0 20px Lagoon/900
Blur
Background Blur
backdrop-blur-lg

Components

Button

Variants

With Icons

Disabled State

Loading State

Usage

import { Button } from '~/components/ui/button'

export function MyComponent() {
  return (
    <div className="flex gap-4">
      <Button>Click me</Button>
    </div>
  )
}

Calendar

Figma Layout (Desktop + Mobile)

February 2026

Mon
Tue
Wed
Thu
Fri
Sat
Sun

Feb 2nd - Assignment A dateline

Feb 5th - Lorem ipsum

Feb 14th - Skibidi Sigma

Feb 15th - awikwokawikwok

February 2026

Mon
Tue
Wed
Thu
Fri
Sat
Sun

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

Mon
Tue
Wed
Thu
Fri
Sat
Sun

Mar 2nd - Sprint planning

Mar 5th - Lorem ipsum

Mar 14th - Skibidi Sigma

Mar 15th - awikwokawikwok

March 2026

Mon
Tue
Wed
Thu
Fri
Sat
Sun

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

Mon
Tue
Wed
Thu
Fri
Sat
Sun

April 2026

Mon
Tue
Wed
Thu
Fri
Sat
Sun

Date Picker with Dropdown Navigation

Use dropdowns to quickly navigate to any month and year. Click on a day to select it.

Mon
Tue
Wed
Thu
Fri
Sat
Sun
Mon
Tue
Wed
Thu
Fri
Sat
Sun

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 Title
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.

Card with Action

Settings
Click the action button in the top-right corner to edit settings.

Card with Asset

Settings
Configure your preferences
asset
Click the action button in the top-right corner to edit settings.

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

ChipSelected Chip

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

4 Apr 2026, 18:22 WIB
Days
2
Hours
00
Minutes
00

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)

Upload file

Drag atau upload file kamu di sini!

Drag and drop or click to select

Controlled with File State

Upload file

Drag atau upload file kamu di sini!

Supports any file type

With File Type Restriction

Upload file

Drag atau upload file kamu di sini!

Only image files accepted

Custom Text

Upload file

Drag atau upload file kamu di sini!

PDF format preferred

Disabled State

Upload file

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

Please enter a valid email address

Disabled

Complex Examples

Search with Icon + Center Alignment

Password with Icons + Label + Error

Password must be at least 8 characters

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>
  );
}

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)

80% Managerial

Label Top

40% Managerial

Custom Labels & Max Values

Menggunakan prop label untuk teks custom dan max untuk skala berbeda.

Excellent Managerial
150/200 Points Managerial

Interactive Example

45% Managerial
Controls:

Grid Layout

Contoh tampilan dalam layout 2 kolom.

Q1 Target Managerial
Q2 Target Managerial
Q3 Target Managerial
Q4 Target Managerial

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

This is the content for tab 1

Vertical Orientation

This is the content for tab 1

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)

This is a very long text that will be truncated with an ellipsis when it overflows the container width

Multi-Line (2 lines)

This is a very long text that will be truncated with an ellipsis when it exceeds two lines. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore.

Multi-Line (3 lines)

This is a very long text that will be truncated with an ellipsis when it exceeds three lines. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation. Lorem ipsum dolor sit amet consectetur adipisicing elit. Hic, quidem labore libero doloribus perspiciatis quod et itaque pariatur aliquam! Ad Lorem ipsum dolor sit amet consectetur adipisicing elit. Facilis, ut..

Short Text (No Truncation)

Short text

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

Use keyboard shortcuts to navigate faster.

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>
  )
}

Contact Person

Need assistance?

Reach out to our amazing team!

kelpkelp

FAQ

Need more help?

Temukan berbagai pertanyaan serta jawaban seputar Main Event di sini!

bubble-chat

Popover

Quiz Navigator

Question 1

Select to navigate through questions

Testimonial

profile

Ahmad Fauzan 0

COMPFEST 17 Participant

COMPFEST 17 was an incredible journey that pushed me to grow both technically and personally. The mentors were supportive and the competition challenges were genuinely exciting.

profile

Sarah Putri 1

Academy Batch 3 Graduate

The Academy program gave me the foundation The Academy program gave me the foundation The Academy program gave me the foundation The Academy program gave me the foundation The Academy program gave me the foundation I needed to start my career in tech. The curriculum is well-structured and the hands-on projects helped me build a strong portfolio.

profile

Michael Tanoto 2

Hackathon Winner 2024

Participating in the COMPFEST Hackathon was a game-changer for me. I met amazing teammates and we built something meaningful that we're still developing today.

profile

Diana Kusuma 3

Event Volunteer

Being part of the volunteer team gave me behind-the-scenes experience in organizing large-scale tech events. It's a great way to network and learn from the best.

profile

Rizki Pratama 4

SDC Finalist

The Software Development Competition was intense but rewarding. I learned so much about team collaboration and delivering under pressure.

profile

Lisa Amanda 5

Academy Batch 5 Student

The online learning experience was seamless. The mentors responded quickly to our questions and the projects were relevant to industry needs.

profile

Budi Santoso 6

Tech Talk Speaker

Speaking at COMPFEST gave me the opportunity to share my knowledge with hundreds of enthusiastic participants. The energy in the room was amazing.

profile

Nina Wahyuni 7

UI/UX Competition Winner

The UI/UX competition pushed me to think creatively while solving real user problems. I gained confidence in presenting my design solutions.

profile

Kevin Hartono 8

Data Science Academy Alum

The Data Science track was comprehensive. From Python basics to machine learning models, I felt prepared for real-world data challenges.

profile

Putri Melinda 9

Closing Ceremony Host

Hosting COMPFEST was an unforgettable experience. I got to meet so many inspiring people from the tech community across Indonesia.

Timeline

Event Name

08/03/2026

Event Name

12/03/2026

Event Name

23/03/2026

Event Name

24/03/2026

Event Name

25/03/2026