hikari-animation 0.3.0

Animation hooks, easing functions and transition utilities for the Hikari design system
// animation/src/scrollbar.rs
// Scrollbar animation system using StyleBuilder

#![allow(unused_imports)]

use std::collections::HashMap;

use wasm_bindgen::{JsCast, JsValue, prelude::wasm_bindgen};
use web_sys::HtmlElement;

use super::style::{CssProperty, StyleBuilder};

/// Store all scrollbar elements for animation updates
#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
static mut SCROLLBARS: Option<HashMap<String, HtmlElement>> = None;

/// Register a scrollbar element for animation
///
/// # Arguments
///
/// * `id` - Unique identifier for this scrollbar
/// * `track` - The scrollbar track element
#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
#[wasm_bindgen(js_name = registerScrollbar)]
pub fn register_scrollbar(id: String, track: JsValue) {
    let track_element = match track.dyn_into::<HtmlElement>() {
        Ok(el) => el,
        Err(_) => {
            web_sys::console::error_1(&"❌ Invalid track element for scrollbar".into());
            return;
        }
    };

    unsafe {
        let scrollbars_ptr = &raw mut SCROLLBARS;

        if (*scrollbars_ptr).is_none() {
            *scrollbars_ptr = Some(HashMap::new());
        }

        if let Some(scrollbars) = &mut *scrollbars_ptr {
            scrollbars.insert(id, track_element);
        }
    }
}

/// Update scrollbar width with smooth transition
///
/// # Arguments
///
/// * `id` - Unique identifier for scrollbar
/// * `width` - Target width in pixels (e.g., 4.0 or 8.0)
#[cfg(all(target_arch = "wasm32", target_os = "unknown"))]
#[wasm_bindgen(js_name = updateScrollbarWidth)]
pub fn update_scrollbar_width(id: String, width: f64) {
    unsafe {
        let scrollbars_ptr = &raw const SCROLLBARS;

        if let Some(scrollbars) = &*scrollbars_ptr {
            if let Some(track) = scrollbars.get(&id) {
                // Use StyleBuilder (consistent with AnimationBuilder architecture)
                StyleBuilder::new(track)
                    .add(
                        CssProperty::Transition,
                        "width 300ms cubic-bezier(0.25, 0.1, 0.25, 1)",
                    )
                    .add(CssProperty::Width, &format!("{}px", width))
                    .apply();
            }
        }
    }
}

#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))]
pub fn register_scrollbar(_id: String, _track: JsValue) {}

#[cfg(not(all(target_arch = "wasm32", target_os = "unknown")))]
pub fn update_scrollbar_width(_id: String, _width: f64) {}