refactor: migrate all icons from Untitled UI to FontAwesome Pro Duotone

Replace all @untitledui/icons imports across 55 files with equivalent
@fortawesome/pro-duotone-svg-icons icons, using FontAwesomeIcon wrappers
(FC<{ className?: string }>) for prop-based usage and inline replacements
for direct JSX usage. Drops unsupported Untitled UI-specific props
(strokeWidth, numeric size). TypeScript compiles clean with no errors.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-21 11:07:19 +05:30
parent 3064eeb444
commit 6f40b82579
55 changed files with 289 additions and 120 deletions

View File

@@ -1,9 +1,15 @@
import type { FC } from 'react';
import { useMemo } from 'react'; import { useMemo } from 'react';
import { CheckCircle, AlertTriangle, AlertCircle } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faCircleCheck, faTriangleExclamation, faCircleExclamation } from '@fortawesome/pro-duotone-svg-icons';
import { cx } from '@/utils/cx'; import { cx } from '@/utils/cx';
import type { Lead } from '@/types/entities'; import type { Lead } from '@/types/entities';
const CheckCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCircleCheck} className={className} />;
const AlertTriangle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faTriangleExclamation} className={className} />;
const AlertCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCircleExclamation} className={className} />;
interface SlaMetricsProps { interface SlaMetricsProps {
leads: Lead[]; leads: Lead[];
} }
@@ -40,7 +46,7 @@ export const SlaMetrics = ({ leads }: SlaMetricsProps) => {
return { avgHours, withinSla, total, slaPercent }; return { avgHours, withinSla, total, slaPercent };
}, [leads]); }, [leads]);
const getTargetStatus = (): { icon: typeof CheckCircle; label: string; colorClass: string } => { const getTargetStatus = (): { icon: FC<{ className?: string }>; label: string; colorClass: string } => {
const diff = metrics.avgHours - SLA_TARGET_HOURS; const diff = metrics.avgHours - SLA_TARGET_HOURS;
if (diff <= 0) { if (diff <= 0) {

View File

@@ -1,5 +1,6 @@
import type { PropsWithChildren } from "react"; import type { PropsWithChildren } from "react";
import { X as CloseIcon, Menu02 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faXmark, faBars } from "@fortawesome/pro-duotone-svg-icons";
import { import {
Button as AriaButton, Button as AriaButton,
Dialog as AriaDialog, Dialog as AriaDialog,
@@ -20,8 +21,8 @@ export const MobileNavigationHeader = ({ children }: PropsWithChildren) => {
aria-label="Expand navigation menu" aria-label="Expand navigation menu"
className="group flex items-center justify-center rounded-lg bg-primary p-2 text-fg-secondary outline-focus-ring hover:bg-primary_hover hover:text-fg-secondary_hover focus-visible:outline-2 focus-visible:outline-offset-2" className="group flex items-center justify-center rounded-lg bg-primary p-2 text-fg-secondary outline-focus-ring hover:bg-primary_hover hover:text-fg-secondary_hover focus-visible:outline-2 focus-visible:outline-offset-2"
> >
<Menu02 className="size-6 transition duration-200 ease-in-out group-aria-expanded:opacity-0" /> <FontAwesomeIcon icon={faBars} className="size-6 transition duration-200 ease-in-out group-aria-expanded:opacity-0" />
<CloseIcon className="absolute size-6 opacity-0 transition duration-200 ease-in-out group-aria-expanded:opacity-100" /> <FontAwesomeIcon icon={faXmark} className="absolute size-6 opacity-0 transition duration-200 ease-in-out group-aria-expanded:opacity-100" />
</AriaButton> </AriaButton>
</header> </header>
@@ -42,7 +43,7 @@ export const MobileNavigationHeader = ({ children }: PropsWithChildren) => {
onPress={() => state.close()} onPress={() => state.close()}
className="fixed top-3 right-2 flex cursor-pointer items-center justify-center rounded-lg p-2 text-fg-white/70 outline-focus-ring hover:bg-white/10 hover:text-fg-white focus-visible:outline-2 focus-visible:outline-offset-2" className="fixed top-3 right-2 flex cursor-pointer items-center justify-center rounded-lg p-2 text-fg-white/70 outline-focus-ring hover:bg-white/10 hover:text-fg-white focus-visible:outline-2 focus-visible:outline-offset-2"
> >
<CloseIcon className="size-6" /> <FontAwesomeIcon icon={faXmark} className="size-6" />
</AriaButton> </AriaButton>
<AriaModal className="w-full cursor-auto will-change-transform"> <AriaModal className="w-full cursor-auto will-change-transform">

View File

@@ -1,9 +1,9 @@
import type { FC, HTMLAttributes } from "react"; import type { FC, HTMLAttributes } from "react";
import { useCallback, useEffect, useRef } from "react"; import { useCallback, useEffect, useRef } from "react";
import type { Placement } from "@react-types/overlays"; import type { Placement } from "@react-types/overlays";
import { ChevronSelectorVertical } from "@untitledui/icons"; import { faSort } from "@fortawesome/pro-duotone-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faUser, faGear, faArrowRightFromBracket, faPhoneVolume } from "@fortawesome/pro-duotone-svg-icons"; import { faUser, faGear, faArrowRightFromBracket, faPhoneVolume, faSort } from "@fortawesome/pro-duotone-svg-icons";
const IconUser: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faUser} className={className} />; const IconUser: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faUser} className={className} />;
const IconSettings: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faGear} className={className} />; const IconSettings: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faGear} className={className} />;
@@ -154,7 +154,7 @@ export const NavAccountCard = ({
<div className="absolute top-1.5 right-1.5"> <div className="absolute top-1.5 right-1.5">
<AriaDialogTrigger> <AriaDialogTrigger>
<AriaButton className="flex cursor-pointer items-center justify-center rounded-md p-1.5 text-fg-quaternary outline-focus-ring transition duration-100 ease-linear hover:bg-primary_hover hover:text-fg-quaternary_hover focus-visible:outline-2 focus-visible:outline-offset-2 pressed:bg-primary_hover pressed:text-fg-quaternary_hover"> <AriaButton className="flex cursor-pointer items-center justify-center rounded-md p-1.5 text-fg-quaternary outline-focus-ring transition duration-100 ease-linear hover:bg-primary_hover hover:text-fg-quaternary_hover focus-visible:outline-2 focus-visible:outline-offset-2 pressed:bg-primary_hover pressed:text-fg-quaternary_hover">
<ChevronSelectorVertical className="size-4 shrink-0" /> <FontAwesomeIcon icon={faSort} className="size-4 shrink-0" />
</AriaButton> </AriaButton>
<AriaPopover <AriaPopover
placement={popoverPlacement ?? (isDesktop ? "right bottom" : "top right")} placement={popoverPlacement ?? (isDesktop ? "right bottom" : "top right")}

View File

@@ -1,5 +1,6 @@
import type { FC, HTMLAttributes, MouseEventHandler, ReactNode } from "react"; import type { FC, HTMLAttributes, MouseEventHandler, ReactNode } from "react";
import { ChevronDown, Share04 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronDown, faArrowUpRightFromSquare } from "@fortawesome/pro-duotone-svg-icons";
import { Link as AriaLink } from "react-aria-components"; import { Link as AriaLink } from "react-aria-components";
import { Badge } from "@/components/base/badges/badges"; import { Badge } from "@/components/base/badges/badges";
import { cx, sortCx } from "@/utils/cx"; import { cx, sortCx } from "@/utils/cx";
@@ -57,7 +58,7 @@ export const NavItemBase = ({ current, type, badge, href, icon: Icon, children,
); );
const isExternal = href && href.startsWith("http"); const isExternal = href && href.startsWith("http");
const externalIcon = isExternal && <Share04 className="size-4 stroke-[2.5px] text-fg-quaternary" />; const externalIcon = isExternal && <FontAwesomeIcon icon={faArrowUpRightFromSquare} className="size-4 text-fg-quaternary" />;
if (type === "collapsible") { if (type === "collapsible") {
return ( return (
@@ -68,7 +69,7 @@ export const NavItemBase = ({ current, type, badge, href, icon: Icon, children,
{badgeElement} {badgeElement}
<ChevronDown aria-hidden="true" className="ml-3 size-4 shrink-0 stroke-[2.5px] text-fg-quaternary in-open:-scale-y-100" /> <FontAwesomeIcon icon={faChevronDown} aria-hidden="true" className="ml-3 size-4 shrink-0 text-fg-quaternary in-open:-scale-y-100" />
</summary> </summary>
); );
} }

View File

@@ -1,5 +1,11 @@
import type { FC, ReactNode } from "react"; import type { FC, ReactNode } from "react";
import { Bell01, LifeBuoy01, SearchLg, Settings01 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faBell, faLifeRing, faMagnifyingGlass, faGear } from "@fortawesome/pro-duotone-svg-icons";
const Bell01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faBell} className={className} />;
const LifeBuoy01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faLifeRing} className={className} />;
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
const Settings01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faGear} className={className} />;
import { Button as AriaButton, DialogTrigger, Popover } from "react-aria-components"; import { Button as AriaButton, DialogTrigger, Popover } from "react-aria-components";
import { Avatar } from "@/components/base/avatar/avatar"; import { Avatar } from "@/components/base/avatar/avatar";
import { BadgeWithDot } from "@/components/base/badges/badges"; import { BadgeWithDot } from "@/components/base/badges/badges";

View File

@@ -1,6 +1,9 @@
import type { ReactNode } from "react"; import type { FC, ReactNode } from "react";
import { useState } from "react"; import { useState } from "react";
import { SearchLg } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons";
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { AnimatePresence, motion } from "motion/react"; import { AnimatePresence, motion } from "motion/react";
import { Input } from "@/components/base/input/input"; import { Input } from "@/components/base/input/input";
import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo"; import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo";

View File

@@ -1,4 +1,8 @@
import { SearchLg } from "@untitledui/icons"; import type { FC } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons";
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { Input } from "@/components/base/input/input"; import { Input } from "@/components/base/input/input";
import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo"; import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo";
import { MobileNavigationHeader } from "../base-components/mobile-header"; import { MobileNavigationHeader } from "../base-components/mobile-header";

View File

@@ -1,5 +1,8 @@
import type { ReactNode } from "react"; import type { FC, ReactNode } from "react";
import { SearchLg } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons";
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { Input } from "@/components/base/input/input"; import { Input } from "@/components/base/input/input";
import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo"; import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";

View File

@@ -1,6 +1,11 @@
import type { FC } from "react"; import type { FC } from "react";
import { useState } from "react"; import { useState } from "react";
import { LifeBuoy01, LogOut01, Settings01 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faLifeRing, faArrowRightFromBracket, faGear } from "@fortawesome/pro-duotone-svg-icons";
const LifeBuoy01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faLifeRing} className={className} />;
const LogOut01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowRightFromBracket} className={className} />;
const Settings01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faGear} className={className} />;
import { AnimatePresence, motion } from "motion/react"; import { AnimatePresence, motion } from "motion/react";
import { Button as AriaButton, DialogTrigger as AriaDialogTrigger, Popover as AriaPopover } from "react-aria-components"; import { Button as AriaButton, DialogTrigger as AriaDialogTrigger, Popover as AriaPopover } from "react-aria-components";
import { Avatar } from "@/components/base/avatar/avatar"; import { Avatar } from "@/components/base/avatar/avatar";

View File

@@ -1,7 +1,11 @@
import type { HTMLAttributes, PropsWithChildren } from "react"; import type { FC, HTMLAttributes, PropsWithChildren } from "react";
import { Fragment, useContext, useState } from "react"; import { Fragment, useContext, useState } from "react";
import { type CalendarDate, getLocalTimeZone, today } from "@internationalized/date"; import { type CalendarDate, getLocalTimeZone, today } from "@internationalized/date";
import { ChevronLeft, ChevronRight } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronLeft, faChevronRight } from "@fortawesome/pro-duotone-svg-icons";
const ChevronLeft: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faChevronLeft} className={className} />;
const ChevronRight: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faChevronRight} className={className} />;
import type { CalendarProps as AriaCalendarProps, DateValue } from "react-aria-components"; import type { CalendarProps as AriaCalendarProps, DateValue } from "react-aria-components";
import { import {
Calendar as AriaCalendar, Calendar as AriaCalendar,

View File

@@ -1,6 +1,10 @@
import type { FC } from "react";
import { getLocalTimeZone, today } from "@internationalized/date"; import { getLocalTimeZone, today } from "@internationalized/date";
import { useControlledState } from "@react-stately/utils"; import { useControlledState } from "@react-stately/utils";
import { Calendar as CalendarIcon } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCalendar } from "@fortawesome/pro-duotone-svg-icons";
const CalendarIcon: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCalendar} className={className} />;
import { useDateFormatter } from "react-aria"; import { useDateFormatter } from "react-aria";
import type { DatePickerProps as AriaDatePickerProps, DateValue } from "react-aria-components"; import type { DatePickerProps as AriaDatePickerProps, DateValue } from "react-aria-components";
import { DatePicker as AriaDatePicker, Dialog as AriaDialog, Group as AriaGroup, Popover as AriaPopover } from "react-aria-components"; import { DatePicker as AriaDatePicker, Dialog as AriaDialog, Group as AriaGroup, Popover as AriaPopover } from "react-aria-components";

