wcl_wdoc 0.11.2-alpha

WCL documentation format — build structured docs with WCL, render to HTML
    export let terminal_target_list = value => value != "" ? filter(split(",", value), target => trim(target) != "") : []

    export let terminal_remove_events = (targets, trigger) => map(targets, target => {
        trigger = trigger,
        target = trim(target),
        state = "shown",
        mode = "remove"
    })

    export let terminal_leave_events = (targets, guard_targets) => map(targets, target => {
        trigger = "mouse_leave",
        target = trim(target),
        state = "shown",
        mode = "remove",
        guard_targets = guard_targets
    })

    export let terminal_menu_item_data = item => {
        label = attr_or(item, "label", "Item"),
        target = attr_or(item, "target", ""),
        close_targets = attr_or(item, "close_targets", ""),
        disabled = attr_or(item, "disabled", "false") == "true"
    }

    export let terminal_menu_item_events = (item, sibling_targets, default_close_targets, click_close_targets) => {
        let target = item.target
        let item_close_targets = item.close_targets != "" ? wdoc::terminal_target_list(item.close_targets) : (len(default_close_targets) > 0 ? default_close_targets : sibling_targets)
        let hover_close_targets = filter(item_close_targets, close_target => trim(close_target) != target)
        let open_event = target != "" ? [{ trigger = "hover", target = target, state = "shown", mode = "add" }] : []
        let click_targets = distinct(concat(click_close_targets, target != "" ? [target] : []))
        item.disabled ? [] : concat(concat(concat(
            [{ trigger = "hover", state = "hovered", mode = "while" }],
            wdoc::terminal_remove_events(hover_close_targets, "hover")
        ), open_event), wdoc::terminal_remove_events(click_targets, "click"))
    }

    export let terminal_menu_item_shape = (b, item, i, row, col, cols, foreground_fill, background_fill, hover_foreground_fill, hover_background_fill, sibling_targets, default_close_targets, click_close_targets) => {
        let target = item.target
        let item_id = to_string(b.id) + "_item_" + to_string(i)
        let item_class = item.disabled ? "wdoc-terminal-menu-item wdoc-terminal-menu-item-disabled" : "wdoc-terminal-menu-item"
        let label_cols = target != "" ? cols - 3 : cols - 1
        let label = substr(item.label, 0, label_cols)
        let normal_text = " " + label
        let arrow = target != "" ? [
            { kind = "terminal_text", id = item_id + "_arrow", row = row + i, col = col + cols - 1, content = ">", foreground_fill = foreground_fill, _wdoc_runtime = "true", pointer_events = "none" },
            { kind = "terminal_text", id = item_id + "_arrow_hover", row = row + i, col = col + cols - 1, content = ">", foreground_fill = hover_foreground_fill, class = "wdoc-terminal-menu-item-label-hover", _wdoc_runtime = "true", pointer_events = "none" }
        ] : []
        {
            kind = "group",
            id = item_id,
            row = row + i,
            col = col,
            rows = 1,
            cols = cols,
            class = item_class,
            cursor = item.disabled ? "default" : "pointer",
            pointer_events = item.disabled ? "none" : "all",
            _wdoc_runtime = "true",
            _wdoc_terminal_grid_group = "true",
            events = wdoc::terminal_menu_item_events(item, sibling_targets, default_close_targets, click_close_targets),
            children = concat([
                { kind = "terminal_surface", id = item_id + "_bg", row = row + i, col = col, cols = cols, background_fill = background_fill, _wdoc_runtime = "true" },
                { kind = "terminal_surface", id = item_id + "_hover_bg", row = row + i, col = col, cols = cols, background_fill = hover_background_fill, class = "wdoc-terminal-menu-item-bg", _wdoc_runtime = "true" },
                { kind = "terminal_text", id = item_id + "_label", row = row + i, col = col, cols = cols, content = normal_text, foreground_fill = foreground_fill, _wdoc_runtime = "true", pointer_events = "none" },
                { kind = "terminal_text", id = item_id + "_label_hover", row = row + i, col = col, cols = cols, content = normal_text, foreground_fill = hover_foreground_fill, class = "wdoc-terminal-menu-item-label-hover", _wdoc_runtime = "true", pointer_events = "none" }
            ], arrow)
        }
    }

    export let terminal_menu_body = (b, context_menu) => {
        let row = attr_or(b, "row", 0)
        let col = attr_or(b, "col", 0)
        let item_blocks = children(b, "wdoc::draw::menu_item")
        let items = map(item_blocks, item => wdoc::terminal_menu_item_data(item))
        let rows = attr_or(b, "rows", len(items) > 0 ? len(items) : 1)
        let cols = attr_or(b, "cols", 18)
        let foreground_fill = attr_or(b, "foreground_fill", attr_or(b, "fill", "#d7e0ff"))
        let background_fill = attr_or(b, "background_fill", "#08111f")
        let hover_foreground_fill = attr_or(b, "hover_foreground_fill", attr_or(b, "selected_foreground_fill", "#08111f"))
        let hover_background_fill = attr_or(b, "hover_background_fill", attr_or(b, "selected_background_fill", "#d7e0ff"))
        let default_close_targets = wdoc::terminal_target_list(attr_or(b, "close_targets", ""))
        let sibling_targets = filter(map(items, item => item.target), target => target != "")
        let leave_targets = wdoc::terminal_target_list(attr_or(b, "leave_close_targets", ""))
        let leave_guard_targets = attr_or(b, "leave_guard_targets", join(",", leave_targets))
        let click_close_targets = distinct(concat(concat([to_string(b.id)], leave_targets), concat(default_close_targets, sibling_targets)))
        let base_class = attr_or(b, "class", "")
        let menu_class = trim(base_class + " wdoc-terminal-menu")
        let leave_events = wdoc::terminal_leave_events(leave_targets, leave_guard_targets)
        let visible_items = map(range(0, min(rows, len(items))), i => wdoc::terminal_menu_item_shape(b, items[i], i, row, col, cols, foreground_fill, background_fill, hover_foreground_fill, hover_background_fill, sibling_targets, default_close_targets, click_close_targets))
        [
            {
                kind = "group",
                id = to_string(b.id),
                row = row,
                col = col,
                rows = rows,
                cols = cols,
                class = menu_class,
                _wdoc_runtime = "true",
                _wdoc_terminal_grid_group = "true",
                events = leave_events,
                children = concat([
                    { kind = "terminal_surface", id = to_string(b.id) + "_surface", row = row, col = col, rows = rows, cols = cols, background_fill = background_fill, _wdoc_runtime = "true" }
                ], visible_items)
            }
        ]
    }

    export let terminal_widget_menu = b => wdoc::terminal_menu_body(b, false)
    export let terminal_widget_context_menu = b => wdoc::terminal_menu_body(b, true)