kozan_core/html/
html_canvas_element.rs1use super::replaced::{IntrinsicSizing, ReplacedElement};
8use crate::Handle;
9use kozan_macros::{Element, Props};
10
11const DEFAULT_CANVAS_WIDTH: f32 = 300.0;
13const DEFAULT_CANVAS_HEIGHT: f32 = 150.0;
15
16#[derive(Copy, Clone, Element)]
21#[element(tag = "canvas", data = CanvasData)]
22pub struct HtmlCanvasElement(Handle);
23
24#[derive(Clone, Props)]
26#[props(element = HtmlCanvasElement)]
27pub struct CanvasData {
28 #[prop]
30 pub canvas_width: f32,
31 #[prop]
33 pub canvas_height: f32,
34}
35
36impl Default for CanvasData {
37 fn default() -> Self {
38 Self {
39 canvas_width: DEFAULT_CANVAS_WIDTH,
40 canvas_height: DEFAULT_CANVAS_HEIGHT,
41 }
42 }
43}
44
45impl ReplacedElement for HtmlCanvasElement {
46 fn intrinsic_sizing(&self) -> IntrinsicSizing {
47 IntrinsicSizing::from_size(self.canvas_width(), self.canvas_height())
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::*;
54 use crate::dom::document::Document;
55
56 #[test]
57 fn canvas_default_size() {
58 let doc = Document::new();
59 let canvas = doc.create::<HtmlCanvasElement>();
60
61 let sizing = canvas.intrinsic_sizing();
63 assert_eq!(sizing.width, Some(300.0));
64 assert_eq!(sizing.height, Some(150.0));
65 }
66
67 #[test]
68 fn canvas_custom_size() {
69 let doc = Document::new();
70 let canvas = doc.create::<HtmlCanvasElement>();
71
72 canvas.set_canvas_width(1024.0);
73 canvas.set_canvas_height(768.0);
74
75 let sizing = canvas.intrinsic_sizing();
76 assert_eq!(sizing.width, Some(1024.0));
77 assert_eq!(sizing.height, Some(768.0));
78 }
79}