feat: remove unused admin dashboard components and icons for cleanup

This commit is contained in:
Ardeman 2025-03-07 17:31:30 +08:00
parent c91fe48eb9
commit a7bae3ea43
14 changed files with 5 additions and 465 deletions

View File

@ -1,23 +0,0 @@
import type { JSX, SVGProps } from 'react'
export const CashierMachineIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={14}
height={16}
viewBox="0 0 14 16"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M11.778 3.87h-1.553v-.988h1.268c.324 0 .586-.325.586-.723V.833c0-.4-.262-.723-.586-.723h-3.46c-.325 0-.586.324-.586.723V2.16c0 .4.26.723.585.723h1.292v.989H3.07a.628.628 0 00-.629.626L.876 12.59v2.521H14v-2.52l-1.593-8.093a.628.628 0 00-.63-.626zm-7.15 7.505h-.966v-.982h.967v.982zM3.662 9.5v-.982h.967V9.5H3.66zm2.843 1.89h-.967v-.997h.967v.996zm0-1.905h-.982v-.953h.982v.953zm1.875 1.902h-.982v-.994h.982v.994zm-.982-1.902v-.967h.982v.967h-.982zM8.38 7.61H3.662V5.735H8.38V7.61zm2.798 0H9.285v-.956h1.892v.956z"
fill="currentColor"
/>
</svg>
)
}

View File

