← Files DataARCHIVED FILE

templates/data-app/base/src/components/Icon.jsx

1.21 KB · Sep 30, 2026 · 23:19 UTC

↓ Download file

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