import React, { forwardRef, useContext, HTMLAttributes } from "react"; import classNames from "classnames"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { library, FlipProp } from "@fortawesome/fontawesome-svg-core"; // far import { faEnvelope as faEnvelopeRegular } from "@fortawesome/free-regular-svg-icons/faEnvelope"; import { faFileAlt } from "@fortawesome/free-regular-svg-icons/faFileAlt"; import { faQuestionCircle as faQuestionCircleRegular } from "@fortawesome/free-regular-svg-icons/faQuestionCircle"; import { faUser as faUserRegular } from "@fortawesome/free-regular-svg-icons/faUser"; import { faCheckCircle as faCheckCircleRegular } from "@fortawesome/free-regular-svg-icons/faCheckCircle"; import { faCircle as faCircleRegular } from "@fortawesome/free-regular-svg-icons/faCircle"; import { faTimesCircle as faTimesCircleRegular } from "@fortawesome/free-regular-svg-icons/faTimesCircle"; import { faClock } from "@fortawesome/free-regular-svg-icons/faClock"; import { faKeyboard } from "@fortawesome/free-regular-svg-icons/faKeyboard"; import { faStar } from "@fortawesome/free-regular-svg-icons/faStar"; import { faThumbsDown as faThumbsDownRegular } from "@fortawesome/free-regular-svg-icons/faThumbsDown"; import { faThumbsUp as faThumbsUpRegular } from "@fortawesome/free-regular-svg-icons/faThumbsUp"; import { faCopy as faCopyRegular } from "@fortawesome/free-regular-svg-icons/faCopy"; // fas import { faArchive } from "@fortawesome/free-solid-svg-icons/faArchive"; import { faArrowDown } from "@fortawesome/free-solid-svg-icons/faArrowDown"; import { faArrowLeft } from "@fortawesome/free-solid-svg-icons/faArrowLeft"; import { faArrowRight } from "@fortawesome/free-solid-svg-icons/faArrowRight"; import { faArrowsAlt } from "@fortawesome/free-solid-svg-icons/faArrowsAlt"; import { faArrowUp } from "@fortawesome/free-solid-svg-icons/faArrowUp"; import { faBackward } from "@fortawesome/free-solid-svg-icons/faBackward"; import { faBalanceScale } from "@fortawesome/free-solid-svg-icons/faBalanceScale"; import { faBan } from "@fortawesome/free-solid-svg-icons/faBan"; import { faBandAid } from "@fortawesome/free-solid-svg-icons/faBandAid"; import { faBars } from "@fortawesome/free-solid-svg-icons/faBars"; import { faBatteryHalf } from "@fortawesome/free-solid-svg-icons/faBatteryHalf"; import { faBed } from "@fortawesome/free-solid-svg-icons/faBed"; import { faBell } from "@fortawesome/free-solid-svg-icons/faBell"; import { faBell as faBellRegular } from "@fortawesome/free-regular-svg-icons/faBell"; import { faBellSlash } from "@fortawesome/free-solid-svg-icons/faBellSlash"; import { faBellSlash as faBellSlashRegular } from "@fortawesome/free-regular-svg-icons/faBellSlash"; import { faBiohazard } from "@fortawesome/free-solid-svg-icons/faBiohazard"; import { faBirthdayCake } from "@fortawesome/free-solid-svg-icons/faBirthdayCake"; import { faBold } from "@fortawesome/free-solid-svg-icons/faBold"; import { faBolt } from "@fortawesome/free-solid-svg-icons/faBolt"; import { faBook } from "@fortawesome/free-solid-svg-icons/faBook"; import { faBox } from "@fortawesome/free-solid-svg-icons/faBox"; import { faBroom } from "@fortawesome/free-solid-svg-icons/faBroom"; import { faBug } from "@fortawesome/free-solid-svg-icons/faBug"; import { faBullhorn } from "@fortawesome/free-solid-svg-icons/faBullhorn"; import { faBullseye } from "@fortawesome/free-solid-svg-icons/faBullseye"; import { faCalculator } from "@fortawesome/free-solid-svg-icons/faCalculator"; import { faCalendar } from "@fortawesome/free-solid-svg-icons/faCalendar"; import { faCamera } from "@fortawesome/free-solid-svg-icons/faCamera"; import { faCaretDown } from "@fortawesome/free-solid-svg-icons/faCaretDown"; import { faCaretLeft } from "@fortawesome/free-solid-svg-icons/faCaretLeft"; import { faCaretRight } from "@fortawesome/free-solid-svg-icons/faCaretRight"; import { faCaretUp } from "@fortawesome/free-solid-svg-icons/faCaretUp"; import { faChartBar } from "@fortawesome/free-solid-svg-icons/faChartBar"; import { faChartLine } from "@fortawesome/free-solid-svg-icons/faChartLine"; import { faCheck } from "@fortawesome/free-solid-svg-icons/faCheck"; import { faCheckCircle } from "@fortawesome/free-solid-svg-icons/faCheckCircle"; import { faCheckSquare } from "@fortawesome/free-solid-svg-icons/faCheckSquare"; import { faChevronDown } from "@fortawesome/free-solid-svg-icons/faChevronDown"; import { faChevronLeft } from "@fortawesome/free-solid-svg-icons/faChevronLeft"; import { faChevronRight } from "@fortawesome/free-solid-svg-icons/faChevronRight"; import { faChevronUp } from "@fortawesome/free-solid-svg-icons/faChevronUp"; import { faCircle } from "@fortawesome/free-solid-svg-icons/faCircle"; import { faCircleNotch } from "@fortawesome/free-solid-svg-icons/faCircleNotch"; import { faClipboard } from "@fortawesome/free-solid-svg-icons/faClipboard"; import { faClipboardCheck } from "@fortawesome/free-solid-svg-icons/faClipboardCheck"; import { faClock as faClockSolid } from "@fortawesome/free-solid-svg-icons/faClock"; import { faClone } from "@fortawesome/free-solid-svg-icons/faClone"; import { faCloudDownloadAlt } from "@fortawesome/free-solid-svg-icons/faCloudDownloadAlt"; import { faCloudShowersHeavy } from "@fortawesome/free-solid-svg-icons/faCloudShowersHeavy"; import { faCloudUploadAlt } from "@fortawesome/free-solid-svg-icons/faCloudUploadAlt"; import { faCodeBranch } from "@fortawesome/free-solid-svg-icons/faCodeBranch"; import { faCog } from "@fortawesome/free-solid-svg-icons/faCog"; import { faCoins } from "@fortawesome/free-solid-svg-icons/faCoins"; import { faColumns } from "@fortawesome/free-solid-svg-icons/faColumns"; import { faCommentAlt } from "@fortawesome/free-solid-svg-icons/faCommentAlt"; import { faCompass } from "@fortawesome/free-solid-svg-icons/faCompass"; import { faCompress } from "@fortawesome/free-solid-svg-icons/faCompress"; import { faCompressArrowsAlt } from "@fortawesome/free-solid-svg-icons/faCompressArrowsAlt"; import { faCopy as faCopySolid } from "@fortawesome/free-solid-svg-icons/faCopy"; import { faCrosshairs } from "@fortawesome/free-solid-svg-icons/faCrosshairs"; import { faCrown } from "@fortawesome/free-solid-svg-icons/faCrown"; import { faDoorClosed } from "@fortawesome/free-solid-svg-icons/faDoorClosed"; import { faDoorOpen } from "@fortawesome/free-solid-svg-icons/faDoorOpen"; import { faDownload } from "@fortawesome/free-solid-svg-icons/faDownload"; import { faDungeon } from "@fortawesome/free-solid-svg-icons/faDungeon"; import { faEdit } from "@fortawesome/free-solid-svg-icons/faEdit"; import { faEllipsisH } from "@fortawesome/free-solid-svg-icons/faEllipsisH"; import { faEllipsisV } from "@fortawesome/free-solid-svg-icons/faEllipsisV"; import { faEnvelope } from "@fortawesome/free-solid-svg-icons/faEnvelope"; import { faEnvelopeOpenText } from "@fortawesome/free-solid-svg-icons/faEnvelopeOpenText"; import { faEraser } from "@fortawesome/free-solid-svg-icons/faEraser"; import { faExchangeAlt } from "@fortawesome/free-solid-svg-icons/faExchangeAlt"; import { faExclamation } from "@fortawesome/free-solid-svg-icons/faExclamation"; import { faExclamationCircle } from "@fortawesome/free-solid-svg-icons/faExclamationCircle"; import { faExclamationTriangle } from "@fortawesome/free-solid-svg-icons/faExclamationTriangle"; import { faExpand } from "@fortawesome/free-solid-svg-icons/faExpand"; import { faExpandArrowsAlt } from "@fortawesome/free-solid-svg-icons/faExpandArrowsAlt"; import { faExternalLinkAlt } from "@fortawesome/free-solid-svg-icons/faExternalLinkAlt"; import { faExternalLinkSquareAlt } from "@fortawesome/free-solid-svg-icons/faExternalLinkSquareAlt"; import { faEye } from "@fortawesome/free-solid-svg-icons/faEye"; import { faEyeSlash } from "@fortawesome/free-solid-svg-icons/faEyeSlash"; import { faFastBackward } from "@fortawesome/free-solid-svg-icons/faFastBackward"; import { faFastForward } from "@fortawesome/free-solid-svg-icons/faFastForward"; import { faFeatherAlt } from "@fortawesome/free-solid-svg-icons/faFeatherAlt"; import { faFile } from "@fortawesome/free-solid-svg-icons/faFile"; import { faFileAlt as faFileAltSolid } from "@fortawesome/free-solid-svg-icons/faFileAlt"; import { faFileExport } from "@fortawesome/free-solid-svg-icons/faFileExport"; import { faFileImport } from "@fortawesome/free-solid-svg-icons/faFileImport"; import { faFileSignature } from "@fortawesome/free-solid-svg-icons/faFileSignature"; import { faFillDrip } from "@fortawesome/free-solid-svg-icons/faFillDrip"; import { faFilter } from "@fortawesome/free-solid-svg-icons/faFilter"; import { faFlag } from "@fortawesome/free-solid-svg-icons/faFlag"; import { faFlask } from "@fortawesome/free-solid-svg-icons/faFlask"; import { faFolder } from "@fortawesome/free-solid-svg-icons/faFolder"; import { faFolderOpen } from "@fortawesome/free-solid-svg-icons/faFolderOpen"; import { faForward } from "@fortawesome/free-solid-svg-icons/faForward"; import { faGavel } from "@fortawesome/free-solid-svg-icons/faGavel"; import { faGift } from "@fortawesome/free-solid-svg-icons/faGift"; import { faGlobeAmericas } from "@fortawesome/free-solid-svg-icons/faGlobeAmericas"; import { faGlobeEurope } from "@fortawesome/free-solid-svg-icons/faGlobeEurope"; import { faGripLines } from "@fortawesome/free-solid-svg-icons/faGripLines"; import { faGripLinesVertical } from "@fortawesome/free-solid-svg-icons/faGripLinesVertical"; import { faHandHoldingHeart } from "@fortawesome/free-solid-svg-icons/faHandHoldingHeart"; import { faHandshake } from "@fortawesome/free-solid-svg-icons/faHandshake"; import { faHashtag } from "@fortawesome/free-solid-svg-icons/faHashtag"; import { faHeartBroken } from "@fortawesome/free-solid-svg-icons/faHeartBroken"; import { faHighlighter } from "@fortawesome/free-solid-svg-icons/faHighlighter"; import { faHistory } from "@fortawesome/free-solid-svg-icons/faHistory"; import { faIdBadge } from "@fortawesome/free-solid-svg-icons/faIdBadge"; import { faImage } from "@fortawesome/free-solid-svg-icons/faImage"; import { faInfoCircle } from "@fortawesome/free-solid-svg-icons/faInfoCircle"; import { faItalic } from "@fortawesome/free-solid-svg-icons/faItalic"; import { faKey } from "@fortawesome/free-solid-svg-icons/faKey"; import { faLaptop } from "@fortawesome/free-solid-svg-icons/faLaptop"; import { faLayerGroup } from "@fortawesome/free-solid-svg-icons/faLayerGroup"; import { faLevelUpAlt } from "@fortawesome/free-solid-svg-icons/faLevelUpAlt"; import { faLifeRing } from "@fortawesome/free-solid-svg-icons/faLifeRing"; import { faLink } from "@fortawesome/free-solid-svg-icons/faLink"; import { faListOl } from "@fortawesome/free-solid-svg-icons/faListOl"; import { faListUl } from "@fortawesome/free-solid-svg-icons/faListUl"; import { faLock } from "@fortawesome/free-solid-svg-icons/faLock"; import { faLongArrowAltRight } from "@fortawesome/free-solid-svg-icons/faLongArrowAltRight"; import { faMagic } from "@fortawesome/free-solid-svg-icons/faMagic"; import { faMapMarkerAlt } from "@fortawesome/free-solid-svg-icons/faMapMarkerAlt"; import { faMapSigns } from "@fortawesome/free-solid-svg-icons/faMapSigns"; import { faMeteor } from "@fortawesome/free-solid-svg-icons/faMeteor"; import { faMinus } from "@fortawesome/free-solid-svg-icons/faMinus"; import { faMinusCircle } from "@fortawesome/free-solid-svg-icons/faMinusCircle"; import { faMoneyBill } from "@fortawesome/free-solid-svg-icons/faMoneyBill"; import { faMoneyBillWave } from "@fortawesome/free-solid-svg-icons/faMoneyBillWave"; import { faMoneyCheckAlt } from "@fortawesome/free-solid-svg-icons/faMoneyCheckAlt"; import { faMousePointer } from "@fortawesome/free-solid-svg-icons/faMousePointer"; import { faPalette } from "@fortawesome/free-solid-svg-icons/faPalette"; import { faPaperclip } from "@fortawesome/free-solid-svg-icons/faPaperclip"; import { faPaperPlane } from "@fortawesome/free-solid-svg-icons/faPaperPlane"; import { faPaste } from "@fortawesome/free-solid-svg-icons/faPaste"; import { faPause } from "@fortawesome/free-solid-svg-icons/faPause"; import { faPen } from "@fortawesome/free-solid-svg-icons/faPen"; import { faPencilRuler } from "@fortawesome/free-solid-svg-icons/faPencilRuler"; import { faPlay } from "@fortawesome/free-solid-svg-icons/faPlay"; import { faPlug } from "@fortawesome/free-solid-svg-icons/faPlug"; import { faPlus } from "@fortawesome/free-solid-svg-icons/faPlus"; import { faPlusCircle } from "@fortawesome/free-solid-svg-icons/faPlusCircle"; import { faPooStorm } from "@fortawesome/free-solid-svg-icons/faPooStorm"; import { faQuestion } from "@fortawesome/free-solid-svg-icons/faQuestion"; import { faQuestionCircle } from "@fortawesome/free-solid-svg-icons/faQuestionCircle"; import { faRandom } from "@fortawesome/free-solid-svg-icons/faRandom"; import { faRedo } from "@fortawesome/free-solid-svg-icons/faRedo"; import { faReply } from "@fortawesome/free-solid-svg-icons/faReply"; import { faRobot } from "@fortawesome/free-solid-svg-icons/faRobot"; import { faRocket } from "@fortawesome/free-solid-svg-icons/faRocket"; import { faRuler } from "@fortawesome/free-solid-svg-icons/faRuler"; import { faSave } from "@fortawesome/free-solid-svg-icons/faSave"; import { faScroll } from "@fortawesome/free-solid-svg-icons/faScroll"; import { faSearch } from "@fortawesome/free-solid-svg-icons/faSearch"; import { faSearchPlus } from "@fortawesome/free-solid-svg-icons/faSearchPlus"; import { faSeedling } from "@fortawesome/free-solid-svg-icons/faSeedling"; import { faServer } from "@fortawesome/free-solid-svg-icons/faServer"; import { faShare } from "@fortawesome/free-solid-svg-icons/faShare"; import { faShareAlt } from "@fortawesome/free-solid-svg-icons/faShareAlt"; import { faShieldAlt } from "@fortawesome/free-solid-svg-icons/faShieldAlt"; import { faSignal } from "@fortawesome/free-solid-svg-icons/faSignal"; import { faSignature } from "@fortawesome/free-solid-svg-icons/faSignature"; import { faSignOutAlt } from "@fortawesome/free-solid-svg-icons/faSignOutAlt"; import { faSitemap } from "@fortawesome/free-solid-svg-icons/faSitemap"; import { faSkull } from "@fortawesome/free-solid-svg-icons/faSkull"; import { faSlidersH } from "@fortawesome/free-solid-svg-icons/faSlidersH"; import { faSort } from "@fortawesome/free-solid-svg-icons/faSort"; import { faSortDown } from "@fortawesome/free-solid-svg-icons/faSortDown"; import { faSortUp } from "@fortawesome/free-solid-svg-icons/faSortUp"; import { faSpinner } from "@fortawesome/free-solid-svg-icons/faSpinner"; import { faSquare } from "@fortawesome/free-solid-svg-icons/faSquare"; import { faStamp } from "@fortawesome/free-solid-svg-icons/faStamp"; import { faStar as faStarSolid } from "@fortawesome/free-solid-svg-icons/faStar"; import { faStopwatch } from "@fortawesome/free-solid-svg-icons/faStopwatch"; import { faSuitcaseRolling } from "@fortawesome/free-solid-svg-icons/faSuitcaseRolling"; import { faSync } from "@fortawesome/free-solid-svg-icons/faSync"; import { faTable } from "@fortawesome/free-solid-svg-icons/faTable"; import { faTag } from "@fortawesome/free-solid-svg-icons/faTag"; import { faTasks } from "@fortawesome/free-solid-svg-icons/faTasks"; import { faThLarge } from "@fortawesome/free-solid-svg-icons/faThLarge"; import { faThumbsDown as faThumbsDownSolid } from "@fortawesome/free-solid-svg-icons/faThumbsDown"; import { faThumbsUp as faThumbsUpSolid } from "@fortawesome/free-solid-svg-icons/faThumbsUp"; import { faTicketAlt } from "@fortawesome/free-solid-svg-icons/faTicketAlt"; import { faTimes } from "@fortawesome/free-solid-svg-icons/faTimes"; import { faTimesCircle as faTimesCircleSolid } from "@fortawesome/free-solid-svg-icons/faTimesCircle"; import { faTools } from "@fortawesome/free-solid-svg-icons/faTools"; import { faTrash } from "@fortawesome/free-solid-svg-icons/faTrash"; import { faUndo } from "@fortawesome/free-solid-svg-icons/faUndo"; import { faUniversalAccess } from "@fortawesome/free-solid-svg-icons/faUniversalAccess"; import { faUnlink } from "@fortawesome/free-solid-svg-icons/faUnlink"; import { faUnlock } from "@fortawesome/free-solid-svg-icons/faUnlock"; import { faUser } from "@fortawesome/free-solid-svg-icons/faUser"; import { faUserAstronaut } from "@fortawesome/free-solid-svg-icons/faUserAstronaut"; import { faUserClock } from "@fortawesome/free-solid-svg-icons/faUserClock"; import { faUserFriends } from "@fortawesome/free-solid-svg-icons/faUserFriends"; import { faUserLock } from "@fortawesome/free-solid-svg-icons/faUserLock"; import { faUserPlus } from "@fortawesome/free-solid-svg-icons/faUserPlus"; import { faUsers } from "@fortawesome/free-solid-svg-icons/faUsers"; import { faUserSecret } from "@fortawesome/free-solid-svg-icons/faUserSecret"; import { faUserShield } from "@fortawesome/free-solid-svg-icons/faUserShield"; import { faVial } from "@fortawesome/free-solid-svg-icons/faVial"; import { faVideo } from "@fortawesome/free-solid-svg-icons/faVideo"; import { faWrench } from "@fortawesome/free-solid-svg-icons/faWrench"; import { faAward } from "@fortawesome/free-solid-svg-icons/faAward"; // Custom icon SVGs import { ArrowToBottom, ArrowToLeft, ArrowToRight, Automation, BadgeCheck, BrandConfluenceIcon, BrandDrata, BrandFront, BrandGoogleDriveIcon, BrandJira, BrandMicrosoftTeams, BrandNotion, BrandSalesforce, BrandSlack, BrandZendesk, CommentAltCheck, ConveyorAI, ConveyorLogoIcon, DialogCheck, DoNotEnter, FactCheck, Folders, Globe, InsertEnd, InsertMiddle, InsertStart, LibraryAdd, QueryStats, Scroll, ShieldCheck, Sparkle, TriangleDown, TriangleUp, } from "./svg"; import { StatusContext } from "../../contexts/status"; import { STATUS_VARIANT } from "../../types"; import { bemHOF } from "../../utilities"; import { SvgProps } from "../Svg"; const cn = bemHOF("Icon"); library.add( faArchive, faArrowDown, faArrowLeft, faArrowRight, faArrowsAlt, faArrowUp, faBackward, faBalanceScale, faBan, faBandAid, faBars, faBatteryHalf, faBed, faBell, faBellRegular, faBellSlash, faBellSlashRegular, faBiohazard, faBirthdayCake, faBold, faBolt, faBook, faBox, faBroom, faBug, faBullhorn, faBullseye, faCalculator, faCalendar, faCamera, faCaretDown, faCaretLeft, faCaretRight, faCaretUp, faChartBar, faChartLine, faCheck, faCheckCircle, faCheckCircleRegular, faCheckSquare, faChevronDown, faChevronLeft, faChevronRight, faChevronUp, faCircle, faCircleNotch, faCircleRegular, faClipboard, faClipboardCheck, faClock, faClockSolid, faClone, faCloudDownloadAlt, faCloudShowersHeavy, faCloudUploadAlt, faCodeBranch, faCog, faCoins, faColumns, faCommentAlt, faCompass, faCompress, faCompressArrowsAlt, faCopyRegular, faCopySolid, faCrosshairs, faCrown, faDoorClosed, faDoorOpen, faDownload, faDungeon, faEdit, faEllipsisH, faEllipsisV, faEnvelope, faEnvelopeRegular, faEnvelopeOpenText, faEraser, faExchangeAlt, faExclamation, faExclamationCircle, faExclamationTriangle, faExpand, faExpandArrowsAlt, faExternalLinkAlt, faExternalLinkSquareAlt, faEye, faEyeSlash, faFastBackward, faFastForward, faFeatherAlt, faFile, faFileAlt, faFileAltSolid, faFileExport, faFileImport, faFileSignature, faFillDrip, faFilter, faFlag, faFlask, faFolder, faFolderOpen, faForward, faGavel, faGift, faGlobeAmericas, faGlobeEurope, faGripLines, faGripLinesVertical, faHandHoldingHeart, faHandshake, faHashtag, faHeartBroken, faHighlighter, faHistory, faIdBadge, faImage, faInfoCircle, faItalic, faKey, faKeyboard, faLaptop, faLayerGroup, faLevelUpAlt, faLifeRing, faLink, faListOl, faListUl, faLock, faLongArrowAltRight, faMagic, faMapMarkerAlt, faMapSigns, faMeteor, faMinus, faMinusCircle, faMoneyBill, faMoneyBillWave, faMoneyCheckAlt, faMousePointer, faPalette, faPaperclip, faPaperPlane, faPaste, faPause, faPen, faPencilRuler, faPlay, faPlug, faPlus, faPlusCircle, faPooStorm, faQuestion, faQuestionCircle, faQuestionCircleRegular, faRandom, faRedo, faReply, faRobot, faRocket, faRuler, faSave, faScroll, faSearch, faSearchPlus, faSeedling, faServer, faShare, faShareAlt, faShieldAlt, faSignal, faSignature, faSignOutAlt, faSitemap, faSkull, faSlidersH, faSort, faSortDown, faSortUp, faSpinner, faSquare, faStamp, faStar, faStarSolid, faStopwatch, faSuitcaseRolling, faSync, faTable, faTag, faTasks, faThLarge, faThumbsDownRegular, faThumbsDownSolid, faThumbsUpRegular, faThumbsUpSolid, faTicketAlt, faTimes, faTimesCircleRegular, faTimesCircleSolid, faTools, faTrash, faUndo, faUniversalAccess, faUnlink, faUnlock, faUser, faUserAstronaut, faUserClock, faUserFriends, faUserLock, faUserPlus, faUserRegular, faUsers, faUserSecret, faUserShield, faVial, faVideo, faWrench, faAward, ); export enum CUSTOM_ICON_TYPE { ARROW_TO_BOTTOM = "arrow-to-bottom", ARROW_TO_LEFT = "arrow-to-left", ARROW_TO_RIGHT = "arrow-to-right", AUTOMATION = "automation", BADGE_CHECK = "badge-check", BRAND_CONFLUENCE = "brand-confluence", BRAND_DRATA = "brand-drata", BRAND_FRONT = "brand-front", BRAND_GOOGLE_DRIVE = "brand-google-drive", BRAND_JIRA = "brand-jira", BRAND_MICROSOFT_TEAMS = "brand-microsoft-teams", BRAND_NOTION = "brand-notion", BRAND_SALESFORCE = "brand-salesforce", BRAND_SLACK = "brand-slack", BRAND_ZENDESK = "brand-zendesk", COMMENT_ALT_CHECK = "comment-alt-check", CONVEYOR_AI = "conveyor-ai", CONVEYOR_LOGO = "conveyor-logo", DIALOG_CHECK = "dialog-check", DO_NOT_ENTER = "do-not-enter", FACT_CHECK = "fact-check", FOLDERS = "folders", GLOBE = "globe", INSERT_END = "insert-end", INSERT_MIDDLE = "insert-middle", INSERT_START = "insert-start", LIBRARY_ADD = "library-add", QUERY_STATS = "query-stats", SCROLL = "scroll", SHIELD_CHECK = "shield-check", SPARKLE = "sparkle", TRIANGLE_DOWN = "triangle-down", TRIANGLE_UP = "triangle-up", } type CustomIconPaths = Record< CUSTOM_ICON_TYPE, (props: SvgProps) => JSX.Element >; const CustomIcons: CustomIconPaths = { [CUSTOM_ICON_TYPE.ARROW_TO_BOTTOM]: ArrowToBottom, [CUSTOM_ICON_TYPE.ARROW_TO_LEFT]: ArrowToLeft, [CUSTOM_ICON_TYPE.ARROW_TO_RIGHT]: ArrowToRight, [CUSTOM_ICON_TYPE.AUTOMATION]: Automation, [CUSTOM_ICON_TYPE.BADGE_CHECK]: BadgeCheck, [CUSTOM_ICON_TYPE.BRAND_CONFLUENCE]: BrandConfluenceIcon, [CUSTOM_ICON_TYPE.BRAND_DRATA]: BrandDrata, [CUSTOM_ICON_TYPE.BRAND_FRONT]: BrandFront, [CUSTOM_ICON_TYPE.BRAND_GOOGLE_DRIVE]: BrandGoogleDriveIcon, [CUSTOM_ICON_TYPE.BRAND_JIRA]: BrandJira, [CUSTOM_ICON_TYPE.BRAND_MICROSOFT_TEAMS]: BrandMicrosoftTeams, [CUSTOM_ICON_TYPE.BRAND_NOTION]: BrandNotion, [CUSTOM_ICON_TYPE.BRAND_SALESFORCE]: BrandSalesforce, [CUSTOM_ICON_TYPE.BRAND_SLACK]: BrandSlack, [CUSTOM_ICON_TYPE.BRAND_ZENDESK]: BrandZendesk, [CUSTOM_ICON_TYPE.COMMENT_ALT_CHECK]: CommentAltCheck, [CUSTOM_ICON_TYPE.CONVEYOR_AI]: ConveyorAI, [CUSTOM_ICON_TYPE.CONVEYOR_LOGO]: ConveyorLogoIcon, [CUSTOM_ICON_TYPE.DIALOG_CHECK]: DialogCheck, [CUSTOM_ICON_TYPE.DO_NOT_ENTER]: DoNotEnter, [CUSTOM_ICON_TYPE.FACT_CHECK]: FactCheck, [CUSTOM_ICON_TYPE.FOLDERS]: Folders, [CUSTOM_ICON_TYPE.GLOBE]: Globe, [CUSTOM_ICON_TYPE.INSERT_END]: InsertEnd, [CUSTOM_ICON_TYPE.INSERT_MIDDLE]: InsertMiddle, [CUSTOM_ICON_TYPE.INSERT_START]: InsertStart, [CUSTOM_ICON_TYPE.LIBRARY_ADD]: LibraryAdd, [CUSTOM_ICON_TYPE.QUERY_STATS]: QueryStats, [CUSTOM_ICON_TYPE.SCROLL]: Scroll, [CUSTOM_ICON_TYPE.SHIELD_CHECK]: ShieldCheck, [CUSTOM_ICON_TYPE.SPARKLE]: Sparkle, [CUSTOM_ICON_TYPE.TRIANGLE_DOWN]: TriangleDown, [CUSTOM_ICON_TYPE.TRIANGLE_UP]: TriangleUp, }; export enum ICON_TYPE { ARCHIVE = "archive", ARROW_DOWN = "arrow-down", ARROW_LEFT = "arrow-left", ARROW_RIGHT = "arrow-right", ARROW_UP = "arrow-up", ARROWS_ALT = "arrows-alt", BACKWARD = "backward", BALANCE_SCALE = "balance-scale", BAN = "ban", BANDAID = "band-aid", BARS = "bars", BATTERY_HALF = "battery-half", BED = "bed", BELL = "bell", BELLSLASH = "bell-slash", BIOHAZARD = "biohazard", BIRTHDAY_CAKE = "birthday-cake", BOLD = "bold", BOLT = "bolt", BOOK = "book", BOX = "box", BROOM = "broom", BUG = "bug", BULLHORN = "bullhorn", BULLSEYE = "bullseye", CALENDAR = "calendar", CALCULATOR = "calculator", CAMERA = "camera", CARET_DOWN = "caret-down", CARET_LEFT = "caret-left", CARET_RIGHT = "caret-right", CARET_UP = "caret-up", CHART_BAR = "chart-bar", CHART_LINE = "chart-line", CHECK = "check", CHECK_CIRCLE = "check-circle", CHECK_SQUARE = "check-square", CHEVRON_DOWN = "chevron-down", CHEVRON_LEFT = "chevron-left", CHEVRON_RIGHT = "chevron-right", CHEVRON_UP = "chevron-up", CIRCLE = "circle", CIRCLE_NOTCH = "circle-notch", CLOCK = "clock", CLONE = "clone", CLIPBOARD = "clipboard", CLIPBOARD_CHECK = "clipboard-check", CLOUD_DOWNLOAD_ALT = "cloud-download-alt", CLOUD_UPLOAD_ALT = "cloud-upload-alt", CODE_BRANCH = "code-branch", COG = "cog", COINS = "coins", COLUMNS = "columns", COMMENT_ALT = "comment-alt", COMPASS = "compass", COMPRESS = "compress", COMPRESS_ARROWS_ALT = "compress-arrows-alt", CROSSHAIRS = "crosshairs", CROWN = "crown", COPY = "copy", DOOR_CLOSED = "door-closed", DOOR_OPEN = "door-open", DOWNLOAD = "download", DUNGEON = "dungeon", EDIT = "edit", ELLIPSIS_H = "ellipsis-h", ELLIPSIS_V = "ellipsis-v", ENVELOPE = "envelope", ENVELOPE_OPEN_TEXT = "envelope-open-text", ERASER = "eraser", EXCHANGE_ALT = "exchange-alt", EXCLAMATION = "exclamation", EXCLAMATION_CIRCLE = "exclamation-circle", EXCLAMATION_TRIANGLE = "exclamation-triangle", EXPAND = "expand", EXPAND_ARROWS_ALT = "expand-arrows-alt", EXTERNAL_LINK_ALT = "external-link-alt", EXTERNAL_LINK_SQUARE_ALT = "external-link-square-alt", EYE = "eye", EYE_SLASH = "eye-slash", FAST_BACKWARD = "fast-backward", FAST_FORWARD = "fast-forward", FEATHER_ALT = "feather-alt", FILE = "file", FILE_ALT = "file-alt", FILE_EXPORT = "file-export", FILE_IMPORT = "file-import", FILE_SIGNATURE = "file-signature", FILL_DRIP = "fill-drip", FILTER = "filter", FLAG = "flag", FLASK = "flask", FOLDER = "folder", FOLDER_OPEN = "folder-open", FORWARD = "forward", GAVEL = "gavel", GIFT = "gift", GLOBE_AMERICAS = "globe-americas", GLOBE_EUROPE = "globe-europe", GRIP_LINES = "grip-lines", GRIP_LINES_VERTICAL = "grip-lines-vertical", HAND_HOLDING_HEART = "hand-holding-heart", HANDSHAKE = "handshake", HASHTAG = "hashtag", HEART_BROKEN = "heart-broken", HIGHLIGHTER = "highlighter", HISTORY = "history", ID_BADGE = "id-badge", IMAGE = "image", INFO_CIRCLE = "info-circle", ITALIC = "italic", KEY = "key", KEYBOARD = "keyboard", LAPTOP = "laptop", LAYER_GROUP = "layer-group", LEVEL_UP_ALT = "level-up-alt", LIFE_RING = "life-ring", LINK = "link", LIST_OL = "list-ol", LIST_UL = "list-ul", LOCK = "lock", LONG_ARROW_ALT_RIGHT = "long-arrow-alt-right", MAGIC = "magic", MAP_MARKER_ALT = "map-marker-alt", MAP_SIGNS = "map-signs", METEOR = "meteor", MINUS = "minus", MINUS_CIRCLE = "minus-circle", MOUSE_POINTER = "mouse-pointer", PALETTE = "palette", PAPER_PLANE = "paper-plane", PAPERCLIP = "paperclip", PASTE = "paste", PAUSE = "pause", PEN = "pen", PENCIL_RULER = "pencil-ruler", PLAY = "play", PLUS = "plus", PLUS_CIRCLE = "plus-circle", POO_STORM = "poo-storm", // Use in storybook examples QUESTION = "question", QUESTION_CIRCLE = "question-circle", RANDOM = "random", REDO = "redo", REPLY = "reply", ROBOT = "robot", ROCKET = "rocket", RULER = "ruler", SAVE = "save", SCROLL = "scroll", SEARCH = "search", SEARCH_PLUS = "search-plus", SEEDLING = "seedling", SERVER = "server", SHARE = "share", SHARE_ALT = "share-alt", SHIELD_ALT = "shield-alt", SHIELD_CHECK = "shield-check", SIGN_OUT_ALT = "sign-out-alt", SIGNAL = "signal", SIGNATURE = "signature", SITEMAP = "sitemap", SKULL = "skull", SLIDERS_H = "sliders-h", SORT = "sort", SORT_DOWN = "sort-down", SORT_UP = "sort-up", SPINNER = "spinner", SQUARE = "square", STAMP = "stamp", STAR = "star", STOPWATCH = "stopwatch", SUITCASE_ROLLING = "suitcase-rolling", SYNC = "sync", TABLE = "table", TAG = "tag", TASKS = "tasks", TICKET_ALT = "ticket-alt", TIMES = "times", TIMES_CIRCLE = "times-circle", TH_LARGE = "th-large", THUMBS_DOWN = "thumbs-down", THUMBS_UP = "thumbs-up", TOOLS = "tools", TRASH = "trash", UNDO = "undo", UNIVERSAL_ACCESS = "universal-access", UNLINK = "unlink", UNLOCK = "unlock", USER = "user", USER_ASTRONAUT = "user-astronaut", USER_CLOCK = "user-clock", USER_LOCK = "user-lock", USER_PLUS = "user-plus", USERS = "users", USER_FRIENDS = "user-friends", USER_SECRET = "user-secret", USER_SHIELD = "user-shield", VIAL = "vial", VIDEO = "video", WRENCH = "wrench", PLUG = "plug", MONEY_BILL = "money-bill", MONEY_BILL_WAVE = "money-bill-wave", MONEY_CHECK_ALT = "money-check-alt", CLOUD_SHOWERS_HEAVY = "cloud-showers-heavy", AWARD = "award", } export enum ICON_STYLE_PREFIX { SOLID = "fas", REGULAR = "far", } interface BaseIconProps extends HTMLAttributes { color?: string; [key: string]: any; // Until comply is on typescript v4, this is needed to allow for data-testid attribute } export interface SharedFaIconProps extends BaseIconProps { spin?: boolean; prefix?: ICON_STYLE_PREFIX; flip?: FlipProp; } export interface FaIconProps extends SharedFaIconProps { icon: ICON_TYPE; } export interface CustomIconProps extends BaseIconProps { icon: CUSTOM_ICON_TYPE; } export type IconProps = FaIconProps | CustomIconProps; export interface StatusIconProps extends SharedFaIconProps { status?: STATUS_VARIANT; } const getIconClasses = ({ className, color, }: Pick) => { const hasColorClassName = className ? className.split(" ").filter((c) => c.startsWith("text-")).length > 0 : false; return classNames( "inline-flex", className, !hasColorClassName && color ? `text-${color}` : "", ); }; export const Icon = forwardRef((props, ref) => { const isCustomIcon = Object.values(CUSTOM_ICON_TYPE).some( (i) => i === props.icon, ); if (isCustomIcon) { const { style, className, color, icon, ...rest } = props as CustomIconProps; const CustomIcon = CustomIcons[icon]; return ( ); } const { icon, style, className, spin = false, color, prefix: prefixProp, flip, ...rest } = props as FaIconProps; /** If no value is provided to the prefix prop, icons will revert to * default "fas" (solid) prefix unless otherwise set in this object. * * regular === "far" * */ const iconSetDefaults: { [key in ICON_TYPE]?: ICON_STYLE_PREFIX } = { [ICON_TYPE.FILE_ALT]: ICON_STYLE_PREFIX.REGULAR, [ICON_TYPE.CLOCK]: ICON_STYLE_PREFIX.REGULAR, [ICON_TYPE.COPY]: ICON_STYLE_PREFIX.REGULAR, [ICON_TYPE.KEYBOARD]: ICON_STYLE_PREFIX.REGULAR, [ICON_TYPE.STAR]: ICON_STYLE_PREFIX.REGULAR, [ICON_TYPE.THUMBS_DOWN]: ICON_STYLE_PREFIX.REGULAR, [ICON_TYPE.THUMBS_UP]: ICON_STYLE_PREFIX.REGULAR, }; const prefix: ICON_STYLE_PREFIX = prefixProp || iconSetDefaults[icon] || ICON_STYLE_PREFIX.SOLID; const faIcon: [ICON_STYLE_PREFIX, ICON_TYPE] = [prefix, icon]; return ( ); }); export const StatusIcon = forwardRef( ({ status: statusProp, ...rest }, ref) => { const context = useContext(StatusContext); let computedStatus = STATUS_VARIANT.DEFAULT; if (statusProp) { computedStatus = statusProp; } else if (context) { computedStatus = context; } let icon = ICON_TYPE.INFO_CIRCLE; switch (computedStatus) { case STATUS_VARIANT.SUCCESS: icon = ICON_TYPE.CHECK; break; case STATUS_VARIANT.WARNING: icon = ICON_TYPE.EXCLAMATION_TRIANGLE; break; case STATUS_VARIANT.DANGER: icon = ICON_TYPE.BAN; break; default: break; } return ; }, ); export type IconType = ICON_TYPE | CUSTOM_ICON_TYPE;