View File

@@ -1,7 +1,11 @@
import type { FC } from "react";
import { useMemo, useState } from "react"; import { useMemo, useState } from "react";
import { endOfMonth, endOfWeek, getLocalTimeZone, startOfMonth, startOfWeek, today } from "@internationalized/date"; import { endOfMonth, endOfWeek, getLocalTimeZone, startOfMonth, startOfWeek, today } from "@internationalized/date";
import { useControlledState } from "@react-stately/utils"; import { useControlledState } from "@react-stately/utils";
import { Calendar as CalendarIcon } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCalendar } from "@fortawesome/pro-duotone-svg-icons";
const CalendarIcon: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCalendar} className={className} />;
import { useDateFormatter } from "react-aria"; import { useDateFormatter } from "react-aria";
import type { DateRangePickerProps as AriaDateRangePickerProps, DateValue } from "react-aria-components"; import type { DateRangePickerProps as AriaDateRangePickerProps, DateValue } from "react-aria-components";
import { DateRangePicker as AriaDateRangePicker, Dialog as AriaDialog, Group as AriaGroup, Popover as AriaPopover, useLocale } from "react-aria-components"; import { DateRangePicker as AriaDateRangePicker, Dialog as AriaDialog, Group as AriaGroup, Popover as AriaPopover, useLocale } from "react-aria-components";

View File

