Problem
The boost frontend plugin (plugins/boost) uses @remixicon/react as its icon library. Every other frontend plugin in the rhdh-plugins repo — adoption-insights, ai-experience, lightspeed, homepage, orchestrator-form-widgets, quickstart, scorecard, etc. — uses
@mui/icons-material, which is the standard icon library in the Backstage ecosystem.
This creates an inconsistency: a contributor working across plugins has to switch between two icon APIs, and the boost plugin carries an extra dependency that no other production plugin needs.
Current @remixicon/react usage (4 files, 14 icon imports)
| File |
Icons used |
plugins/boost/src/utils/categoryMeta.ts |
RiMagicLine, RiShieldCheckLine, RiServerLine, RiRobotLine, RiBrainLine, RiToolsLine, RiDatabase2Line + RemixiconComponentType type |
plugins/boost/src/components/catalog/AiAssetCard.tsx |
RiUserLine |
plugins/boost/src/components/catalog/AiCatalogPage.tsx |
RiGridLine, RiListUnordered |
plugins/boost/src/components/catalog/entity/AdoptionCard.tsx |
RiCheckLine, RiFileCopyLine |
Note: The CategoryMeta.icon field is typed as RemixiconComponentType and populated for all 7 categories + fallback, but the icon component is never rendered anywhere — only CategoryMeta.label and CategoryMeta.color are used in AiAssetCard.tsx. The icon field
exists for potential future use.
Expected behavior
- Replace all
@remixicon/react icon imports with equivalent @mui/icons-material icons.
- Change the
CategoryMeta.icon type from RemixiconComponentType to SvgIconComponent from @mui/icons-material.
- Remove
@remixicon/react from plugins/boost/package.json dependencies.
- Add
@mui/icons-material to plugins/boost/package.json dependencies (it is already a dependency of the dev app packages/app and every other frontend plugin in the repo).
Scope
- Workspace:
workspaces/boost
- Package:
@red-hat-developer-hub/backstage-plugin-boost (plugins/boost)
Icon mapping
Use the Outlined variant consistently to match the line-style aesthetic of the current Remixicon usage.
Files to modify
| File |
Change |
plugins/boost/package.json |
Remove @remixicon/react from dependencies. Add @mui/icons-material. |
plugins/boost/src/utils/categoryMeta.ts |
Replace RemixiconComponentType with SvgIconComponent from @mui/icons-material. Replace all 7 Remixicon icon imports with MUI equivalents. |
plugins/boost/src/components/catalog/AiAssetCard.tsx |
Replace RiUserLine import with PersonOutlined from @mui/icons-material. Adjust the JSX — MUI icons use fontSize prop instead of size (e.g. <PersonOutlined fontSize="small" /> instead of `<RiUserLine size={14} |
| />`). |
|
plugins/boost/src/components/catalog/AiCatalogPage.tsx |
Replace RiGridLine and RiListUnordered imports with GridViewOutlined and ViewListOutlined. Adjust size → fontSize in JSX. |
plugins/boost/src/components/catalog/entity/AdoptionCard.tsx |
Replace RiCheckLine and RiFileCopyLine imports with CheckOutlined and ContentCopyOutlined. Adjust size → fontSize in JSX. |
API differences to account for
- Sizing: Remixicon uses
size={14} (pixels). MUI icons use fontSize="small" (20px) or sx={{ fontSize: 14 }} for exact pixel control. Use fontSize="small" where the current size is 14-16px; it is close enough and more idiomatic.
- Type: Remixicon's
RemixiconComponentType → MUI's SvgIconComponent (import from @mui/icons-material), or use typeof SvgIcon from @mui/material.
- Rendering: both are React components rendered inline —
<RiCheckLine /> → <CheckOutlined /> — no structural change needed.
Tests
No new test file needed. Existing tests (AiAssetCard.test.tsx, AiCatalogPage.test.tsx) do not assert on specific icon components. Verify that existing tests still pass after the swap.
Run yarn workspace @red-hat-developer-hub/backstage-plugin-boost test and yarn workspace @red-hat-developer-hub/backstage-plugin-boost tsc to confirm.
Problem
The
boostfrontend plugin (plugins/boost) uses@remixicon/reactas its icon library. Every other frontend plugin in therhdh-pluginsrepo —adoption-insights,ai-experience,lightspeed,homepage,orchestrator-form-widgets,quickstart,scorecard, etc. — uses@mui/icons-material, which is the standard icon library in the Backstage ecosystem.This creates an inconsistency: a contributor working across plugins has to switch between two icon APIs, and the boost plugin carries an extra dependency that no other production plugin needs.
Current
@remixicon/reactusage (4 files, 14 icon imports)plugins/boost/src/utils/categoryMeta.tsRiMagicLine,RiShieldCheckLine,RiServerLine,RiRobotLine,RiBrainLine,RiToolsLine,RiDatabase2Line+RemixiconComponentTypetypeplugins/boost/src/components/catalog/AiAssetCard.tsxRiUserLineplugins/boost/src/components/catalog/AiCatalogPage.tsxRiGridLine,RiListUnorderedplugins/boost/src/components/catalog/entity/AdoptionCard.tsxRiCheckLine,RiFileCopyLineNote: The
CategoryMeta.iconfield is typed asRemixiconComponentTypeand populated for all 7 categories + fallback, but the icon component is never rendered anywhere — onlyCategoryMeta.labelandCategoryMeta.colorare used inAiAssetCard.tsx. The icon fieldexists for potential future use.
Expected behavior
@remixicon/reacticon imports with equivalent@mui/icons-materialicons.CategoryMeta.icontype fromRemixiconComponentTypetoSvgIconComponentfrom@mui/icons-material.@remixicon/reactfromplugins/boost/package.jsondependencies.@mui/icons-materialtoplugins/boost/package.jsondependencies (it is already a dependency of the dev apppackages/appand every other frontend plugin in the repo).Scope
workspaces/boost@red-hat-developer-hub/backstage-plugin-boost(plugins/boost)Icon mapping
RiMagicLineAutoFixHighOutlinedcategoryMeta.ts(skill)RiShieldCheckLineVerifiedUserOutlinedcategoryMeta.ts(rule)RiServerLineDnsOutlinedcategoryMeta.ts(mcp-server)RiRobotLineSmartToyOutlinedcategoryMeta.ts(ai-agent)RiBrainLinePsychologyOutlinedcategoryMeta.ts(ai-model + fallback)RiToolsLineBuildOutlinedcategoryMeta.ts(ai-tool)RiDatabase2LineStorageOutlinedcategoryMeta.ts(vector-store)RiUserLinePersonOutlinedAiAssetCard.tsxRiGridLineGridViewOutlinedAiCatalogPage.tsxRiListUnorderedViewListOutlinedAiCatalogPage.tsxRiCheckLineCheckOutlinedAdoptionCard.tsxRiFileCopyLineContentCopyOutlinedAdoptionCard.tsxUse the
Outlinedvariant consistently to match the line-style aesthetic of the current Remixicon usage.Files to modify
plugins/boost/package.json@remixicon/reactfromdependencies. Add@mui/icons-material.plugins/boost/src/utils/categoryMeta.tsRemixiconComponentTypewithSvgIconComponentfrom@mui/icons-material. Replace all 7 Remixicon icon imports with MUI equivalents.plugins/boost/src/components/catalog/AiAssetCard.tsxRiUserLineimport withPersonOutlinedfrom@mui/icons-material. Adjust the JSX — MUI icons usefontSizeprop instead ofsize(e.g.<PersonOutlined fontSize="small" />instead of `<RiUserLine size={14}plugins/boost/src/components/catalog/AiCatalogPage.tsxRiGridLineandRiListUnorderedimports withGridViewOutlinedandViewListOutlined. Adjustsize→fontSizein JSX.plugins/boost/src/components/catalog/entity/AdoptionCard.tsxRiCheckLineandRiFileCopyLineimports withCheckOutlinedandContentCopyOutlined. Adjustsize→fontSizein JSX.API differences to account for
size={14}(pixels). MUI icons usefontSize="small"(20px) orsx={{ fontSize: 14 }}for exact pixel control. UsefontSize="small"where the currentsizeis 14-16px; it is close enough and more idiomatic.RemixiconComponentType→ MUI'sSvgIconComponent(import from@mui/icons-material), or usetypeof SvgIconfrom@mui/material.<RiCheckLine />→<CheckOutlined />— no structural change needed.Tests
No new test file needed. Existing tests (
AiAssetCard.test.tsx,AiCatalogPage.test.tsx) do not assert on specific icon components. Verify that existing tests still pass after the swap.Run
yarn workspace @red-hat-developer-hub/backstage-plugin-boost testandyarn workspace @red-hat-developer-hub/backstage-plugin-boost tscto confirm.