import {html, LitElement} from "lit" import {mixinCss} from "@chasemoskal/magical" import {property, query} from "lit/decorators.js" import {V2} from "../../tools/v2.js" import {styles} from "./styles.css.js" import {NubCauseEvent} from "../../events/cause.js" import {NubStickGraphic} from "../stick-graphic/element.js" import {make_pointer_listeners} from "./utils/make_pointer_listeners.js" import {calculate_new_vector_from_pointer_position} from "./utils/calculate_new_vector_from_pointer_position.js" @mixinCss(styles) export class NubStick extends LitElement { @property({type: String, reflect: true}) cause: string = "Stick" @query(NubStickGraphic.tag) private graphic: NubStickGraphic | undefined @property() private vector: V2 = [0, 0] #update_vector_and_dispatch_cause = (vector: V2) => { this.vector = vector NubCauseEvent .target(this) .dispatch({ vector, kind: "stick", cause: this.cause, }) } #pointer_listeners = make_pointer_listeners({ get_pointer_capture_element: () => this.graphic!, set_vector: this.#update_vector_and_dispatch_cause, set_pointer_position: position => { this.#update_vector_and_dispatch_cause( calculate_new_vector_from_pointer_position( this.graphic!.basis!, position, ) ) }, }) render() { const listeners = this.#pointer_listeners return html` ` } }