Skip to content

icon: Add independently embedded SVG constants - #3360

Open
suxiaoshao wants to merge 2 commits into
longbridge:mainfrom
suxiaoshao:codex/3349-svg-icon
Open

suxiaoshao wants to merge 2 commits into
longbridge:mainfrom
suxiaoshao:codex/3349-svg-icon

Conversation

@suxiaoshao

Copy link
Copy Markdown
Contributor

Closes #3349

Description

Using extra catalog icons through icon_assets! requires keeping a selection list in sync with the Rust use sites. Removing the last UI reference can leave an obsolete entry, and its SVG bytes, in the runtime asset source.

Add SvgIcon as a third option alongside the existing full-catalog and macro-selected asset sources. Each generated constant references only its own embedded SVG, so optimized builds can drop unreferenced payloads without an application-maintained list:

use gpui_kit::component::{Icon, SvgIcon, button::Button};

Icon::new(SvgIcon::ACCESSIBILITY);
Button::new("alarm").icon(SvgIcon::ALARM_CLOCK);

The asset crate generates the catalog from its existing SVG files; Component owns the new value type and presentation conversion. Direct children, entity views, custom static SVGs, component icon slots, and native-menu byte resolution are supported. No new dependency or application asset-source registration is required for these icons.

Existing IconName enums, custom IconNamed implementations, default Assets, AllAssets, and icon_assets! retain their behavior. Components' internal path-based icons still need the normal default assets. The new byte-backed constants embed their selected SVGs on native and WASM targets; CDN loading remains available through existing path sources. English/Chinese documentation and the Icon Story demonstrate the additional option.

Current copying cost and upstream follow-up

This implementation intentionally uses today's APIs: conversion calls Icon::data(&[u8]), copying into an Arc<[u8]>; building the underlying GPUI Svg calls Svg::data(&[u8]), copying again and preparing its content cache key. These are element-construction costs; cached rendering does not imply parsing/rasterization on every paint. No application-level performance improvement is claimed.

Related upstream work: zed#65066 and zed#65067. If reusable SvgData becomes available in the GPUI dependency, a localized follow-up can store it in private IconSource::Data, construct static data in From<SvgIcon>, forward it directly into Svg, and use as_bytes() for native menus. Icon::new(SvgIcon::...) remains unchanged, and the existing Icon::data(&[u8]) signature can retain its copying semantics. No breaking public API migration is required for that optimization.

Public API

gpui-component