@@ -1,7 +1,11 @@
import type { HTMLAttributes, PropsWithChildren } from "react"; import type { FC, HTMLAttributes, PropsWithChildren } from "react";
import { Fragment, useContext, useState } from "react"; import { Fragment, useContext, useState } from "react";
import type { CalendarDate } from "@internationalized/date"; import type { CalendarDate } from "@internationalized/date";
import { ChevronLeft, ChevronRight } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronLeft, faChevronRight } from "@fortawesome/pro-duotone-svg-icons";
const ChevronLeft: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faChevronLeft} className={className} />;
const ChevronRight: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faChevronRight} className={className} />;
import { useDateFormatter } from "react-aria"; import { useDateFormatter } from "react-aria";
import type { RangeCalendarProps as AriaRangeCalendarProps, DateValue } from "react-aria-components"; import type { RangeCalendarProps as AriaRangeCalendarProps, DateValue } from "react-aria-components";
import { import {

View File

@@ -1,7 +1,10 @@
import type { ComponentProps, ComponentPropsWithRef } from "react"; import type { ComponentProps, ComponentPropsWithRef, FC } from "react";
import { Children, createContext, isValidElement, useContext } from "react"; import { Children, createContext, isValidElement, useContext } from "react";
import { FileIcon } from "@untitledui/file-icons"; import { FileIcon } from "@untitledui/file-icons";
import { SearchLg } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons";
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { FeaturedIcon as FeaturedIconbase } from "@/components/foundations/featured-icon/featured-icon"; import { FeaturedIcon as FeaturedIconbase } from "@/components/foundations/featured-icon/featured-icon";
import type { BackgroundPatternProps } from "@/components/shared-assets/background-patterns"; import type { BackgroundPatternProps } from "@/components/shared-assets/background-patterns";
import { BackgroundPattern } from "@/components/shared-assets/background-patterns"; import { BackgroundPattern } from "@/components/shared-assets/background-patterns";

View File

@@ -1,8 +1,11 @@
import type { ComponentProps, ComponentPropsWithRef } from "react"; import type { ComponentProps, ComponentPropsWithRef, FC } from "react";
import { useId, useRef, useState } from "react"; import { useId, useRef, useState } from "react";
import type { FileIcon } from "@untitledui/file-icons"; import type { FileIcon } from "@untitledui/file-icons";
import { FileIcon as FileTypeIcon } from "@untitledui/file-icons"; import { FileIcon as FileTypeIcon } from "@untitledui/file-icons";
import { CheckCircle, Trash01, UploadCloud02, XCircle } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCircleCheck, faTrash, faCloudArrowUp, faCircleXmark } from "@fortawesome/pro-duotone-svg-icons";
const Trash01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faTrash} className={className} />;
import { AnimatePresence, motion } from "motion/react"; import { AnimatePresence, motion } from "motion/react";
import { Button } from "@/components/base/buttons/button"; import { Button } from "@/components/base/buttons/button";
import { ButtonUtility } from "@/components/base/buttons/button-utility"; import { ButtonUtility } from "@/components/base/buttons/button-utility";
@@ -206,7 +209,7 @@ export const FileUploadDropZone = ({
)} )}
> >
<FeaturedIcon color="gray" theme="modern" size="md"> <FeaturedIcon color="gray" theme="modern" size="md">
<UploadCloud02 className="size-5" /> <FontAwesomeIcon icon={faCloudArrowUp} className="size-5" />
</FeaturedIcon> </FeaturedIcon>
<div className="flex flex-col gap-1 text-center"> <div className="flex flex-col gap-1 text-center">
@@ -283,13 +286,13 @@ export const FileListItemProgressBar = ({ name, size, progress, failed, type, fi
<hr className="h-3 w-px rounded-t-full rounded-b-full border-none bg-border-primary" /> <hr className="h-3 w-px rounded-t-full rounded-b-full border-none bg-border-primary" />
<div className="flex items-center gap-1"> <div className="flex items-center gap-1">
{isComplete && <CheckCircle className="size-4 stroke-[2.5px] text-fg-success-primary" />} {isComplete && <FontAwesomeIcon icon={faCircleCheck} className="size-4 text-fg-success-primary" />}
{isComplete && <p className="text-sm font-medium text-success-primary">Complete</p>} {isComplete && <p className="text-sm font-medium text-success-primary">Complete</p>}
{!isComplete && !failed && <UploadCloud02 className="stroke-[2.5px size-4 text-fg-quaternary" />} {!isComplete && !failed && <FontAwesomeIcon icon={faCloudArrowUp} className="size-4 text-fg-quaternary" />}
{!isComplete && !failed && <p className="text-sm font-medium text-quaternary">Uploading...</p>} {!isComplete && !failed && <p className="text-sm font-medium text-quaternary">Uploading...</p>}
{failed && <XCircle className="size-4 text-fg-error-primary" />} {failed && <FontAwesomeIcon icon={faCircleXmark} className="size-4 text-fg-error-primary" />}
{failed && <p className="text-sm font-medium text-error-primary">Failed</p>} {failed && <p className="text-sm font-medium text-error-primary">Failed</p>}
</div> </div>
</div> </div>
@@ -350,8 +353,8 @@ export const FileListItemProgressFill = ({ name, size, progress, failed, type, f
<> <>
<hr className="h-3 w-px rounded-t-full rounded-b-full border-none bg-border-primary" /> <hr className="h-3 w-px rounded-t-full rounded-b-full border-none bg-border-primary" />
<div className="flex items-center gap-1"> <div className="flex items-center gap-1">
{isComplete && <CheckCircle className="size-4 stroke-[2.5px] text-fg-success-primary" />} {isComplete && <FontAwesomeIcon icon={faCircleCheck} className="size-4 text-fg-success-primary" />}
{!isComplete && <UploadCloud02 className="size-4 stroke-[2.5px] text-fg-quaternary" />} {!isComplete && <FontAwesomeIcon icon={faCloudArrowUp} className="size-4 text-fg-quaternary" />}
<p className="text-sm text-tertiary">{progress}%</p> <p className="text-sm text-tertiary">{progress}%</p>
</div> </div>

View File

@@ -1,5 +1,10 @@
import type { FC } from "react"; import type { FC } from "react";
import { AlertCircle, CheckCircle, InfoCircle } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCircleExclamation, faCircleCheck, faCircleInfo } from "@fortawesome/pro-duotone-svg-icons";
const AlertCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCircleExclamation} className={className} />;
const CheckCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCircleCheck} className={className} />;
const InfoCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCircleInfo} className={className} />;
import { Avatar } from "@/components/base/avatar/avatar"; import { Avatar } from "@/components/base/avatar/avatar";
import { Button } from "@/components/base/buttons/button"; import { Button } from "@/components/base/buttons/button";
import { CloseButton } from "@/components/base/buttons/close-button"; import { CloseButton } from "@/components/base/buttons/close-button";

View File

@@ -1,4 +1,9 @@
import { ArrowLeft, ArrowRight } from "@untitledui/icons"; import type { FC } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faArrowLeft, faArrowRight } from "@fortawesome/pro-duotone-svg-icons";
const ArrowLeft: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowLeft} className={className} />;
const ArrowRight: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowRight} className={className} />;
import { ButtonGroup, ButtonGroupItem } from "@/components/base/button-group/button-group"; import { ButtonGroup, ButtonGroupItem } from "@/components/base/button-group/button-group";
import { Button } from "@/components/base/buttons/button"; import { Button } from "@/components/base/buttons/button";
import { useBreakpoint } from "@/hooks/use-breakpoint"; import { useBreakpoint } from "@/hooks/use-breakpoint";

View File

@@ -1,6 +1,11 @@
import type { ComponentPropsWithRef, HTMLAttributes, ReactNode, Ref, TdHTMLAttributes, ThHTMLAttributes } from "react"; import type { ComponentPropsWithRef, FC, HTMLAttributes, ReactNode, Ref, TdHTMLAttributes, ThHTMLAttributes } from "react";
import { createContext, isValidElement, useContext } from "react"; import { createContext, isValidElement, useContext } from "react";
import { ArrowDown, ChevronSelectorVertical, Copy01, Edit01, HelpCircle, Trash01 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faArrowDown, faSort, faCopy, faPenToSquare, faCircleQuestion, faTrash } from "@fortawesome/pro-duotone-svg-icons";
const Edit01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faPenToSquare} className={className} />;
const Copy01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCopy} className={className} />;
const Trash01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faTrash} className={className} />;
import type { import type {
CellProps as AriaCellProps, CellProps as AriaCellProps,
ColumnProps as AriaColumnProps, ColumnProps as AriaColumnProps,
@@ -190,16 +195,16 @@ const TableHead = ({ className, tooltip, label, children, ...props }: TableHeadP
{tooltip && ( {tooltip && (
<Tooltip title={tooltip} placement="top"> <Tooltip title={tooltip} placement="top">
<TooltipTrigger className="cursor-pointer text-fg-quaternary transition duration-100 ease-linear hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover"> <TooltipTrigger className="cursor-pointer text-fg-quaternary transition duration-100 ease-linear hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover">
<HelpCircle className="size-4" /> <FontAwesomeIcon icon={faCircleQuestion} className="size-4" />
</TooltipTrigger> </TooltipTrigger>
</Tooltip> </Tooltip>
)} )}
{state.allowsSorting && {state.allowsSorting &&
(state.sortDirection ? ( (state.sortDirection ? (
<ArrowDown className={cx("size-3 stroke-[3px] text-fg-quaternary", state.sortDirection === "ascending" && "rotate-180")} /> <FontAwesomeIcon icon={faArrowDown} className={cx("size-3 text-fg-quaternary", state.sortDirection === "ascending" && "rotate-180")} />
) : ( ) : (
<ChevronSelectorVertical size={12} strokeWidth={3} className="text-fg-quaternary" /> <FontAwesomeIcon icon={faSort} className="text-fg-quaternary" />
))} ))}
</AriaGroup> </AriaGroup>
)} )}

View File

