Add 'clone' callback to build, implement for Input

This commit is contained in:
Karl Seguin
2026-01-07 07:29:43 +08:00
parent 90ee919f45
commit d8f7eb3f24
2 changed files with 16 additions and 0 deletions

View File

@@ -978,6 +978,11 @@ pub fn cloneElement(self: *Element, deep: bool, page: *Page) !*Node {
const node = try page.createElement(namespace_uri, tag_name, self._attributes); const node = try page.createElement(namespace_uri, tag_name, self._attributes);
// Allow element-specific types to copy their runtime state
_ = Element.Build.call(node.as(Element), "cloned", .{ self, node.as(Element), page }) catch |err| {
log.err(.dom, "element.clone.failed", .{ .err = err });
};
if (deep) { if (deep) {
var child_it = self.asNode().childrenIterator(); var child_it = self.asNode().childrenIterator();
while (child_it.next()) |child| { while (child_it.next()) |child| {

View File

@@ -404,6 +404,17 @@ pub const Build = struct {
}, },
} }
} }
pub fn cloned(source_element: *Element, cloned_element: *Element, _: *Page) !void {
const source = source_element.as(Input);
const clone = cloned_element.as(Input);
// Copy runtime state from source to clone
clone._value = source._value;
clone._checked = source._checked;
clone._checked_dirty = source._checked_dirty;
clone._selected = source._selected;
}
}; };
const testing = @import("../../../../testing.zig"); const testing = @import("../../../../testing.zig");