@ -1,239 +0,0 @@
import type { JSX, SVGProps } from 'react'
export const BoldIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={20}
height={20}
viewBox="0 0 20 20"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M11.4062 15.625H5.625V4.375H10.9375C11.5639 4.37504 12.1771 4.55435 12.7048 4.89174C13.2325 5.22914 13.6526 5.71052 13.9155 6.27903C14.1784 6.84754 14.2731 7.47942 14.1884 8.10001C14.1037 8.72061 13.8431 9.30399 13.4375 9.78125C13.9673 10.205 14.3528 10.7825 14.5408 11.4344C14.7289 12.0862 14.7102 12.7803 14.4875 13.4211C14.2647 14.0619 13.8488 14.6179 13.297 15.0126C12.7452 15.4073 12.0847 15.6213 11.4062 15.625ZM7.5 13.75H11.3937C11.5784 13.75 11.7613 13.7136 11.9319 13.643C12.1025 13.5723 12.2575 13.4687 12.3881 13.3381C12.5187 13.2075 12.6223 13.0525 12.693 12.8819C12.7636 12.7113 12.8 12.5284 12.8 12.3438C12.8 12.1591 12.7636 11.9762 12.693 11.8056C12.6223 11.635 12.5187 11.48 12.3881 11.3494C12.2575 11.2188 12.1025 11.1152 11.9319 11.0445C11.7613 10.9739 11.5784 10.9375 11.3937 10.9375H7.5V13.75ZM7.5 9.0625H10.9375C11.1222 9.0625 11.305 9.02613 11.4756 8.95546C11.6463 8.88478 11.8013 8.7812 11.9319 8.65062C12.0625 8.52004 12.166 8.36501 12.2367 8.1944C12.3074 8.02378 12.3438 7.84092 12.3438 7.65625C12.3438 7.47158 12.3074 7.28872 12.2367 7.1181C12.166 6.94749 12.0625 6.79246 11.9319 6.66188C11.8013 6.5313 11.6463 6.42772 11.4756 6.35704C11.305 6.28637 11.1222 6.25 10.9375 6.25H7.5V9.0625Z"
fill="currentColor"
/>
</svg>
)
}
export const ItalicIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M19.625 9.625v-1.25H11.5v1.25h3.213l-2.732 8.75H8.375v1.25H16.5v-1.25h-3.213l2.732-8.75h3.606z"
fill="currentColor"
/>
</svg>
)
}
export const UnderlineIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M6.5 20.25h15v1.25h-15v-1.25zm7.5-1.875A4.375 4.375 0 019.625 14V7.125h1.25V14a3.125 3.125 0 106.25 0V7.125h1.25V14A4.375 4.375 0 0114 18.375z"
fill="#212529"
/>
</svg>
)
}
export const UndoIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M16.5 10.25H8.884l2.242-2.241-.876-.884-3.75 3.75 3.75 3.75.876-.884-2.24-2.241H16.5a3.75 3.75 0 010 7.5h-5v1.25h5a5 5 0 100-10z"
fill="#212529"
/>
</svg>
)
}
export const RedoIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M11.5 10.25h7.616l-2.242-2.241.876-.884 3.75 3.75-3.75 3.75-.876-.884 2.24-2.241H11.5a3.75 3.75 0 000 7.5h5v1.25h-5a5 5 0 010-10z"
fill="#212529"
/>
</svg>
)
}
export const ListIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M8.375 11.5a1.875 1.875 0 100-3.75 1.875 1.875 0 000 3.75zM8.375 20.25a1.875 1.875 0 100-3.75 1.875 1.875 0 000 3.75zM14 17.75h8.75V19H14v-1.25zM14 9h8.75v1.25H14V9z"
fill="#212529"
/>
</svg>
)
}
export const ListOrderIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M14 17.75h8.75V19H14v-1.25zM14 9h8.75v1.25H14V9zm-5 2.5v-5H7.75v.625H6.5v1.25h1.25V11.5H6.5v1.25h3.75V11.5H9zm1.25 10H6.5V19a1.25 1.25 0 011.25-1.25H9V16.5H6.5v-1.25H9a1.25 1.25 0 011.25 1.25v1.25A1.25 1.25 0 019 19H7.75v1.25h2.5v1.25z"
fill="#212529"
/>
</svg>
)
}
export const LinkIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M22.281 8.225a3.75 3.75 0 00-5.312 0l.887.888a2.506 2.506 0 113.544 3.543l-5 5a2.504 2.504 0 01-3.544-3.537l.882-.888-.882-.887-.887.887a3.75 3.75 0 000 5.313 3.75 3.75 0 002.656 1.081 3.75 3.75 0 002.669-1.1l5-5a3.75 3.75 0 00-.013-5.3z"
fill="#212529"
/>
<path
d="M6.619 19.512a2.5 2.5 0 010-3.543l5-5a2.5 2.5 0 013.543 0 2.462 2.462 0 01.713 1.781 2.5 2.5 0 01-.731 1.781l-1.325 1.344.887.887 1.325-1.325a3.76 3.76 0 10-5.318-5.318l-5 5a3.75 3.75 0 000 5.319A3.75 3.75 0 008.375 21.5a3.794 3.794 0 002.675-1.1l-.888-.887a2.5 2.5 0 01-3.543 0z"
fill="#212529"
/>
</svg>
)
}
export const ImageIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M15.875 12.75a1.875 1.875 0 100-3.75 1.875 1.875 0 000 3.75zm0-2.5a.625.625 0 110 1.25.625.625 0 010-1.25z"
fill="#212529"
/>
<path
d="M20.25 6.5H7.75A1.25 1.25 0 006.5 7.75v12.5a1.25 1.25 0 001.25 1.25h12.5a1.25 1.25 0 001.25-1.25V7.75a1.25 1.25 0 00-1.25-1.25zm0 13.75H7.75V16.5l3.125-3.125 3.494 3.494a1.25 1.25 0 001.762 0l.994-.994L20.25 19v1.25zm0-3.019l-2.244-2.244a1.25 1.25 0 00-1.762 0l-.994.994-3.494-3.493a1.25 1.25 0 00-1.762 0L7.75 14.73V7.75h12.5v9.481z"
fill="#212529"
/>
</svg>
)
}
export const CodeIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M23.375 14L19 18.375l-.881-.881L21.606 14l-3.487-3.494.881-.881L23.375 14zm-18.75 0L9 9.625l.881.881L6.394 14l3.487 3.494-.881.881L4.625 14zm7.137 5.927L15.025 7.75l1.208.323L12.97 20.25l-1.208-.323z"
fill="#212529"
/>
</svg>
)
}
export const QuoteIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M11.5 13.375H7.819a5.626 5.626 0 012.431-3.838l1.119-.75-.688-1.037-1.118.75A6.875 6.875 0 006.5 14.219v4.156a1.25 1.25 0 001.25 1.25h3.75a1.25 1.25 0 001.25-1.25v-3.75a1.25 1.25 0 00-1.25-1.25zm8.75 0h-3.681A5.625 5.625 0 0119 9.537l1.119-.75-.681-1.037-1.125.75a6.875 6.875 0 00-3.063 5.719v4.156a1.25 1.25 0 001.25 1.25h3.75a1.25 1.25 0 001.25-1.25v-3.75a1.25 1.25 0 00-1.25-1.25z"
fill="#212529"
/>
</svg>
)
}
export const StrikethroughIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={28}
height={28}
viewBox="0 0 28 28"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M21.5 13.375h-6.277a25.033 25.033 0 00-.837-.209c-1.755-.415-2.747-.719-2.747-2.14a1.792 1.792 0 01.492-1.34 2.993 2.993 0 011.883-.681c1.769-.044 2.584.556 3.251 1.468l1.01-.737a4.67 4.67 0 00-4.27-1.981 4.233 4.233 0 00-2.75 1.038 3.015 3.015 0 00-.866 2.234 2.733 2.733 0 001.084 2.348H6.5v1.25h8.533c1.229.357 1.964.82 1.983 2.1a1.949 1.949 0 01-.54 1.495 3.64 3.64 0 01-2.324.78 4.146 4.146 0 01-3.216-1.681l-.958.802a5.328 5.328 0 004.155 2.13h.062a4.794 4.794 0 003.155-1.138 3.175 3.175 0 00.916-2.408 3.094 3.094 0 00-.72-2.08H21.5v-1.25z"
fill="#212529"
/>
</svg>
)
}