@@ -1,5 +1,6 @@
import { useState } from "react"; import { useState } from "react";
import { User01 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faUser } from "@fortawesome/pro-duotone-svg-icons";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
import { type AvatarProps } from "./avatar"; import { type AvatarProps } from "./avatar";
import { AvatarOnlineIndicator, VerifiedTick } from "./base-components"; import { AvatarOnlineIndicator, VerifiedTick } from "./base-components";
@@ -90,7 +91,7 @@ export const AvatarProfilePhoto = ({
return ( return (
<div className={cx("flex size-full items-center justify-center rounded-full bg-tertiary ring-1 ring-secondary_alt", styles[size].content)}> <div className={cx("flex size-full items-center justify-center rounded-full bg-tertiary ring-1 ring-secondary_alt", styles[size].content)}>
{placeholder || <User01 className={cx("text-fg-quaternary", styles[size].icon)} />} {placeholder || <FontAwesomeIcon icon={faUser} className={cx("text-fg-quaternary", styles[size].icon)} />}
</div> </div>
); );
}; };

View File

@@ -1,5 +1,6 @@
import { type FC, type ReactNode, useState } from "react"; import { type FC, type ReactNode, useState } from "react";
import { User01 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faUser } from "@fortawesome/pro-duotone-svg-icons";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
import { AvatarOnlineIndicator, VerifiedTick } from "./base-components"; import { AvatarOnlineIndicator, VerifiedTick } from "./base-components";
@@ -90,7 +91,7 @@ export const Avatar = ({
return <PlaceholderIcon className={cx("text-fg-quaternary", styles[size].icon)} />; return <PlaceholderIcon className={cx("text-fg-quaternary", styles[size].icon)} />;
} }
return placeholder || <User01 className={cx("text-fg-quaternary", styles[size].icon)} />; return placeholder || <FontAwesomeIcon icon={faUser} className={cx("text-fg-quaternary", styles[size].icon)} />;
}; };
const renderBadgeContent = () => { const renderBadgeContent = () => {

View File

@@ -1,4 +1,5 @@
import { Plus } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faPlus } from "@fortawesome/pro-duotone-svg-icons";
import type { ButtonProps as AriaButtonProps } from "react-aria-components"; import type { ButtonProps as AriaButtonProps } from "react-aria-components";
import { Tooltip as AriaTooltip, TooltipTrigger as AriaTooltipTrigger } from "@/components/base/tooltip/tooltip"; import { Tooltip as AriaTooltip, TooltipTrigger as AriaTooltipTrigger } from "@/components/base/tooltip/tooltip";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
@@ -26,7 +27,7 @@ export const AvatarAddButton = ({ size, className, title = "Add user", ...props
className, className,
)} )}
> >
<Plus className={cx("text-current transition-inherit-all", sizes[size].icon)} /> <FontAwesomeIcon icon={faPlus} className={cx("text-current transition-inherit-all", sizes[size].icon)} />
</AriaTooltipTrigger> </AriaTooltipTrigger>
</AriaTooltip> </AriaTooltip>
); );

View File

@@ -1,6 +1,9 @@
import type { FC, ReactNode } from "react"; import type { FC, ReactNode } from "react";
import { isValidElement } from "react"; import { isValidElement } from "react";
import { ArrowRight } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faArrowRight } from "@fortawesome/pro-duotone-svg-icons";
const ArrowRight: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowRight} className={className} />;
import { cx, sortCx } from "@/utils/cx"; import { cx, sortCx } from "@/utils/cx";
import { isReactComponent } from "@/utils/is-react-component"; import { isReactComponent } from "@/utils/is-react-component";

View File

@@ -1,5 +1,8 @@
import type { MouseEventHandler, ReactNode } from "react"; import type { FC, MouseEventHandler, ReactNode } from "react";
import { X as CloseX } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faXmark } from "@fortawesome/pro-duotone-svg-icons";
const CloseX: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faXmark} className={className} />;
import { Dot } from "@/components/foundations/dot-icon"; import { Dot } from "@/components/foundations/dot-icon";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
import type { BadgeColors, BadgeTypeToColorMap, BadgeTypes, FlagTypes, IconComponentType, Sizes } from "./badge-types"; import type { BadgeColors, BadgeTypeToColorMap, BadgeTypes, FlagTypes, IconComponentType, Sizes } from "./badge-types";

View File

@@ -1,4 +1,5 @@
import { X as CloseIcon } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faXmark } from "@fortawesome/pro-duotone-svg-icons";
import { Button as AriaButton, type ButtonProps as AriaButtonProps } from "react-aria-components"; import { Button as AriaButton, type ButtonProps as AriaButtonProps } from "react-aria-components";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
@@ -34,7 +35,7 @@ export const CloseButton = ({ label, className, size = "sm", theme = "light", ..
) )
} }
> >
<CloseIcon aria-hidden="true" className={cx("shrink-0 transition-inherit-all", sizes[size].icon)} /> <FontAwesomeIcon icon={faXmark} aria-hidden="true" className={cx("shrink-0 transition-inherit-all", sizes[size].icon)} />
</AriaButton> </AriaButton>
); );
}; };

View File

@@ -1,5 +1,6 @@
import type { FC, RefAttributes } from "react"; import type { FC, RefAttributes } from "react";
import { DotsVertical } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faEllipsisVertical } from "@fortawesome/pro-duotone-svg-icons";
import type { import type {
ButtonProps as AriaButtonProps, ButtonProps as AriaButtonProps,
MenuItemProps as AriaMenuItemProps, MenuItemProps as AriaMenuItemProps,
@@ -144,7 +145,7 @@ const DropdownDotsButton = (props: AriaButtonProps & RefAttributes<HTMLButtonEle
) )
} }
> >
<DotsVertical className="size-5 transition-inherit-all" /> <FontAwesomeIcon icon={faEllipsisVertical} className="size-5 transition-inherit-all" />
</AriaButton> </AriaButton>
); );
}; };

View File

