A UI component library for MoonBit web apps — dark & light themes, overlay motion, zero config
howtomakeaname/sumi does not have a README file
pub(all) enum ThemeMode {
Dark
Light
System
}action_chip(label="Storyboard", on_click=emit.map(Run("storyboard")))dropdown_menu(
trigger=add_tile(aria_label="Add image"),
items=[...],
open=menu_open,
on_open_change=set_menu_open.map(v => _ => v),
)fn agent_input(value? : String, placeholder? : String, rows? : Int, on_input? : Emit[String], on_send? : Cmd, on_stop? : Cmd, send_disabled? : Bool, send_loading? : Bool, generating? : Bool, disabled? : Bool, autofocus? : Bool, actions? : Array[Html], children? : Array[Html], aria_label? : String, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlagent_input(
value=prompt,
placeholder="Describe your idea, or type / to use a skill",
on_input=emit.map(PromptChanged),
on_send=emit(Submit),
send_disabled=prompt.is_empty(),
actions=[
icon_button(icon_plus_fill(size=14), aria_label="Add attachment"),
agent_tool_button(icon=icon_skill(), label="Use Skill"),
icon_button(icon_at(), aria_label="Mention a reference"),
],
)agent_tool_button(icon=icon_skill(), label="Use Skill", on_click=pick_skill)fn alert(message~ : String, variant? : AlertVariant, icon? : Html, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlattachment_strip(
items=[
AttachmentItem::image("cover.png", label="Cover"),
AttachmentItem::document("Brief.pdf"),
],
on_add=pick_files,
on_remove=set_items.map(i => items => items.filteri(fn(j, _) { j != i })),
)fn[C : IsChildren] button(variant? : ButtonVariant, size? : ButtonSize, disabled? : Bool, pressed? : Bool, loading? : Bool, type_? : String, id? : String, class? : String, title? : String, name? : String, value? : String, autofocus? : Bool, on_click? : Cmd, attrs? : Attrs, style? : Array[String], children : C) -> Htmlfn[C : IsChildren] card(id? : String, class? : String, title? : String, attrs? : Attrs, style? : Array[String], children : C) -> Htmlfn[C : IsChildren] card_section(header~ : Html, id? : String, class? : String, attrs? : Attrs, style? : Array[String], children : C) -> Htmlchat_bubble(text="Continue")
chat_bubble(children=[
media_tag(kind=Image, variant=Inline, thumbnail=thumb),
@html.text("Add more detail"),
])
chat_bubble(text=long, collapsible=true, collapsed=c, on_toggle=set_c.map(v => _ => !v))checkbox_menu(
groups=[
CheckboxMenuGroup::new(
[
CheckboxMenuItem::new("text", "Text", checked=true),
CheckboxMenuItem::new("date", "Date"),
],
title="Fields",
clear_label="Clear",
on_clear=clear_fields,
),
],
on_toggle=toggle_field.map(v => _ => v),
)chip("720P", selected=quality == "720p", on_click=set_quality.map(v => _ => "720p"))chip_panel(children=[
skill_chip(label="Storyboard", mark=Hot),
skill_chip(label="Quick Cut"),
])context_menu(
entries=[
Item(MenuItem::new("rename", "Rename", shortcut="R")),
Separator,
Item(MenuItem::new("delete", "Delete", shortcut="⌫")),
],
open=ctx_open,
on_open_change=set_ctx_open.map(v => _ => v),
on_select=set_action.map(v => _ => v),
[canvas_card],
)fn dropdown_menu(items~ : Array[MenuEntry], trigger~ : Html, open~ : Bool, on_open_change? : Emit[Bool], selected? : String, on_select? : Emit[String], align? : MenuAlign, side? : MenuSide, id? : String, class? : String, attrs? : Attrs, style? : Array[String], trigger_style? : Array[String], menu_style? : Array[String]) -> Htmldropdown_menu(
trigger=button(variant=Ghost, [text(model_label), menu_chevron()]),
open=menu_open,
on_open_change=set_menu_open.map(v => _ => v),
items=MenuEntry::items([MenuItem::new("sd", "Sketch Diffusion")]),
selected=model,
on_select=set_model.map(v => _ => v),
)favorite_toggle(
checked=starred,
on_change=set_starred.map(v => _ => v),
)generation_meta(
text="AI-generated content | 0 credits used",
on_copy=emit(CopyResult),
)fn hitl_card(title~ : String, items~ : Array[HitlItem], on_toggle? : Emit[Int], confirmed? : Bool, on_cancel? : Cmd, on_confirm? : Cmd, cancel_label? : String, confirm_label? : String, max_height? : Int, aria_label? : String, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlhitl_card(
title="Generate the following 4 videos",
items=plan,
on_toggle=emit.map(ToggleRow),
on_cancel=emit(Dismiss),
on_confirm=emit(ConfirmAll),
)fn icon_button(icon : Html, variant? : ButtonVariant, size? : ButtonSize, disabled? : Bool, pressed? : Bool, id? : String, class? : String, title? : String, aria_label? : String, on_click? : Cmd, attrs? : Attrs, style? : Array[String]) -> Htmlfn input(value~ : String, placeholder? : String, input_type? : InputType, on_input? : Emit[String], on_change? : Emit[String], on_clear? : Cmd, clearable? : Bool, prefix? : Html, suffix? : Html, error? : Bool, error_text? : String, disabled? : Bool, read_only? : Bool, name? : String, maxlength? : Int, autofocus? : Bool, id? : String, class? : String, title? : String, attrs? : Attrs, style? : Array[String]) -> Htmlfn md_text(text~ : String, kind? : MdTextKind, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlmd_text(kind=H2, text="Story beats")
md_text(kind=Body, text="The opening shot drifts over the quiet bay.")fn media_tag(kind~ : MediaTagKind, label? : String, state? : MediaTagState, variant? : MediaTagVariant, thumbnail? : String, on_click? : Cmd, aria_label? : String, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlmedia_tag(kind=Image, thumbnail=thumb_url)
media_tag(kind=Video, state=Generating)
media_tag(kind=Audio, variant=Inline, state=Candidate)popover(
trigger=button(variant=Ghost, [text("16:9 · 2K"), menu_chevron()]),
open=panel_open,
on_open_change=set_panel_open.map(v => _ => v),
[my_panel_content],
)fn prompt_box(value~ : String, placeholder? : String, rows? : Int, on_input? : Emit[String], on_send? : Cmd, send_disabled? : Bool, send_loading? : Bool, disabled? : Bool, maxlength? : Int, show_count? : Bool, autofocus? : Bool, actions? : Html, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlprompt_box(
value=prompt,
placeholder="Describe what to create",
on_input=emit.map(PromptChanged),
on_send=emit(Submit),
send_disabled=prompt.is_empty(),
maxlength=800,
show_count=true,
)fn result_chip(label~ : String, thumbnail? : String, size? : ResultChipSize, aria_label? : String, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlresult_chip(label="Harbor Dusk", thumbnail=ref_url)
result_chip(label="Image", thumbnail=ref_url, size=Medium)select(
options=[@overlays.MenuItem::new("png", "PNG"), @overlays.MenuItem::new("webp", "WebP")],
value=format,
placeholder="Export format",
open=select_open,
on_open_change=set_select_open.map(v => _ => v),
on_select=set_format.map(v => _ => v),
)session_header(
title="Desert Mirage Expedition",
status=Done,
on_title=emit(ToggleSessionMenu),
on_new=emit(NewConversation),
on_collapse=emit(CollapsePanel),
)session_item(
label="Desert Mirage Expedition",
active=current == id,
status=Done,
on_click=emit.map(Open(id)),
on_edit=emit.map(Rename(id)),
on_delete=emit.map(Remove(id)),
)session_list(max_height=320, [
session_item(label="Neon Harbor Nights", active=true),
session_item(label="Alpine Sunrise Timelapse", status=Generating),
session_divider(),
session_item(label="Archived Storyboards", disabled=true),
])fn session_status(kind~ : SessionStatus, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlsession_status(kind=Generating)
session_status(kind=Count(5))
session_status(kind=Pending("Review"))fn session_title(label~ : String, status? : SessionStatus, on_click? : Cmd, disabled? : Bool, aria_label? : String, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlshimmer_text("Working on it…")shortcuts_panel(
title="Shortcuts",
sections=[
ShortcutSection::new(
"General",
[
ShortcutItem::new("Toggle sidebar", "Cmd /"),
ShortcutItem::new("Send message", "Enter"),
],
),
],
on_close=close_panel,
)skill_chip(label="Storyboard", icon=@sumi.icon_draw(size=16), mark=New)
skill_chip(label="More", more=true, on_click=emit(OpenSkillPanel))slider(
value=35,
value_tooltip=true,
on_input=set_strength.map(v => _ => v),
on_commit=emit(CommitStrength),
suffix="°",
)fn slider_field(value~ : Int, min? : Int, max? : Int, step? : Int, label? : String, unit? : String, ticks? : Array[Int], auto? : Bool, auto_label? : String, on_auto_change? : Emit[Bool], on_input? : Emit[Int], on_commit? : Emit[Int], disabled? : Bool, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlslider_field(
value=duration,
min=0, max=180,
label="Total duration",
unit="s",
ticks=[0, 30, 60, 90, 120, 150, 180],
on_input=set_duration.map(v => _ => v),
)fn status_badge(state~ : StatusBadgeState, aria_label? : String, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Htmlstatus_badge(state=Running(45))
status_badge(state=Count(3))
status_badge(state=Complete)
status_badge(state=Warning)tabs(
items=[TabEntry::new("all", "All"), TabEntry::new("mine", "Mine")],
selected=tab,
on_select=set_tab.map(v => _ => v),
)fn[C : IsChildren] tag(variant? : TagVariant, on_remove? : Cmd, id? : String, class? : String, attrs? : Attrs, style? : Array[String], children : C) -> Htmltask_card(
title="Neon Harbor Nights",
status=Generating,
summary="I will first break down the brief into its core elements.",
)task_list(height=400, children=cards)fn textarea(value~ : String, placeholder? : String, rows? : Int, on_input? : Emit[String], on_change? : Emit[String], disabled? : Bool, read_only? : Bool, name? : String, maxlength? : Int, autofocus? : Bool, id? : String, class? : String, title? : String, attrs? : Attrs, style? : Array[String]) -> Htmlfn[C : IsChildren] theme(mode? : ThemeMode, id? : String, class? : String, title? : String, attrs? : Attrs, style? : Array[String], children : C) -> Htmltheme(mode=Dark, [my_app_content])fn toast(message~ : String, open~ : Bool, variant? : ToastVariant, on_close? : Cmd, id? : String, class? : String, attrs? : Attrs, style? : Array[String]) -> Html// show for 2.4s
@cmd.batch([set_toast(_ => true), @cmd.delay(set_toast(_ => false), 2400)])tool_call_row(icon=icon_image(), label="(0/1) Image generating…")
tool_call_row(icon=icon_image(), state=Done, label="(1/1) Image generation completed")
tool_call_row(
icon=icon_adjust(), label="2 commands executed",
expandable=true, expanded=e, on_toggle=set_e.map(v => _ => !v),
steps=["List file directories", "Search for related content"],
)fn[C : IsChildren] toolbar(id? : String, class? : String, title? : String, attrs? : Attrs, style? : Array[String], children : C) -> Htmlfn[C : IsChildren] tooltip(content~ : String, side? : TooltipSide, id? : String, class? : String, attrs? : Attrs, style? : Array[String], children : C) -> Htmltooltip(content="Upscale to 4K", button(variant=Ghost, "4K"))Install
Download zipA UI component library for MoonBit web apps — dark & light themes, overlay motion, zero config