View File

@ -1,37 +0,0 @@
import type { JSX, SVGProps } from 'react'
type TNotificationIcon = {
showBadge?: boolean
} & JSX.IntrinsicAttributes &
SVGProps<SVGSVGElement>
export const NotificationIcon = ({
showBadge = false,
...properties
}: TNotificationIcon) => {
return (
<svg
width={16}
height={19}
viewBox="0 0 16 19"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M6.597 18.53a1.616 1.616 0 01-1.608-1.6h3.2c.001.213-.04.425-.12.623-.21.482-.639.833-1.152.944h-.038c-.093.02-.187.03-.282.032zm6.4-2.4H.197v-1.6l1.6-.8v-4.4a6.452 6.452 0 01.739-3.249 3.723 3.723 0 012.46-1.808V2.53h3.2v1.744c2.064.492 3.2 2.287 3.2 5.056v4.4l1.6.8v1.6z"
fill="currentColor"
/>
{showBadge && (
<circle
cx={11.1968}
cy={4.306_64}
r={3.6}
fill="#EC5252"
stroke="#fff"
strokeWidth={1.2}
/>
)}
</svg>
)
}

View File

@ -1,23 +0,0 @@
import type { JSX, SVGProps } from 'react'
export const SettingIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={18}
height={19}
viewBox="0 0 18 19"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M15.302 10.537c.268.142.475.367.62.592.284.465.261 1.035-.015 1.538l-.537.9c-.283.48-.812.78-1.356.78a1.6 1.6 0 01-.813-.225c-.199-.128-.429-.173-.674-.173-.759 0-1.395.623-1.418 1.365 0 .863-.705 1.538-1.587 1.538H8.48c-.89 0-1.594-.675-1.594-1.538-.016-.742-.652-1.365-1.41-1.365-.254 0-.483.045-.675.173a1.62 1.62 0 01-.813.225 1.6 1.6 0 01-1.364-.78l-.529-.9c-.283-.488-.299-1.073-.015-1.538.123-.225.353-.45.613-.592.215-.105.353-.278.483-.48.383-.645.153-1.493-.498-1.875a1.533 1.533 0 01-.567-2.123l.513-.885a1.593 1.593 0 012.162-.57c.666.36 1.533.12 1.923-.517a1.16 1.16 0 00.177-.66c-.016-.293.069-.57.214-.795a1.646 1.646 0 011.357-.78h1.08c.568 0 1.081.315 1.365.78.138.225.23.502.207.795-.015.225.054.45.176.66a1.48 1.48 0 001.932.517 1.584 1.584 0 012.153.57l.514.885a1.52 1.52 0 01-.567 2.123c-.652.382-.882 1.23-.49 1.875.122.202.26.375.475.48zm-8.47-1.178c0 1.178.973 2.115 2.177 2.115 1.203 0 2.153-.937 2.153-2.115 0-1.177-.95-2.122-2.153-2.122-1.204 0-2.177.945-2.177 2.122z"
fill="currentColor"
/>
</svg>
)
}

View File