@@ -1,5 +1,6 @@
import { type ComponentType, type HTMLAttributes, type ReactNode, type Ref, createContext, useContext } from "react"; import { type ComponentType, type HTMLAttributes, type ReactNode, type Ref, createContext, useContext } from "react";
import { HelpCircle, InfoCircle } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCircleQuestion, faCircleExclamation } from "@fortawesome/pro-duotone-svg-icons";
import type { InputProps as AriaInputProps, TextFieldProps as AriaTextFieldProps } from "react-aria-components"; import type { InputProps as AriaInputProps, TextFieldProps as AriaTextFieldProps } from "react-aria-components";
import { Group as AriaGroup, Input as AriaInput, TextField as AriaTextField } from "react-aria-components"; import { Group as AriaGroup, Input as AriaInput, TextField as AriaTextField } from "react-aria-components";
import { HintText } from "@/components/base/input/hint-text"; import { HintText } from "@/components/base/input/hint-text";
@@ -140,14 +141,15 @@ export const InputBase = ({
tooltipClassName, tooltipClassName,
)} )}
> >
<HelpCircle className="size-4" /> <FontAwesomeIcon icon={faCircleQuestion} className="size-4" />
</TooltipTrigger> </TooltipTrigger>
</Tooltip> </Tooltip>
)} )}
{/* Invalid icon */} {/* Invalid icon */}
{isInvalid && ( {isInvalid && (
<InfoCircle <FontAwesomeIcon
icon={faCircleExclamation}
className={cx( className={cx(
"pointer-events-none absolute size-4 text-fg-error-secondary", "pointer-events-none absolute size-4 text-fg-error-secondary",
sizes[inputSize].iconTrailing, sizes[inputSize].iconTrailing,

View File

@@ -1,5 +1,6 @@
import type { ReactNode, Ref } from "react"; import type { ReactNode, Ref } from "react";
import { HelpCircle } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCircleQuestion } from "@fortawesome/pro-duotone-svg-icons";
import type { LabelProps as AriaLabelProps } from "react-aria-components"; import type { LabelProps as AriaLabelProps } from "react-aria-components";
import { Label as AriaLabel } from "react-aria-components"; import { Label as AriaLabel } from "react-aria-components";
import { Tooltip, TooltipTrigger } from "@/components/base/tooltip/tooltip"; import { Tooltip, TooltipTrigger } from "@/components/base/tooltip/tooltip";
@@ -37,7 +38,7 @@ export const Label = ({ isRequired, tooltip, tooltipDescription, className, ...p
isDisabled={false} isDisabled={false}
className="cursor-pointer text-fg-quaternary transition duration-200 hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover" className="cursor-pointer text-fg-quaternary transition duration-200 hover:text-fg-quaternary_hover focus:text-fg-quaternary_hover"
> >
<HelpCircle className="size-4" /> <FontAwesomeIcon icon={faCircleQuestion} className="size-4" />
</TooltipTrigger> </TooltipTrigger>
</Tooltip> </Tooltip>
)} )}

View File

@@ -1,6 +1,7 @@
import type { FocusEventHandler, PointerEventHandler, RefAttributes, RefObject } from "react"; import type { FocusEventHandler, PointerEventHandler, RefAttributes, RefObject } from "react";
import { useCallback, useContext, useRef, useState } from "react"; import { useCallback, useContext, useRef, useState } from "react";
import { SearchLg as SearchIcon } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons";
import type { ComboBoxProps as AriaComboBoxProps, GroupProps as AriaGroupProps, ListBoxProps as AriaListBoxProps } from "react-aria-components"; import type { ComboBoxProps as AriaComboBoxProps, GroupProps as AriaGroupProps, ListBoxProps as AriaListBoxProps } from "react-aria-components";
import { ComboBox as AriaComboBox, Group as AriaGroup, Input as AriaInput, ListBox as AriaListBox, ComboBoxStateContext } from "react-aria-components"; import { ComboBox as AriaComboBox, Group as AriaGroup, Input as AriaInput, ListBox as AriaListBox, ComboBoxStateContext } from "react-aria-components";
import { HintText } from "@/components/base/input/hint-text"; import { HintText } from "@/components/base/input/hint-text";
@@ -51,7 +52,7 @@ const ComboBoxValue = ({ size, shortcut, placeholder, shortcutClassName, ...othe
> >
{({ isDisabled }) => ( {({ isDisabled }) => (
<> <>
<SearchIcon className="pointer-events-none size-5 shrink-0 text-fg-quaternary" /> <FontAwesomeIcon icon={faMagnifyingGlass} className="pointer-events-none size-5 shrink-0 text-fg-quaternary" />
<div className="relative flex w-full items-center gap-2"> <div className="relative flex w-full items-center gap-2">
{inputValue && ( {inputValue && (

View File

@@ -1,6 +1,9 @@
import type { FocusEventHandler, KeyboardEvent, PointerEventHandler, RefAttributes, RefObject } from "react"; import type { FC, FocusEventHandler, KeyboardEvent, PointerEventHandler, RefAttributes, RefObject } from "react";
import { createContext, useCallback, useContext, useRef, useState } from "react"; import { createContext, useCallback, useContext, useRef, useState } from "react";
import { SearchLg } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons";
const SearchIcon: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { FocusScope, useFilter, useFocusManager } from "react-aria"; import { FocusScope, useFilter, useFocusManager } from "react-aria";
import type { ComboBoxProps as AriaComboBoxProps, GroupProps as AriaGroupProps, ListBoxProps as AriaListBoxProps, Key } from "react-aria-components"; import type { ComboBoxProps as AriaComboBoxProps, GroupProps as AriaGroupProps, ListBoxProps as AriaListBoxProps, Key } from "react-aria-components";
import { ComboBox as AriaComboBox, Group as AriaGroup, Input as AriaInput, ListBox as AriaListBox, ComboBoxStateContext } from "react-aria-components"; import { ComboBox as AriaComboBox, Group as AriaGroup, Input as AriaInput, ListBox as AriaListBox, ComboBoxStateContext } from "react-aria-components";
@@ -317,7 +320,7 @@ export const MultiSelectTagsValue = ({
shortcut, shortcut,
placeholder, placeholder,
shortcutClassName, shortcutClassName,
placeholderIcon: Icon = SearchLg, placeholderIcon: Icon = SearchIcon,
// Omit this prop to avoid invalid HTML attribute warning // Omit this prop to avoid invalid HTML attribute warning
isDisabled: _isDisabled, isDisabled: _isDisabled,
...otherProps ...otherProps

View File

@@ -1,5 +1,6 @@
import { isValidElement, useContext } from "react"; import { isValidElement, useContext } from "react";
import { Check } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCheck } from "@fortawesome/pro-duotone-svg-icons";
import type { ListBoxItemProps as AriaListBoxItemProps } from "react-aria-components"; import type { ListBoxItemProps as AriaListBoxItemProps } from "react-aria-components";
import { ListBoxItem as AriaListBoxItem, Text as AriaText } from "react-aria-components"; import { ListBoxItem as AriaListBoxItem, Text as AriaText } from "react-aria-components";
import { Avatar } from "@/components/base/avatar/avatar"; import { Avatar } from "@/components/base/avatar/avatar";
@@ -79,11 +80,12 @@ export const SelectItem = ({ label, id, value, avatarUrl, supportingText, isDisa
</div> </div>
{state.isSelected && ( {state.isSelected && (
<Check <FontAwesomeIcon
icon={faCheck}
aria-hidden="true" aria-hidden="true"
className={cx( className={cx(
"ml-auto text-fg-brand-primary", "ml-auto text-fg-brand-primary",
size === "sm" ? "size-4 stroke-[2.5px]" : "size-5", size === "sm" ? "size-4" : "size-5",
state.isDisabled && "text-fg-disabled", state.isDisabled && "text-fg-disabled",
)} )}
/> />

View File

@@ -1,5 +1,6 @@
import { type SelectHTMLAttributes, useId } from "react"; import { type SelectHTMLAttributes, useId } from "react";
import { ChevronDown } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronDown } from "@fortawesome/pro-duotone-svg-icons";
import { HintText } from "@/components/base/input/hint-text"; import { HintText } from "@/components/base/input/hint-text";
import { Label } from "@/components/base/input/label"; import { Label } from "@/components/base/input/label";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
@@ -51,9 +52,10 @@ export const NativeSelect = ({ label, hint, options, className, selectClassName,
</option> </option>
))} ))}
</select> </select>
<ChevronDown <FontAwesomeIcon
icon={faChevronDown}
aria-hidden="true" aria-hidden="true"
className="pointer-events-none absolute right-3.5 size-5 text-fg-quaternary in-data-input-wrapper:right-0 in-data-input-wrapper:size-4 in-data-input-wrapper:stroke-[2.625px] in-data-input-wrapper:in-data-trailing:in-data-[input-size=sm]:right-3" className="pointer-events-none absolute right-3.5 size-5 text-fg-quaternary in-data-input-wrapper:right-0 in-data-input-wrapper:size-4 in-data-input-wrapper:in-data-trailing:in-data-[input-size=sm]:right-3"
/> />
</div> </div>

View File

@@ -1,6 +1,7 @@
import type { FC, ReactNode, Ref, RefAttributes } from "react"; import type { FC, ReactNode, Ref, RefAttributes } from "react";
import { createContext, isValidElement } from "react"; import { createContext, isValidElement } from "react";
import { ChevronDown } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronDown } from "@fortawesome/pro-duotone-svg-icons";
import type { SelectProps as AriaSelectProps } from "react-aria-components"; import type { SelectProps as AriaSelectProps } from "react-aria-components";
import { Button as AriaButton, ListBox as AriaListBox, Select as AriaSelect, SelectValue as AriaSelectValue } from "react-aria-components"; import { Button as AriaButton, ListBox as AriaListBox, Select as AriaSelect, SelectValue as AriaSelectValue } from "react-aria-components";
import { Avatar } from "@/components/base/avatar/avatar"; import { Avatar } from "@/components/base/avatar/avatar";
@@ -92,9 +93,10 @@ const SelectValue = ({ isOpen, isFocused, isDisabled, size, placeholder, placeho
<p className={cx("text-md text-placeholder", isDisabled && "text-disabled")}>{placeholder}</p> <p className={cx("text-md text-placeholder", isDisabled && "text-disabled")}>{placeholder}</p>
)} )}
<ChevronDown <FontAwesomeIcon
icon={faChevronDown}
aria-hidden="true" aria-hidden="true"
className={cx("ml-auto shrink-0 text-fg-quaternary", size === "sm" ? "size-4 stroke-[2.5px]" : "size-5")} className={cx("ml-auto shrink-0 text-fg-quaternary", size === "sm" ? "size-4" : "size-5")}
/> />
</> </>
); );

View File

@@ -1,5 +1,6 @@
import type { RefAttributes } from "react"; import type { RefAttributes } from "react";
import { XClose } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faXmark } from "@fortawesome/pro-duotone-svg-icons";
import { Button as AriaButton, type ButtonProps as AriaButtonProps } from "react-aria-components"; import { Button as AriaButton, type ButtonProps as AriaButtonProps } from "react-aria-components";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
@@ -26,7 +27,7 @@ export const TagCloseX = ({ size = "md", className, ...otherProps }: TagCloseXPr
)} )}
{...otherProps} {...otherProps}
> >
<XClose className={cx("transition-inherit-all", styles[size].icon)} strokeWidth="3" /> <FontAwesomeIcon icon={faXmark} className={cx("transition-inherit-all", styles[size].icon)} />
</AriaButton> </AriaButton>
); );
}; };

View File

@@ -1,10 +1,12 @@
import { useState, useEffect } from 'react'; import { useState, useEffect } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faCalendarPlus } from '@fortawesome/pro-duotone-svg-icons'; import { faCalendarPlus, faXmark } from '@fortawesome/pro-duotone-svg-icons';
import type { FC, HTMLAttributes } from 'react'; import type { FC, HTMLAttributes } from 'react';
const CalendarPlus02: FC<HTMLAttributes<HTMLOrSVGElement>> = ({ className }) => <FontAwesomeIcon icon={faCalendarPlus} className={className} />; const CalendarPlus02: FC<HTMLAttributes<HTMLOrSVGElement>> = ({ className }) => <FontAwesomeIcon icon={faCalendarPlus} className={className} />;
import { XClose } from '@untitledui/icons'; import { faXmark } from '@fortawesome/pro-duotone-svg-icons';
const XClose: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faXmark} className={className} />;
import { Input } from '@/components/base/input/input'; import { Input } from '@/components/base/input/input';
import { Select } from '@/components/base/select/select'; import { Select } from '@/components/base/select/select';
import { TextArea } from '@/components/base/textarea/textarea'; import { TextArea } from '@/components/base/textarea/textarea';

View File

@@ -1,6 +1,10 @@
import type { FC } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faArrowRight } from '@fortawesome/pro-duotone-svg-icons';
import { Badge } from '@/components/base/badges/badges'; import { Badge } from '@/components/base/badges/badges';
import { Button } from '@/components/base/buttons/button'; import { Button } from '@/components/base/buttons/button';
import { ArrowRight } from '@untitledui/icons';
const ArrowRight: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowRight} className={className} />;
import { formatShortDate } from '@/lib/format'; import { formatShortDate } from '@/lib/format';
import type { Call, CallDisposition } from '@/types/entities'; import type { Call, CallDisposition } from '@/types/entities';

