1use floating_ui_dom::{
2 ARROW_NAME, Arrow as CoreArrow, ArrowOptions as CoreArrowOptions, Middleware, MiddlewareReturn,
3 MiddlewareState, Padding,
4};
5use web_sys::wasm_bindgen::JsCast;
6use yew::NodeRef;
7
8#[derive(Clone, PartialEq)]
10pub struct ArrowOptions {
11 pub element: NodeRef,
13
14 pub padding: Option<Padding>,
19}
20
21impl ArrowOptions {
22 pub fn new(element: NodeRef) -> Self {
23 ArrowOptions {
24 element,
25 padding: None,
26 }
27 }
28
29 pub fn element(mut self, value: NodeRef) -> Self {
31 self.element = value;
32 self
33 }
34
35 pub fn padding(mut self, value: Padding) -> Self {
37 self.padding = Some(value);
38 self
39 }
40}
41
42#[derive(Clone, PartialEq)]
48pub struct Arrow {
49 options: ArrowOptions,
50}
51
52impl Arrow {
53 pub fn new(options: ArrowOptions) -> Self {
54 Arrow { options }
55 }
56}
57
58impl Middleware<web_sys::Element, web_sys::Window> for Arrow {
59 fn name(&self) -> &'static str {
60 ARROW_NAME
61 }
62
63 fn compute(
64 &self,
65 state: MiddlewareState<web_sys::Element, web_sys::Window>,
66 ) -> MiddlewareReturn {
67 match self.options.element.get() {
68 Some(element) => CoreArrow::new(CoreArrowOptions {
69 element: element
70 .dyn_into()
71 .expect("Arrow element should be an Element."),
72 padding: self.options.padding.clone(),
73 })
74 .compute(state),
75 _ => MiddlewareReturn {
76 x: None,
77 y: None,
78 data: None,
79 reset: None,
80 },
81 }
82 }
83}