perspective-viewer 5.6.1

The `<perspective-viewer>` Custom Element: a WebAssembly data grid, pivot table and charting UI for large, real-time and streaming datasets.
Documentation
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
// ┃ This file is part of the Perspective library, distributed under the terms ┃
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

use web_sys::Element;

/// Mirror the host `<perspective-viewer>`'s `settings` attribute and
/// `shift-active` class onto one slotted plugin element so plugin stylesheets
/// can match them with `:host(...)`.
pub fn stamp_plugin_host_state(viewer: &Element, plugin: &Element) {
    let _ = plugin.toggle_attribute_with_force("settings", viewer.has_attribute("settings"));
    let _ = plugin
        .class_list()
        .toggle_with_force("shift-active", viewer.class_list().contains("shift-active"));
}

/// Apply [`stamp_plugin_host_state`] to every plugin element slotted into
/// `viewer`.
pub fn stamp_plugin_host_state_all(viewer: &Element) {
    let children = viewer.children();
    for i in 0..children.length() {
        let Some(el) = children.item(i) else {
            continue;
        };

        let is_plugin = el.tag_name().starts_with("PERSPECTIVE-VIEWER-")
            && el
                .get_attribute("slot")
                .is_some_and(|slot| !slot.starts_with("tab-"));

        if is_plugin {
            stamp_plugin_host_state(viewer, &el);
        }
    }
}