refactor(web): replace lucide-react and react-icons with @opal/icons

Merged
RO
2d ago
+81-66

Description

Targets main. This is the first of four cleanup PRs (#16240, #16241, #16242, #16243) that fix the design-system violations that #16234 (merged) put in the warn-only baseline. This PR replaces lucide-react and react-icons with @opal/icons.

Before and after

10 files imported lucide-react (3) or react-icons (7). This PR migrates them all, except for 3 icons that have no Opal match. Three files are now clean of the design-system rules, so they are removed from the baseline in web/.oxlintrc.json:

  • src/app/admin/agents/CollapsibleSection.tsx
  • src/app/app/message/messageComponents/interfaces.ts
  • src/views/admin/connectors/FederatedDetailPage/index.tsx

Changes (all under web/src/)

FileOldNew
app/admin/agents/CollapsibleSection.tsxFiSettingsSvgSettings (size 16 kept)
app/admin/bots/[bot-id]/channels/SlackChannelConfigFormFields.tsxlucide AlertCircleSvgAlertCircle (classes kept)
app/admin/documents/feedback/DocumentFeedbackTable.tsxFiEye, FiEyeOffSvgEye, SvgEyeOff
app/admin/documents/sets/page.tsxFiCheckCircle, FiClock, FiAlertTriangle, FiLock, FiEdit2The matching Svg* icons; FiEdit2 becomes SvgEdit
app/app/message/errorHelpers.tsxlucide AlertCircle, Clock, Lock, ServerThe matching Svg* icons
app/app/message/messageComponents/interfaces.tsIconType from react-iconsIconFunctionComponent | null. No caller passes a react-icons icon any more
app/app/message/messageComponents/toolDisplayHelpers.tsxFiTool, FiCircleSvgWrench, SvgCircle
app/ee/admin/performance/query-history/[id]/page.tsxFiBookSvgBook
app/ee/admin/standard-answer/page.tsxFiTagSvgTag (size 16)
views/admin/connectors/FederatedDetailPage/index.tsxlucide Loader2SvgLoader (classes kept)

Kept on purpose (no matching Opal icon)

These sites still trip the rule and stay in the baseline. Each needs an icon added to web/lib/opal/src/icons/ from Figma first:

  • Wifi in errorHelpers.tsx: Opal has no wifi or signal icon.
  • FiUnlock in documents/sets/page.tsx: Opal has lock but no unlock icon. The lock and unlock icons in that table now come from different sets.
  • FiList in toolDisplayHelpers.tsx: no Opal icon has the same bullet-list shape (list-tree, list-check and text-lines all differ).

Visual differences reviewers should check

  • Size: react-icons default to 1em, but Opal icons have no default size, so I set an explicit size from the text size around each icon:
    • SvgEye/SvgEyeOff are 12 (they sit in text-xs).
    • SvgBook is 14 (it sits in text-sm).
    • SvgEdit is 16. Its button sets no text size, so this one is a guess.
  • Stroke: lucide icons use stroke width 2, and Opal icons use 1.5, so lines look slightly thinner.
  • FiEdit2 to SvgEdit: Opal's pencil has an underline.
  • FiCircle to SvgCircle: the Opal circle is smaller (r=4 in a 16 box, where the old one was r=10 in a 24 box). It is only the fallback when there are no packets, and ReasoningRenderer already uses SvgCircle.

How Has This Been Tested?

  • oxlint: in the changed files, only the 3 icons listed above still report. The full run has 0 errors.
  • bun run types:check: no type errors, and type coverage stays at 99.04%.
  • pre-commit (oxfmt, oxlint) passes on the changed files.

Additional Options

  • [Optional] Please cherry-pick this PR to the latest release version.

Summary by CodeRabbit

  • Style
    • Updated icons across admin pages, document controls, chat tools, and message error states for a more consistent appearance.
    • Loading indicators, visibility controls, and error-state behavior remain unchanged.