-
+
{formatDate(startAt)} - {formatDate(endAt)}
@@ -27,10 +26,7 @@ const SnapshotCard = ({ title, button, startAt, endAt }: SnapshotCardProps) => {
View Snapshot
-
+
)
diff --git a/frontend/src/components/SortBy.tsx b/frontend/src/components/SortBy.tsx
index c4230c318a..55ff6bc3e9 100644
--- a/frontend/src/components/SortBy.tsx
+++ b/frontend/src/components/SortBy.tsx
@@ -1,7 +1,6 @@
-import { faArrowDownWideShort, faArrowUpWideShort } from '@fortawesome/free-solid-svg-icons'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { Select, SelectItem } from '@heroui/select'
import { Tooltip } from '@heroui/tooltip'
+import { FaArrowDownWideShort, FaArrowUpWideShort } from 'react-icons/fa6'
import type { SortByProps } from 'types/sortBy'
const SortBy = ({
@@ -69,15 +68,9 @@ const SortBy = ({
}
>
{selectedOrder === 'asc' ? (
-
+
) : (
-
+
)}
diff --git a/frontend/src/components/StatusBadge.tsx b/frontend/src/components/StatusBadge.tsx
index e3cab00461..e4197813c5 100644
--- a/frontend/src/components/StatusBadge.tsx
+++ b/frontend/src/components/StatusBadge.tsx
@@ -1,13 +1,12 @@
-import type { IconDefinition } from '@fortawesome/fontawesome-svg-core'
-import { faArchive, faBan } from '@fortawesome/free-solid-svg-icons'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import type React from 'react'
+import type { IconType } from 'react-icons'
+import { FaArchive, FaBan } from 'react-icons/fa'
export type StatusType = 'archived' | 'inactive'
interface StatusConfig {
text: string
- icon: IconDefinition
+ icon: IconType
bgColor: string
textColor: string
borderColor: string
@@ -24,14 +23,14 @@ interface StatusBadgeProps {
showIcon?: boolean
size?: 'sm' | 'md' | 'lg'
customText?: string
- customIcon?: IconDefinition
+ customIcon?: IconType
customTooltip?: string
}
const statusConfig: Record
= {
archived: {
text: 'Archived',
- icon: faArchive,
+ icon: FaArchive,
bgColor: 'bg-yellow-50',
textColor: 'text-yellow-800',
borderColor: 'border-yellow-600',
@@ -43,7 +42,7 @@ const statusConfig: Record = {
},
inactive: {
text: 'Inactive',
- icon: faBan,
+ icon: FaBan,
bgColor: 'bg-red-50',
textColor: 'text-red-800',
borderColor: 'border-red-600',
@@ -66,7 +65,7 @@ const StatusBadge: React.FC = ({
}) => {
const config = statusConfig[status]
const displayText = customText ?? config.text
- const displayIcon = customIcon ?? config.icon
+ const DisplayIcon = customIcon ?? config.icon
const displayTooltip = customTooltip ?? config.tooltip
const sizeClasses = {
@@ -81,7 +80,7 @@ const StatusBadge: React.FC = ({
title={displayTooltip}
aria-label={config.ariaLabel}
>
- {showIcon && }
+ {showIcon && }
{displayText}
)
diff --git a/frontend/src/components/ToggleableList.tsx b/frontend/src/components/ToggleableList.tsx
index 85c0e65c38..27c506fc0f 100644
--- a/frontend/src/components/ToggleableList.tsx
+++ b/frontend/src/components/ToggleableList.tsx
@@ -1,8 +1,8 @@
-import type { IconDefinition } from '@fortawesome/fontawesome-svg-core'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { useRouter } from 'next/navigation'
import type React from 'react'
import { useState } from 'react'
+import type { IconType } from 'react-icons'
+import { IconWrapper } from 'wrappers/IconWrapper'
import ShowMoreButton from 'components/ShowMoreButton'
const ToggleableList = ({
@@ -15,7 +15,7 @@ const ToggleableList = ({
items: string[]
label: React.ReactNode
limit?: number
- icon?: IconDefinition
+ icon?: IconType
isDisabled?: boolean
}) => {
const [showAll, setShowAll] = useState(false)
@@ -30,7 +30,7 @@ const ToggleableList = ({
- {icon && }
+ {icon && }
{label}
diff --git a/frontend/src/components/TopContributorsList.tsx b/frontend/src/components/TopContributorsList.tsx
index 70d24e3dc3..d3bc34ca7f 100644
--- a/frontend/src/components/TopContributorsList.tsx
+++ b/frontend/src/components/TopContributorsList.tsx
@@ -1,8 +1,8 @@
-import type { IconProp } from '@fortawesome/fontawesome-svg-core'
import upperFirst from 'lodash/upperFirst'
import Image from 'next/image'
import Link from 'next/link'
import { useState } from 'react'
+import type { IconType } from 'react-icons'
import type { Contributor } from 'types/contributor'
import { getMemberUrl } from 'utils/urlFormatter'
import AnchorTitle from 'components/AnchorTitle'
@@ -18,7 +18,7 @@ const TopContributorsList = ({
contributors: Contributor[]
label?: string
maxInitialDisplay?: number
- icon?: IconProp
+ icon?: IconType
}) => {
const [showAllContributors, setShowAllContributors] = useState(false)
diff --git a/frontend/src/components/UserCard.tsx b/frontend/src/components/UserCard.tsx
index 7c7dec06f9..0ef856b39c 100644
--- a/frontend/src/components/UserCard.tsx
+++ b/frontend/src/components/UserCard.tsx
@@ -1,15 +1,9 @@
-import {
- faChevronRight,
- faFolderOpen,
- faMedal,
- faUser,
- faUsers,
-} from '@fortawesome/free-solid-svg-icons'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { Button } from '@heroui/button'
import { Tooltip } from '@heroui/tooltip'
import millify from 'millify'
import Image from 'next/image'
+import { FaChevronRight, FaFolderOpen, FaMedal, FaUser } from 'react-icons/fa6'
+import { HiUserGroup } from 'react-icons/hi'
import type { UserCardProps } from 'types/card'
const UserCard = ({
@@ -42,10 +36,7 @@ const UserCard = ({
/>
) : (
-
+
)}
{followersCount > 0 && (
-
+
{millify(followersCount, { precision: 1 })}
)}
{repositoriesCount > 0 && (
-
+
{millify(repositoriesCount, { precision: 1 })}
)}
{badgeCount > 0 && (
-
+
{millify(badgeCount, { precision: 1 })}
)}
@@ -94,10 +85,7 @@ const UserCard = ({
{button.label}
-
+
)
diff --git a/frontend/src/components/UserMenu.tsx b/frontend/src/components/UserMenu.tsx
index 086d9aa0a9..95d96f7fa1 100644
--- a/frontend/src/components/UserMenu.tsx
+++ b/frontend/src/components/UserMenu.tsx
@@ -1,13 +1,12 @@
'use client'
-import { faGithub } from '@fortawesome/free-brands-svg-icons'
-import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { useDjangoSession } from 'hooks/useDjangoSession'
import { useLogout } from 'hooks/useLogout'
import Image from 'next/image'
import Link from 'next/link'
import { signIn } from 'next-auth/react'
import { useEffect, useId, useRef, useState } from 'react'
+import { FaGithub } from 'react-icons/fa'
import { ExtendedSession } from 'types/auth'
export default function UserMenu({
@@ -50,7 +49,7 @@ export default function UserMenu({
onClick={() => signIn('github', { callbackUrl: '/', prompt: 'login' })}
className="group relative flex h-10 cursor-pointer items-center justify-center gap-2 rounded-md bg-[#87a1bc] p-4 text-sm font-medium text-black hover:ring-1 hover:ring-[#b0c7de] dark:bg-slate-900 dark:text-white dark:hover:bg-slate-900/90 dark:hover:ring-[#46576b]"
>
-
+
Sign In
)
diff --git a/frontend/src/types/button.ts b/frontend/src/types/button.ts
index bded6c19db..7ddeb7161a 100644
--- a/frontend/src/types/button.ts
+++ b/frontend/src/types/button.ts
@@ -1,5 +1,5 @@
-import type { IconDefinition } from '@fortawesome/free-solid-svg-icons'
import type { JSX } from 'react'
+import type { IconType } from 'react-icons'
export type Button = {
icon?: JSX.Element
@@ -10,9 +10,9 @@ export type Button = {
export type NavButtonProps = {
className?: string
- defaultIcon: IconDefinition
+ defaultIcon: IconType
defaultIconColor?: string
- hoverIcon: IconDefinition
+ hoverIcon: IconType
hoverIconColor?: string
href: string
text: string
diff --git a/frontend/src/types/card.ts b/frontend/src/types/card.ts
index 67c276df11..787c66e4a0 100644
--- a/frontend/src/types/card.ts
+++ b/frontend/src/types/card.ts
@@ -1,5 +1,5 @@
-import type { IconDefinition } from '@fortawesome/free-solid-svg-icons'
import type { JSX } from 'react'
+import type { IconType } from 'react-icons'
import type { Badge } from 'types/badge'
import type { Button } from 'types/button'
import type { Chapter } from 'types/chapter'
@@ -22,7 +22,7 @@ export type CardProps = {
level?: Level
projectLink?: string
projectName?: string
- social?: { title: string; icon: string; url: string }[]
+ social?: { title: string; icon: IconType; url: string }[]
summary: string
title: string
timeline?: {
@@ -35,7 +35,7 @@ export type CardProps = {
}
type Stats = {
- icon: IconDefinition
+ icon: IconType
pluralizedName?: string
unit?: string
value: number
diff --git a/frontend/src/types/level.ts b/frontend/src/types/level.ts
index 27f252d020..2760796409 100644
--- a/frontend/src/types/level.ts
+++ b/frontend/src/types/level.ts
@@ -1,5 +1,7 @@
+import type { IconType } from 'react-icons'
+
export type Level = {
color: string
- icon: string
+ icon: IconType
level?: string
}
diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts
index 95f1e54f1e..2e0a970685 100644
--- a/frontend/src/utils/constants.ts
+++ b/frontend/src/utils/constants.ts
@@ -1,4 +1,6 @@
-import { faGithub, faSlack, faBluesky, faLinkedin } from '@fortawesome/free-brands-svg-icons'
+import type { IconType } from 'react-icons'
+import { FaGithub, FaSlack, FaLinkedin } from 'react-icons/fa'
+import { FaBluesky } from 'react-icons/fa6'
import type { Link } from 'types/link'
import type { Section } from 'types/section'
@@ -26,24 +28,28 @@ export const headerLinks: Link[] = [
},
]
-export const footerIcons = [
+export const footerIcons: Array<{
+ icon: IconType
+ href: string
+ label: string
+}> = [
{
- icon: faBluesky,
+ icon: FaBluesky,
href: 'https://bsky.app/profile/nest.owasp.org',
label: 'Bluesky',
},
{
- icon: faGithub,
+ icon: FaGithub,
href: 'https://github.com/owasp/nest',
label: 'GitHub',
},
{
- icon: faLinkedin,
+ icon: FaLinkedin,
href: 'https://www.linkedin.com/groups/14656108/',
label: 'LinkedIn',
},
{
- icon: faSlack,
+ icon: FaSlack,
href: 'https://owasp.slack.com/archives/project-nest',
label: 'Slack',
},
diff --git a/frontend/src/utils/data.ts b/frontend/src/utils/data.ts
index 837ac1d829..92aef45d00 100644
--- a/frontend/src/utils/data.ts
+++ b/frontend/src/utils/data.ts
@@ -1,109 +1,58 @@
-import type { IconDefinition } from '@fortawesome/fontawesome-svg-core'
-import { library } from '@fortawesome/fontawesome-svg-core'
+import type { IconType } from 'react-icons'
import {
- faDiscord,
- faFacebook,
- faGoogle,
- faLinkedin,
- faMeetup,
- faSlack,
- faXTwitter,
- faYoutube,
-} from '@fortawesome/free-brands-svg-icons'
-import {
- faClock,
- faComment,
- faLightbulb,
- faStar,
- faUser,
-} from '@fortawesome/free-regular-svg-icons'
-import {
- faArrowsRotate,
- faAward,
- faBug,
- faCertificate,
- faCity,
- faCode,
- faCodeFork,
- faEgg,
- faFlag,
- faFlask,
- faGlobe,
- faMedal,
- faMoon,
- faPeopleGroup,
- faRibbon,
- faRightToBracket,
- faStar as faSolidStar,
- faSun,
- faWandMagicSparkles,
- faX,
-} from '@fortawesome/free-solid-svg-icons'
+ FaDiscord,
+ FaFacebook,
+ FaGoogle,
+ FaLinkedin,
+ FaMeetup,
+ FaSlack,
+ FaXTwitter,
+ FaYoutube,
+ FaRegClock,
+ FaRegComment,
+ FaRegStar,
+ FaRegUser,
+ FaAward,
+ FaBug,
+ FaCertificate,
+ FaCity,
+ FaCodeFork,
+ FaEgg,
+ FaFlag,
+ FaFlask,
+ FaMedal,
+ FaRibbon,
+} from 'react-icons/fa6'
-library.add(
- faArrowsRotate,
- faAward,
- faBug,
- faCertificate,
- faCity,
- faClock,
- faCode,
- faCodeFork,
- faComment,
- faDiscord,
- faEgg,
- faFacebook,
- faFlag,
- faFlask,
- faGlobe,
- faGoogle,
- faLightbulb,
- faLinkedin,
- faMedal,
- faMeetup,
- faMoon,
- faPeopleGroup,
- faRibbon,
- faRightToBracket,
- faSlack,
- faStar,
- faSun,
- faUser,
- faWandMagicSparkles,
- faX,
- faXTwitter,
- faYoutube
-)
-
-export const BADGE_CLASS_MAP: Record
= {
- award: faAward,
- bugSlash: faBug,
- certificate: faCertificate,
- medal: faMedal,
- ribbon: faRibbon,
- star: faSolidStar,
+export const BADGE_CLASS_MAP: Record = {
+ award: FaAward,
+ bugSlash: FaBug,
+ certificate: FaCertificate,
+ medal: FaMedal,
+ ribbon: FaRibbon,
+ star: FaRegStar,
} as const
export const ICONS = {
starsCount: {
label: 'GitHub stars',
- icon: 'fa-regular fa-star',
+ icon: FaRegStar,
},
forksCount: {
label: 'GitHub forks',
- icon: 'fa-solid fa-code-fork',
+ icon: FaCodeFork,
},
contributorsCount: {
label: 'GitHub contributors',
- icon: 'fa-regular fa-user',
+ icon: FaRegUser,
},
createdAt: {
label: 'Creation date',
- icon: 'fa-regular fa-clock',
+ icon: FaRegClock,
},
commentsCount: {
label: 'Comments count',
- icon: 'fa-regular fa-comment',
+ icon: FaRegComment,
},
} as const
@@ -112,37 +61,33 @@ export type IconKeys = keyof typeof ICONS
export const level = {
incubator: {
color: '#53AAE5',
- icon: ' text-white fa-solid fa-egg ',
+ icon: FaEgg,
level: 'Incubator',
},
lab: {
color: '#FFA500',
- icon: ' text-white fa-solid fa-flask',
+ icon: FaFlask,
level: 'Lab',
},
production: {
color: '#800080',
- icon: ' text-white fa-solid fa-city',
+ icon: FaCity,
level: 'Production',
},
flagship: {
color: '#38a047',
- icon: ' text-white fa-solid fa-flag',
+ icon: FaFlag,
level: 'Flagship',
},
}
export const urlMappings = [
- { key: 'youtube.com', title: 'YouTube', icon: 'fa-brands fa-youtube' },
- {
- key: 'x.com',
- title: 'X (formerly Twitter)',
- icon: 'fa-brands fa-x-twitter',
- },
- { key: 'google.com', title: 'Google', icon: 'fa-brands fa-google' },
- { key: 'meetup.com', title: 'Meetup', icon: 'fa-brands fa-meetup' },
- { key: 'linkedin.com', title: 'LinkedIn', icon: 'fa-brands fa-linkedin' },
- { key: 'facebook.com', title: 'Facebook', icon: 'fa-brands fa-facebook' },
- { key: 'discord.com', title: 'Discord', icon: 'fa-brands fa-discord' },
- { key: 'slack.com', title: 'Slack', icon: 'fa-brands fa-slack' },
+ { key: 'youtube.com', title: 'YouTube', icon: FaYoutube },
+ { key: 'x.com', title: 'X (formerly Twitter)', icon: FaXTwitter },
+ { key: 'google.com', title: 'Google', icon: FaGoogle },
+ { key: 'meetup.com', title: 'Meetup', icon: FaMeetup },
+ { key: 'linkedin.com', title: 'LinkedIn', icon: FaLinkedin },
+ { key: 'facebook.com', title: 'Facebook', icon: FaFacebook },
+ { key: 'discord.com', title: 'Discord', icon: FaDiscord },
+ { key: 'slack.com', title: 'Slack', icon: FaSlack },
]
diff --git a/frontend/src/utils/milestoneProgress.ts b/frontend/src/utils/milestoneProgress.ts
index 544c547149..819702a1f7 100644
--- a/frontend/src/utils/milestoneProgress.ts
+++ b/frontend/src/utils/milestoneProgress.ts
@@ -1,5 +1,5 @@
-import { faCircleCheck, faClock, faUserGear } from '@fortawesome/free-solid-svg-icons'
-
+import type { IconType } from 'react-icons'
+import { FaCircleCheck, FaClock, FaUserGear } from 'react-icons/fa6'
// helper functions used in about/page.tsx
export const getMilestoneProgressText = (progress: number): string => {
if (progress === 100) {
@@ -11,12 +11,12 @@ export const getMilestoneProgressText = (progress: number): string => {
}
}
-export const getMilestoneProgressIcon = (progress: number) => {
+export const getMilestoneProgressIcon = (progress: number): IconType => {
if (progress === 100) {
- return faCircleCheck
+ return FaCircleCheck
} else if (progress > 0) {
- return faUserGear
+ return FaUserGear
} else {
- return faClock
+ return FaClock
}
}
diff --git a/frontend/src/utils/urlIconMappings.ts b/frontend/src/utils/urlIconMappings.ts
index 11c5a0248a..a23a37dfda 100644
--- a/frontend/src/utils/urlIconMappings.ts
+++ b/frontend/src/utils/urlIconMappings.ts
@@ -1,50 +1,50 @@
+import type { IconType } from 'react-icons'
import {
- faDiscord,
- faInstagram,
- faLinkedin,
- faYoutube,
- faXTwitter,
- faMeetup,
- faSlack,
- faFacebook,
- faTelegram,
- faGoogle,
- faBluesky,
- faWhatsapp,
- faTiktok,
- faGithub,
- faSlideshare,
- faSpeakerDeck,
- faVimeo,
- faTwitch,
- faMedium,
-} from '@fortawesome/free-brands-svg-icons'
-import { faGlobe } from '@fortawesome/free-solid-svg-icons'
+ FaDiscord,
+ FaInstagram,
+ FaLinkedin,
+ FaYoutube,
+ FaMeetup,
+ FaSlack,
+ FaFacebook,
+ FaTelegram,
+ FaGoogle,
+ FaWhatsapp,
+ FaTiktok,
+ FaGithub,
+ FaSlideshare,
+ FaSpeakerDeck,
+ FaVimeo,
+ FaTwitch,
+ FaMedium,
+ FaGlobe,
+} from 'react-icons/fa'
+import { FaXTwitter, FaBluesky } from 'react-icons/fa6'
-export const getSocialIcon = (url: string) => {
+export const getSocialIcon = (url: string): IconType => {
const hostname = new URL(url).hostname.toLowerCase()
- if (hostname.includes('discord')) return faDiscord
- if (hostname.includes('instagram')) return faInstagram
- if (hostname.includes('linkedin')) return faLinkedin
- if (hostname.includes('youtube')) return faYoutube
- if (hostname.includes('meetup')) return faMeetup
- if (hostname.includes('slack')) return faSlack
- if (hostname.includes('facebook')) return faFacebook
- if (hostname.includes('telegram') || hostname.includes('t.me')) return faTelegram
- if (hostname.includes('google')) return faGoogle
- if (hostname.includes('bsky')) return faBluesky
- if (hostname.includes('whatsapp')) return faWhatsapp
- if (hostname.includes('tiktok')) return faTiktok
- if (hostname.includes('github')) return faGithub
- if (hostname.includes('slideshare')) return faSlideshare
- if (hostname.includes('speakerdeck')) return faSpeakerDeck
- if (hostname.includes('vimeo')) return faVimeo
- if (hostname.includes('twitch')) return faTwitch
- if (hostname.includes('medium')) return faMedium
+ if (hostname.includes('discord')) return FaDiscord
+ if (hostname.includes('instagram')) return FaInstagram
+ if (hostname.includes('linkedin')) return FaLinkedin
+ if (hostname.includes('youtube')) return FaYoutube
+ if (hostname.includes('meetup')) return FaMeetup
+ if (hostname.includes('slack')) return FaSlack
+ if (hostname.includes('facebook')) return FaFacebook
+ if (hostname.includes('telegram') || hostname.includes('t.me')) return FaTelegram
+ if (hostname.includes('google')) return FaGoogle
+ if (hostname.includes('bsky')) return FaBluesky
+ if (hostname.includes('whatsapp')) return FaWhatsapp
+ if (hostname.includes('tiktok')) return FaTiktok
+ if (hostname.includes('github')) return FaGithub
+ if (hostname.includes('slideshare')) return FaSlideshare
+ if (hostname.includes('speakerdeck')) return FaSpeakerDeck
+ if (hostname.includes('vimeo')) return FaVimeo
+ if (hostname.includes('twitch')) return FaTwitch
+ if (hostname.includes('medium')) return FaMedium
if (hostname === 'x.com' || hostname.endsWith('.x.com') || hostname.includes('twitter')) {
- return faXTwitter
+ return FaXTwitter
}
- return faGlobe
+ return FaGlobe
}
diff --git a/frontend/src/utils/utility.ts b/frontend/src/utils/utility.ts
index 1fde60e2ee..21b1b25ed0 100644
--- a/frontend/src/utils/utility.ts
+++ b/frontend/src/utils/utility.ts
@@ -1,6 +1,7 @@
import { type ClassValue, clsx } from 'clsx'
import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
+import { FaGlobe } from 'react-icons/fa6'
import { twMerge } from 'tailwind-merge'
import { fetchCsrfToken } from 'server/fetchCsrfToken'
@@ -40,7 +41,7 @@ export const handleSocialUrls = (relatedUrls: string[]) => {
return match
? { title: match.title, icon: match.icon, url }
- : { title: 'Social Links', icon: 'fa-solid fa-globe', url }
+ : { title: 'Social Links', icon: FaGlobe, url }
})
}
diff --git a/frontend/src/wrappers/FontAwesomeIconWrapper.tsx b/frontend/src/wrappers/FontAwesomeIconWrapper.tsx
deleted file mode 100644
index f37728fe2b..0000000000
--- a/frontend/src/wrappers/FontAwesomeIconWrapper.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { IconDefinition } from '@fortawesome/free-brands-svg-icons'
-import { FontAwesomeIcon, FontAwesomeIconProps } from '@fortawesome/react-fontawesome'
-
-type IconProp = FontAwesomeIconProps['icon']
-
-interface MyIconProps extends Omit {
- icon: string | IconDefinition
-}
-
-const FontAwesomeIconWrapper = ({ icon, ...props }: MyIconProps) => (
-
-)
-
-export default FontAwesomeIconWrapper
diff --git a/frontend/src/wrappers/IconWrapper.tsx b/frontend/src/wrappers/IconWrapper.tsx
new file mode 100644
index 0000000000..3022235019
--- /dev/null
+++ b/frontend/src/wrappers/IconWrapper.tsx
@@ -0,0 +1,13 @@
+import { ComponentProps } from 'react'
+import type { IconType } from 'react-icons'
+
+export interface IconWrapperProps extends ComponentProps<'svg'> {
+ icon: IconType
+ size?: string | number
+}
+
+const IconWrapper = ({ icon: Icon, className, ...props }: IconWrapperProps) => (
+
+)
+
+export { IconWrapper }
diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json
index 72ccd27a56..457f077a06 100644
--- a/frontend/tsconfig.json
+++ b/frontend/tsconfig.json
@@ -11,7 +11,7 @@
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
- "jsx": "react-jsx",
+ "jsx": "preserve",
"incremental": true,
"sourceMap": true,
"inlineSources": true,