View File

@@ -1,4 +1,5 @@
import { PhoneCall01 } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faPhoneArrowUpRight } from '@fortawesome/pro-duotone-svg-icons';
import { cx } from '@/utils/cx'; import { cx } from '@/utils/cx';
interface CallSimulatorProps { interface CallSimulatorProps {
@@ -19,7 +20,7 @@ export const CallSimulator = ({ onSimulate, isCallActive }: CallSimulatorProps)
: 'cursor-pointer bg-brand-solid hover:bg-brand-solid_hover [&:hover_svg]:animate-[ring-shake_0.5s_ease-in-out]', : 'cursor-pointer bg-brand-solid hover:bg-brand-solid_hover [&:hover_svg]:animate-[ring-shake_0.5s_ease-in-out]',
)} )}
> >
<PhoneCall01 className="size-5 shrink-0" /> <FontAwesomeIcon icon={faPhoneArrowUpRight} className="size-5 shrink-0" />
{isCallActive ? 'Call in progress...' : 'Simulate Incoming Call'} {isCallActive ? 'Call in progress...' : 'Simulate Incoming Call'}
</button> </button>
); );

View File

@@ -1,6 +1,10 @@
import type { FC } from 'react';
import { useState } from 'react'; import { useState } from 'react';
import { Phone01 } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faPhone } from '@fortawesome/pro-duotone-svg-icons';
import { useSetAtom } from 'jotai'; import { useSetAtom } from 'jotai';
const Phone01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faPhone} className={className} />;
import { Button } from '@/components/base/buttons/button'; import { Button } from '@/components/base/buttons/button';
import { useSip } from '@/providers/sip-provider'; import { useSip } from '@/providers/sip-provider';
import { sipCallStateAtom, sipCallerNumberAtom, sipCallUcidAtom } from '@/state/sip-state'; import { sipCallStateAtom, sipCallerNumberAtom, sipCallUcidAtom } from '@/state/sip-state';

View File

