Widgets
Widgets are interactive UI components. Fynerisor v0.5.0 provides 37 widgets with 100% fynerisor coverage.
All examples use Risor v2 syntax with arrow functions.
Basic Widgets
Button
Creates a clickable button with a callback function.
let btn = widget.NewButton("Click Me", () => {
print("Button clicked!")
})Button with Importance:
let highBtn = widget.NewButtonWithImportance("High", "HighImportance", () => {
print("High priority action!")
})
let dangerBtn = widget.NewButtonWithImportance("Delete", "DangerImportance", () => {
print("Danger!")
})Importance levels: HighImportance, LowImportance, MediumImportance, DangerImportance, WarningImportance, SuccessImportance
Icon Button:
let iconBtn = widget.NewButtonWithIcon("Save", "DocumentSaveIcon", () => {
print("Saved!")
})Use cases: Form submissions, navigation, triggering actions
Label
Displays static or dynamic text.
let label = widget.NewLabel("Initial text")
label.SetText("Updated text")With Data Binding:
let data = binding.NewString("Hello")
let label = widget.NewLabelWithData(data)
data.Set("Updated!") // Label updates automatically
Properties:
Text(string): The displayed text (via SetText/GetText)
Use cases: Displaying information, status messages, headings
Entry
Single-line text input field.
let entry = widget.NewEntry()
entry.SetText("Default value")
entry.OnSubmitted(() => {
print("Submitted:", entry.Text)
})With Data Binding:
let text = binding.NewString("")
let entry = widget.NewEntryWithData(text)With Password:
let password = widget.NewPasswordEntry()Properties:
Text(string): The current text valuePlaceHolder(string): Placeholder text
Methods:
SetText(text): Set textSetPlaceHolder(text): Set placeholderOnSubmitted(callback): Called when user presses Enter
Use cases: Text input, search boxes, form fields
MultiLineEntry
Multi-line text input area.
let textArea = widget.NewMultiLineEntry()
textArea.SetText("Line 1\nLine 2\nLine 3")Properties:
Text(string): The current text value
Use cases: Long text input, comments, notes, code editing
SelectEntry
Combination of dropdown and text entry.
let options = ["Option 1", "Option 2", "Option 3"]
let selectEntry = widget.NewSelectEntry(options)
selectEntry.SetText("Custom value")Use cases: Autocomplete, combo boxes with custom values
Check
Checkbox with change callback.
let check = widget.NewCheck("Enable feature", (checked) => {
print("Checked:", checked)
})
check.SetChecked(true)With Data Binding:
let checked = binding.NewBool(false)
let check = widget.NewCheckWithData("Enable", checked)Properties:
Checked(bool): Current checkbox state
Methods:
SetChecked(bool): Set the checkbox state
Use cases: Boolean options, feature toggles, selections
CheckGroup
Group of checkboxes with multi-selection.
let options = ["Option 1", "Option 2", "Option 3"]
let checkGroup = widget.NewCheckGroup(options, (selected) => {
print("Selected:", selected) // Returns list of checked items
})Use cases: Multiple selections, filtering options
Radio
Radio button group (single selection).
let radio = widget.NewRadio("Option A", (selected) => {
print("Selected:", selected)
})Use cases: Single selection from a group
RadioGroup
Group of radio buttons.
let options = ["Small", "Medium", "Large"]
let radioGroup = widget.NewRadioGroup(options, (selected) => {
print("Size selected:", selected)
})
radioGroup.SetSelected("Medium")Methods:
SetSelected(value): Set selected option
Use cases: Single choice from multiple options
Select
Dropdown selection widget.
let options = ["Red", "Green", "Blue"]
let dropdown = widget.NewSelect(options, (selected) => {
print("Selected color:", selected)
})
dropdown.SetSelectedIndex(0) // Select first option
Methods:
SetSelectedIndex(index): Select option by indexSetSelected(value): Select by value
Use cases: Single choice from multiple options, category selection
Slider
Slider for numeric value selection.
let slider = widget.NewSlider(0, 100, (value) => {
print("Value:", value)
})
slider.SetValue(50)With Data Binding:
let value = binding.NewFloat(50.0)
let slider = widget.NewSliderWithData(0, 100, value)Methods:
SetValue(float): Set slider value
Use cases: Volume controls, opacity, numeric ranges
ProgressBar
Progress bar indicator.
let progress = widget.NewProgressBar()
progress.SetValue(0.5) // 50%
With Data Binding:
let value = binding.NewFloat(0.0)
let progress = widget.NewProgressBarWithData(value)Infinite Progress:
let progress = widget.NewProgressBarInfinite()
progress.Start()
// Later...
progress.Stop()Methods:
SetValue(float): Set progress (0.0 to 1.0)Start(): Start infinite animationStop(): Stop infinite animation
Use cases: Loading indicators, task progress
ActivityIndicator
Spinning activity indicator.
let activity = widget.NewActivity()
activity.Start()
// Later...
activity.Stop()Use cases: Background operations, loading states
Separator
Visual separator line.
let separator = widget.NewSeparator()Use cases: Dividing sections, visual grouping
Icon
Display an icon from theme.
let icon = widget.NewIcon("DocumentSaveIcon")Common Icons: DocumentSaveIcon, DocumentOpenIcon, DeleteIcon, SettingsIcon, HomeIcon, HelpIcon, InfoIcon, WarningIcon, ErrorIcon, ConfirmIcon, CancelIcon, SearchIcon, MenuIcon
Use cases: Visual indicators, toolbar buttons
Hyperlink
Clickable link to URL.
let link = widget.NewHyperlink("Visit Site", "https://example.com")Use cases: External links, documentation references
Card
Card widget with title, subtitle, and content.
let card = widget.NewCard(
"Card Title",
"Subtitle",
widget.NewLabel("Card content goes here")
)With Image:
let img = canvas.NewImageFromFile("image.png")
let card = widget.NewCard("Title", "Subtitle", img)Use cases: Information panels, dashboards, galleries
Form Widgets
Form
Form layout with labeled fields and submit/cancel buttons.
let nameEntry = widget.NewEntry()
let emailEntry = widget.NewEntry()
let form = widget.NewForm(
widget.NewFormItem("Name:", nameEntry),
widget.NewFormItem("Email:", emailEntry)
)
form.OnSubmit(() => {
print("Name:", nameEntry.Text)
print("Email:", emailEntry.Text)
})
form.OnCancel(() => {
print("Cancelled")
})Methods:
OnSubmit(callback): Handle form submissionOnCancel(callback): Handle form cancellation
Use cases: Data entry forms, user input collection
FormItem
Individual form field with label.
let entry = widget.NewEntry()
let formItem = widget.NewFormItem("Username:", entry)Use cases: Building custom forms
DateEntry
Date picker widget.
let dateEntry = widget.NewDateEntry((date) => {
print("Selected date:", date)
})Use cases: Date selection, scheduling
Calendar
Calendar widget for date selection.
let calendar = widget.NewCalendar((date) => {
print("Selected:", date)
})Use cases: Date pickers, scheduling interfaces
Advanced Widgets
Table
Advanced table widget with pagination and custom data binding.
let table = widget.NewTable("My Table", 20) // 20 rows per page
table.Columns(() => {
return ["ID", "Name", "Status"]
})
table.RowCount(() => {
return 100 // Total number of rows
})
table.Data((offset, limit) => {
// Return slice of data for current page
return data[offset:limit]
})
table.SetOnClick((row, col) => {
print("Clicked row", row, "col", col)
})
table.SetColumnWidth(0, 150) // Set column 0 width to 150px
table.Refresh()Alternative Cell-by-Cell Rendering:
table.CellValue((row, col) => {
return sprintf("Cell %d,%d", row, col)
})Methods:
Columns(callback): Returns array of column namesRowCount(callback): Returns total number of rowsData(offset, limit): Returns data for current pageCellValue(row, col): Alternative cell-by-cell renderingSetOnClick(callback): Handle cell clicksSetColumnWidth(column, width): Set column width in pixelsRefresh(): Update table display
Use cases: Data tables, database views, search results, reports
List
Virtualized list widget for large datasets.
let itemCount = 1000
let list = widget.NewList(
() => itemCount, // Length function
() => widget.NewLabel("Template"), // Template function
(id, item) => { // Update function
item.SetText(sprintf("Item %d", id))
}
)Use cases: Large lists, file browsers, menu lists
Tree
Tree widget with hierarchical data.
let tree = widget.NewTree(
(uid) => { // ChildUIDs function
if (uid == "") {
return ["root1", "root2"] // Root items
}
return [uid + "-child1", uid + "-child2"]
},
(uid) => uid != "", // IsBranch function
() => widget.NewLabel("Template"), // Template function
(uid, branch, item) => { // Update function
item.SetText(uid)
}
)Use cases: File trees, org charts, navigation menus
Accordion
Collapsible accordion panels.
let accordion = widget.NewAccordion(
widget.NewAccordionItem("Section 1", widget.NewLabel("Content 1")),
widget.NewAccordionItem("Section 2", widget.NewLabel("Content 2")),
widget.NewAccordionItem("Section 3", widget.NewLabel("Content 3"))
)Use cases: Collapsible sections, FAQs, settings panels
Toolbar
Toolbar with action buttons.
let toolbar = widget.NewToolbar(
widget.NewToolbarAction("DocumentSaveIcon", () => print("Save")),
widget.NewToolbarAction("DocumentOpenIcon", () => print("Open")),
widget.NewToolbarSeparator(),
widget.NewToolbarAction("DeleteIcon", () => print("Delete"))
)Use cases: Application toolbars, action bars
TextGrid
Monospace text grid for code/data display.
let textGrid = widget.NewTextGrid()
textGrid.SetText("Line 1\nLine 2\nLine 3")Use cases: Code display, logs, tabular text data
RichText
Rich text widget with formatting.
let richText = widget.NewRichTextFromMarkdown("# Title\n\nSome **bold** text")Use cases: Formatted text, markdown rendering, documentation
Log
Scrolling log widget with maximum item limit.
let log = widget.NewLog(100) // Keep last 100 entries
log.Append("Log entry 1")
log.Append("Log entry 2")
log.Append("Log entry 3")Methods:
Append(text): Add new log entry
Use cases: Console output, debug logs, activity feeds
Markdown
Renders markdown text with full CommonMark support.
let md = widget.NewMarkdown("# Title\n\nSome **bold** text")Use cases: Documentation, formatted text, help pages
GridWrap
Grid layout that wraps items.
let items = [
widget.NewButton("1", () => {}),
widget.NewButton("2", () => {}),
widget.NewButton("3", () => {})
]
let gridWrap = widget.NewGridWrap(items...)Use cases: Image galleries, icon grids, responsive layouts
Charts
BarChart
Bar chart widget for data visualization.
let data = [5, 10, 15, 20, 15, 10, 5]
let chart = chart.NewBarChart("Sales Data", data)Use cases: Data visualization, reports, dashboards
Summary
Fynerisor v0.5.0 provides 37 widgets with 100% coverage:
- High Priority (11/11): Button, Label, Entry, Check, Select, Form, Table, ProgressBar, List, Calendar, DateEntry
- Medium Priority (13/13): MultiLineEntry, CheckGroup, RadioGroup, Slider, Icon, Hyperlink, Card, Tree, Accordion, Toolbar, Separator, ActivityIndicator, SelectEntry
- Low Priority (13/13): TextGrid, RichText, GridWrap, Log, Markdown, Radio, BarChart, etc.
All widgets support Risor v2 syntax with arrow functions and data binding where applicable.