Skip to main content
Version: 3.11

Icons

Migration Guide: Icon Component Updates​

General Overview​

This migration involves changes to how icons are used within the OHIF platform. The core change is the move to a new icon component library, @ohif/ui-next, which provides more flexibility and a more consistent naming convention for icons.

Key Changes:

  1. New Icon Library: The primary change is the shift from using <Icon> from @ohif/ui to using the new Icons component from @ohif/ui-next.
  2. AbcDef Naming Convention: The new library uses a AbcDef (PascalCase) naming convention for the icons. For instance, status-alert is now StatusAlert.
  3. Legacy Fallback: To ease the transition, a legacy fallback has been provided using Icons.ByName. This allows you to continue using the old name="status-alert" format but is not the recommended way moving forward.
  4. Direct Icon Component Access: The recommended approach is to use Icons.StatusAlert instead of <Icons.ByName name="status-alert"/> this way will make code more clear and readable.

Migration Strategies​

You have two ways to approach the migration:

  1. Recommended Approach (Gradual Adoption):

    • Start by updating your codebase to use the Icons.Method for the new icon naming convention.
    • For example, replace <Icon name="status-alert" /> with <Icons.StatusAlert />.
    • This ensures your code is aligned with the new standard and provides optimal compatibility in the future.
    • This method can be rolled out in phases.
  2. Legacy Fallback Approach (Temporary):

    • If a full migration is not immediately feasible, you can use the legacy fallback temporarily:
      • Replace <Icon name="status-alert" /> with <Icons.ByName name="status-alert" />.
    • This option allows you to complete the migration with minimal disruption to the old code
    • However, it is highly recommended to move towards the Icons.Method approach to take advantage of all the new library offers and have a cleaner code base.

Recommendation: We strongly recommend using the Recommended Approach for a more maintainable and consistent codebase going forward.

Specific Changes (Code Examples)​

Here are some specific examples based on the diff you provided, illustrating both the legacy fallback and recommended approach:

Example 1: Status Icons in _getStatusComponent.tsx

Old Code (@ohif/ui):

import { Icon, Tooltip } from '@ohif/ui';

// ...
case true:
StatusIcon = () => <Icon name="status-alert" />;
break;
case false:
StatusIcon = () => (
<Icon
className="text-aqua-pale"
name="status-untracked"
/>
);
break;
//...

Legacy Fallback Approach (Icons.ByName):

import { Tooltip } from '@ohif/ui';
import { Icons } from '@ohif/ui-next';

// ...
case true:
StatusIcon = () => <Icons.ByName name="status-alert" />;
break;
case false:
StatusIcon = () => (
<Icons.ByName
className="text-aqua-pale"
name="status-untracked"
/>
);
break;
//...

Recommended Approach (Icons.StatusAlert, Icons.StatusUntracked):

import { Tooltip } from '@ohif/ui';
import { Icons } from '@ohif/ui-next';

// ...
case true:
StatusIcon = () => <Icons.StatusAlert />;
break;
case false:
StatusIcon = () => (
<Icons.StatusUntracked
className="text-aqua-pale"
/>
);
break;
//...

Example 5: Icon usage in WorkList.tsx

Old Code (@ohif/ui):

<Icon
name="group-layers"

Recommended Approach (Icons.GroupLayers):

<Icons.GroupLayers
<Icons.ByName
className="!h-[20px] !w-[20px] text-black"
name={isValidMode ? 'launch-arrow' : 'launch-info'}
/>

Recommended Approach (Icons.LaunchArrow, Icons.LaunchInfo):

isValidMode ? (
<Icons.LaunchArrow className="!h-[20px] !w-[20px] text-black" />
) : (
<Icons.LaunchInfo className="!h-[20px] !w-[20px] text-black" />
)

Creating New Custom Icons​

This section explains how to migrate your custom icons from the old SVG import method to the new React component-based system in @ohif/ui-next. The new approach improves consistency, allows for better tree-shaking, and provides type safety.

The process involves converting your existing SVG files into React components and then registering them.

1. Convert SVG to a React Component​

First, take your raw SVG file and convert it into a .tsx React functional component.