All items are exposed through gpui_kit::component as well.

  • pub struct SvgIcon { /* private fields */ } — copyable embedded SVG value; derives Clone, Copy, Debug, Eq, PartialEq, Hash, and IntoElement.
  • pub const fn SvgIcon::new(bytes: &'static [u8]) -> Self — wraps custom static SVG bytes.
  • pub const fn SvgIcon::bytes(self) -> &'static [u8] — returns the original bytes.
  • pub fn SvgIcon::view(self, cx: &mut App) -> Entity<Icon> — constructs an entity-backed icon.
  • impl From<SvgIcon> for Icon — accepts embedded icons in existing component icon slots.
  • impl RenderOnce for SvgIcon — supports direct element-tree composition through the existing Icon presentation.
  • impl From<SvgIcon> for AnyElement — supports type-erased element conversion.
  • Generated pub const SvgIcon::<NAME>: Self — each independently references the SVG identified by its uppercase, underscore-separated file stem. The complete identifier list is below; there is no runtime catalog array or lookup table in this API.
All 1830 generated SvgIcon constants (each: pub const NAME: Self)
ACCESSIBILITY, ACTIVITY, AD, AIRPLAY, AIR_VENT, ALARM_CLOCK, ALARM_CLOCK_CHECK, ALARM_CLOCK_MINUS,
ALARM_CLOCK_OFF, ALARM_CLOCK_PLUS, ALARM_SMOKE, ALBUM, ALIGN_CENTER_HORIZONTAL,
ALIGN_CENTER_VERTICAL, ALIGN_END_HORIZONTAL, ALIGN_END_VERTICAL, ALIGN_HORIZONTAL_DISTRIBUTE_CENTER,
ALIGN_HORIZONTAL_DISTRIBUTE_END, ALIGN_HORIZONTAL_DISTRIBUTE_START, ALIGN_HORIZONTAL_JUSTIFY_CENTER,
ALIGN_HORIZONTAL_JUSTIFY_END, ALIGN_HORIZONTAL_JUSTIFY_START, ALIGN_HORIZONTAL_SPACE_AROUND,
ALIGN_HORIZONTAL_SPACE_BETWEEN, ALIGN_START_HORIZONTAL, ALIGN_START_VERTICAL,
ALIGN_VERTICAL_DISTRIBUTE_CENTER, ALIGN_VERTICAL_DISTRIBUTE_END, ALIGN_VERTICAL_DISTRIBUTE_START,
ALIGN_VERTICAL_JUSTIFY_CENTER, ALIGN_VERTICAL_JUSTIFY_END, ALIGN_VERTICAL_JUSTIFY_START,
ALIGN_VERTICAL_SPACE_AROUND, ALIGN_VERTICAL_SPACE_BETWEEN, AMBULANCE, AMPERSAND, AMPERSANDS,
AMPHORA, ANCHOR, ANGLE, ANTENNA, ANVIL, APERTURE, APPLE, APP_WINDOW, APP_WINDOW_MAC, ARCHIVE,
ARCHIVE_RESTORE, ARCHIVE_X, ARMCHAIR, ARROWS_UP_FROM_LINE, ARROW_BIG_DOWN, ARROW_BIG_DOWN_DASH,
ARROW_BIG_LEFT, ARROW_BIG_LEFT_DASH, ARROW_BIG_RIGHT, ARROW_BIG_RIGHT_DASH, ARROW_BIG_UP,
ARROW_BIG_UP_DASH, ARROW_DOWN, ARROW_DOWN_0_1, ARROW_DOWN_1_0, ARROW_DOWN_A_Z, ARROW_DOWN_FROM_LINE,
ARROW_DOWN_LEFT, ARROW_DOWN_NARROW_WIDE, ARROW_DOWN_RIGHT, ARROW_DOWN_TO_DOT, ARROW_DOWN_TO_LINE,
ARROW_DOWN_UP, ARROW_DOWN_WIDE_NARROW, ARROW_DOWN_Z_A, ARROW_LEFT, ARROW_LEFT_FROM_LINE,
ARROW_LEFT_RIGHT, ARROW_LEFT_TO_LINE, ARROW_RIGHT, ARROW_RIGHT_FROM_LINE, ARROW_RIGHT_LEFT,
ARROW_RIGHT_TO_LINE, ARROW_UP, ARROW_UP_0_1, ARROW_UP_1_0, ARROW_UP_A_Z, ARROW_UP_DOWN,
ARROW_UP_FROM_DOT, ARROW_UP_FROM_LINE, ARROW_UP_LEFT, ARROW_UP_NARROW_WIDE, ARROW_UP_RIGHT,
ARROW_UP_TO_LINE, ARROW_UP_WIDE_NARROW, ARROW_UP_Z_A, ASTERISK, ASTROID, ATOM, AT_SIGN, AUDIO_LINES,
AUDIO_LINES_OFF, AUDIO_LINES_X, AUDIO_WAVEFORM, AWARD, AXE, AXIS_3D, A_ARROW_DOWN, A_ARROW_UP,
A_LARGE_SMALL, BABY, BACKPACK, BADGE, BADGE_ALERT, BADGE_CENT, BADGE_CHECK, BADGE_DOLLAR_SIGN,
BADGE_EURO, BADGE_INDIAN_RUPEE, BADGE_INFO, BADGE_JAPANESE_YEN, BADGE_MINUS, BADGE_PERCENT,
BADGE_PLUS, BADGE_POUND_STERLING, BADGE_QUESTION_MARK, BADGE_RUSSIAN_RUBLE, BADGE_SWISS_FRANC,
BADGE_TURKISH_LIRA, BADGE_X, BAGGAGE_CLAIM, BALLOON, BAN, BANANA, BANDAGE, BANKNOTE,
BANKNOTE_ARROW_DOWN, BANKNOTE_ARROW_UP, BANKNOTE_CHECK, BANKNOTE_X, BARCODE, BARREL, BASELINE, BATH,
BATTERY, BATTERY_CHARGING, BATTERY_FULL, BATTERY_LOW, BATTERY_MEDIUM, BATTERY_PLUS, BATTERY_WARNING,
BEAKER, BEAN, BEAN_OFF, BED, BED_DOUBLE, BED_SINGLE, BEEF, BEEF_OFF, BEER, BEER_OFF, BELL,
BELL_CHECK, BELL_DOT, BELL_ELECTRIC, BELL_MINUS, BELL_OFF, BELL_PLUS, BELL_RING,
BETWEEN_HORIZONTAL_END, BETWEEN_HORIZONTAL_START, BETWEEN_VERTICAL_END, BETWEEN_VERTICAL_START,
BICEPS_FLEXED, BIKE, BINARY, BINOCULARS, BIOHAZARD, BIRD, BIRDHOUSE, BITCOIN, BLEND, BLENDER,
BLINDS, BLOCKS, BLUETOOTH, BLUETOOTH_CONNECTED, BLUETOOTH_OFF, BLUETOOTH_SEARCHING, BOLD, BOLT,
BOMB, BONE, BONE_FRACTURE, BOOK, BOOKMARK, BOOKMARK_CHECK, BOOKMARK_MINUS, BOOKMARK_OFF,
BOOKMARK_PLUS, BOOKMARK_X, BOOK_A, BOOK_ALERT, BOOK_AUDIO, BOOK_CHECK, BOOK_COPY, BOOK_DASHED,
BOOK_DOWN, BOOK_HEADPHONES, BOOK_HEART, BOOK_IMAGE, BOOK_KEY, BOOK_LOCK, BOOK_MARKED, BOOK_MINUS,
BOOK_OPEN, BOOK_OPEN_CHECK, BOOK_OPEN_TEXT, BOOK_PLUS, BOOK_SEARCH, BOOK_TEXT, BOOK_TYPE, BOOK_UP,
BOOK_UP_2, BOOK_USER, BOOK_X, BOOM_BOX, BOT, BOTTLE_WINE, BOT_MESSAGE_SQUARE, BOT_OFF, BOW_ARROW,
BOX, BOXES, BRACES, BRACKETS, BRAIN, BRAIN_CIRCUIT, BRAIN_COG, BRICK_WALL, BRICK_WALL_FIRE,
BRICK_WALL_SHIELD, BRIDGE, BRIEFCASE, BRIEFCASE_BUSINESS, BRIEFCASE_CONVEYOR_BELT,
BRIEFCASE_MEDICAL, BRING_TO_FRONT, BROCCOLI, BROOM, BROOM_SPARKLES, BRUSH, BRUSH_CLEANING, BUBBLES,
BUG, BUG_OFF, BUG_PLAY, BUILDING, BUILDING_2, BUS, BUS_FRONT, CABLE, CABLE_CAR, CAKE, CAKE_SLICE,
CALCULATOR, CALENDAR, CALENDARS, CALENDAR_1, CALENDAR_ARROW_DOWN, CALENDAR_ARROW_UP, CALENDAR_CHECK,
CALENDAR_CHECK_2, CALENDAR_CLOCK, CALENDAR_COG, CALENDAR_DAYS, CALENDAR_FOLD, CALENDAR_HEART,
CALENDAR_MINUS, CALENDAR_MINUS_2, CALENDAR_OFF, CALENDAR_PLUS, CALENDAR_PLUS_2, CALENDAR_RANGE,
CALENDAR_SEARCH, CALENDAR_SYNC, CALENDAR_X, CALENDAR_X_2, CAMERA, CAMERA_OFF, CAN, CANDY,
CANDY_CANE, CANDY_OFF, CANNABIS, CANNABIS_OFF, CAN_SODA, CAPTIONS, CAPTIONS_OFF, CAR, CARAVAN,
CARD_SIM, CARROT, CARTON, CARTON_OFF, CAR_BATTERY, CAR_FRONT, CAR_TAXI_FRONT, CASE_LOWER,
CASE_SENSITIVE, CASE_UPPER, CASSETTE_TAPE, CAST, CASTLE, CAT, CCTV, CCTV_OFF, CHART_AREA, CHART_BAR,
CHART_BAR_BIG, CHART_BAR_DECREASING, CHART_BAR_INCREASING, CHART_BAR_STACKED, CHART_CANDLESTICK,
CHART_COLUMN, CHART_COLUMN_BIG, CHART_COLUMN_DECREASING, CHART_COLUMN_INCREASING,
CHART_COLUMN_STACKED, CHART_GANTT, CHART_LINE, CHART_NETWORK, CHART_NO_AXES_COLUMN,
CHART_NO_AXES_COLUMN_DECREASING, CHART_NO_AXES_COLUMN_INCREASING, CHART_NO_AXES_COMBINED,
CHART_NO_AXES_GANTT, CHART_PIE, CHART_SCATTER, CHART_SPLINE, CHECK, CHECK_CHECK, CHECK_LINE,
CHEF_HAT, CHERRY, CHESS_BISHOP, CHESS_KING, CHESS_KNIGHT, CHESS_PAWN, CHESS_QUEEN, CHESS_ROOK,
CHEVRONS_DOWN, CHEVRONS_DOWN_UP, CHEVRONS_LEFT, CHEVRONS_LEFT_RIGHT, CHEVRONS_LEFT_RIGHT_ELLIPSIS,
CHEVRONS_RIGHT, CHEVRONS_RIGHT_LEFT, CHEVRONS_UP, CHEVRONS_UP_DOWN, CHEVRON_DOWN, CHEVRON_FIRST,
CHEVRON_LAST, CHEVRON_LEFT, CHEVRON_RIGHT, CHEVRON_UP, CHURCH, CIGARETTE, CIGARETTE_OFF, CIRCLE,
CIRCLE_ALERT, CIRCLE_ARROW_DOWN, CIRCLE_ARROW_LEFT, CIRCLE_ARROW_OUT_DOWN_LEFT,
CIRCLE_ARROW_OUT_DOWN_RIGHT, CIRCLE_ARROW_OUT_UP_LEFT, CIRCLE_ARROW_OUT_UP_RIGHT,
CIRCLE_ARROW_RIGHT, CIRCLE_ARROW_UP, CIRCLE_CHECK, CIRCLE_CHECK_BIG, CIRCLE_CHEVRON_DOWN,
CIRCLE_CHEVRON_LEFT, CIRCLE_CHEVRON_RIGHT, CIRCLE_CHEVRON_UP, CIRCLE_DASHED, CIRCLE_DASHED_CHECK,
CIRCLE_DIVIDE, CIRCLE_DOLLAR_SIGN, CIRCLE_DOT, CIRCLE_DOT_DASHED, CIRCLE_ELLIPSIS, CIRCLE_EQUAL,
CIRCLE_EURO, CIRCLE_FADING_ARROW_UP, CIRCLE_FADING_PLUS, CIRCLE_GAUGE, CIRCLE_MINUS, CIRCLE_OFF,
CIRCLE_PARKING, CIRCLE_PARKING_OFF, CIRCLE_PAUSE, CIRCLE_PERCENT, CIRCLE_PILE, CIRCLE_PLAY,
CIRCLE_PLUS, CIRCLE_POUND_STERLING, CIRCLE_POWER, CIRCLE_QUESTION_MARK, CIRCLE_SLASH,
CIRCLE_SLASH_2, CIRCLE_SMALL, CIRCLE_STAR, CIRCLE_STOP, CIRCLE_USER, CIRCLE_USER_ROUND, CIRCLE_X,
CIRCUIT_BOARD, CITRUS, CLAPPERBOARD, CLIPBOARD, CLIPBOARD_CHECK, CLIPBOARD_CLOCK, CLIPBOARD_COPY,
CLIPBOARD_LIST, CLIPBOARD_MINUS, CLIPBOARD_PASTE, CLIPBOARD_PEN, CLIPBOARD_PEN_LINE, CLIPBOARD_PLUS,
CLIPBOARD_TYPE, CLIPBOARD_X, CLOCK, CLOCK_1, CLOCK_10, CLOCK_11, CLOCK_12, CLOCK_2, CLOCK_3,
CLOCK_4, CLOCK_5, CLOCK_6, CLOCK_7, CLOCK_8, CLOCK_9, CLOCK_ALERT, CLOCK_ARROW_DOWN,
CLOCK_ARROW_LEFT, CLOCK_ARROW_RIGHT, CLOCK_ARROW_UP, CLOCK_CHECK, CLOCK_FADING, CLOCK_PLUS, CLOSE,
CLOSED_CAPTION, CLOUD, CLOUDY, CLOUD_ALERT, CLOUD_BACKUP, CLOUD_CHECK, CLOUD_COG, CLOUD_DOWNLOAD,
CLOUD_DRIZZLE, CLOUD_FOG, CLOUD_HAIL, CLOUD_LIGHTNING, CLOUD_MOON, CLOUD_MOON_RAIN, CLOUD_OFF,
CLOUD_RAIN, CLOUD_RAIN_WIND, CLOUD_SNOW, CLOUD_SUN, CLOUD_SUN_RAIN, CLOUD_SYNC, CLOUD_UPLOAD,
CLOVER, CLUB, CODE, CODE_XML, COFFEE, COG, COINS, COLUMNS_2, COLUMNS_3, COLUMNS_3_COG, COLUMNS_4,
COMBINE, COMMAND, COMPASS, COMPONENT, COMPUTER, CONCIERGE_BELL, CONE, CONSTRUCTION, CONTACT,
CONTACT_ROUND, CONTAINER, CONTRAST, COOKIE, COOKING_POT, COPY, COPYLEFT, COPYRIGHT, COPY_CHECK,
COPY_MINUS, COPY_PLUS, COPY_SLASH, COPY_X, CORNER_DOWN_LEFT, CORNER_DOWN_RIGHT, CORNER_LEFT_DOWN,
CORNER_LEFT_UP, CORNER_RIGHT_DOWN, CORNER_RIGHT_UP, CORNER_UP_LEFT, CORNER_UP_RIGHT, CPU,
CREATIVE_COMMONS, CREDIT_CARD, CREDIT_CARD_CHECK, CREDIT_CARD_MINUS, CREDIT_CARD_PLUS,
CREDIT_CARD_READER, CREDIT_CARD_X, CROISSANT, CROP, CROSS, CROSSHAIR, CROWN, CUBOID, CUP_SODA,
CURRENCY, CYLINDER, DAM, DASH, DATABASE, DATABASE_ARROW_DOWN, DATABASE_ARROW_UP, DATABASE_BACKUP,
DATABASE_CHECK, DATABASE_MINUS, DATABASE_PLUS, DATABASE_SEARCH, DATABASE_X, DATABASE_ZAP,
DECIMALS_ARROW_LEFT, DECIMALS_ARROW_RIGHT, DELETE, DESSERT, DIAMETER, DIAMOND, DIAMOND_MINUS,
DIAMOND_PERCENT, DIAMOND_PLUS, DICES, DICE_1, DICE_2, DICE_3, DICE_4, DICE_5, DICE_6, DIFF, DISC,
DISC_2, DISC_3, DISC_ALBUM, DIVIDE, DNA, DNA_OFF, DOCK, DOG, DOLLAR_SIGN, DOME, DONUT, DOOR_CLOSED,
DOOR_CLOSED_LOCKED, DOOR_OPEN, DOOR_STAIRWELL, DOT, DOWNLOAD, DRAFTING_COMPASS, DRAMA, DRILL, DRONE,
DROPLET, DROPLETS, DROPLET_OFF, DRUM, DRUMSTICK, DUMBBELL, EAR, EARTH, EARTH_LOCK, EAR_OFF, ECLIPSE,
EGG, EGG_FRIED, EGG_OFF, EJECT, ELLIPSE, ELLIPSIS, ELLIPSIS_VERTICAL, ENGINE, EQUAL,
EQUAL_APPROXIMATELY, EQUAL_APPROXIMATELY_NOT, EQUAL_NOT, ERASER, ETHERNET_PORT, EURO, EV_CHARGER,
EXPAND, EXTERNAL_LINK, EYE, EYE_CLOSED, EYE_DASHED, EYE_OFF, FACE_ANGRY, FACE_EXPRESSIONLESS,
FACE_GRINNING, FACE_NEUTRAL, FACE_SLIGHTLY_FROWNING, FACE_SLIGHTLY_SMILING,
FACE_SLIGHTLY_SMILING_PLUS, FACTORY, FAN, FAST_FORWARD, FEATHER, FENCE, FERRIS_WHEEL, FILE, FILES,
FILE_ARCHIVE, FILE_AXIS_3D, FILE_BADGE, FILE_BOX, FILE_BRACES, FILE_BRACES_CORNER,
FILE_CHART_COLUMN, FILE_CHART_COLUMN_INCREASING, FILE_CHART_LINE, FILE_CHART_PIE, FILE_CHECK,
FILE_CHECK_CORNER, FILE_CLOCK, FILE_CODE, FILE_CODE_CORNER, FILE_COG, FILE_DIFF, FILE_DIGIT,
FILE_DOWN, FILE_EXCLAMATION_POINT, FILE_HEADPHONE, FILE_HEART, FILE_IMAGE, FILE_INPUT, FILE_KEY,
FILE_LOCK, FILE_MINUS, FILE_MINUS_CORNER, FILE_MUSIC, FILE_OUTPUT, FILE_PEN, FILE_PEN_LINE,
FILE_PLAY, FILE_PLUS, FILE_PLUS_CORNER, FILE_QUESTION_MARK, FILE_SCAN, FILE_SEARCH,
FILE_SEARCH_CORNER, FILE_SIGNAL, FILE_SLIDERS, FILE_SPREADSHEET, FILE_STACK, FILE_SYMLINK,
FILE_TERMINAL, FILE_TEXT, FILE_TYPE, FILE_TYPE_CORNER, FILE_UP, FILE_USER, FILE_VIDEO_CAMERA,
FILE_VOLUME, FILE_X, FILE_X_CORNER, FILM, FINGERPRINT_PATTERN, FIRE_EXTINGUISHER, FISH,
FISHING_HOOK, FISHING_ROD, FISH_OFF, FISH_SYMBOL, FLAG, FLAG_OFF, FLAG_TRIANGLE_LEFT,
FLAG_TRIANGLE_RIGHT, FLAME, FLAME_KINDLING, FLASHLIGHT, FLASHLIGHT_OFF, FLASK_CONICAL,
FLASK_CONICAL_OFF, FLASK_ROUND, FLIP_HORIZONTAL_2, FLIP_VERTICAL_2, FLOWER, FLOWER_2, FOCUS, FOLDER,
FOLDERS, FOLDER_ARCHIVE, FOLDER_BOOKMARK, FOLDER_CHECK, FOLDER_CLOCK, FOLDER_CLOSED, FOLDER_CODE,
FOLDER_COG, FOLDER_DOT, FOLDER_DOWN, FOLDER_GIT, FOLDER_GIT_2, FOLDER_HEART, FOLDER_INPUT,
FOLDER_KANBAN, FOLDER_KEY, FOLDER_LOCK, FOLDER_MINUS, FOLDER_OPEN, FOLDER_OPEN_DOT, FOLDER_OUTPUT,
FOLDER_PEN, FOLDER_PLUS, FOLDER_ROOT, FOLDER_SEARCH, FOLDER_SEARCH_2, FOLDER_SYMLINK, FOLDER_SYNC,
FOLDER_TREE, FOLDER_UP, FOLDER_X, FOLD_HORIZONTAL, FOLD_VERTICAL, FOOTPRINTS, FORKLIFT, FORM,
FORWARD, FRAME, FUEL, FULLSCREEN, FUNNEL, FUNNEL_PLUS, FUNNEL_X, GALAXY, GALLERY_HORIZONTAL,
GALLERY_HORIZONTAL_END, GALLERY_THUMBNAILS, GALLERY_VERTICAL, GALLERY_VERTICAL_END, GAMEPAD,
GAMEPAD_2, GAMEPAD_DIRECTIONAL, GAP_HORIZONTAL, GAP_VERTICAL, GAUGE, GAVEL, GEM, GEORGIAN_LARI,
GERM, GERM_OFF, GHOST, GIFT, GITHUB, GIT_BRANCH, GIT_BRANCH_MINUS, GIT_BRANCH_PLUS,
GIT_COMMIT_HORIZONTAL, GIT_COMMIT_VERTICAL, GIT_COMPARE, GIT_COMPARE_ARROWS, GIT_FORK, GIT_GRAPH,
GIT_MERGE, GIT_MERGE_CONFLICT, GIT_PULL_REQUEST, GIT_PULL_REQUEST_ARROW, GIT_PULL_REQUEST_CLOSED,
GIT_PULL_REQUEST_CREATE, GIT_PULL_REQUEST_CREATE_ARROW, GIT_PULL_REQUEST_DRAFT, GLASSES,
GLASS_WATER, GLOBE, GLOBE_CHECK, GLOBE_LOCK, GLOBE_OFF, GLOBE_X, GOAL, GPU, GRADUATION_CAP, GRAPE,
GRID_2X2, GRID_2X2_CHECK, GRID_2X2_PLUS, GRID_2X2_X, GRID_3X2, GRID_3X3, GRIP, GRIP_HORIZONTAL,
GRIP_VERTICAL, GROUP, GUITAR, HAM, HAMBURGER, HAMMER, HAND, HANDBAG, HANDSHAKE, HAND_COINS,
HAND_FIST, HAND_GRAB, HAND_HEART, HAND_HELPING, HAND_METAL, HAND_PLATTER, HARD_DRIVE,
HARD_DRIVE_DOWNLOAD, HARD_DRIVE_UPLOAD, HARD_HAT, HASH, HAT_GLASSES, HAZE, HD, HDMI_PORT, HEADING,
HEADING_1, HEADING_2, HEADING_3, HEADING_4, HEADING_5, HEADING_6, HEADPHONES, HEADPHONE_OFF,
HEADSET, HEART, HEART_CRACK, HEART_HANDSHAKE, HEART_MINUS, HEART_OFF, HEART_PLUS, HEART_PULSE,
HEART_X, HEATER, HELICOPTER, HEXAGON, HIGHLIGHTER, HOP, HOP_OFF, HOSPITAL, HOTEL, HOURGLASS, HOUSE,
HOUSE_HEART, HOUSE_PLUG, HOUSE_PLUS, HOUSE_WIFI, ICE_CREAM_BOWL, ICE_CREAM_CONE, ID_CARD,
ID_CARD_LANYARD, IMAGE, IMAGES, IMAGE_DOWN, IMAGE_MINUS, IMAGE_OFF, IMAGE_PLAY, IMAGE_PLUS,
IMAGE_UP, IMAGE_UPSCALE, IMPORT, INBOX, INDIAN_RUPEE, INFINITY, INFO, INSPECTION_PANEL, INSPECTOR,
ITALIC, ITERATION_CCW, ITERATION_CW, JAPANESE_YEN, JOYSTICK, KANBAN, KAYAK, KEY, KEYBOARD,
KEYBOARD_MUSIC, KEYBOARD_OFF, KEY_ROUND, KEY_SQUARE, LAMP, LAMP_CEILING, LAMP_DESK, LAMP_FLOOR,
LAMP_WALL_DOWN, LAMP_WALL_UP, LANDMARK, LAND_PLOT, LANGUAGES, LAPTOP, LAPTOP_MINIMAL,
LAPTOP_MINIMAL_CHECK, LASSO, LASSO_SELECT, LAYERS, LAYERS_2, LAYERS_ARROW_DOWN, LAYERS_ARROW_UP,
LAYERS_MINUS, LAYERS_PLUS, LAYER_ARROW_DOWN, LAYER_ARROW_UP, LAYOUT_DASHBOARD, LAYOUT_FREEFORM,
LAYOUT_GRID, LAYOUT_LIST, LAYOUT_PANEL_LEFT, LAYOUT_PANEL_TOP, LAYOUT_TEMPLATE, LEAF, LEAFY_GREEN,
LECTERN, LENS_CONCAVE, LENS_CONVEX, LIBRARY, LIBRARY_BIG, LIFE_BUOY, LIGATURE, LIGHTBULB,
LIGHTBULB_OFF, LIGHTHOUSE, LINE_DOT_RIGHT_HORIZONTAL, LINE_SQUIGGLE, LINE_STYLE, LINK, LINK_2,
LINK_2_OFF, LIST, LIST_CHECK, LIST_CHECKS, LIST_CHEVRONS_DOWN_UP, LIST_CHEVRONS_UP_DOWN, LIST_CLOCK,
LIST_COLLAPSE, LIST_END, LIST_FILTER, LIST_FILTER_PLUS, LIST_INDENT_DECREASE, LIST_INDENT_INCREASE,
LIST_MINUS, LIST_MUSIC, LIST_ORDERED, LIST_PLUS, LIST_RESTART, LIST_SORT_ASCENDING,
LIST_SORT_DESCENDING, LIST_START, LIST_TODO, LIST_TREE, LIST_VIDEO, LIST_X, LOADER, LOADER_CIRCLE,
LOADER_PINWHEEL, LOCATE, LOCATE_FIXED, LOCATE_OFF, LOCK, LOCK_KEYHOLE, LOCK_KEYHOLE_OPEN, LOCK_OPEN,
LOGS, LOG_IN, LOG_OUT, LOLLIPOP, LUGGAGE, MAGNET, MAIL, MAILBOX, MAILS, MAIL_BADGE, MAIL_CHECK,
MAIL_CLOCK, MAIL_MINUS, MAIL_OPEN, MAIL_PEN, MAIL_PLUS, MAIL_QUESTION_MARK, MAIL_SEARCH,
MAIL_WARNING, MAIL_X, MAP, MAP_MINUS, MAP_PIN, MAP_PINNED, MAP_PIN_CHECK, MAP_PIN_CHECK_INSIDE,
MAP_PIN_HOUSE, MAP_PIN_MINUS, MAP_PIN_MINUS_INSIDE, MAP_PIN_OFF, MAP_PIN_PEN, MAP_PIN_PLUS,
MAP_PIN_PLUS_INSIDE, MAP_PIN_SEARCH, MAP_PIN_X, MAP_PIN_X_INSIDE, MAP_PLUS, MARS, MARS_STROKE,
MARTINI, MAXIMIZE, MAXIMIZE_2, MEDAL, MEGAPHONE, MEGAPHONE_OFF, MEMORY_STICK, MENU, MERGE,
MESSAGES_SQUARE, MESSAGE_CIRCLE, MESSAGE_CIRCLE_CHECK, MESSAGE_CIRCLE_CODE, MESSAGE_CIRCLE_DASHED,
MESSAGE_CIRCLE_DASHED_CHECK, MESSAGE_CIRCLE_HEART, MESSAGE_CIRCLE_MORE, MESSAGE_CIRCLE_OFF,
MESSAGE_CIRCLE_PLUS, MESSAGE_CIRCLE_QUESTION_MARK, MESSAGE_CIRCLE_REPLY, MESSAGE_CIRCLE_WARNING,
MESSAGE_CIRCLE_X, MESSAGE_SQUARE, MESSAGE_SQUARE_CHECK, MESSAGE_SQUARE_CODE, MESSAGE_SQUARE_DASHED,
MESSAGE_SQUARE_DIFF, MESSAGE_SQUARE_DOT, MESSAGE_SQUARE_HEART, MESSAGE_SQUARE_LOCK,
MESSAGE_SQUARE_MORE, MESSAGE_SQUARE_OFF, MESSAGE_SQUARE_PLUS, MESSAGE_SQUARE_QUOTE,
MESSAGE_SQUARE_REPLY, MESSAGE_SQUARE_SHARE, MESSAGE_SQUARE_TEXT, MESSAGE_SQUARE_WARNING,
MESSAGE_SQUARE_X, METRONOME, MIC, MICROCHIP, MICROSCOPE, MICROWAVE, MIC_AUDIO_LINES, MIC_OFF,
MIC_SIGNAL, MIC_VOCAL, MIDI_PORT, MILESTONE, MILK, MILK_OFF, MINIMIZE, MINIMIZE_2, MINUS,
MIRROR_RECTANGULAR, MIRROR_ROUND, MONITOR, MONITOR_CHECK, MONITOR_CLOUD, MONITOR_COG, MONITOR_DOT,
MONITOR_DOWN, MONITOR_OFF, MONITOR_PAUSE, MONITOR_PLAY, MONITOR_SMARTPHONE, MONITOR_SPEAKER,
MONITOR_STOP, MONITOR_UP, MONITOR_X, MOON, MOON_STAR, MOP, MOP_SPARKLES, MOSQUE, MOTORBIKE,
MOUNTAIN, MOUNTAIN_SNOW, MOUSE, MOUSE_LEFT, MOUSE_OFF, MOUSE_POINTER, MOUSE_POINTER_2,
MOUSE_POINTER_2_OFF, MOUSE_POINTER_BAN, MOUSE_POINTER_CLICK, MOUSE_RIGHT, MOVE, MOVE_3D,
MOVE_DIAGONAL, MOVE_DIAGONAL_2, MOVE_DOWN, MOVE_DOWN_LEFT, MOVE_DOWN_RIGHT, MOVE_HORIZONTAL,
MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_UP_LEFT, MOVE_UP_RIGHT, MOVE_VERTICAL, MUSIC, MUSIC_2, MUSIC_3,
MUSIC_4, NAVIGATION, NAVIGATION_2, NAVIGATION_2_OFF, NAVIGATION_OFF, NETWORK, NEWSPAPER, NFC,
NON_BINARY, NOTEBOOK, NOTEBOOK_PEN, NOTEBOOK_TABS, NOTEBOOK_TEXT, NOTEPAD_TEXT, NOTEPAD_TEXT_DASHED,
NUT, NUT_OFF, OCTAGON, OCTAGON_ALERT, OCTAGON_MINUS, OCTAGON_PAUSE, OCTAGON_X, OMEGA, OPTION, ORBIT,
ORIGAMI, PACKAGE, PACKAGE_2, PACKAGE_CHECK, PACKAGE_MINUS, PACKAGE_OPEN, PACKAGE_PLUS,
PACKAGE_SEARCH, PACKAGE_X, PAINTBRUSH, PAINTBRUSH_VERTICAL, PAINT_BUCKET, PAINT_ROLLER, PALETTE,
PANDA, PANELS_LEFT_BOTTOM, PANELS_RIGHT_BOTTOM, PANELS_TOP_LEFT, PANEL_BOTTOM, PANEL_BOTTOM_CLOSE,
PANEL_BOTTOM_DASHED, PANEL_BOTTOM_OPEN, PANEL_LEFT, PANEL_LEFT_CLOSE, PANEL_LEFT_DASHED,
PANEL_LEFT_OPEN, PANEL_LEFT_RIGHT_DASHED, PANEL_RIGHT, PANEL_RIGHT_CLOSE, PANEL_RIGHT_DASHED,
PANEL_RIGHT_OPEN, PANEL_TOP, PANEL_TOP_BOTTOM_DASHED, PANEL_TOP_CLOSE, PANEL_TOP_DASHED,
PANEL_TOP_OPEN, PAPERCLIP, PAPER_BAG, PARASOL, PARENTHESES, PARKING_METER, PARTY_POPPER, PAUSE,
PAW_PRINT, PC_CASE, PEN, PENCIL, PENCIL_LINE, PENCIL_OFF, PENCIL_RULER, PENCIL_SPARKLES, PENTAGON,
PEN_LINE, PEN_OFF, PEN_TOOL, PERCENT, PERSON_STANDING, PHI, PHILIPPINE_PESO, PHONE, PHONE_CALL,
PHONE_FORWARDED, PHONE_INCOMING, PHONE_MISSED, PHONE_OFF, PHONE_OUTGOING, PI, PIANO, PICKAXE,
PICTURE_IN_PICTURE, PICTURE_IN_PICTURE_2, PIGGY_BANK, PILCROW, PILCROW_LEFT, PILCROW_RIGHT, PILL,
PILL_BOTTLE, PIN, PIN_OFF, PIPETTE, PIZZA, PLANE, PLANE_LANDING, PLANE_TAKEOFF, PLAY, PLAYING_CARD,
PLAYING_CARDS, PLAYING_CARDS_FAN, PLAY_OFF, PLUG, PLUG_2, PLUG_ZAP, PLUS, POCKET_KNIFE, PODIUM,
POINTER, POINTER_OFF, POPCORN, POPSICLE, POUND_STERLING, POWER, POWER_OFF, PRESENTATION, PRINTER,
PRINTER_CHECK, PRINTER_X, PROJECTOR, PROPORTIONS, PUZZLE, PYRAMID, QR_CODE, QUOTE, RABBIT, RADAR,
RADIATION, RADICAL, RADIO, RADIO_OFF, RADIO_RECEIVER, RADIO_TOWER, RADIUS, RAINBOW, RAT, RATIO,
RECEIPT, RECEIPT_CENT, RECEIPT_EURO, RECEIPT_INDIAN_RUPEE, RECEIPT_JAPANESE_YEN,
RECEIPT_POUND_STERLING, RECEIPT_RUSSIAN_RUBLE, RECEIPT_SWISS_FRANC, RECEIPT_TEXT,
RECEIPT_TURKISH_LIRA, RECTANGLE_CIRCLE, RECTANGLE_ELLIPSIS, RECTANGLE_GOGGLES, RECTANGLE_HORIZONTAL,
RECTANGLE_VERTICAL, RECYCLE, REDO, REDO_2, REDO_DOT, REFRESH_CCW, REFRESH_CCW_DOT, REFRESH_CW,
REFRESH_CW_OFF, REFRIGERATOR, REGEX, REMOVE_FORMATTING, REPEAT, REPEAT_1, REPEAT_2, REPEAT_OFF,
REPLACE, REPLACE_ALL, REPLY, REPLY_ALL, RESIZE_CORNER, REWIND, RIBBON, ROAD, ROBOT_ARM,
ROBOT_VACUUM, ROCKET, ROCKING_CHAIR, ROLLER_COASTER, ROSE, ROTATE_3D, ROTATE_CCW, ROTATE_CCW_CLOCK,
ROTATE_CCW_KEY, ROTATE_CCW_SQUARE, ROTATE_CW, ROTATE_CW_FADING_CLOCK, ROTATE_CW_SQUARE, ROUTE,
ROUTER, ROUTE_OFF, ROWS_2, ROWS_3, ROWS_4, RSS, RULER, RULER_DIMENSION_LINE, RUSSIAN_RUBLE,
SAILBOAT, SALAD, SANDWICH, SATELLITE, SATELLITE_DISH, SAUDI_RIYAL, SAVE, SAVE_ALL, SAVE_CHECK,
SAVE_OFF, SAVE_PEN, SAVE_PLUS, SCALE, SCALE_3D, SCALING, SCAN, SCAN_BARCODE, SCAN_BOX, SCAN_EYE,
SCAN_FACE, SCAN_HEART, SCAN_LINE, SCAN_QR_CODE, SCAN_SEARCH, SCAN_SQUARE, SCAN_TEXT, SCHOOL,
SCISSORS, SCISSORS_LINE_DASHED, SCOOTER, SCREEN_SHARE, SCREEN_SHARE_OFF, SCROLL, SCROLL_TEXT,
SEARCH, SEARCH_ALERT, SEARCH_CHECK, SEARCH_CODE, SEARCH_SLASH, SEARCH_X, SECTION, SEND,
SEND_HORIZONTAL, SEND_TO_BACK, SEPARATOR_HORIZONTAL, SEPARATOR_VERTICAL, SERVER, SERVER_COG,
SERVER_CRASH, SERVER_OFF, SERVER_PLUS, SETTINGS, SETTINGS_2, SHAPES, SHARE, SHARE_2, SHEET, SHELL,
SHELVING_UNIT, SHIELD, SHIELD_ALERT, SHIELD_BAN, SHIELD_CHECK, SHIELD_COG, SHIELD_COG_CORNER,
SHIELD_ELLIPSIS, SHIELD_HALF, SHIELD_KEYHOLE, SHIELD_LOCK, SHIELD_MINUS, SHIELD_OFF, SHIELD_PLUS,
SHIELD_QUESTION_MARK, SHIELD_USER, SHIELD_X, SHIP, SHIP_CARGO, SHIP_WHEEL, SHIRT, SHOPPING_BAG,
SHOPPING_BASKET, SHOPPING_CART, SHOPPING_CART_MINUS, SHOPPING_CART_PLUS, SHOVEL, SHOWER_HEAD,
SHREDDER, SHRIMP, SHRIMP_OFF, SHRINK, SHRUB, SHUFFLE, SIGMA, SIGNAL, SIGNAL_HIGH, SIGNAL_LOW,
SIGNAL_MEDIUM, SIGNAL_ZERO, SIGNATURE, SIGNPOST, SIGNPOST_BIG, SIREN, SKIP_BACK, SKIP_FORWARD,
SKULL, SLASH, SLICE, SLIDERS_HORIZONTAL, SLIDERS_VERTICAL, SMARTPHONE, SMARTPHONE_CHARGING,
SMARTPHONE_NFC, SNAIL, SNOWFLAKE, SOAP_DISPENSER_DROPLET, SOFA, SOLAR_PANEL, SORT_ASCENDING,
SORT_DESCENDING, SOUP, SPACE, SPADE, SPARKLE, SPARKLES, SPEAKER, SPEECH, SPELL_CHECK, SPELL_CHECK_2,
SPLINE, SPLINE_POINTER, SPLIT, SPOOL, SPORT_SHOE, SPOTLIGHT, SPRAY_CAN, SPROUT, SQUARE,
SQUARES_EXCLUDE, SQUARES_INTERSECT, SQUARES_SUBTRACT, SQUARES_UNITE, SQUARE_ACTIVITY,
SQUARE_ARROW_DOWN, SQUARE_ARROW_DOWN_LEFT, SQUARE_ARROW_DOWN_RIGHT, SQUARE_ARROW_LEFT,
SQUARE_ARROW_OUT_DOWN_LEFT, SQUARE_ARROW_OUT_DOWN_RIGHT, SQUARE_ARROW_OUT_UP_LEFT,
SQUARE_ARROW_OUT_UP_RIGHT, SQUARE_ARROW_RIGHT, SQUARE_ARROW_RIGHT_ENTER, SQUARE_ARROW_RIGHT_EXIT,
SQUARE_ARROW_UP, SQUARE_ARROW_UP_LEFT, SQUARE_ARROW_UP_RIGHT, SQUARE_ASTERISK,
SQUARE_BOTTOM_DASHED_SCISSORS, SQUARE_CENTERLINE_DASHED_HORIZONTAL,
SQUARE_CENTERLINE_DASHED_VERTICAL, SQUARE_CHART_GANTT, SQUARE_CHECK, SQUARE_CHECK_BIG,
SQUARE_CHEVRON_DOWN, SQUARE_CHEVRON_LEFT, SQUARE_CHEVRON_RIGHT, SQUARE_CHEVRON_UP, SQUARE_CODE,
SQUARE_DASHED, SQUARE_DASHED_BOTTOM, SQUARE_DASHED_BOTTOM_CODE, SQUARE_DASHED_KANBAN,
SQUARE_DASHED_MOUSE_POINTER, SQUARE_DASHED_TEXT, SQUARE_DASHED_TOP_SOLID, SQUARE_DIMENSIONS,
SQUARE_DIVIDE, SQUARE_DOT, SQUARE_EQUAL, SQUARE_EXCLAMATION_POINT, SQUARE_FUNCTION, SQUARE_KANBAN,
SQUARE_LIBRARY, SQUARE_M, SQUARE_MENU, SQUARE_MINUS, SQUARE_MOUSE_POINTER, SQUARE_OFF,
SQUARE_PARKING, SQUARE_PARKING_OFF, SQUARE_PAUSE, SQUARE_PEN, SQUARE_PERCENT, SQUARE_PI,
SQUARE_PILCROW, SQUARE_PLAY, SQUARE_PLUS, SQUARE_POWER, SQUARE_RADICAL, SQUARE_ROUND_CORNER,
SQUARE_SCISSORS, SQUARE_SIGMA, SQUARE_SLASH, SQUARE_SPLIT_HORIZONTAL, SQUARE_SPLIT_VERTICAL,
SQUARE_SQUARE, SQUARE_STACK, SQUARE_STAR, SQUARE_STOP, SQUARE_TERMINAL, SQUARE_TEXT, SQUARE_USER,
SQUARE_USER_ROUND, SQUARE_X, SQUIRCLE, SQUIRCLE_DASHED, SQUIRREL, STAMP, STAR, STAR_CHECK,
STAR_FILL, STAR_HALF, STAR_MINUS, STAR_OFF, STAR_PLUS, STAR_X, STEP_BACK, STEP_FORWARD, STETHOSCOPE,
STICKER, STICKY_NOTE, STICKY_NOTES, STICKY_NOTE_CHECK, STICKY_NOTE_MINUS, STICKY_NOTE_OFF,
STICKY_NOTE_PLUS, STICKY_NOTE_X, STONE, STORE, STRETCH_HORIZONTAL, STRETCH_VERTICAL, STRIKETHROUGH,
SUBSCRIPT, SUMMARY, SUN, SUNRISE, SUNSET, SUN_DIM, SUN_MEDIUM, SUN_MOON, SUN_SNOW, SUPERSCRIPT,
SWATCH_BOOK, SWISS_FRANC, SWITCH_CAMERA, SWORD, SWORDS, SYRINGE, TABLE, TABLET, TABLETS,
TABLET_SMARTPHONE, TABLE_2, TABLE_CELLS_MERGE, TABLE_CELLS_SPLIT, TABLE_COLUMNS_SPLIT,
TABLE_OF_CONTENTS, TABLE_PROPERTIES, TABLE_ROWS_SPLIT, TAG, TAGS, TAG_PLUS, TAG_X, TALLY_1, TALLY_2,
TALLY_3, TALLY_4, TALLY_5, TANGENT, TARGET, TELESCOPE, TENT, TENT_TREE, TERMINAL, TEST_TUBE,
TEST_TUBES, TEST_TUBE_DIAGONAL, TEXT_ALIGN_CENTER, TEXT_ALIGN_END, TEXT_ALIGN_JUSTIFY,
TEXT_ALIGN_START, TEXT_CURSOR, TEXT_CURSOR_INPUT, TEXT_INITIAL, TEXT_QUOTE, TEXT_SEARCH, TEXT_WRAP,
THEATER, THERMOMETER, THERMOMETER_SNOWFLAKE, THERMOMETER_SUN, THUMBS_DOWN, THUMBS_UP, TICKET,
TICKETS, TICKETS_PLANE, TICKET_CHECK, TICKET_MINUS, TICKET_PERCENT, TICKET_PLUS, TICKET_SLASH,
TICKET_X, TIC_TAC_TOE, TIMELINE, TIMER, TIMER_OFF, TIMER_RESET, TOGGLE_LEFT, TOGGLE_RIGHT, TOILET,
TOOLBOX, TOOL_CASE, TORNADO, TORUS, TOUCHPAD, TOUCHPAD_OFF, TOWEL_RACK, TOWER_CONTROL, TOY_BRICK,
TRACTOR, TRAFFIC_CONE, TRAILER, TRAIN_FRONT, TRAIN_FRONT_TUNNEL, TRAIN_TRACK, TRAM_FRONT,
TRANSGENDER, TRASH, TRASH_OFF, TREES, TREE_DECIDUOUS, TREE_PALM, TREE_PINE, TRENDING_DOWN,
TRENDING_UP, TRENDING_UP_DOWN, TRIANGLE, TRIANGLE_ALERT, TRIANGLE_DASHED, TRIANGLE_RIGHT, TROPHY,
TRUCK, TRUCK_ELECTRIC, TURKISH_LIRA, TURNTABLE, TURTLE, TV, TV_MINIMAL, TV_MINIMAL_PLAY, TYPE,
TYPE_OUTLINE, UMBRELLA, UMBRELLA_OFF, UNDERLINE, UNDO, UNDO_2, UNDO_DOT, UNFOLD_HORIZONTAL,
UNFOLD_VERTICAL, UNGROUP, UNIVERSITY, UNLINK, UNLINK_2, UNPLUG, UPLOAD, USB, USB_C_PORT, USER,
USERS, USERS_ROUND, USER_CHECK, USER_COG, USER_GROUP, USER_KEY, USER_LOCK, USER_MINUS, USER_PEN,
USER_PLUS, USER_ROUND, USER_ROUND_ARROW_LEFT, USER_ROUND_CHECK, USER_ROUND_COG, USER_ROUND_GROUP,
USER_ROUND_KEY, USER_ROUND_MINUS, USER_ROUND_PEN, USER_ROUND_PLUS, USER_ROUND_SEARCH, USER_ROUND_X,
USER_SEARCH, USER_SHIELD, USER_STAR, USER_X, UTENSILS, UTENSILS_CROSSED, UTILITY_POLE, VAN,
VARIABLE, VAULT, VECTOR_POLYGON, VECTOR_SQUARE, VEGAN, VENETIAN_MASK, VENUS, VENUS_AND_MARS,
VIBRATE, VIBRATE_OFF, VIDEO, VIDEOTAPE, VIDEO_OFF, VIEW, VIRUS, VIRUS_OFF, VOICEMAIL, VOLLEYBALL,
VOLUME, VOLUME_1, VOLUME_2, VOLUME_OFF, VOLUME_X, VOTE, WALLET, WALLET_CARDS, WALLET_MINIMAL,
WALLPAPER, WAND, WAND_SPARKLES, WAREHOUSE, WASHING_MACHINE, WATCH, WAVES_ARROW_DOWN, WAVES_ARROW_UP,
WAVES_HORIZONTAL, WAVES_LADDER, WAVES_VERTICAL, WAYPOINTS, WEBCAM, WEBCAM_OFF, WEBHOOK, WEBHOOK_OFF,
WEIGHT, WEIGHT_TILDE, WHEAT, WHEAT_OFF, WHISTLE, WHOLE_WORD, WIFI, WIFI_COG, WIFI_HIGH, WIFI_LOW,
WIFI_OFF, WIFI_PEN, WIFI_SYNC, WIFI_ZERO, WIND, WINDOW_CLOSE, WINDOW_MAXIMIZE, WINDOW_MINIMIZE,
WINDOW_RESTORE, WIND_ARROW_DOWN, WINE, WINE_OFF, WORKFLOW, WORM, WRENCH, WRENCH_OFF, X, X_LINE_TOP,
ZAP, ZAP_OFF, ZODIAC_AQUARIUS, ZODIAC_ARIES, ZODIAC_CANCER, ZODIAC_CAPRICORN, ZODIAC_GEMINI,
ZODIAC_LEO, ZODIAC_LIBRA, ZODIAC_OPHIUCHUS, ZODIAC_PISCES, ZODIAC_SAGITTARIUS, ZODIAC_SCORPIO,
ZODIAC_TAURUS, ZODIAC_VIRGO, ZOOM_IN, ZOOM_OUT

gpui-kit-assets

  • __component_svg_icons!($icon:ty) — new #[doc(hidden)] exported macro generating Component's associated constants across the crate boundary. This is explicitly internal, not a supported application extension point.

No existing public item is changed or removed; no JavaScript or TypeScript API changes.

How to Test

Validated on macOS:

  • cargo check -p gpui-component -p gpui-kit --locked
  • cargo test -p gpui-component --lib icon --locked — 20 passed, including byte conversion and native-menu resolution.
  • cargo test -p gpui-kit --test assets --locked — 3 passed, including old enums, custom IconNamed, and new icon slots.
  • cargo test -p gpui-kit-assets --test icons --locked — 5 passed for the existing catalog, defaults, and selection macro.
  • cargo clippy -p gpui-component -p gpui-kit --lib --locked -- --deny warnings
  • cargo check -p gpui-component-story --locked
  • cargo run -p gpui-component-story --locked -- Icon — built and launched. Window automation could not identify the standalone process, so visual appearance has not been confirmed. Manually inspect the new “Embedded catalog icons” section and its “Set alarm” button.
  • Changed Rust files passed rustfmt --check; changed API/docs passed typos; git diff --check passed.

A temporary external package depending on this Kit checkout was built with cargo build --release --offline, with symbol stripping and no explicit LTO override. Its main passed each Icon::new(SvgIcon::...) through std::hint::black_box. Scanning each executable for every catalog SVG's complete bytes produced:

Referenced constants SVG payloads present Executable bytes
None None 1,309,216
ACCESSIBILITY accessibility 1,309,616
ACCESSIBILITY, ALARM_CLOCK accessibility, alarm-clock 1,309,616
Remove ALARM_CLOCK accessibility 1,309,616

The byte scan, rather than total size alone, confirms removal: alignment can hide payload-size differences. These figures describe the small probe, not a full application's size or runtime memory. The temporary verification script is not included in this PR. Windows/Linux/WASM execution was not performed locally.

Checklist

  • I have read CONTRIBUTING.md and followed the guidelines.
  • Reviewed the implementation and checked the AI-assisted changes against the tests above.
  • Built and launched the affected Icon Story; visual verification limitation recorded above.
  • Tested Windows and Linux locally.

Implementation, tests, and documentation were written with Codex assistance.

@huacnlee

This comment was marked as duplicate.

@huacnlee huacnlee left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand the motivation: keeping the icon_assets! selection list in sync with Rust use sites requires separate maintenance, and stale entries can retain unused SVG payloads. SvgIcon makes resource inclusion follow reachable Rust references instead.

However, I do not think this benefit justifies introducing another public icon API. gpui-kit-assets and IconName already provide the shared catalog and its selection/loading mechanisms. Exposing the same catalog through SvgIcon and another set of constants duplicates that functionality and adds long-term API maintenance cost.

Please reconsider this approach rather than proceeding with the additional SvgIcon API. If selection-list maintenance is a significant practical problem, explore a solution within the existing assets and IconName design, or provide a concrete use case demonstrating why that design cannot reasonably address it. The objection is to the proposed product/API scope, not an implementation correctness defect.

Please address the findings above, then request my review again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Icon: Add independently referenced SVG constants alongside asset sources

2 participants