@@ -1,5 +1,6 @@
import { useMemo } from 'react'; import { useMemo } from 'react';
import { Phone01, PhoneIncoming01, CheckCircle, Mail01, Clock, Stars02 } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faPhone, faPhoneArrowDown, faCircleCheck, faEnvelope, faClock, faStars } from '@fortawesome/pro-duotone-svg-icons';
import { Avatar } from '@/components/base/avatar/avatar'; import { Avatar } from '@/components/base/avatar/avatar';
import { Badge } from '@/components/base/badges/badges'; import { Badge } from '@/components/base/badges/badges';
import { SourceTag } from '@/components/shared/source-tag'; import { SourceTag } from '@/components/shared/source-tag';
@@ -41,11 +42,11 @@ const ActivityIcon = ({ type }: { type: string }) => {
const iconType = activityTypeIcons[type] ?? 'note'; const iconType = activityTypeIcons[type] ?? 'note';
const baseClass = 'size-3.5 shrink-0 text-fg-quaternary'; const baseClass = 'size-3.5 shrink-0 text-fg-quaternary';
if (iconType === 'phone') return <Phone01 className={baseClass} />; if (iconType === 'phone') return <FontAwesomeIcon icon={faPhone} className={baseClass} />;
if (iconType === 'email') return <Mail01 className={baseClass} />; if (iconType === 'email') return <FontAwesomeIcon icon={faEnvelope} className={baseClass} />;
if (iconType === 'clock') return <Clock className={baseClass} />; if (iconType === 'clock') return <FontAwesomeIcon icon={faClock} className={baseClass} />;
if (iconType === 'check') return <CheckCircle className={baseClass} />; if (iconType === 'check') return <FontAwesomeIcon icon={faCircleCheck} className={baseClass} />;
return <Clock className={baseClass} />; return <FontAwesomeIcon icon={faClock} className={baseClass} />;
}; };
const dispositionLabels: Record<CallDisposition, string> = { const dispositionLabels: Record<CallDisposition, string> = {
@@ -80,7 +81,7 @@ export const IncomingCallCard = ({ callState, lead, activities, campaigns, onDis
const IdleState = () => ( const IdleState = () => (
<div className="flex flex-col items-center justify-center rounded-2xl border border-secondary bg-secondary p-12 text-center"> <div className="flex flex-col items-center justify-center rounded-2xl border border-secondary bg-secondary p-12 text-center">
<div className="mb-4 animate-pulse"> <div className="mb-4 animate-pulse">
<Phone01 className="size-12 text-fg-quaternary" /> <FontAwesomeIcon icon={faPhone} className="size-12 text-fg-quaternary" />
</div> </div>
<p className="text-lg text-tertiary">Waiting for incoming call...</p> <p className="text-lg text-tertiary">Waiting for incoming call...</p>
</div> </div>
@@ -96,7 +97,7 @@ const RingingState = ({ lead }: { lead: Lead | null }) => {
<div className="relative mb-4"> <div className="relative mb-4">
<div className="absolute inset-0 animate-ping rounded-full bg-brand-solid opacity-20" /> <div className="absolute inset-0 animate-ping rounded-full bg-brand-solid opacity-20" />
<div className="relative animate-bounce"> <div className="relative animate-bounce">
<PhoneIncoming01 className="size-12 text-fg-brand-primary" /> <FontAwesomeIcon icon={faPhoneArrowDown} className="size-12 text-fg-brand-primary" />
</div> </div>
</div> </div>
<span className="mb-1 text-xs font-bold uppercase tracking-wider text-brand-secondary"> <span className="mb-1 text-xs font-bold uppercase tracking-wider text-brand-secondary">
@@ -158,12 +159,12 @@ const ActiveState = ({
<div className="min-w-0 flex-1"> <div className="min-w-0 flex-1">
<h3 className="text-lg font-bold text-primary">{fullName}</h3> <h3 className="text-lg font-bold text-primary">{fullName}</h3>
<div className="mt-1 flex items-center gap-1.5"> <div className="mt-1 flex items-center gap-1.5">
<Phone01 className="size-3.5 shrink-0 text-fg-quaternary" /> <FontAwesomeIcon icon={faPhone} className="size-3.5 shrink-0 text-fg-quaternary" />
<span className="text-md text-secondary">{phoneDisplay}</span> <span className="text-md text-secondary">{phoneDisplay}</span>
</div> </div>
{emailDisplay !== null && ( {emailDisplay !== null && (
<div className="mt-0.5 flex items-center gap-1.5"> <div className="mt-0.5 flex items-center gap-1.5">
<Mail01 className="size-3.5 shrink-0 text-fg-quaternary" /> <FontAwesomeIcon icon={faEnvelope} className="size-3.5 shrink-0 text-fg-quaternary" />
<span className="text-sm text-tertiary">{emailDisplay}</span> <span className="text-sm text-tertiary">{emailDisplay}</span>
</div> </div>
)} )}
@@ -192,7 +193,7 @@ const ActiveState = ({
{/* AI Insight panel */} {/* AI Insight panel */}
<div className="mt-4 rounded-xl bg-brand-primary p-4"> <div className="mt-4 rounded-xl bg-brand-primary p-4">
<div className="mb-2 flex items-center gap-1.5"> <div className="mb-2 flex items-center gap-1.5">
<Stars02 className="size-4 text-fg-brand-primary" /> <FontAwesomeIcon icon={faStars} className="size-4 text-fg-brand-primary" />
<span className="text-xs font-bold uppercase tracking-wider text-brand-secondary"> <span className="text-xs font-bold uppercase tracking-wider text-brand-secondary">
AI Insight AI Insight
</span> </span>
@@ -252,7 +253,7 @@ const CompletedState = ({ disposition }: { disposition: CallDisposition | null }
return ( return (
<div className="flex flex-col items-center justify-center rounded-2xl bg-success-primary p-8 text-center"> <div className="flex flex-col items-center justify-center rounded-2xl bg-success-primary p-8 text-center">
<CheckCircle className="mb-3 size-12 text-fg-success-primary" /> <FontAwesomeIcon icon={faCircleCheck} className="mb-3 size-12 text-fg-success-primary" />
<h3 className="text-lg font-bold text-success-primary">Call Logged</h3> <h3 className="text-lg font-bold text-success-primary">Call Logged</h3>
{disposition !== null && ( {disposition !== null && (
<Badge size="md" color="success" className="mt-2">{label}</Badge> <Badge size="md" color="success" className="mt-2">{label}</Badge>

View File

@@ -4,8 +4,10 @@ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { import {
faPhoneArrowDown, faPhoneArrowDown,
faPhoneArrowUp, faPhoneArrowUp,
faMagnifyingGlass,
} from '@fortawesome/pro-duotone-svg-icons'; } from '@fortawesome/pro-duotone-svg-icons';
import { SearchLg } from '@untitledui/icons';
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { Table } from '@/components/application/table/table'; import { Table } from '@/components/application/table/table';
import { Badge } from '@/components/base/badges/badges'; import { Badge } from '@/components/base/badges/badges';
import { Input } from '@/components/base/input/input'; import { Input } from '@/components/base/input/input';

View File

@@ -1,5 +1,10 @@
import type { FC } from 'react';
import { useNavigate } from 'react-router'; import { useNavigate } from 'react-router';
import { ArrowLeft, LinkExternal01 } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faArrowLeft, faArrowUpRightFromSquare } from '@fortawesome/pro-duotone-svg-icons';
const ArrowLeft: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowLeft} className={className} />;
const LinkExternal01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowUpRightFromSquare} className={className} />;
import { Button } from '@/components/base/buttons/button'; import { Button } from '@/components/base/buttons/button';
import { CampaignStatusBadge } from '@/components/shared/status-badge'; import { CampaignStatusBadge } from '@/components/shared/status-badge';

View File

@@ -1,4 +1,5 @@
import { X } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faXmark } from '@fortawesome/pro-duotone-svg-icons';
import { cx } from '@/utils/cx'; import { cx } from '@/utils/cx';
type FilterPill = { type FilterPill = {
@@ -32,7 +33,7 @@ export const FilterPills = ({ filters, onRemove, onClearAll }: FilterPillsProps)
className="ml-0.5 cursor-pointer rounded-full p-0.5 transition duration-100 ease-linear hover:bg-brand-secondary hover:text-white" className="ml-0.5 cursor-pointer rounded-full p-0.5 transition duration-100 ease-linear hover:bg-brand-secondary hover:text-white"
aria-label={`Remove ${filter.label} filter`} aria-label={`Remove ${filter.label} filter`}
> >
<X className="size-3 stroke-[3px]" /> <FontAwesomeIcon icon={faXmark} className="size-3" />
</button> </button>
</span> </span>
))} ))}

View File

@@ -1,7 +1,11 @@
import type { FC } from 'react';
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { TableBody as AriaTableBody } from 'react-aria-components'; import { TableBody as AriaTableBody } from 'react-aria-components';
import type { SortDescriptor, Selection } from 'react-aria-components'; import type { SortDescriptor, Selection } from 'react-aria-components';
import { DotsVertical } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faEllipsisVertical } from '@fortawesome/pro-duotone-svg-icons';
const DotsVertical: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faEllipsisVertical} className={className} />;
import { Badge } from '@/components/base/badges/badges'; import { Badge } from '@/components/base/badges/badges';
import { Button } from '@/components/base/buttons/button'; import { Button } from '@/components/base/buttons/button';
import { Table } from '@/components/application/table/table'; import { Table } from '@/components/application/table/table';

View File

@@ -1,6 +1,14 @@
import { BookClosed, FileCode01, LifeBuoy01, PlayCircle, Stars02 } from "@untitledui/icons"; import type { FC } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faBookBookmark, faFileCode, faLifeRing, faCirclePlay, faStars } from "@fortawesome/pro-duotone-svg-icons";
import { NavMenuItemLink } from "./base-components/nav-menu-item"; import { NavMenuItemLink } from "./base-components/nav-menu-item";
const BookClosed: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faBookBookmark} className={className} />;
const FileCode01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faFileCode} className={className} />;
const LifeBuoy01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faLifeRing} className={className} />;
const PlayCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCirclePlay} className={className} />;
const Stars02: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faStars} className={className} />;
const items = [ const items = [
{ {
title: "Blog", title: "Blog",

View File

@@ -1,6 +1,7 @@
import type { ReactNode } from "react"; import type { ReactNode } from "react";
import { useRef, useState } from "react"; import { useRef, useState } from "react";
import { ChevronDown } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faChevronDown } from "@fortawesome/pro-duotone-svg-icons";
import { Button as AriaButton, Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Popover as AriaPopover } from "react-aria-components"; import { Button as AriaButton, Dialog as AriaDialog, DialogTrigger as AriaDialogTrigger, Popover as AriaPopover } from "react-aria-components";
import { Button } from "@/components/base/buttons/button"; import { Button } from "@/components/base/buttons/button";
import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo"; import { UntitledLogo } from "@/components/foundations/logo/untitledui-logo";
@@ -54,8 +55,9 @@ const MobileNavItem = (props: { className?: string; label: string; href?: string
className="flex w-full items-center justify-between px-4 py-3 text-md font-semibold text-primary hover:bg-primary_hover" className="flex w-full items-center justify-between px-4 py-3 text-md font-semibold text-primary hover:bg-primary_hover"
> >
{props.label}{" "} {props.label}{" "}
<ChevronDown <FontAwesomeIcon
className={cx("size-4 stroke-[2.625px] text-fg-quaternary transition duration-100 ease-linear", isOpen ? "-rotate-180" : "rotate-0")} icon={faChevronDown}
className={cx("size-4 text-fg-quaternary transition duration-100 ease-linear", isOpen ? "-rotate-180" : "rotate-0")}
/> />
</button> </button>
{isOpen && <div>{props.children}</div>} {isOpen && <div>{props.children}</div>}
@@ -128,7 +130,7 @@ export const Header = ({ items = headerNavItems, isFullWidth, isFloating, classN
<AriaButton className="flex cursor-pointer items-center gap-0.5 rounded-lg px-1.5 py-1 text-md font-semibold text-secondary outline-focus-ring transition duration-100 ease-linear hover:text-secondary_hover focus-visible:outline-2 focus-visible:outline-offset-2"> <AriaButton className="flex cursor-pointer items-center gap-0.5 rounded-lg px-1.5 py-1 text-md font-semibold text-secondary outline-focus-ring transition duration-100 ease-linear hover:text-secondary_hover focus-visible:outline-2 focus-visible:outline-offset-2">
<span className="px-0.5">{navItem.label}</span> <span className="px-0.5">{navItem.label}</span>
<ChevronDown className="size-4 rotate-0 stroke-[2.625px] text-fg-quaternary transition duration-100 ease-linear in-aria-expanded:-rotate-180" /> <FontAwesomeIcon icon={faChevronDown} className="size-4 rotate-0 text-fg-quaternary transition duration-100 ease-linear in-aria-expanded:-rotate-180" />
</AriaButton> </AriaButton>
<AriaPopover <AriaPopover

View File

@@ -1,5 +1,9 @@
import type { FC } from 'react';
import { useState } from 'react'; import { useState } from 'react';
import { SearchLg } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faMagnifyingGlass } from '@fortawesome/pro-duotone-svg-icons';
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { Input } from '@/components/base/input/input'; import { Input } from '@/components/base/input/input';
import { Badge } from '@/components/base/badges/badges'; import { Badge } from '@/components/base/badges/badges';
import { Tabs, TabList, Tab, TabPanel } from '@/components/application/tabs/tabs'; import { Tabs, TabList, Tab, TabPanel } from '@/components/application/tabs/tabs';

View File

@@ -1,7 +1,10 @@
import type { HTMLAttributes } from "react"; import type { FC, HTMLAttributes } from "react";
import { UploadCloud02 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCloudArrowUp } from "@fortawesome/pro-duotone-svg-icons";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
const UploadCloud02: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCloudArrowUp} className={className} />;
interface IllustrationProps extends HTMLAttributes<HTMLDivElement> { interface IllustrationProps extends HTMLAttributes<HTMLDivElement> {
size?: "sm" | "md" | "lg"; size?: "sm" | "md" | "lg";
svgClassName?: string; svgClassName?: string;

View File

@@ -1,7 +1,10 @@
import type { HTMLAttributes } from "react"; import type { FC, HTMLAttributes } from "react";
import { SearchLg } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faMagnifyingGlass } from "@fortawesome/pro-duotone-svg-icons";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
interface IllustrationProps extends HTMLAttributes<HTMLDivElement> { interface IllustrationProps extends HTMLAttributes<HTMLDivElement> {
size?: "sm" | "md" | "lg"; size?: "sm" | "md" | "lg";
svgClassName?: string; svgClassName?: string;

View File

@@ -1,7 +1,10 @@
import type { HTMLAttributes } from "react"; import type { FC, HTMLAttributes } from "react";
import { AlertCircle } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCircleExclamation } from "@fortawesome/pro-duotone-svg-icons";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
const AlertCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCircleExclamation} className={className} />;
interface IllustrationProps extends HTMLAttributes<HTMLDivElement> { interface IllustrationProps extends HTMLAttributes<HTMLDivElement> {
size?: "sm" | "md" | "lg"; size?: "sm" | "md" | "lg";
svgClassName?: string; svgClassName?: string;

View File

@@ -1,7 +1,10 @@
import type { HTMLAttributes } from "react"; import type { FC, HTMLAttributes } from "react";
import { UploadCloud02 } from "@untitledui/icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCloudArrowUp } from "@fortawesome/pro-duotone-svg-icons";
import { cx } from "@/utils/cx"; import { cx } from "@/utils/cx";
const UploadCloud02: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCloudArrowUp} className={className} />;
interface IllustrationProps extends HTMLAttributes<HTMLDivElement> { interface IllustrationProps extends HTMLAttributes<HTMLDivElement> {
size?: "sm" | "md" | "lg"; size?: "sm" | "md" | "lg";
svgClassName?: string; svgClassName?: string;

View File

@@ -1,6 +1,14 @@
import type { FC } from 'react';
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { useSearchParams } from 'react-router'; import { useSearchParams } from 'react-router';
import { ArrowLeft, Download01, FilterLines, SearchLg, SwitchVertical01 } from '@untitledui/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faArrowLeft, faArrowDownToLine, faFilterList, faMagnifyingGlass, faArrowUpArrowDown } from '@fortawesome/pro-duotone-svg-icons';
const ArrowLeft: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowLeft} className={className} />;
const Download01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowDownToLine} className={className} />;
const FilterLines: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faFilterList} className={className} />;
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
const SwitchVertical01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowUpArrowDown} className={className} />;
import { Button } from '@/components/base/buttons/button'; import { Button } from '@/components/base/buttons/button';
import { Input } from '@/components/base/input/input'; import { Input } from '@/components/base/input/input';
import { Tabs, TabList, Tab } from '@/components/application/tabs/tabs'; import { Tabs, TabList, Tab } from '@/components/application/tabs/tabs';

View File

@@ -7,8 +7,10 @@ import {
faPhoneXmark, faPhoneXmark,
faPlay, faPlay,
faPause, faPause,
faMagnifyingGlass,
} from '@fortawesome/pro-duotone-svg-icons'; } from '@fortawesome/pro-duotone-svg-icons';
import { SearchLg } from '@untitledui/icons';
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { Table, TableCard } from '@/components/application/table/table'; import { Table, TableCard } from '@/components/application/table/table';
import { Badge } from '@/components/base/badges/badges'; import { Badge } from '@/components/base/badges/badges';
import { Button } from '@/components/base/buttons/button'; import { Button } from '@/components/base/buttons/button';

View File

@@ -1,4 +1,12 @@
import { BookOpen01, Check, Copy01, Cube01, HelpCircle } from "@untitledui/icons"; import type { FC } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faBookOpen, faCheck, faCopy, faCube, faCircleQuestion } from "@fortawesome/pro-duotone-svg-icons";
const BookOpen01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faBookOpen} className={className} />;
const Check: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCheck} className={className} />;
const Copy01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCopy} className={className} />;
const Cube01: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCube} className={className} />;
const HelpCircle: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faCircleQuestion} className={className} />;
import { Button } from "@/components/base/buttons/button"; import { Button } from "@/components/base/buttons/button";
import { ButtonUtility } from "@/components/base/buttons/button-utility"; import { ButtonUtility } from "@/components/base/buttons/button-utility";
import { UntitledLogoMinimal } from "@/components/foundations/logo/untitledui-logo-minimal"; import { UntitledLogoMinimal } from "@/components/foundations/logo/untitledui-logo-minimal";

