← Files DataARCHIVED FILE
templates/data-app/base/src/components/Icon.jsx
1.21 KB · Sep 30, 2026 · 23:19 UTC
import React from "react";
const dashboardIconAssets = import.meta.glob("./icons/dashboard-icon-*.svg", {
eager: true,
import: "default",
query: "?url",
});
const dashboardIcons = Object.fromEntries(
Object.entries(dashboardIconAssets).map(([path, asset]) => [
path.slice("./icons/dashboard-icon-".length, -".svg".length),
asset,
]),
);
/** Inline builds may decode bundled, data-only icon assets before mounting. */
export async function prepareDashboardIcons() {
await Promise.all(Object.entries(dashboardIcons).map(async ([name, asset]) => {
dashboardIcons[name] = await asset;
}));
}
export const dashboardIconNames = Object.freeze(Object.keys(dashboardIcons));
export function Icon({ name, size = 16, className = "" }) {
const icon = dashboardIcons[name];
if (!icon)
throw new Error(`Unknown dashboard icon: ${String(name)}. Add a bundled dashboard-icon-${String(name)}.svg asset.`);
return (
<span
className={`dashboard-icon${name === "theme" ? " theme-palette-icon" : ""} ${className}`.trim()}
aria-hidden="true"
data-dashboard-icon={name}
style={{
width: size,
height: size,
"--dashboard-icon-mask": `url("${icon}")`,
}}
/>
);
}
SHA-256: 3181d5f82f887b5a7cf4a1c5b1fcb50d6ffc1a06d082ce9f3f569bc26b4341a6