mirror of
https://dev.azure.com/globalhealthx/EMR/_git/helix-engage
synced 2026-04-11 18:28:15 +00:00
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:
@@ -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) {
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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")}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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 = () => {
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -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 && (
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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",
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|
||||||
|
|||||||
@@ -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")}
|
||||||
/>
|
/>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
@@ -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';
|
||||||
|
|||||||
Reference in New Issue
Block a user