Before: Raw SVG File

Previously, you might have had a file like Baseline.svg:

// Baseline.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
< some svg content>
</svg>

After: React Icon Component

Now, create a .tsx file that exports a React component. Note the following changes:

  • SVG attributes like text-anchor and stroke-width are converted to camel case (i.e. textAnchor, strokeWidth).
  • The component accepts IconProps and spreads them onto the root <svg> element.
// Baseline.tsx
import React from 'react';
import type { IconProps } from '../types';

export const Baseline = (props: IconProps) => (
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" {...props}>
< some svg content>
</svg>
);

export default Baseline;

2. Register the New Icon​

After creating the component, you must register it with the Icons service from @ohif/ui-next. This is typically done in a centralized location where you initialize your UI components (for example, an extension's preRegistration is a good spot for this). You'll need a unique name for the icon, which can be managed with an enum for consistency.

// Example: in your setup/initialization code
import { Icons, IconNameEnum } from '@ohif/ui-next';
import Baseline from './sources/Baseline'; // Import your new icon component

// Add the icon to the registry
Icons.addIcon(IconNameEnum.BASELINE, Baseline);

By following these steps, your custom icon will be available for use throughout the application just like any of the default icons.

Detailed Renaming Table​

Old Icon NameNew Icon Component NameExample Usage (Icons.)Notes
status-alertStatusAlertIcons.StatusAlert
status-untrackedStatusUntrackedIcons.StatusUntracked
status-lockedStatusLockedIcons.StatusLocked
icon-transferringIconTransferringIcons.IconTransferring
icon-alert-smallAlertIcons.Alert
icon-alert-outlineAlertOutlineIcons.AlertOutline
icon-status-alertAlertIcons.Alert
action-new-dialogActionNewDialogIcons.ActionNewDialog
VolumeRenderingVolumeRenderingIcons.VolumeRendering
chevron-leftChevronClosedIcons.ChevronClosedUse when arrow direction needs to point left
chevron-downChevronOpenIcons.ChevronOpenUse when arrow direction needs to point down
launch-arrowLaunchArrowIcons.LaunchArrow
launch-infoLaunchInfoIcons.LaunchInfo
group-layersGroupLayersIcons.GroupLayers
icon-uploadUploadIcons.Upload
icon-searchSearchIcons.Search
icon-clear-fieldClearIcons.Clear
icon-addAddIcons.Add
icon-closeCloseIcons.Close
icon-pausePauseIcons.Pause
icon-playPlayIcons.Play
icon-multiple-patientsMultiplePatientsIcons.MultiplePatients
icon-settingsSettingsIcons.Settings
icon-more-menuMoreIcons.More
content-prevContentPrevIcons.ContentPrev
content-nextContentNextIcons.ContentNext
checkbox-checkedCheckBoxCheckedIcons.CheckBoxChecked
checkbox-uncheckedCheckBoxUncheckedIcons.CheckBoxUnchecked
checkbox-defaultCheckBoxUncheckedIcons.CheckBoxUnchecked
checkbox-activeCheckBoxCheckedIcons.CheckBoxChecked
sorting-active-upSortingAscendingIcons.SortingAscending
sorting-active-downSortingDescendingIcons.SortingDescending
sortingSortingIcons.Sorting
linkLinkIcons.Link
unlinkLinkIcons.Link
info-actionInfoIcons.Info
databaseDatabaseIcons.Database
tool-3d-rotateTool3DRotateIcons.Tool3DRotate
tool-angleToolAngleIcons.ToolAngle
tool-annotateToolAnnotateIcons.ToolAnnotate
tool-bidirectionalToolBidirectionalIcons.ToolBidirectional
tool-calibrationToolCalibrateIcons.ToolCalibrate
tool-captureToolCaptureIcons.ToolCapture
tool-cineToolCineIcons.ToolCine
tool-circleToolCircleIcons.ToolCircle
tool-cobb-angleToolCobbAngleIcons.ToolCobbAngle
tool-create-thresholdToolCreateThresholdIcons.ToolCreateThreshold
tool-crosshairToolCrosshairIcons.ToolCrosshair
dicom-tag-browserToolDicomTagBrowserIcons.ToolDicomTagBrowser
tool-flip-horizontalToolFlipHorizontalIcons.ToolFlipHorizontal
tool-freehand-polygonToolFreehandPolygonIcons.ToolFreehandPolygon
tool-freehand-roiToolFreehandRoiIcons.ToolFreehandRoi
tool-freehandToolFreehandIcons.ToolFreehand
tool-fusion-colorToolFusionColorIcons.ToolFusionColor
tool-invertToolInvertIcons.ToolInvert
tool-layout-defaultToolLayoutDefaultIcons.ToolLayoutDefault
tool-lengthToolLengthIcons.ToolLength
tool-magnetic-roiToolMagneticRoiIcons.ToolMagneticRoi
tool-magnifyToolMagnifyIcons.ToolMagnify
tool-measure-ellipseToolMeasureEllipseIcons.ToolMeasureEllipse
tool-more-menuToolMoreMenuIcons.ToolMoreMenu
tool-moveToolMoveIcons.ToolMove
tool-polygonToolPolygonIcons.ToolPolygon
tool-quick-magnifyToolQuickMagnifyIcons.ToolQuickMagnify
tool-rectangleToolRectangleIcons.ToolRectangle
tool-referenceLinesToolReferenceLinesIcons.ToolReferenceLines
tool-resetToolResetIcons.ToolReset
tool-rotate-rightToolRotateRightIcons.ToolRotateRight
tool-seg-brushToolSegBrushIcons.ToolSegBrush
tool-seg-eraserToolSegEraserIcons.ToolSegEraser
tool-seg-shapeToolSegShapeIcons.ToolSegShape
tool-seg-thresholdToolSegThresholdIcons.ToolSegThreshold
tool-spline-roiToolSplineRoiIcons.ToolSplineRoi
tool-stack-image-syncToolStackImageSyncIcons.ToolStackImageSync
tool-stack-scrollToolStackScrollIcons.ToolStackScroll
tool-toggle-dicom-overlayToolToggleDicomOverlayIcons.ToolToggleDicomOverlay
tool-ultrasound-bidirectionalToolUltrasoundBidirectionalIcons.ToolUltrasoundBidirectional
tool-window-levelToolWindowLevelIcons.ToolWindowLevel
tool-window-regionToolWindowRegionIcons.ToolWindowRegion
tool-zoomToolZoomIcons.ToolZoom
tool-layoutToolLayoutIcons.ToolLayout
icon-tool-eraserToolEraserIcons.ToolEraser
icon-tool-brushToolBrushIcons.ToolBrush
icon-tool-thresholdToolThresholdIcons.ToolThreshold
icon-tool-shapeToolShapeIcons.ToolShape
icon-color-lutIconColorLUTIcons.IconColorLUT
viewport-window-levelViewportWindowLevelIcons.ViewportWindowLevel
notifications-infoNotificationInfoIcons.NotificationInfo
layout-advanced-3d-four-upLayoutAdvanced3DFourUpIcons.LayoutAdvanced3DFourUp
layout-advanced-3d-mainLayoutAdvanced3DMainIcons.LayoutAdvanced3DMain
layout-advanced-3d-onlyLayoutAdvanced3DOnlyIcons.LayoutAdvanced3DOnly
layout-advanced-3d-primaryLayoutAdvanced3DPrimaryIcons.LayoutAdvanced3DPrimary
layout-advanced-axial-primaryLayoutAdvancedAxialPrimaryIcons.LayoutAdvancedAxialPrimary
layout-advanced-mprLayoutAdvancedMPRIcons.LayoutAdvancedMPR
layout-common-1x1LayoutCommon1x1Icons.LayoutCommon1x1
layout-common-1x2LayoutCommon1x2Icons.LayoutCommon1x2
layout-common-2x2LayoutCommon2x2Icons.LayoutCommon2x2
layout-common-2x3LayoutCommon2x3Icons.LayoutCommon2x3
illustration-investigational-useInvestigationalUseIcons.InvestigationalUse