Remove internal package import from todo example
All checks were successful
CI / build (pull_request) Successful in 28s

Replace direct internal/element usage with public ui package
components to ensure examples only use the public API:

- Add ui.RawCheckbox for plain checkbox without label wrapper
- Add ui.Span for span elements with text content
- Add View.TextDecoration modifier for strikethrough styling
- Update todo example to use these public components

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-09 17:23:47 +01:00
parent a85ae91023
commit 2b2b8978d8
4 changed files with 38 additions and 17 deletions

View File

@@ -6,7 +6,6 @@ import (
"fmt" "fmt"
"syscall/js" "syscall/js"
"git.flowmade.one/flowmade-one/iris/internal/element"
"git.flowmade.one/flowmade-one/iris/reactive" "git.flowmade.one/flowmade-one/iris/reactive"
"git.flowmade.one/flowmade-one/iris/ui" "git.flowmade.one/flowmade-one/iris/ui"
) )
@@ -142,28 +141,19 @@ func todoItem(todo Todo, todos *reactive.Signal[[]Todo]) ui.View {
row.Display("flex").Gap("12px").Padding("8px 0").Width("100%").AlignItems("center") row.Display("flex").Gap("12px").Padding("8px 0").Width("100%").AlignItems("center")
row.BorderBottom("1px solid #eee") row.BorderBottom("1px solid #eee")
// Completed checkbox // Completed checkbox using public ui.RawCheckbox
checkbox := element.NewElement("input") checkbox := ui.RawCheckbox(todo.Completed, func(isChecked bool) {
checkbox.Attr("type", "checkbox")
if todo.Completed {
checkbox.Set("checked", true)
}
checkbox.On("change", func() {
isChecked := checkbox.Get("checked").Bool()
toggleTodo(todos, todo.ID, isChecked) toggleTodo(todos, todo.ID, isChecked)
}) })
checkboxView := ui.NewViewFromElement(checkbox)
// Todo text with strikethrough if completed // Todo text with strikethrough if completed
textView := ui.NewView() textView := ui.NewView()
textView.Display("flex").Width("100%") textView.Display("flex").Width("100%")
text := element.NewElement("span") text := ui.Span(todo.Text)
text.Set("textContent", todo.Text)
if todo.Completed { if todo.Completed {
text.Get("style").Call("setProperty", "text-decoration", "line-through") text.TextDecoration("line-through").Color("#999")
text.Get("style").Call("setProperty", "color", "#999")
} }
textView.Child(ui.NewViewFromElement(text)) textView.Child(text)
// Delete button // Delete button
deleteBtn := ui.Button(func() { deleteBtn := ui.Button(func() {
@@ -171,7 +161,7 @@ func todoItem(todo Todo, todos *reactive.Signal[[]Todo]) ui.View {
}, ui.TextFromString("X")) }, ui.TextFromString("X"))
deleteBtn.Padding("4px 8px") deleteBtn.Padding("4px 8px")
row.Child(checkboxView) row.Child(checkbox)
row.Child(textView) row.Child(textView)
row.Child(deleteBtn) row.Child(deleteBtn)

View File

@@ -205,4 +205,23 @@ func NumberInput(value *reactive.Signal[float64], placeholder string) View {
}) })
return View{input} return View{input}
} }
// RawCheckbox creates a plain checkbox input without a label wrapper.
// The onChange callback is called with the new checked state when the user clicks.
func RawCheckbox(checked bool, onChange func(bool)) View {
checkbox := element.NewElement("input")
checkbox.Attr("type", "checkbox")
// Set initial state
if checked {
checkbox.Set("checked", true)
}
// Call onChange when user clicks
checkbox.On("change", func() {
newValue := checkbox.Get("checked").Bool()
onChange(newValue)
})
return View{checkbox}
}

View File

@@ -170,3 +170,8 @@ func (v View) PointerEvents(value string) View {
v.e.PointerEvents(value) v.e.PointerEvents(value)
return v return v
} }
func (v View) TextDecoration(value string) View {
v.e.Get("style").Call("setProperty", "text-decoration", value)
return v
}

View File

@@ -21,3 +21,10 @@ func TextFromFunction(fn func() string) View {
return View{textNode} return View{textNode}
} }
// Span creates a span element with the given text content.
func Span(text string) View {
v := View{element.NewElement("span")}
v.e.Set("textContent", text)
return v
}