Skip to content

THE COMPONENT GALLERY

Good interfaces, piece by piece.

A collection of useful little things. Try them, change the theme, and take a look at the Volang behind them.

Get to know the framework →

Explore the essentials

A good place to start

Actions with clear intent and a little room to breathe.

0 little steps forward
View code
kit.Button(kit.ButtonProps{
    OnPress: func() { count.Set(count.Get() + 1) },
}, ui.Text("Make it happen"))
Open complete examples →

The little details

Native inputs, useful labels, and familiar keyboard behavior.

View code
kit.Field("name", "Your name", "A personal touch.",
    ui.Element("input").Attr("value", name.Get()).
        On("input", func(e ui.Event) { name.Set(e.Value) }))
Open complete examples →

Every state has a story

Quiet feedback that keeps people in the picture.

View code
kit.Progress(kit.ProgressProps{
    ID: "progress", Label: "A little progress",
    Max: 100, Value: 35, Indeterminate: busy.Get(),
})
Open complete examples →

A moment of focus

Native modal layers, keyboard navigation, and a graceful way back.

Try Tab, Shift + Tab, and Escape.

View code
kit.Dialog(kit.DialogProps{
    ID: "idea", Title: "A new idea", Open: readOpen,
    OnOpenChange: func(value bool) { open.Set(value) },
}, content)
Open complete examples →

Little things worth knowing

A timely note, with a little space to read and respond.

A little reassurance, without losing your place.

View code
notes := kit.NewToasts(scope, "notes", kit.ToastOptions{})
show := func() {
    notes.Show(kit.ToastMessage{Key: "saved", Title: "Your idea is saved"})
}
kit.ToastRegion(kit.ToastRegionProps{
    ID: "notes", Queue: notes, ReturnFocus: trigger,
})
Open complete examples →

A different perspective

Related views, with a clear path between them.

View code
kit.Tabs(kit.TabsProps{
    ID: "idea", Label: "Your idea", Value: readSelected,
    Items: items, OnChange: func(key string) { selected.Set(key) },
})
Open complete examples →

A gentle change of pace

A little movement, with time to change your mind.

Bring it back before it fades to keep your thought. Once it’s gone, there’s room for a fresh start.

View code
kit.Presence(kit.PresenceProps{
    ID: "thought", Visible: readVisible, ReturnFocus: trigger,
}, content)
Open complete examples →

Room for your next idea

Clear feedback, thoughtful defaults, and a safe place for unfinished thoughts.

Try “hello” to see a validation response.

A little inspiration

Pick the things that help an idea grow.

A small form, ready for your next idea.

View code
form := forms.Use(scope, "idea", forms.Options{
    Initial: forms.Values{"title": []string{""}},
    Validate: validateIdea,
})
field := form.Input("title", ui.Element("input"))
Open complete examples →

A little room to unfold

Useful details, ready when you need them.

View code
kit.Accordion(kit.AccordionProps{
    ID: "ideas", Items: items, Expanded: readExpanded,
    Multiple: true, OnChange: updateExpanded,
})
Open complete examples →

Keep the details close

A little space beside the action, with a familiar way back.

Untitled idea

View code
kit.Popover(kit.PopoverProps{
    ID: "settings", Label: "Quick settings",
    Open: readOpen, OnOpenChange: setOpen,
}, content)
Open complete examples →

A few good next steps

Familiar actions, one small menu away.

A few useful next steps for your idea.

View code
kit.Menu(kit.MenuProps{
    ID: "actions", Label: "Idea actions", Items: items,
    Open: readOpen, OnOpenChange: setOpen,
    OnAction: handleAction,
})
Open complete examples →

Follow your curiosity

Find a familiar place, or leave room for a new one.

A suggestion can be the start of something.

A little further afield

Pick a suggestion or type someplace new.

Amsterdam
Berlin
Copenhagen
Dublin
Edinburgh
Florence
Helsinki
Lisbon
Oslo
Paris
Porto
Prague
Reykjavík
Rome
Stockholm
Vienna
Zürich
京都
東京
View code
kit.Combobox(kit.ComboboxProps{
    ID: "place", Label: "Your next stop", Options: places,
    Value: readPlace, OnChange: setPlace,
})
Open complete examples →

Make yourself at home

Familiar choices, with room for your own preferences.

Room to breathe

Choose the spacing that feels right.

A few preferences to make it yours.

View code
kit.Select(kit.SelectProps{
    ID: "language", Name: "language", Label: "Language",
    Placeholder: "Choose a language", Options: languages,
})
Open complete examples →

So much to discover

A thousand small thoughts, with a comfortable place to browse.

A place to begin: A quiet morning · 1

View code
kit.Listbox(kit.ListboxProps{
    ID: "library", Label: "Your library", Items: library,
    Selected: readSelected, OnSelectionChange: setSelected,
    Virtual: true, RowHeight: 40, Height: 208,
})
Open complete examples →

A little more organized

A few ideas to sort through, with space for your notes.

Page 1 of 3. Your notes stay with each thought.

View code
kit.Table(kit.TableProps{
    Caption: "Ideas for your day", Columns: columns, Rows: rows,
    Sort: readSort, OnSortChange: sortItems,
})
kit.Pagination(kit.PaginationProps{
    Page: readPage, PageCount: pages, OnChange: setPage,
})
Open complete examples →

Built with Volang UI · A work in progress, made to be explored.
Opening Studio…