@ -1,21 +0,0 @@
import type { JSX, SVGProps } from 'react'
export const UserDoctorIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={25}
height={28}
viewBox="0 0 25 28"
fill="currentColor"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
d="M12.714 14.364a6.821 6.821 0 006.822-6.822A6.821 6.821 0 0012.714.72a6.822 6.822 0 00-6.822 6.822 6.822 6.822 0 006.822 6.822zM6.32 23.318c0 .708.57 1.279 1.279 1.279s1.279-.57 1.279-1.28c0-.708-.57-1.278-1.28-1.278-.708 0-1.278.57-1.278 1.279zM17.83 16.1v2.612a4.27 4.27 0 013.41 4.178v2.223a.855.855 0 01-.687.837l-1.716.34a.424.424 0 01-.501-.335l-.165-.837a.422.422 0 01.336-.5l1.028-.209v-1.519c0-3.347-5.116-3.47-5.116.102v1.423l1.028.207c.23.048.379.272.336.502l-.165.836a.432.432 0 01-.501.336l-1.663-.224a.852.852 0 01-.736-.847V22.89a4.274 4.274 0 013.412-4.178v-2.41c-.118.038-.235.06-.352.102a9.244 9.244 0 01-3.06.522c-1.07 0-2.1-.186-3.059-.522a5.889 5.889 0 00-1.204-.277v4.349a2.974 2.974 0 012.132 2.846 2.987 2.987 0 01-2.985 2.985 2.987 2.987 0 01-2.985-2.985c0-1.348.901-2.478 2.132-2.846v-4.285c-3.39.57-5.974 3.49-5.974 7.04v2.388a2.39 2.39 0 002.387 2.388h19.102a2.39 2.39 0 002.388-2.388v-2.388c0-3.837-3.028-6.944-6.822-7.13z"
fill="currentColor"
/>
</svg>
)
}

View File

@ -1,23 +0,0 @@
import type { JSX, SVGProps } from 'react'
export const WalletIcon = (
properties: JSX.IntrinsicAttributes & SVGProps<SVGSVGElement>,
) => {
return (
<svg
width={18}
height={19}
viewBox="0 0 18 19"
fill="none"
xmlns="http://www.w3.org/2000/svg"
{...properties}
>
<path
fillRule="evenodd"
clipRule="evenodd"
d="M13.327 6.638H16.5c0-2.548-1.527-4.036-4.113-4.036H5.613C3.027 2.602 1.5 4.09 1.5 6.605v5.493c0 2.515 1.527 4.004 4.113 4.004h6.774c2.586 0 4.113-1.489 4.113-4.004v-.234h-3.173c-1.473 0-2.667-1.164-2.667-2.6 0-1.436 1.194-2.6 2.667-2.6v-.026zm0 1.118h2.613c.31 0 .56.244.56.546V10.2a.56.56 0 01-.56.546h-2.553A1.58 1.58 0 0111.82 9.55c-.085-.44.034-.893.325-1.24.29-.345.723-.548 1.181-.554zm.113 1.995h.247c.316 0 .573-.25.573-.559a.566.566 0 00-.573-.559h-.247a.574.574 0 00-.405.16.545.545 0 00-.168.393c0 .31.255.562.573.565zM5.053 6.638h4.234c.316 0 .573-.25.573-.56a.566.566 0 00-.573-.558H5.053a.567.567 0 00-.573.552c0 .31.256.562.573.566z"
fill="currentColor"
/>
</svg>
)
}

View File

