presentation/renderers/link.renderer.ts

presentation/renderers/link.renderer.ts is a file in Bane's Lab Site. 36 lines of code and 5 definitions.

import { ARROW_ICON, ICON_BASE_CLASS } from "#configuration/icons/element.icons";
import type { LinkBlock, LinkEntry } from "#types/block.types";
import { appendChildren, createElement } from "#core/factories/element.factory";
import { createLink } from "#presentation/components/link.component";

const renderNavigation = function renderNavigation(entry: LinkEntry, icon: string): Element {
    const body = createElement("div", { className: "block-nav-body" });
    body.append(createElement("h4", { className: "block-nav-title", text: entry.text }));
    if (entry.description !== undefined) {
        body.append(createElement("p", { className: "block-nav-description", text: entry.description }));
    }
    return createLink(entry.href, "block-nav", [
        createElement("i", { className: `${ICON_BASE_CLASS} ${icon} block-nav-icon` }),
        body,
        createElement("i", { className: `${ICON_BASE_CLASS} ${ARROW_ICON} block-nav-arrow` }),
    ]);
};

const renderLinkEntry = function renderLinkEntry(entry: LinkEntry, button: boolean): Element {
    if (entry.icon === undefined) {
        return createLink(entry.href, "block-link", [entry.text]);
    }
    if (button) {
        return createLink(entry.href, "block-button", [
            createElement("i", { className: `${ICON_BASE_CLASS} ${entry.icon}` }),
            createElement("span", { text: entry.text }),
        ]);
    }
    return renderNavigation(entry, entry.icon);
};

export const renderLinks = function renderLinks(block: LinkBlock): Element {
    const wrapper = createElement("div", { className: "block-links" });
    appendChildren(
        wrapper,
        block.links.map((entry) => renderLinkEntry(entry, block.button === true)),
    );
    return wrapper;
};