From 934a2bc5614955e2cd8c6ec01023618e43d32c2a Mon Sep 17 00:00:00 2001 From: mina-gwak Date: Sun, 13 Apr 2025 16:07:30 +0900 Subject: [PATCH 1/7] =?UTF-8?q?Fix:=20PD-253=20GNB=20=EB=8B=A4=EA=B5=AD?= =?UTF-8?q?=EC=96=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../internationalization/locales/en/gnb.json | 2 +- .../internationalization/locales/ko/gnb.json | 2 +- src/shared/ui/gnb/business-gnb.tsx | 6 +++--- src/shared/ui/gnb/gnb.stories.tsx | 20 ------------------- 4 files changed, 5 insertions(+), 25 deletions(-) delete mode 100644 src/shared/ui/gnb/gnb.stories.tsx diff --git a/src/shared/config/internationalization/locales/en/gnb.json b/src/shared/config/internationalization/locales/en/gnb.json index fab87e3e..e03c6194 100644 --- a/src/shared/config/internationalization/locales/en/gnb.json +++ b/src/shared/config/internationalization/locales/en/gnb.json @@ -10,7 +10,7 @@ "sign-in": "Sign In", "sign-up": "Sign Up", "go-to-business-home": "Academy", - "go-to-user-home": "My Page" + "go-to-teacher-home": "Teacher" }, "notification": { "empty": "You have no notifications yet" diff --git a/src/shared/config/internationalization/locales/ko/gnb.json b/src/shared/config/internationalization/locales/ko/gnb.json index de2d1661..bc02f802 100644 --- a/src/shared/config/internationalization/locales/ko/gnb.json +++ b/src/shared/config/internationalization/locales/ko/gnb.json @@ -10,7 +10,7 @@ "sign-in": "로그인", "sign-up": "회원가입", "go-to-business-home": "학원 홈", - "go-to-user-home": "원어민 홈" + "go-to-teacher-home": "원어민 홈" }, "notification": { "empty": "알림이 없습니다." diff --git a/src/shared/ui/gnb/business-gnb.tsx b/src/shared/ui/gnb/business-gnb.tsx index 1bef7ce8..2a4b2be8 100644 --- a/src/shared/ui/gnb/business-gnb.tsx +++ b/src/shared/ui/gnb/business-gnb.tsx @@ -65,7 +65,7 @@ export const BusinessGNB = () => { variant="text" size="small" > - Sign In + {t('button.sign-in')}
) : ( @@ -84,7 +84,7 @@ export const BusinessGNB = () => { ))} diff --git a/src/shared/ui/gnb/gnb.stories.tsx b/src/shared/ui/gnb/gnb.stories.tsx deleted file mode 100644 index 94dcadd4..00000000 --- a/src/shared/ui/gnb/gnb.stories.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import type { Meta, StoryObj } from '@storybook/react' - -import { GNB } from './gnb' - -const meta = { - title: 'Component/GNB', - component: GNB, - decorators: [ - Story => ( -
- -
- ), - ], -} satisfies Meta - -export default meta -type Story = StoryObj - -export const Default: Story = {} From 18e53732478bd2d12e12c2de14972d81ccfcb07e Mon Sep 17 00:00:00 2001 From: mina-gwak Date: Sun, 13 Apr 2025 16:18:36 +0900 Subject: [PATCH 2/7] =?UTF-8?q?Fix:=20PD-253=20GNB=20=EB=82=B4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=9E=91=EC=84=B1=20=ED=9B=84=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/ui/gnb/business-gnb.tsx | 29 ++++++++++++----------------- src/shared/ui/gnb/gnb.tsx | 17 ++++++----------- src/shared/ui/gnb/navigation.tsx | 30 ++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 28 deletions(-) create mode 100644 src/shared/ui/gnb/navigation.tsx diff --git a/src/shared/ui/gnb/business-gnb.tsx b/src/shared/ui/gnb/business-gnb.tsx index 2a4b2be8..6fd9dca8 100644 --- a/src/shared/ui/gnb/business-gnb.tsx +++ b/src/shared/ui/gnb/business-gnb.tsx @@ -1,21 +1,20 @@ 'use client' -import { usePathname, useRouter } from 'next/navigation' +import { useRouter } from 'next/navigation' import { useSession } from 'next-auth/react' import { useTranslations } from 'next-intl' import { cn } from 'shared/lib' import { Button } from '../button' -import { Tabs } from '../tabs' import Logo from './assets/Logo.svg' import { BusinessButton } from './business-button' +import * as Navigation from './navigation' import { NotificationButton } from './notification' import * as css from './variants' export const BusinessGNB = () => { const router = useRouter() - const pathname = usePathname() const session = useSession() const t = useTranslations() @@ -26,10 +25,6 @@ export const BusinessGNB = () => { router.push('/business') } - const handleTabChange = async (value: string) => { - router.push(value) - } - const notAuthenticated = session.status !== 'authenticated' return ( @@ -39,20 +34,20 @@ export const BusinessGNB = () => {
{isDev && ( - - + + {t('tab.find-teacher')} - - + + {t('tab.applicant-management')} - - + + {t('tab.academy-detail')} - - + + {t('tab.job-posting')} - - + + )}
diff --git a/src/shared/ui/gnb/gnb.tsx b/src/shared/ui/gnb/gnb.tsx index 9313e0d2..cdee5122 100644 --- a/src/shared/ui/gnb/gnb.tsx +++ b/src/shared/ui/gnb/gnb.tsx @@ -1,21 +1,20 @@ 'use client' -import { usePathname, useRouter } from 'next/navigation' +import { useRouter } from 'next/navigation' import { useSession } from 'next-auth/react' import { useTranslations } from 'next-intl' import { cn } from 'shared/lib' import { Button } from '../button' -import { Tabs } from '../tabs' import Logo from './assets/Logo.svg' +import * as Navigation from './navigation' import { NotificationButton } from './notification' import { UserButton } from './user-button' import * as css from './variants' export const GNB = () => { const router = useRouter() - const pathname = usePathname() const session = useSession() const t = useTranslations() @@ -24,10 +23,6 @@ export const GNB = () => { router.push('/') } - const handleTabChange = async (value: string) => { - router.push(value) - } - const notAuthenticated = session.status !== 'authenticated' return ( @@ -36,11 +31,11 @@ export const GNB = () => {
- - + + {t('tab.job-board')} - - + +
{notAuthenticated ? ( diff --git a/src/shared/ui/gnb/navigation.tsx b/src/shared/ui/gnb/navigation.tsx new file mode 100644 index 00000000..58ec1002 --- /dev/null +++ b/src/shared/ui/gnb/navigation.tsx @@ -0,0 +1,30 @@ +import Link from 'next/link' +import { usePathname } from 'next/navigation' +import { PropsWithChildren } from 'react' + +import { cn } from 'shared/lib' + +export const Root = ({ children }: PropsWithChildren) => { + return
    {children}
+} + +type ItemProps = { + value: string +} + +export const Item = ({ value, children }: PropsWithChildren) => { + const pathname = usePathname() + + const isActive = (pathname ?? '/') === value + + return ( +
  • + {children} +
  • + ) +} From db2fac1a990f962378ca2c13d3e81cf70c8e0d63 Mon Sep 17 00:00:00 2001 From: mina-gwak Date: Sun, 13 Apr 2025 22:05:22 +0900 Subject: [PATCH 3/7] =?UTF-8?q?Feat:=20PD-253=20Tabs=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/lib/fix-width.ts | 22 +++ src/shared/lib/index.ts | 1 + src/shared/ui/tabs/tabs.stories.tsx | 87 +++++++---- src/shared/ui/tabs/tabs.tsx | 221 +++++++++++++++++++--------- 4 files changed, 231 insertions(+), 100 deletions(-) create mode 100644 src/shared/lib/fix-width.ts diff --git a/src/shared/lib/fix-width.ts b/src/shared/lib/fix-width.ts new file mode 100644 index 00000000..3b202cbd --- /dev/null +++ b/src/shared/lib/fix-width.ts @@ -0,0 +1,22 @@ +'use client' + +import { ReactNode, useLayoutEffect, useRef, useState } from 'react' + +const DEFAULT_OFFSET = 10 + +export const useFixWidth = ( + children: ReactNode, + { offset = DEFAULT_OFFSET }: { offset?: number } = {}, +) => { + const childrenRef = useRef(null) + const [width, setWidth] = useState() + + useLayoutEffect(() => { + if (childrenRef.current) { + const childrenWidth = childrenRef.current.offsetWidth + setWidth(childrenWidth + offset * 2) + } + }, [children, offset]) + + return { width, childrenRef } +} diff --git a/src/shared/lib/index.ts b/src/shared/lib/index.ts index c7bc9a98..4cdd6859 100644 --- a/src/shared/lib/index.ts +++ b/src/shared/lib/index.ts @@ -9,6 +9,7 @@ export { useClickAway } from './click-away' export { useDebounce } from './debounce' export { useDropdown } from './dropdown' export { useEscape } from './escape' +export { useFixWidth } from './fix-width' export { useFocus } from './focus' export { toDisplayValue, diff --git a/src/shared/ui/tabs/tabs.stories.tsx b/src/shared/ui/tabs/tabs.stories.tsx index d0cac250..ed8519a3 100644 --- a/src/shared/ui/tabs/tabs.stories.tsx +++ b/src/shared/ui/tabs/tabs.stories.tsx @@ -1,52 +1,83 @@ import type { Meta, StoryObj } from '@storybook/react' +import { ComponentProps } from 'react' -import { Tabs, TabsProps } from './tabs' +import * as Tabs from './tabs' + +const TabsStory = (props: ComponentProps) => { + return ( +
    + + + Tab A + Tab B + Tab C + + Tab A + Tab B + Tab C + +
    + ) +} const meta = { title: 'Component/Tabs', - component: Tabs, + component: Tabs.List, parameters: { componentSubtitle: 'Tabs allow users to navigate between different sections of content.', }, argTypes: { - defaultValue: { - control: 'text', - description: 'Set the default value of the Tabs.', + variant: { + control: 'select', + options: ['box', 'underline'], + description: 'Set the variant of the Tabs.', }, - value: { - control: 'text', - description: 'Set the value of the Tabs.', + size: { + control: 'select', + options: ['small', 'large'], + description: 'Set the size of the Tabs.', }, - onChange: { - description: - 'Callback function that is triggered when the value changes.', - table: { - type: { summary: 'function' }, - }, + width: { + control: 'select', + options: ['full', 'fit'], + description: 'Set the width of the Tabs.', }, }, args: { - defaultValue: 'one', - value: '', - onChange: () => {}, + variant: 'box', + size: 'small', + width: 'fit', }, -} satisfies Meta + render: TabsStory, +} satisfies Meta export default meta type Story = StoryObj -const TabsStory = (props: TabsProps) => { - return ( - - Tab A - Tab B - Tab C - - ) +export const Small: Story = { + args: { + size: 'small', + }, } -export const Default: Story = { - render: TabsStory, +export const Large: Story = { + args: { + size: 'large', + }, +} + +export const Underline: Story = { + args: { + variant: 'underline', + size: 'small', + }, +} + +export const UnderlineLarge: Story = { + args: { + variant: 'underline', + size: 'large', + }, } diff --git a/src/shared/ui/tabs/tabs.tsx b/src/shared/ui/tabs/tabs.tsx index 754484b8..b0ce0556 100644 --- a/src/shared/ui/tabs/tabs.tsx +++ b/src/shared/ui/tabs/tabs.tsx @@ -1,96 +1,173 @@ 'use client' -import { isUndefined } from 'lodash-es' +import * as TabsPrimitive from '@radix-ui/react-tabs' +import { cva, VariantProps } from 'class-variance-authority' import { - PropsWithChildren, - useCallback, - useEffect, - useMemo, - useState, - MouseEvent, + ComponentProps, + ComponentPropsWithoutRef, + createContext, + ElementRef, + forwardRef, + useContext, } from 'react' -import { cn } from 'shared/lib' +import { cn, useFixWidth } from 'shared/lib' -import { TabsContext, useTabsContext } from './context' -import * as css from './variants' +const groupVariants = cva('group/toggle-group flex bg-white', { + variants: { + variant: { + box: '', + underline: 'border-b border-gray-200', + }, + size: { + small: '', + large: '', + }, + }, +}) -export type TabsProps = { - defaultValue?: string - value?: string - onChange?: (value: string) => void - className?: string -} +const itemVariants = cva( + [ + 'flex items-center justify-center font-medium transition-all', + 'font-medium text-gray-700 focus-visible:ring-blue-100 [&_svg]:text-gray-500', + '[&_span]:inline-block [&_span]:w-fit', + '[&_svg]:size-4', + ], + { + variants: { + variant: { + box: [ + 'border', + '[&:first-child]:rounded-r-none [&:last-child]:rounded-l-none [&:not(:first-child)]:-ml-[1px] [&:not(:first-child)]:border-l-transparent [&:nth-child(n+2):nth-last-child(n+2)]:rounded-none', + 'hover:bg-gray-100', + 'disabled:text-gray-200 disabled:[&_svg]:text-gray-200', + 'data-[state=active]:text-blue-800', + 'focus-visible:border-2 focus-visible:!border-blue-800', + ], + underline: [ + 'relative rounded-sm text-gray-500', + 'hover:text-gray-700', + 'data-[state=active]:after:content-[" "] data-[state=active]:text-blue-800 data-[state=active]:after:absolute data-[state=active]:after:-bottom-px data-[state=active]:after:left-0 data-[state=active]:after:right-0 data-[state=active]:after:h-0.5 data-[state=active]:after:bg-blue-800 data-[state=active]:after:transition-all', + 'focus-visible:ring-2 focus-visible:ring-blue-800 data-[state=active]:focus-visible:after:bg-[rgba(0,0,0,0)]', + ], + }, + size: { + small: 'body-large', + large: 'title-small', + }, + disabled: { + true: 'cursor-not-allowed', + false: 'cursor-pointer hover:bg-gray-50/50 active:font-bold', + }, + }, -const TabsRoot = ({ - defaultValue = '', - value, - onChange, - className, - children, -}: PropsWithChildren) => { - const [activatedTab, setActivatedTab] = useState(defaultValue) + compoundVariants: [ + { + variant: 'underline', + size: 'small', + className: 'h-9 px-2.5 py-2', + }, + { + variant: 'underline', + size: 'large', + className: 'h-12 p-3', + }, + { + variant: 'box', + size: 'small', + className: 'h-10 w-[120px] rounded-[10px] p-[10px]', + }, + { + variant: 'box', + size: 'large', + className: 'h-12 w-[146px] rounded-[12px] p-[12px]', + }, + ], + }, +) - const handleTabChange = useCallback( - (updatedValue: string) => { - setActivatedTab(updatedValue) - onChange?.(updatedValue) - }, - [onChange], - ) +const ToggleGroupContext = createContext< + VariantProps & { + width?: 'full' | 'fit' + } +>({ + size: 'large', + variant: 'box', + width: 'full', +}) - useEffect(() => { - if (isUndefined(value)) return - setActivatedTab(value) - }, [value]) +export const { Root } = TabsPrimitive - const contextValues = useMemo( - () => ({ - activatedTab, - handleTabChange, - }), - [activatedTab, handleTabChange], - ) +type ListProps = ComponentProps & + VariantProps & { + width?: 'full' | 'fit' + } - return ( -
    - - {children} - -
    - ) -} +export const List = ({ + variant = 'box', + size = 'large', + width, + className, + ref, + children, + ...props +}: ListProps) => ( + + + {children} + + +) -type TabTriggerProps = { - className?: string - value: string - onChange?: string -} +type TriggerProps = ComponentProps & + VariantProps -const Trigger = ({ - value, +export const Trigger = ({ + disabled, className, children, -}: PropsWithChildren) => { - const { activatedTab, handleTabChange } = useTabsContext() + ref, + ...props +}: TriggerProps) => { + const { width: widthState, variant, size } = useContext(ToggleGroupContext) - const isActive = activatedTab === value + const { width: widthFromChildren, childrenRef } = + useFixWidth(children) - const handleClick = (event: MouseEvent) => { - event.stopPropagation() - handleTabChange(value) - } + const width = widthState === 'full' ? null : widthFromChildren return ( - +
    + {children} +
    + ) } -export const Tabs = Object.assign(TabsRoot, { - Trigger, -}) +export const Content = forwardRef< + ElementRef, + ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) +Content.displayName = TabsPrimitive.Content.displayName From ab68ce58cc9468e183587ff498c1aff5d6f9949e Mon Sep 17 00:00:00 2001 From: mina-gwak Date: Sun, 13 Apr 2025 22:26:10 +0900 Subject: [PATCH 4/7] =?UTF-8?q?Feat:=20PD-253=20=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 +- pnpm-lock.yaml | 374 ++++++++++++++++++-------- src/shared/ui/index.ts | 1 + src/shared/ui/table/index.tsx | 1 + src/shared/ui/table/table.stories.tsx | 95 +++++++ src/shared/ui/table/table.tsx | 93 +++++++ 6 files changed, 460 insertions(+), 107 deletions(-) create mode 100644 src/shared/ui/table/index.tsx create mode 100644 src/shared/ui/table/table.stories.tsx create mode 100644 src/shared/ui/table/table.tsx diff --git a/package.json b/package.json index a030571c..b0721c9e 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@radix-ui/react-dialog": "^1.1.4", "@radix-ui/react-separator": "^1.1.1", "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-tabs": "^1.1.4", "@radix-ui/react-tooltip": "^1.1.7", "@tanstack/react-query": "^5.51.23", "@vis.gl/react-google-maps": "^1.5.1", @@ -76,7 +77,7 @@ "eslint-plugin-boundaries": "^4.2.2", "eslint-plugin-fsd-lint": "^1.0.5", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-storybook": "^0.8.0", + "eslint-plugin-storybook": "^0.12.0", "husky": "^9.1.4", "lint-staged": "^15.2.8", "msw": "^2.4.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d954e936..14d21959 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@radix-ui/react-slot': specifier: ^1.1.1 version: 1.1.1(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-tabs': + specifier: ^1.1.4 + version: 1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) '@radix-ui/react-tooltip': specifier: ^1.1.7 version: 1.1.7(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -193,8 +196,8 @@ importers: specifier: ^2.29.1 version: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4))(eslint@9.20.0(jiti@1.21.6)) eslint-plugin-storybook: - specifier: ^0.8.0 - version: 0.8.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4) + specifier: ^0.12.0 + version: 0.12.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4) husky: specifier: ^9.1.4 version: 9.1.6 @@ -1563,6 +1566,9 @@ packages: '@radix-ui/primitive@1.1.1': resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + '@radix-ui/react-arrow@1.1.1': resolution: {integrity: sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==} peerDependencies: @@ -1589,6 +1595,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-collection@1.1.3': + resolution: {integrity: sha512-mM2pxoQw5HJ49rkzwOs7Y6J4oYH22wS8BfK2/bBxROlI4xuR0c4jEenQP63LlTlDkO6Buj2Vt+QYAYcOgqtrXA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.1.1': resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} peerDependencies: @@ -1598,6 +1617,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-context@1.1.1': resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==} peerDependencies: @@ -1607,6 +1635,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dialog@1.1.4': resolution: {integrity: sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==} peerDependencies: @@ -1620,6 +1657,15 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-dismissable-layer@1.1.3': resolution: {integrity: sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==} peerDependencies: @@ -1677,6 +1723,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-popper@1.2.1': resolution: {integrity: sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==} peerDependencies: @@ -1716,6 +1771,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-presence@1.1.3': + resolution: {integrity: sha512-IrVLIhskYhH3nLvtcBLQFZr61tBG7wx7O3kEmdzcYwRGAEBmBicGGL7ATzNgruYJ3xBTbuzEEq9OXJM3PAX3tA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.0.1': resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} peerDependencies: @@ -1729,6 +1797,32 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-primitive@2.0.3': + resolution: {integrity: sha512-Pf/t/GkndH7CQ8wE2hbkXA+WyZ83fhQQn5DDmwDiDo6AwN/fhaH8oqZ0jRjMrO2iaMhDi6P1HRx6AZwyMinY1g==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-roving-focus@1.1.3': + resolution: {integrity: sha512-ufbpLUjZiOg4iYgb2hQrWXEPYX6jOLBbR27bDyAff5GYMRrCzcze8lukjuXVUQvJ6HZe8+oL+hhswDcjmcgVyg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-separator@1.1.1': resolution: {integrity: sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==} peerDependencies: @@ -1751,6 +1845,28 @@ packages: '@types/react': optional: true + '@radix-ui/react-slot@1.2.0': + resolution: {integrity: sha512-ujc+V6r0HNDviYqIK3rW4ffgYiZ8g5DEHrGJVk4x7kTlLXRDILnKX9vAUYeIsLOoDpDJ0ujpqMkjH4w2ofuo6w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-tabs@1.1.4': + resolution: {integrity: sha512-fuHMHWSf5SRhXke+DbHXj2wVMo+ghVH30vhX3XVacdXqDl+J4XWafMIGOOER861QpBx1jxgwKXL2dQnfrsd8MQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-tooltip@1.1.7': resolution: {integrity: sha512-ss0s80BC0+g0+Zc53MvilcnTYSOi4mSuFWBPYPuTOFGjx+pUU+ZrmamMNwS56t8MTFlniA5ocjd4jYm/CdhbOg==} peerDependencies: @@ -1773,6 +1889,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-controllable-state@1.1.0': resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} peerDependencies: @@ -1782,6 +1907,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.1.1': + resolution: {integrity: sha512-YnEXIy8/ga01Y1PN0VfaNH//MhA91JlEGVBDxDzROqwrAtG5Yr2QGEPz8A/rJA3C7ZAHryOYGaUv8fLSW2H/mg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-escape-keydown@1.1.0': resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} peerDependencies: @@ -1800,6 +1934,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-rect@1.1.0': resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} peerDependencies: @@ -1951,9 +2094,6 @@ packages: peerDependencies: storybook: ^8.3.0 - '@storybook/csf@0.0.1': - resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} - '@storybook/csf@0.1.11': resolution: {integrity: sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==} @@ -2337,10 +2477,6 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2366,10 +2502,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2378,15 +2510,6 @@ packages: resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2402,12 +2525,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -2421,10 +2538,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -3728,11 +3841,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-storybook@0.8.0: - resolution: {integrity: sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==} + eslint-plugin-storybook@0.12.0: + resolution: {integrity: sha512-Lg5I0+npTgiYgZ4KSvGWGDFZi3eOCNJPaWX0c9rTEEXC5wvooOClsP9ZtbI4hhFKyKgYR877KiJxbRTSJq9gWA==} engines: {node: '>= 18'} peerDependencies: - eslint: '>=6' + eslint: '>=8' eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} @@ -5678,10 +5791,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - requireindex@1.2.0: - resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} - engines: {node: '>=0.10.5'} - requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -6242,21 +6351,12 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tty-browserify@0.0.1: resolution: {integrity: sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==} @@ -8137,6 +8237,8 @@ snapshots: '@radix-ui/primitive@1.1.1': {} + '@radix-ui/primitive@1.1.2': {} + '@radix-ui/react-arrow@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8162,18 +8264,42 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-collection@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-compose-refs@1.1.1(@types/react@18.3.5)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.5)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-context@1.1.1(@types/react@18.3.5)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-context@1.1.2(@types/react@18.3.5)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-dialog@1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -8196,6 +8322,12 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-direction@1.1.1(@types/react@18.3.5)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-dismissable-layer@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -8246,6 +8378,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-id@1.1.1(@types/react@18.3.5)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-popper@1.2.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8284,6 +8423,16 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-presence@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-slot': 1.1.1(@types/react@18.3.5)(react@19.0.0) @@ -8293,6 +8442,32 @@ snapshots: '@types/react': 18.3.5 '@types/react-dom': 18.3.0 + '@radix-ui/react-primitive@2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-slot': 1.2.0(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + + '@radix-ui/react-roving-focus@1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-separator@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -8309,6 +8484,29 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-slot@1.2.0(@types/react@18.3.5)(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + + '@radix-ui/react-tabs@1.1.4(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-direction': 1.1.1(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.5)(react@19.0.0) + '@radix-ui/react-presence': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-roving-focus': 1.1.3(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.1(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 18.3.5 + '@types/react-dom': 18.3.0 + '@radix-ui/react-tooltip@1.1.7(@types/react-dom@18.3.0)(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/primitive': 1.1.1 @@ -8335,6 +8533,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.5)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.5)(react@19.0.0)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@19.0.0) @@ -8342,6 +8546,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-use-controllable-state@1.1.1(@types/react@18.3.5)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.5)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.5)(react@19.0.0)': dependencies: '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.5)(react@19.0.0) @@ -8355,6 +8566,12 @@ snapshots: optionalDependencies: '@types/react': 18.3.5 + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.5)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 18.3.5 + '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.5)(react@19.0.0)': dependencies: '@radix-ui/rect': 1.1.0 @@ -8612,10 +8829,6 @@ snapshots: transitivePeerDependencies: - webpack-sources - '@storybook/csf@0.0.1': - dependencies: - lodash: 4.17.21 - '@storybook/csf@0.1.11': dependencies: type-fest: 2.19.0 @@ -9154,11 +9367,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 @@ -9192,26 +9400,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@7.18.0': {} '@typescript-eslint/types@8.23.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.4) - optionalDependencies: - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.5.4)': dependencies: '@typescript-eslint/types': 7.18.0 @@ -9241,21 +9433,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.0(jiti@1.21.6)) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - eslint: 9.20.0(jiti@1.21.6) - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@7.18.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.20.0(jiti@1.21.6)) @@ -9278,11 +9455,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 @@ -10951,12 +11123,11 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@0.8.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4): + eslint-plugin-storybook@0.12.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4): dependencies: - '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4) + '@storybook/csf': 0.1.11 + '@typescript-eslint/utils': 8.23.0(eslint@9.20.0(jiti@1.21.6))(typescript@5.5.4) eslint: 9.20.0(jiti@1.21.6) - requireindex: 1.2.0 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color @@ -13025,8 +13196,6 @@ snapshots: require-from-string@2.0.2: {} - requireindex@1.2.0: {} - requires-port@1.0.0: {} resolve-from@4.0.0: {} @@ -13688,17 +13857,10 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - tslib@2.7.0: {} tslib@2.8.1: {} - tsutils@3.21.0(typescript@5.5.4): - dependencies: - tslib: 1.14.1 - typescript: 5.5.4 - tty-browserify@0.0.1: {} tunnel-agent@0.6.0: diff --git a/src/shared/ui/index.ts b/src/shared/ui/index.ts index de6237e2..bd09f4d5 100644 --- a/src/shared/ui/index.ts +++ b/src/shared/ui/index.ts @@ -25,6 +25,7 @@ export { Sidebar, useSidebar } from './sidebar' export { Skeleton } from './skeleton' export { Spinner } from './spinner' export { Switch } from './switch' +export { Table } from './table' export { Tabs } from './tabs' export { TextArea, type TextAreaProps } from './text-area' export { diff --git a/src/shared/ui/table/index.tsx b/src/shared/ui/table/index.tsx new file mode 100644 index 00000000..786a84bb --- /dev/null +++ b/src/shared/ui/table/index.tsx @@ -0,0 +1 @@ +export * as Table from './table' diff --git a/src/shared/ui/table/table.stories.tsx b/src/shared/ui/table/table.stories.tsx new file mode 100644 index 00000000..a8aebae0 --- /dev/null +++ b/src/shared/ui/table/table.stories.tsx @@ -0,0 +1,95 @@ +import type { Meta, StoryObj } from '@storybook/react' +import { ComponentProps } from 'react' + +import * as Table from './table' + +const invoices = [ + { + invoice: 'INV001', + paymentStatus: 'Paid', + totalAmount: '$250.00', + paymentMethod: 'Credit Card', + }, + { + invoice: 'INV002', + paymentStatus: 'Pending', + totalAmount: '$150.00', + paymentMethod: 'PayPal', + }, + { + invoice: 'INV003', + paymentStatus: 'Unpaid', + totalAmount: '$350.00', + paymentMethod: 'Bank Transfer', + }, + { + invoice: 'INV004', + paymentStatus: 'Paid', + totalAmount: '$450.00', + paymentMethod: 'Credit Card', + }, + { + invoice: 'INV005', + paymentStatus: 'Paid', + totalAmount: '$550.00', + paymentMethod: 'PayPal', + }, + { + invoice: 'INV006', + paymentStatus: 'Pending', + totalAmount: '$200.00', + paymentMethod: 'Bank Transfer', + }, + { + invoice: 'INV007', + paymentStatus: 'Unpaid', + totalAmount: '$300.00', + paymentMethod: 'Credit Card', + }, +] + +const TableStory = (props: ComponentProps) => { + return ( + + + + Invoice + Status + Method + Amount + + + + {invoices.map(invoice => ( + + {invoice.invoice} + {invoice.paymentStatus} + {invoice.paymentMethod} + + {invoice.totalAmount} + + + ))} + + + ) +} + +const meta = { + title: 'Component/Table', + component: Table.Root, + parameters: { + componentSubtitle: + 'Table allows users to display and interact with data in a tabular format.', + }, + args: {}, + render: TableStory, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: {}, +} diff --git a/src/shared/ui/table/table.tsx b/src/shared/ui/table/table.tsx new file mode 100644 index 00000000..4bfc3a79 --- /dev/null +++ b/src/shared/ui/table/table.tsx @@ -0,0 +1,93 @@ +import { HTMLAttributes } from 'react' + +import { cn } from 'shared/lib' + +export const Root = ({ + className, + ...props +}: HTMLAttributes) => ( +
    + + +) + +export const Header = ({ + className, + ...props +}: HTMLAttributes) => ( + +) + +export const Body = ({ + className, + ...props +}: HTMLAttributes) => ( + +) + +export const Footer = ({ + className, + ...props +}: HTMLAttributes) => ( + tr]:last:border-b-0', className)} + {...props} + /> +) + +export const Row = ({ + className, + ...props +}: HTMLAttributes) => ( + +) + +export const Head = ({ + className, + ...props +}: HTMLAttributes) => ( +
    +) + +export const Cell = ({ + className, + ...props +}: HTMLAttributes) => ( + [role=checkbox]]:translate-y-[2px]', + '[&:first-child]:pl-5 [&:last-child]:pr-5', + className, + )} + {...props} + /> +) + +export const Caption = ({ + className, + ...props +}: HTMLAttributes) => ( +
    +) From 573826d3541bec9144b9d3c427cde16a7f20a715 Mon Sep 17 00:00:00 2001 From: mina-gwak Date: Mon, 14 Apr 2025 22:51:09 +0900 Subject: [PATCH 5/7] =?UTF-8?q?Feat:=20PD-253=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EB=84=A4=EC=9D=B4=EC=85=98=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 13 ++++++ src/shared/ui/index.ts | 1 + src/shared/ui/pagination/index.tsx | 66 ++++++++++++++++++++++++++++++ 4 files changed, 81 insertions(+) create mode 100644 src/shared/ui/pagination/index.tsx diff --git a/package.json b/package.json index b0721c9e..b5879358 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ "react-dom": "^19", "react-error-boundary": "^4.1.2", "react-hook-form": "^7.53.0", + "react-paginate": "^8.3.0", "react-pdf": "^9.2.1", "react-toastify": "^10.0.6", "svg-country-flags": "^1.2.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 14d21959..901627dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -86,6 +86,9 @@ importers: react-hook-form: specifier: ^7.53.0 version: 7.53.0(react@19.0.0) + react-paginate: + specifier: ^8.3.0 + version: 8.3.0(react@19.0.0) react-pdf: specifier: ^9.2.1 version: 9.2.1(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -5638,6 +5641,11 @@ packages: react-is@18.1.0: resolution: {integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==} + react-paginate@8.3.0: + resolution: {integrity: sha512-TptZE37HPkT3R+7AszWA++LOTIsIHXcCSWMP9WW/abeF8sLpJzExFB/dVs7xbtqteJ5njF6kk+udTDC0AR3y5w==} + peerDependencies: + react: ^16 || ^17 || ^18 || ^19 + react-pdf@9.2.1: resolution: {integrity: sha512-AJt0lAIkItWEZRA5d/mO+Om4nPCuTiQ0saA+qItO967DTjmGjnhmF+Bi2tL286mOTfBlF5CyLzJ35KTMaDoH+A==} peerDependencies: @@ -12993,6 +13001,11 @@ snapshots: react-is@18.1.0: {} + react-paginate@8.3.0(react@19.0.0): + dependencies: + prop-types: 15.8.1 + react: 19.0.0 + react-pdf@9.2.1(@types/react@18.3.5)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: clsx: 2.1.1 diff --git a/src/shared/ui/index.ts b/src/shared/ui/index.ts index bd09f4d5..275bb7b4 100644 --- a/src/shared/ui/index.ts +++ b/src/shared/ui/index.ts @@ -16,6 +16,7 @@ export { Label } from './label' export { Layout } from './layout' export { Link, linkVariants } from './link' export { Modal, useModalContext } from './modal' +export { Pagination } from './pagination' export { Panel, longDivide, shortDivide } from './panel' export { Radio, type RadioProps } from './radio' export { Select, type SelectValue, type SelectRootProps } from './select-field' diff --git a/src/shared/ui/pagination/index.tsx b/src/shared/ui/pagination/index.tsx new file mode 100644 index 00000000..09a440cd --- /dev/null +++ b/src/shared/ui/pagination/index.tsx @@ -0,0 +1,66 @@ +'use client' + +import ReactPaginate from 'react-paginate' + +import { colors } from 'shared/config' +import { cn } from 'shared/lib' + +import { Icon } from '../icon' + +interface PaginationProps { + pageCount: number + currentPage: number + onPageChange: (selectedItem: { selected: number }) => void + className?: string +} + +export const Pagination = ({ + pageCount, + currentPage, + onPageChange, + className, +}: PaginationProps) => { + return ( + + } + nextLabel={ + + } + breakLabel={ + + } + /> + ) +} From d2a101a30d8c3887f990a267d5e9a75453a4a8f2 Mon Sep 17 00:00:00 2001 From: mina-gwak Date: Mon, 14 Apr 2025 22:51:46 +0900 Subject: [PATCH 6/7] =?UTF-8?q?Feat:=20PD-253=20=EC=A7=80=EC=9B=90?= =?UTF-8?q?=EC=9E=90=20=EA=B4=80=EB=A6=AC=20=ED=8E=98=EC=9D=B4=EC=A7=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../business/applicant-management/page.ts | 1 + src/pages/applicant-management/index.ts | 1 + .../ui/applicant-management-list-page.tsx | 78 +++++++++++++++++++ src/shared/ui/tabs/index.ts | 2 +- src/shared/ui/tabs/tabs.tsx | 3 +- 5 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 app/(business)/business/applicant-management/page.ts create mode 100644 src/pages/applicant-management/index.ts create mode 100644 src/pages/applicant-management/ui/applicant-management-list-page.tsx diff --git a/app/(business)/business/applicant-management/page.ts b/app/(business)/business/applicant-management/page.ts new file mode 100644 index 00000000..9f360c97 --- /dev/null +++ b/app/(business)/business/applicant-management/page.ts @@ -0,0 +1 @@ +export { ApplicantManagementListPage as default } from 'pages/applicant-management' diff --git a/src/pages/applicant-management/index.ts b/src/pages/applicant-management/index.ts new file mode 100644 index 00000000..9fa50ef8 --- /dev/null +++ b/src/pages/applicant-management/index.ts @@ -0,0 +1 @@ +export { ApplicantManagementListPage } from './ui/applicant-management-list-page' diff --git a/src/pages/applicant-management/ui/applicant-management-list-page.tsx b/src/pages/applicant-management/ui/applicant-management-list-page.tsx new file mode 100644 index 00000000..c2c74b65 --- /dev/null +++ b/src/pages/applicant-management/ui/applicant-management-list-page.tsx @@ -0,0 +1,78 @@ +'use client' + +import { useState } from 'react' + +import { Layout, Tabs, Table, Pagination } from 'shared/ui' + +const relations = [ + { + id: 1, + firstName: '길동', + lastName: '홍', + jobPostTitle: '웹 프론트엔드 개발자', + memo: '메모', + submittedDate: '2024-01-01', + }, + { + id: 2, + firstName: '길동', + lastName: '홍', + jobPostTitle: '웹 프론트엔드 개발자', + memo: '메모', + submittedDate: '2024-01-01', + }, +] + +export const ApplicantManagementListPage = () => { + const [currentPage, setCurrentPage] = useState(0) + + const handlePageChange = ({ selected }: { selected: number }) => { + setCurrentPage(selected) + // API 호출 등 페이지 변경 로직 + } + + return ( + +

    + 지원자 관리 +

    + + + 접수 + 검토 + 합격 + 불합격 + + +
    + + + + 지원자 + 공고 제목 + 메모 + 지원 일자 + + + + {relations.map(relation => ( + + + {relation.firstName} {relation.lastName} + + {relation.jobPostTitle} + {relation.memo} + {relation.submittedDate} + + ))} + + +
    + +
    + ) +} diff --git a/src/shared/ui/tabs/index.ts b/src/shared/ui/tabs/index.ts index 55f323c5..2c149557 100644 --- a/src/shared/ui/tabs/index.ts +++ b/src/shared/ui/tabs/index.ts @@ -1 +1 @@ -export { Tabs } from './tabs' +export * as Tabs from './tabs' diff --git a/src/shared/ui/tabs/tabs.tsx b/src/shared/ui/tabs/tabs.tsx index b0ce0556..719e4d15 100644 --- a/src/shared/ui/tabs/tabs.tsx +++ b/src/shared/ui/tabs/tabs.tsx @@ -96,7 +96,8 @@ const ToggleGroupContext = createContext< width: 'full', }) -export const { Root } = TabsPrimitive +// eslint-disable-next-line prefer-destructuring +export const Root = TabsPrimitive.Root type ListProps = ComponentProps & VariantProps & { From 68248761e01322c69a65f2aa4ff37598858cd8a2 Mon Sep 17 00:00:00 2001 From: mina-gwak Date: Mon, 14 Apr 2025 23:00:00 +0900 Subject: [PATCH 7/7] =?UTF-8?q?Feat:=20PD-253=20=EB=8B=A4=EA=B5=AD?= =?UTF-8?q?=EC=96=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/applicant-management-list-page.tsx | 26 ++++++++++++------- .../locales/en/applicant-management.json | 17 ++++++++++++ .../locales/ko/applicant-management.json | 17 ++++++++++++ .../config/internationalization/request.ts | 1 + 4 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 src/shared/config/internationalization/locales/en/applicant-management.json create mode 100644 src/shared/config/internationalization/locales/ko/applicant-management.json diff --git a/src/pages/applicant-management/ui/applicant-management-list-page.tsx b/src/pages/applicant-management/ui/applicant-management-list-page.tsx index c2c74b65..2efcf280 100644 --- a/src/pages/applicant-management/ui/applicant-management-list-page.tsx +++ b/src/pages/applicant-management/ui/applicant-management-list-page.tsx @@ -1,5 +1,6 @@ 'use client' +import { useTranslations } from 'next-intl' import { useState } from 'react' import { Layout, Tabs, Table, Pagination } from 'shared/ui' @@ -24,6 +25,7 @@ const relations = [ ] export const ApplicantManagementListPage = () => { + const t = useTranslations('applicant-management-list') const [currentPage, setCurrentPage] = useState(0) const handlePageChange = ({ selected }: { selected: number }) => { @@ -34,24 +36,30 @@ export const ApplicantManagementListPage = () => { return (

    - 지원자 관리 + {t('title')}

    - 접수 - 검토 - 합격 - 불합격 + {t('tabs.submitted')} + {t('tabs.reviewed')} + {t('tabs.accepted')} + {t('tabs.rejected')}
    - 지원자 - 공고 제목 - 메모 - 지원 일자 + + {t('table.applicant')} + + + {t('table.job-title')} + + {t('table.memo')} + + {t('table.application-date')} + diff --git a/src/shared/config/internationalization/locales/en/applicant-management.json b/src/shared/config/internationalization/locales/en/applicant-management.json new file mode 100644 index 00000000..df208e7e --- /dev/null +++ b/src/shared/config/internationalization/locales/en/applicant-management.json @@ -0,0 +1,17 @@ +{ + "applicant-management-list": { + "title": "Applicant Management", + "tabs": { + "submitted": "Submitted", + "reviewed": "Reviewed", + "accepted": "Accepted", + "rejected": "Rejected" + }, + "table": { + "applicant": "Applicant", + "job-title": "Job Title", + "memo": "Memo", + "application-date": "Application Date" + } + } +} diff --git a/src/shared/config/internationalization/locales/ko/applicant-management.json b/src/shared/config/internationalization/locales/ko/applicant-management.json new file mode 100644 index 00000000..20caf3d6 --- /dev/null +++ b/src/shared/config/internationalization/locales/ko/applicant-management.json @@ -0,0 +1,17 @@ +{ + "applicant-management-list": { + "title": "지원자 관리", + "tabs": { + "submitted": "접수", + "reviewed": "검토", + "accepted": "합격", + "rejected": "불합격" + }, + "table": { + "applicant": "지원자", + "job-title": "공고 제목", + "memo": "메모", + "application-date": "지원 일자" + } + } +} diff --git a/src/shared/config/internationalization/request.ts b/src/shared/config/internationalization/request.ts index fb916534..27264e5e 100644 --- a/src/shared/config/internationalization/request.ts +++ b/src/shared/config/internationalization/request.ts @@ -6,6 +6,7 @@ export default getRequestConfig(async () => { const locale = await getLocale() // path에 따라 다른 쿠키 값 반환 const messages = { + ...(await import(`./locales/${locale}/applicant-management.json`)).default, ...(await import(`./locales/${locale}/auth.json`)).default, ...(await import(`./locales/${locale}/exception.json`)).default, ...(await import(`./locales/${locale}/field.json`)).default,