View File

@@ -1,7 +1,11 @@
import { ArrowLeft } from "@untitledui/icons"; import type { FC } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faArrowLeft } from "@fortawesome/pro-duotone-svg-icons";
import { useNavigate } from "react-router"; import { useNavigate } from "react-router";
import { Button } from "@/components/base/buttons/button"; import { Button } from "@/components/base/buttons/button";
const ArrowLeft: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowLeft} className={className} />;
export function NotFound() { export function NotFound() {
const router = useNavigate(); const router = useNavigate();

View File

@@ -1,8 +1,10 @@
import { useMemo, useState } from 'react'; import { useMemo, useState } from 'react';
import { useNavigate } from 'react-router'; import { useNavigate } from 'react-router';
import type { FC } from 'react';
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
import { faUser } from '@fortawesome/pro-duotone-svg-icons'; import { faUser, faMagnifyingGlass } from '@fortawesome/pro-duotone-svg-icons';
import { SearchLg } from '@untitledui/icons';
const SearchLg: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faMagnifyingGlass} className={className} />;
import { Avatar } from '@/components/base/avatar/avatar'; import { Avatar } from '@/components/base/avatar/avatar';
import { Badge } from '@/components/base/badges/badges'; import { Badge } from '@/components/base/badges/badges';
import { Button } from '@/components/base/buttons/button'; import { Button } from '@/components/base/buttons/button';

View File

@@ -7,8 +7,12 @@ import {
faPhoneArrowUpRight, faPhoneArrowUpRight,
faPercent, faPercent,
} from '@fortawesome/pro-duotone-svg-icons'; } from '@fortawesome/pro-duotone-svg-icons';
import type { FC } from 'react';
import { faArrowUp, faArrowDown } from '@fortawesome/pro-duotone-svg-icons';
import { BadgeWithIcon } from '@/components/base/badges/badges'; import { BadgeWithIcon } from '@/components/base/badges/badges';
import { ArrowUp, ArrowDown } from '@untitledui/icons';
const ArrowUp: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowUp} className={className} />;
const ArrowDown: FC<{ className?: string }> = ({ className }) => <FontAwesomeIcon icon={faArrowDown} className={className} />;
import { TopBar } from '@/components/layout/top-bar'; import { TopBar } from '@/components/layout/top-bar';
import { useData } from '@/providers/data-provider'; import { useData } from '@/providers/data-provider';
import type { Call } from '@/types/entities'; import type { Call } from '@/types/entities';