@ -2,7 +2,7 @@ import DT, { type Config, type ConfigColumns } from 'datatables.net-dt'
import DataTable from 'datatables.net-react' import DataTable from 'datatables.net-react'
import React from 'react' import React from 'react'
export type UiTableProperties = { type UiTableProperties = {
data: any // eslint-disable-line @typescript-eslint/no-explicit-any data: any // eslint-disable-line @typescript-eslint/no-explicit-any
columns: ConfigColumns[] columns: ConfigColumns[]
slots?: any // eslint-disable-line @typescript-eslint/no-explicit-any slots?: any // eslint-disable-line @typescript-eslint/no-explicit-any

View File

@ -1,41 +0,0 @@
import {
createContext,
useState,
useContext,
type PropsWithChildren,
type SetStateAction,
type Dispatch,
} from 'react'
type AdminProfile = {
name: string
}
type AdminContextProperties = {
adminProfile: AdminProfile
setAdminProfile: Dispatch<SetStateAction<AdminProfile>>
}
const AdminContext = createContext<AdminContextProperties | undefined>(
undefined,
)
export const AdminProvider = ({ children }: PropsWithChildren) => {
const [adminProfile, setAdminProfile] = useState<AdminProfile>({
name: 'Admin',
})
return (
<AdminContext.Provider value={{ adminProfile, setAdminProfile }}>
{children}
</AdminContext.Provider>
)
}
export const useAdminContext = (): AdminContextProperties => {
const context = useContext(AdminContext)
if (!context) {
throw new Error('useAdminContext must be used within a AdminProvider')
}
return context
}

View File

@ -5,8 +5,6 @@ import { ChartIcon } from '~/components/icons/chart'
import { ChatIcon } from '~/components/icons/chat' import { ChatIcon } from '~/components/icons/chat'
import { DocumentIcon } from '~/components/icons/document' import { DocumentIcon } from '~/components/icons/document'
import { MedicalNotesIcon } from '~/components/icons/medical-notes' import { MedicalNotesIcon } from '~/components/icons/medical-notes'
import { ProfileIcon } from '~/components/icons/profile'
import { SettingIcon } from '~/components/icons/setting'
type TMenu = { type TMenu = {
group: string group: string
@ -61,16 +59,6 @@ export const MENU: TMenu[] = [
url: '/lg-admin/tags', url: '/lg-admin/tags',
icon: TagIcon, icon: TagIcon,
}, },
{
title: 'Pengaturan',
url: '/lg-admin/settings',
icon: SettingIcon,
},
{
title: 'Admin',
url: '/lg-admin/admins',
icon: ProfileIcon,
},
], ],
}, },
] ]

View File

@ -1,2 +0,0 @@
const DashboardAdminsLayout = () => <div>Admins Page</div>
export default DashboardAdminsLayout

View File

@ -1,34 +0,0 @@
import { Button } from '~/components/ui/button'
const DashboardSettingsLayout = () => (
<div>
{/* action sementara kategory */}
<div className="flex space-x-2">
<Button
as="a"
href={`/lg-admin/categories`}
className="text-md rounded-md"
size="sm"
>
List Kategory
</Button>
<Button
as="a"
href={`/lg-admin/category/create`}
className="text-md rounded-md"
size="sm"
>
Create Category
</Button>
<Button
as="a"
href={`/lg-admin/category/update/1`}
className="text-md rounded-md"
size="sm"
>
Update Category
</Button>
</div>
</div>
)
export default DashboardSettingsLayout

View File

@ -1,2 +0,0 @@
const DashboardSiteDataLayout = () => <div>Site Data Page</div>
export default DashboardSiteDataLayout

View File

@ -4,7 +4,6 @@ import { getStaff } from '~/apis/admin/get-staff'
import { getCategories } from '~/apis/common/get-categories' import { getCategories } from '~/apis/common/get-categories'
import { getTags } from '~/apis/common/get-tags' import { getTags } from '~/apis/common/get-tags'
import { AUTH_PAGES } from '~/configs/pages' import { AUTH_PAGES } from '~/configs/pages'
import { AdminProvider } from '~/contexts/admin'
import { AdminDefaultLayout } from '~/layouts/admin/default' import { AdminDefaultLayout } from '~/layouts/admin/default'
import { handleCookie } from '~/libs/cookies' import { handleCookie } from '~/libs/cookies'
@ -42,11 +41,9 @@ export const loader = async ({ request }: Route.LoaderArgs) => {
const AdminLayout = () => { const AdminLayout = () => {
return ( return (
<AdminProvider> <AdminDefaultLayout>
<AdminDefaultLayout> <Outlet />
<Outlet /> </AdminDefaultLayout>
</AdminDefaultLayout>
</AdminProvider>
) )
} }

View File

@ -9,7 +9,7 @@
"server.{js,ts}" "server.{js,ts}"
], ],
"project": ["**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}"], "project": ["**/*.{js,cjs,mjs,jsx,ts,cts,mts,tsx}"],
"ignore": ["app/components/icons/*.tsx"], "ignore": [],
"ignoreDependencies": [ "ignoreDependencies": [
"tailwindcss", "tailwindcss",
"@tailwindcss/typography", "@tailwindcss/typography",