cashdoc-cms-design-system 1.0.9 → 1.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/icons/index.d.ts +3 -0
- package/dist/index.es.js +582 -556
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/utils/cn.ts","../src/components/Button/Button.tsx","../src/components/LoadingCircle/LoadingCircle.tsx","../src/components/icons/index.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Dropdown/Select.tsx","../src/components/Dropdown/Combobox.tsx","../src/components/Popover/Popover.tsx","../src/components/Popover/PopoverMenuItem.tsx","../src/components/Text/Text.tsx","../src/components/TextInput/TextInput.tsx","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constants.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructFrom.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/normalizeDates.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/defaultOptions.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/toDate.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/localize.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/match.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatLong.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/formatDistance.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/formatLong.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/formatRelative.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/localize.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/match.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/tzName/index.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/tzOffset/index.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/date/mini.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/date/index.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addDays.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addMonths.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfDay.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarDays.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addWeeks.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addYears.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/max.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/min.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameDay.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isDate.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isValid.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarMonths.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/normalizeInterval.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachMonthOfInterval.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachYearOfInterval.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfISOWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDayOfYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/addLeadingZeros.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/lightFormatters.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/formatters.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/longFormatters.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/protectedTokens.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/format.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDaysInMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isAfter.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isBefore.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setYear.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/helpers/getBroadcastWeeksInMonth.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/helpers/startOfBroadcastWeek.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/helpers/endOfBroadcastWeek.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/locale/en-US.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/classes/DateLib.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/locale/ko.js","../src/components/DatePicker/DatePicker.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/Switch/Switch.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/SideNavigation/SideNavigation.tsx","../src/components/Pagination/Pagination.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Modal/Modal.tsx","../src/components/Modal/ConfirmModal.tsx","../src/components/Modal/DeleteModal.tsx","../src/components/Modal/ErrorModal.tsx","../src/components/Modal/WarningModal.tsx","../src/components/Modal/SuccessModal.tsx","../src/components/Toast/Toaster.tsx","../src/components/ToolTip/ToolTip.tsx","../src/components/Table/Table.tsx","../src/components/ImageUpload/ImageUpload.tsx","../src/components/FileUpload/FileUpload.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from \"@/utils/cn\";\nimport { cva, VariantProps } from \"class-variance-authority\";\nimport { ButtonHTMLAttributes, forwardRef } from \"react\";\n\n/**\n * 버튼 컴포넌트의 스타일 variant를 정의합니다.\n *\n * @variant default - 기본 스타일 (회색 배경)\n * @variant secondary - 보조 스타일 (밝은 회색 배경)\n * @variant outline - 테두리 스타일 (투명 배경)\n * @variant ghost - 고스트 스타일 (투명 배경, hover시 배경)\n * @variant link - 링크 스타일 (밑줄)\n *\n * @size default - 기본 크기 (h-10)\n * @size sm - 작은 크기 (h-8)\n * @size lg - 큰 크기 (h-11)\n * @size icon - 아이콘 크기 (정사각형 10x10)\n */\nexport const buttonVariants = cva(\n cn(\n \"inline-flex items-center justify-center gap-2\",\n \"rounded-md ring-offset-white\",\n \"text-sm font-medium\",\n \"focus-visible:outline-none focus-visible:ring-2\",\n \"focus-visible:ring-slate-950 focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-60\",\n \"transition-colors cursor-pointer\",\n ),\n {\n variants: {\n variant: {\n default:\n \"border-0 bg-cms-gray-850 text-cms-white hover:bg-cms-gray-750\",\n secondary: cn(\n \"border-0 bg-cms-gray-300 text-cms-black\",\n \"hover:bg-cms-gray-200 hover:text-cms-gray-800\",\n ),\n outline: cn(\n \"border border-cms-gray-400 bg-transparent\",\n \"hover:bg-cms-gray-200 hover:text-cms-gray-900\",\n ),\n\n ghost:\n \"border-0 bg-transparent hover:bg-cms-gray-200 hover:text-cms-gray-800\",\n link: \"border-0 text-cms-black underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-8 rounded-sm px-3\",\n lg: \"h-11 rounded-sm px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {}\n\n/**\n * 사용자의 클릭 동작을 통해 특정 액션을 실행하거나 페이지를 이동시키는 기본적인 컴포넌트입니다.\n *\n * {@link Button}은 다양한 시각적 스타일(Variant)과 크기(Size)를 제공하여 인터페이스의\n * 계층 구조를 명확히 하고 사용자의 행동을 유도합니다.\n *\n * ## When (언제 사용해야 하는가)\n * ### 사용해야 하는 경우\n *\n * - **액션 실행**: 데이터 저장, 삭제, 전송 등 시스템 상태를 변경하는 작업을 수행할 때\n * - **명확한 콜 투 액션(CTA)**: 페이지 내에서 가장 중요한 작업을 강조할 때\n * - **내비게이션**: 다른 페이지로의 이동이나 섹션 전환이 필요할 때\n * - **상태 변경**: 모달 열기, 드롭다운 토글 등 UI 요소를 제어할 때\n *\n * ### 사용하지 말아야 하는 경우:\n *\n * - **단순 링크**: 본문 내에서 다른 페이지로 연결되는 텍스트 링크는 `<a>` 태그나 별도의 Link 컴포넌트를 사용하세요\n * - **여러 선택지 중 하나 선택**: `RadioButton`이나 `Checkbox`를 고려하세요\n * - **탐색 메뉴**: `SideNavigation`이나 상단 메뉴에는 전용 메뉴 아이템을 사용하세요\n *\n * ---\n *\n * ## Layout behavior\n *\n * - **Inline-flex**: 기본적으로 인라인 블록 요소처럼 동작하여 텍스트 흐름 내에 배치됩니다.\n * - **W-full**: `fullWidth` prop을 통해 부모 컨테이너의 전체 너비를 차지하게 할 수 있습니다.\n * - **Center Alignment**: 버튼 내부의 텍스트와 아이콘은 항상 중앙에 정렬됩니다.\n * - **Responsive**: 모바일 환경을 위해 `fullWidth`를 적극 활용하는 것이 좋습니다.\n *\n * ---\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 동사 사용**: '저장', '삭제', '추가' 등 행동을 직접적으로 나타내는 레이블을 사용하세요.\n * - **계층 구조 유지**: 한 화면에 여러 버튼이 있다면 가장 중요한 버튼에만 'primary' variant를 적용하세요.\n * - **일관된 위치**: 확인 버튼은 오른쪽, 취소 버튼은 왼쪽에 배치하는 등 일관된 배치 규칙을 따르세요.\n * - **로딩 상태 활용**: 서버 통신 등 시간이 걸리는 작업 시 `isLoading` 상태를 표시하여 중복 클릭을 방지하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **레이블 생략 지양**: 아이콘만 있는 버튼(Icon Button)의 경우 접근성을 위해 반드시 `aria-label`을 제공하세요.\n * - **너무 긴 텍스트**: 버튼 레이블은 가급적 짧고 간결하게 유지하세요 (보통 2-4자).\n * - **모호한 표현**: '확인'보다는 '변경사항 저장'과 같이 구체적인 결과가 예상되는 레이블이 좋습니다.\n *\n * ---\n *\n * ## Accessibility\n *\n * - **Keyboard Support**: `Enter`와 `Space` 키로 실행 가능하며, 포커스 상태가 시각적으로 명확히 표시됩니다.\n * - **ARIA Attributes**: `disabled` 상태 시 `aria-disabled`가 자동으로 처리됩니다.\n * - **Role**: 기본적으로 `<button>` 태그를 사용하며, 필요한 경우 `asChild`를 통해 다른 요소(Link 등)로 렌더링하면서도 버튼의 스타일을 유지할 수 있습니다.\n *\n * ---\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 버튼 사용 예시:\n *\n * ```tsx\n * <div className=\"flex gap-2\">\n * <Button variant=\"primary\">저장하기</Button>\n * <Button variant=\"outline\">취소</Button>\n * <Button variant=\"ghost\">닫기</Button>\n * </div>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 아이콘과 로딩 상태가 포함된 버튼:\n *\n * ```tsx\n * <Button\n * isLoading={isSubmitting}\n * leftIcon={<SaveIcon />}\n * onClick={handleSubmit}\n * >\n * 데이터 저장\n * </Button>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 크기 변형 예시:\n *\n * ```tsx\n * <div className=\"flex items-center gap-2\">\n * <Button size=\"sm\">Small</Button>\n * <Button size=\"md\">Medium</Button>\n * <Button size=\"lg\">Large</Button>\n * </div>\n * ```\n * {@end-tool}\n *s\n * See also:\n *\n * - {@link TextInput}, 입력과 함께 액션이 필요한 경우\n * - {@link Modal}, 중요한 결정을 위한 버튼을 포함하는 오버레이\n * - {@link IconButton}, 아이콘만으로 구성된 버튼을 구성할 때\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","import { cn } from \"@/utils/cn\";\n\ninterface LoadingCircleProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4\",\n md: \"h-8 w-8\",\n lg: \"h-16 w-16\",\n};\n\n/**\n * 시스템이 데이터를 처리 중이거나 다음 화면을 준비 중임을 시각적으로 나타내는 인디케이터입니다.\n *\n * {@link LoadingCircle}은 회전하는 원형 애니메이션을 통해 작업이 진행 중임을 알려\n * 사용자가 시스템이 멈춘 것으로 오해하지 않도록 돕습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **데이터 로딩**: 페이지 진입 시 API로부터 데이터를 불러올 때\n * - **작업 처리 중**: 버튼 클릭 후 서버 응답을 기다릴 때\n * - **업로드/다운로드**: 파일 전송 상태를 표시할 때\n * - **점진적 로딩**: 무한 스크롤 등 하단에 추가 데이터를 불러올 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **짧은 대기 시간**: 0.3초 미만의 아주 짧은 대기 시간에는 오히려 화면을 깜빡거리게 할 수 있으므로 생략하는 것이 좋습니다.\n * - **진행률 표시**: 전체 작업 중 어느 정도 진행되었는지 정확한 수치가 중요한 경우 Progress Bar를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Centered**: 기본적으로 컨테이너의 중앙에 배치되도록 설정되어 있습니다.\n * - **Fixed vs Inline**: 페이지 전체 로딩 시에는 고정된 위치(Overlay)에, 버튼 내부 등에는 인라인으로 배치할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 크기 선택**: 로딩이 일어나는 맥락(페이지 전체, 카드 내부, 버튼 내부 등)에 맞는 `size`를 선택하세요.\n * - **텍스트와 병행**: 필요한 경우 '불러오는 중...'과 같은 텍스트를 함께 표시하여 의미를 더 명확히 하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **남용 지양**: 한 화면에 너무 많은 로딩 서클이 동시에 나타나면 사용자에게 피로감을 줄 수 있습니다.\n * - **무한 로딩**: 작업이 실패한 경우 로딩을 멈추고 적절한 에러 메시지를 표시해야 합니다.\n *\n * ## Accessibility\n *\n * - **Role**: `role=\"status\"` 또는 `role=\"progressbar\"`를 사용하여 현재 상태를 스크린 리더에 알립니다.\n * - **Aria Label**: 시각적으로 확인이 어려운 사용자를 위해 `aria-label=\"로딩 중\"`과 같은 정보를 제공하는 것이 좋습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 로딩 서클 사용 예시:\n *\n * ```tsx\n * {isLoading ? (\n * <LoadingCircle size=\"md\" />\n * ) : (\n * <DataContent />\n * )}\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 버튼 내부의 로딩 상태:\n *\n * ```tsx\n * <Button disabled={isSubmitting}>\n * {isSubmitting && <LoadingCircle size=\"sm\" className=\"mr-2\" />}\n * 제출하기\n * </Button>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Button}, 버튼 자체의 로딩 상태를 지원함\n * - {@link Modal}, 로딩 상태를 포함할 수 있는 오버레이\n */\nexport function LoadingCircle({ size = \"lg\", className }: LoadingCircleProps) {\n return (\n <div className=\"flex items-center justify-center\">\n <div\n className={cn(\n sizeClasses[size],\n \"animate-spin rounded-full\",\n \"border-2 border-cms-gray-500 border-b-transparent\",\n className,\n )}\n />\n </div>\n );\n}\n","/**\n * @license\n * This icon set incorporates path data from Lucide (https://lucide.dev)\n * and Feather Icons (https://feathericons.com), which are licensed under the ISC License.\n *\n * ISC License\n * Copyright (c) 2022, Lucide Contributors\n */\n\nimport React, { SVGProps } from \"react\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n size?: number;\n strokeWidth?: number;\n}\n\nconst DEFAULT_SIZE = 40;\nconst DEFAULT_STROKE_WIDTH = 2.0;\n\nconst IconWrapper = React.forwardRef<SVGSVGElement, IconProps>(\n (\n {\n children,\n className,\n size = DEFAULT_SIZE,\n strokeWidth = DEFAULT_STROKE_WIDTH,\n viewBox = \"0 0 24 24\",\n ...props\n },\n ref,\n ) => (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox={viewBox}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\"text-current\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n {children}\n </svg>\n ),\n);\nIconWrapper.displayName = \"IconWrapper\";\n\n// --- Navigation & Arrows ---\nexport const ChevronDownIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M6 9L12 15L18 9\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronDownFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M6 9L12 15L18 9Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronUpIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M18 15L12 9L6 15\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronUpFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M18 15L12 9L6 15Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronLeftIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M15 18L9 12L15 6\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronLeftFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M15 18L9 12L15 6Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronRightIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M9 18L15 12L9 6\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronRightFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M9 18L15 12L9 6Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronsLeftIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M11 17L6 12L11 7\" />\n <path d=\"M18 17L13 12L18 7\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronsRightIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M13 17L18 12L13 7\" />\n <path d=\"M6 17L11 12L6 7\" />\n </IconWrapper>\n ),\n);\n\nexport const ArrowLeftIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M19 12H5\" />\n <path d=\"M12 19L5 12L12 5\" />\n </IconWrapper>\n ),\n);\n\nexport const ArrowRightIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M5 12H19\" />\n <path d=\"M12 5L19 12L12 19\" />\n </IconWrapper>\n ),\n);\n\nexport const MenuIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </IconWrapper>\n ),\n);\n\nexport const AlignIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"9\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\n// --- Status & Feedback ---\nexport const XIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m15 9-6 6\" />\n <path d=\"m9 9 6 6\" />\n </IconWrapper>\n ),\n);\n\nexport const CheckIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M20 6L9 17L4 12\" />\n </IconWrapper>\n ),\n);\n\nexport const CheckCircleIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m8.5 12 2.5 2.5 5-5\" />\n </IconWrapper>\n ),\n);\n\nexport const InfoIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"16\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"8\" y2=\"8\" />\n </IconWrapper>\n ),\n);\n\nexport const ErrorIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\n </IconWrapper>\n ),\n);\n\nexport const WarningIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </IconWrapper>\n ),\n);\n\nexport const HelpIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </IconWrapper>\n ),\n);\n\n// --- Actions ---\nexport const CloseIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M18 6L6 18\" />\n <path d=\"M6 6L18 18\" />\n </IconWrapper>\n ),\n);\n\nexport const PlusIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <line x1=\"12\" x2=\"12\" y1=\"5\" y2=\"19\" />\n <line x1=\"5\" x2=\"19\" y1=\"12\" y2=\"12\" />\n </IconWrapper>\n ),\n);\n\nexport const PlusCircleIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"16\" />\n <line x1=\"8\" x2=\"16\" y1=\"12\" y2=\"12\" />\n </IconWrapper>\n ),\n);\n\nexport const TrashIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M3 6H21\" />\n <path d=\"M19 6V20A2 2 0 0 1 17 22H7A2 2 0 0 1 5 20V6\" />\n <path d=\"M8 6V4A2 2 0 0 1 10 2H14A2 2 0 0 1 16 4V6\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </IconWrapper>\n ),\n);\n\nexport const SaveIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M19 21H5A2 2 0 0 1 3 19V5A2 2 0 0 1 5 3H16L21 8V19A2 2 0 0 1 19 21Z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </IconWrapper>\n ),\n);\n\nexport const SettingsIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </IconWrapper>\n ),\n);\n\nexport const RefreshIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3V8H16\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M3 21V16H8\" />\n </IconWrapper>\n ),\n);\n\nexport const LinkIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </IconWrapper>\n ),\n);\n\nexport const PinIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"22\" />\n <path d=\"M5 17H19V15.24A2 2 0 0 0 17.89 13.45L16.1 12.55A0.5 0.5 0 0 1 15.8 12.3V8A4 4 0 0 0 7.8 8V12.3A0.5 0.5 0 0 1 7.5 12.55L5.71 13.45A2 2 0 0 0 4.6 15.24V17Z\" />\n </IconWrapper>\n ),\n);\n\n// --- Files & Content ---\nexport const FileIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </IconWrapper>\n ),\n);\n\nexport const FileTextIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" x2=\"16\" y1=\"13\" y2=\"13\" />\n <line x1=\"8\" x2=\"16\" y1=\"17\" y2=\"17\" />\n <line x1=\"8\" x2=\"12\" y1=\"9\" y2=\"9\" />\n </IconWrapper>\n ),\n);\n\nexport const ExcelIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <rect x=\"8\" y=\"13\" width=\"8\" height=\"6\" rx=\"1\" />\n <line x1=\"12\" x2=\"12\" y1=\"13\" y2=\"19\" />\n <line x1=\"8\" x2=\"16\" y1=\"16\" y2=\"16\" />\n </IconWrapper>\n ),\n);\n\nexport const FileUploadIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <path d=\"M12 12V18\" />\n <path d=\"M15 15L12 12L9 15\" />\n </IconWrapper>\n ),\n);\n\nexport const ImageUploadIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"M21 15L17.91 11.91A2 2 0 0 0 15.09 11.91L6 21\" />\n <path d=\"M16 12L18.5 9.5A2 2 0 0 1 21.32 9.5L21 12\" />\n </IconWrapper>\n ),\n);\n\nexport const CalendarIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" x2=\"16\" y1=\"2\" y2=\"6\" />\n <line x1=\"8\" x2=\"8\" y1=\"2\" y2=\"6\" />\n <line x1=\"3\" x2=\"21\" y1=\"10\" y2=\"10\" />\n </IconWrapper>\n ),\n);\n\n// --- Custom Brand Icons ---\nexport const MedicashIcon = React.forwardRef<SVGSVGElement, IconProps>(\n ({ className, size = DEFAULT_SIZE, ...props }, ref) => (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 24 22\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n className={cn(\"text-current\", className)}\n {...props}\n >\n <g fill=\"currentColor\">\n <path d=\"M17.9361 18.3242C18.5184 19.9414 20.3015 20.7804 21.9188 20.1981C23.536 19.6157 24.375 17.8326 23.7927 16.2154L19.2776 3.67591C18.6953 2.05867 16.9122 1.21969 15.2949 1.802C13.6777 2.38432 12.8387 4.16742 13.421 5.78466L17.9361 18.3242Z\" />\n <path d=\"M13.3741 3.67585C13.9564 2.0586 15.7395 1.21962 17.3568 1.80194C18.974 2.38425 19.813 4.16735 19.2307 5.7846L14.7156 18.3241C14.1333 19.9413 12.3502 20.7803 10.7329 20.198C9.11569 19.6157 8.27671 17.8326 8.85903 16.2153L13.3741 3.67585Z\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M1.21568 15.8655L3.40558 9.78358L8.00981 11.4414L5.81991 17.5233C5.36212 18.7948 3.96031 19.4543 2.68888 18.9965C1.41746 18.5387 0.757885 17.1369 1.21568 15.8655ZM6.82668 17.8858C6.16868 19.7133 4.15382 20.6613 2.32638 20.0033C0.498935 19.3453 -0.449084 17.3305 0.208918 15.503L2.39882 9.42108L2.76131 8.41435L2.76123 8.41432L4.55271 3.43893C5.21071 1.61148 7.22556 0.663465 9.05301 1.32147C10.8804 1.97947 11.8285 3.99432 11.1705 5.82177L9.379 10.7971L9.37908 10.7972L9.01658 11.8039L6.82668 17.8858ZM8.31315 10.1149C8.24214 10.3082 8.02787 10.4074 7.83456 10.3364C7.64124 10.2654 7.54209 10.0511 7.6131 9.85778L9.13383 5.71775C9.20484 5.52444 9.41912 5.42529 9.61243 5.4963C9.80575 5.56731 9.90489 5.78158 9.83388 5.9749L8.31315 10.1149ZM9.96695 4.76687C10.1639 4.76687 10.3236 4.60718 10.3236 4.41019C10.3236 4.2132 10.1639 4.05351 9.96695 4.05351C9.76996 4.05351 9.61027 4.2132 9.61027 4.41019C9.61027 4.60718 9.76996 4.76687 9.96695 4.76687Z\"\n />\n </g>\n </svg>\n ),\n);\n\nexport const NewBadgeIcon = React.forwardRef<SVGSVGElement, IconProps>(\n ({ className, size = DEFAULT_SIZE, ...props }, ref) => (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className={cn(className)}\n {...props}\n >\n <g transform=\"translate(-1841 -61)\">\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"6\"\n transform=\"translate(1841 61)\"\n fill=\"#ffd200\"\n />\n <text\n transform=\"translate(1844 70)\"\n fill=\"#424242\"\n fontSize=\"8\"\n fontFamily=\"Pretendard-Bold, Pretendard\"\n fontWeight=\"700\"\n >\n <tspan x=\"0\" y=\"0\">\n N\n </tspan>\n </text>\n </g>\n </svg>\n ),\n);\n","import { cn } from \"@/utils/cn\";\nimport { cva, VariantProps } from \"class-variance-authority\";\nimport { useState, useRef, useEffect, forwardRef, KeyboardEvent } from \"react\";\nimport { ChevronDownFillIcon, XIcon as ClearIcon } from \"../icons\";\n\nexport const dropdownTriggerVariants = cva(\n cn(\n \"flex items-center justify-between\",\n \"rounded-md px-4 py-2.5\",\n \"text-sm font-medium\",\n \"outline-none\",\n \"transition-all\",\n \"w-full min-w-0\"\n ),\n {\n variants: {\n variant: {\n default: cn(\n \"bg-white text-cms-black border border-black\",\n \"hover:bg-cms-gray-100\"\n ),\n outline: cn(\n \"border border-cms-outline bg-transparent\",\n \"hover:bg-cms-gray-200\"\n ),\n ghost: \"border-none bg-transparent hover:bg-cms-gray-200 hover:text-black\",\n },\n size: {\n sm: \"px-3 py-2 text-xs\",\n default: \"px-4 py-2.5 text-sm\",\n lg: \"px-6 py-3 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface DropdownOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface DropdownProps extends VariantProps<\n typeof dropdownTriggerVariants\n> {\n options: DropdownOption[];\n value?: string;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n disabled?: boolean;\n className?: string;\n dropdownClassName?: string;\n searchable?: boolean;\n clearable?: boolean;\n multiple?: boolean;\n maxHeight?: number;\n}\n\n/**\n * 사용자가 목록에서 하나 또는 여러 개의 옵션을 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link Dropdown}은 공간이 제한적인 UI에서 다양한 선택지를 효율적으로 제공합니다.\n * 검색 기능, 다중 선택(Multiple), 선택 해제(Clearable) 등 복잡한 선택 시나리오를 지원합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **단일/다중 선택**: 5개 이상의 옵션 중 하나 또는 여러 개를 선택해야 할 때\n * - **공간 절약**: 라디오 버튼이나 체크박스 그룹을 표시하기엔 화면 공간이 부족할 때\n * - **동적 필터링**: 옵션이 너무 많아 검색을 통해 원하는 항목을 찾아야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **옵션이 적은 경우(2-4개)**: 사용자가 모든 옵션을 한눈에 볼 수 있는 `RadioButton`이나 `Checkbox`가 더 좋습니다.\n * - **설정 토글**: 단순히 On/Off를 전환하는 것이라면 `Switch`를 사용하세요.\n * - **단순 내비게이션**: 클릭 시 다른 페이지로 이동만 하는 기능이라면 `Button`이나 `SideNavigation` 아이템이 더 적절합니다.\n *\n * ## Layout behavior\n *\n * - **Popover Menu**: 클릭 시 버튼 아래(또는 위)에 옵션 목록이 나타나며, 다른 요소들 위에 오버레이됩니다.\n * - **Flexible Width**: 부모 컨테이너의 너비에 맞춰지거나, `className`을 통해 고정 너비를 가질 수 있습니다.\n * - **Scrolling**: 옵션이 많아지면 `maxHeight` 설정에 따라 목록 내부에 스크롤이 발생합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **논리적 정렬**: 옵션 목록은 가나다순, 사용 빈도순 등 사용자가 예측 가능한 순서로 정렬하세요.\n * - **검색 기능 활용**: 옵션이 10개 이상인 경우 `searchable` 속성을 활성화하여 편의성을 높이세요.\n * - **상태 표시**: `placeholder`를 통해 무엇을 선택해야 하는지 안내하고, 선택 후에는 선택된 항목을 명확히 표시하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 많은 텍스트**: 각 옵션의 레이블은 가급적 한 줄에 들어오도록 짧게 작성하세요.\n * - **중첩 드롭다운 지양**: 드롭다운 안에서 또 다른 드롭다운이 열리는 복잡한 계층 구조는 피하는 것이 좋습니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Interaction**: `Enter`나 `Space`로 열고, 화살표 키로 이동하며, `Esc`로 닫을 수 있습니다.\n * - **Screen Reader**: `aria-expanded`, `aria-haspopup` 등의 속성을 통해 드롭다운의 상태와 역할을 스크린 리더에 전달합니다.\n * - **Focus Management**: 드롭다운이 열리면 검색창이나 첫 번째 옵션으로 포커스가 이동합니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 단일 선택 드롭다운:\n *\n * ```tsx\n * <Dropdown\n * options={[\n * { value: 'ko', label: '한국어' },\n * { value: 'en', label: '영어' },\n * { value: 'ja', label: '일본어' },\n * ]}\n * placeholder=\"언어를 선택하세요\"\n * onValueChange={(val) => console.log(val)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 검색과 다중 선택이 가능한 드롭다운:\n *\n * ```tsx\n * <Dropdown\n * options={largeOptionList}\n * multiple={true}\n * searchable={true}\n * clearable={true}\n * placeholder=\"태그 선택\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Select}, 기본적인 HTML select 스타일의 컴포넌트\n * - {@link Combobox}, 입력과 선택이 결합된 컴포넌트\n * - {@link Popover}, 더 자유로운 형태의 팝오버가 필요한 경우\n */\nexport const Dropdown = forwardRef<HTMLButtonElement, DropdownProps>(\n (\n {\n options,\n value,\n placeholder = \"선택하세요\",\n onValueChange,\n disabled = false,\n className,\n dropdownClassName,\n variant,\n size,\n searchable = false,\n clearable = false,\n multiple = false,\n maxHeight = 200,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [selectedValues, setSelectedValues] = useState<string[]>(\n multiple ? (value ? [value] : []) : []\n );\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const selectedOption = options.find((option) => option.value === value);\n const selectedLabel = multiple\n ? selectedValues.length > 0\n ? `${selectedValues.length}개 선택됨`\n : placeholder\n : selectedOption?.label || placeholder;\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase())\n );\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n setSearchTerm(\"\");\n }\n };\n\n const handleOptionClick = (option: DropdownOption) => {\n if (option.disabled) return;\n\n if (multiple) {\n const newSelectedValues = selectedValues.includes(option.value)\n ? selectedValues.filter((v) => v !== option.value)\n : [...selectedValues, option.value];\n\n setSelectedValues(newSelectedValues);\n onValueChange?.(newSelectedValues.join(\",\"));\n } else {\n onValueChange?.(option.value);\n setIsOpen(false);\n }\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (multiple) {\n setSelectedValues([]);\n onValueChange?.(\"\");\n } else {\n onValueChange?.(\"\");\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsOpen(false);\n } else if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleToggle();\n }\n };\n\n // 외부 클릭 감지\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // 드롭다운이 열릴 때 검색 입력창에 포커스\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n return (\n <div ref={dropdownRef} className=\"relative w-full\">\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n dropdownTriggerVariants({ variant, size }),\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n {...props}\n >\n <span\n className={cn(\n \"truncate flex-1 text-left\",\n !selectedOption && !multiple && \"text-cms-gray-400\"\n )}\n >\n {selectedLabel}\n </span>\n\n <div className=\"flex items-center gap-2 ml-3\">\n {clearable && (value || selectedValues.length > 0) && (\n <button\n type=\"button\"\n className={cn(\n \"border-0 bg-transparent\",\n \"p-1 rounded text-cms-gray-400 transition-colors\",\n \"hover:text-cms-black\"\n )}\n onClick={handleClear}\n aria-label=\"선택 취소\"\n >\n <ClearIcon className=\"w-3 h-3\" />\n </button>\n )}\n <ChevronDownFillIcon\n className={cn(\"w-3 h-3 transition-transform duration-200\", isOpen && \"rotate-180\")}\n />\n </div>\n </button>\n\n {isOpen && (\n <div\n className={cn(\n \"absolute z-50 mt-1 py-1 w-full min-w-0\",\n \"rounded-md border border-cms-gray-300\",\n \"bg-white shadow-lg\",\n dropdownClassName\n )}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n {searchable && (\n <div className=\"px-3 py-2 border-b border-cms-gray-200\">\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"검색...\"\n className={cn(\n \"w-full px-2 py-1 text-sm\",\n \"rounded outline-none\",\n \"border border-cms-gray-300\",\n \"focus:ring-1 focus:ring-cms-gray-400\"\n )}\n />\n </div>\n )}\n\n <div className=\"max-h-48 overflow-y-auto\">\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-cms-gray-400 text-center\">\n {searchTerm ? \"검색 결과가 없습니다\" : \"옵션이 없습니다\"}\n </div>\n ) : (\n filteredOptions.map((option) => {\n const isSelected = multiple\n ? selectedValues.includes(option.value)\n : value === option.value;\n\n return (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"border-0\",\n \"flex items-center justify-between gap-2\",\n \"w-full px-3 py-2 \",\n \"text-left text-sm\",\n \"transition-colors\",\n option.disabled\n ? \"text-cms-gray-400 cursor-not-allowed bg-white\"\n : \"text-cms-black bg-white hover:bg-cms-gray-100 cursor-pointer\",\n isSelected && \"bg-cms-gray-150 font-medium\"\n )}\n onClick={() => handleOptionClick(option)}\n disabled={option.disabled}\n >\n <span className=\"truncate\">{option.label}</span>\n {isSelected && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"w-4 h-4 text-black shrink-0\"\n >\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nDropdown.displayName = \"Dropdown\";\n","import { cn } from \"@/utils/cn\";\nimport { forwardRef } from \"react\";\nimport { Dropdown, DropdownProps } from \"./Dropdown\";\n\nexport interface SelectProps extends Omit<\n DropdownProps,\n \"multiple\" | \"searchable\" | \"clearable\"\n> {\n label?: string;\n helperText?: string;\n error?: string;\n required?: boolean;\n}\n\n/**\n * 사용자에게 레이블, 도움말, 에러 메시지와 함께 단일 선택 드롭다운을 제공하는 컴포넌트입니다.\n *\n * {@link Select}는 {@link Dropdown}을 기반으로 하며, 폼(Form) 구성에 필요한\n * 추가적인 UI 요소(레이블, 필수 표시, 유효성 검사 메시지 등)를 포함하고 있습니다.\n * 주로 입력 폼 내에서 하나의 값을 선택받아야 할 때 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **표준 폼 입력**: 이름, 이메일 등과 함께 성별, 지역, 카테고리 등을 선택받을 때\n * - **유효성 검사가 필요한 경우**: 선택하지 않았을 때 에러 메시지를 표시해야 하는 상황\n * - **상세 설명 필요**: 입력 항목에 대한 추가적인 도움말(helperText)이 필요한 경우\n *\n * **사용하지 말아야 하는 경우:**\n * - **단순 필터/정렬**: 레이블 없이 목록 위에 놓이는 필터 등은 `Dropdown`을 직접 사용하세요.\n * - **다중 선택/검색**: 다중 선택이나 검색 기능이 필요하다면 `Dropdown` 또는 `Combobox`를 사용하세요.\n *\n * ## Layout behavior\n *\n * - **Vertical Stack**: 레이블 - 드롭다운 버튼 - 도움말/에러 메시지가 수직으로 배치됩니다.\n * - **Consistency**: 다른 입력 컴포넌트(TextInput 등)와 동일한 간격과 스타일을 유지하여 일관된 폼 레이아웃을 구성합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 레이블**: 사용자가 무엇을 선택해야 하는지 알 수 있도록 구체적인 레이블을 제공하세요.\n * - **필수 여부 표시**: `required` 속성을 사용하여 필수 입력 항목임을 시각적으로 나타내세요.\n * - **에러 메시지 활용**: 유효성 검사 실패 시 `error` prop을 통해 구체적인 오류 원인을 안내하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **레이블 생략 지양**: 폼 내에서는 접근성과 사용자 경험을 위해 가급적 레이블을 생략하지 마세요.\n * - **과도한 도움말**: 도움말이 너무 길어지면 폼 전체의 가독성이 떨어집니다. 가급적 한 줄 이내로 작성하세요.\n *\n * ## Accessibility\n *\n * - **Label Association**: 레이블은 드롭다운 버튼과 논리적으로 연결되어 스크린 리더에서 함께 읽어줍니다.\n * - **Error States**: 에러 상태가 되면 `aria-invalid` 등의 속성을 통해 시각 장애 사용자에게도 오류 상태를 전달합니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 레이블과 필수 표시가 포함된 선택 창:\n *\n * ```tsx\n * <Select\n * label=\"사용자 등급\"\n * required={true}\n * options={[\n * { value: 'admin', label: '관리자' },\n * { value: 'editor', label: '편집자' },\n * { value: 'viewer', label: '뷰어' },\n * ]}\n * placeholder=\"등급을 선택해 주세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 에러 메시지가 표시된 상태:\n *\n * ```tsx\n * <Select\n * label=\"국가 선택\"\n * options={countryOptions}\n * error=\"국가를 선택하는 것은 필수입니다\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Dropdown}, 레이블 없이 단순한 선택 기능만 필요한 경우\n * - {@link TextInput}, 텍스트 직접 입력이 필요한 경우\n * - {@link RadioButton}, 옵션이 적고 한눈에 보여야 하는 경우\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(\n ({ label, helperText, error, required, className, ...props }, ref) => {\n return (\n <div className={cn(\"space-y-1\", className)}>\n {label && (\n <label className=\"block text-sm font-medium text-cms-black\">\n {label}\n {required && <span className=\"text-cms-red-500 ml-1\">*</span>}\n </label>\n )}\n\n <Dropdown\n ref={ref}\n {...props}\n className={cn(error && \"border-cms-red-500 focus:ring-cms-red-500\")}\n />\n\n {(helperText || error) && (\n <p\n className={cn(\n \"text-xs\",\n error ? \"text-cms-red-500\" : \"text-cms-gray-400\",\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = \"Select\";\n","import { cn } from \"@/utils/cn\";\nimport { useState, forwardRef } from \"react\";\nimport { Dropdown, DropdownProps } from \"./Dropdown\";\n\nexport interface ComboboxProps extends Omit<DropdownProps, \"searchable\"> {\n loading?: boolean;\n createable?: boolean;\n onCreateOption?: (value: string) => void;\n}\n\n/**\n * 텍스트 입력과 드롭다운 선택 기능이 결합되어, 목록에서 검색하거나 새로운 옵션을 생성할 수 있는 컴포넌트입니다.\n *\n * {@link Combobox}는 사용자가 방대한 목록에서 원하는 항목을 빠르게 찾을 수 있도록 돕고,\n * 만약 찾는 항목이 없을 경우 즉석에서 새로운 값을 추가할 수 있는 유연성을 제공합니다.\n *\n * {@link Dropdown}의 확장 버전으로, 기본적으로 `searchable` 기능이 활성화되어 있습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **대량 데이터 검색**: 옵션이 수백 개 이상이어서 단순 스크롤로는 찾기 어려운 경우\n * - **동적 옵션 추가**: 목록에 없는 값을 사용자가 직접 입력하여 데이터베이스에 추가해야 할 때 (예: 태그 입력, 신규 제조사 추가 등)\n * - **빠른 필터링**: 사용자가 정확한 명칭을 입력하여 필터링된 결과만 보고 싶어 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **옵션이 고정된 경우**: 새로운 값을 추가할 필요가 없고 옵션 개수가 적다면 일반 `Dropdown`이나 `Select`가 더 단순합니다.\n * - **자유 텍스트 입력**: 미리 정의된 옵션 없이 자유로운 입력을 받는 것이 주 목적이라면 `TextInput`을 사용하세요.\n *\n * ## Layout behavior\n *\n * - **Auto-filtering**: 사용자가 입력할 때마다 목록이 즉시 필터링되어 업데이트됩니다.\n * - **Create Option**: `createable` 설정 시, 검색 결과가 없을 경우 최하단에 '생성' 옵션이 나타납니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **로딩 상태 표시**: 대규모 데이터를 원격에서 가져오는 경우 `loading` 속성을 통해 사용자에게 진행 상황을 알리세요.\n * - **명확한 생성 문구**: 새로운 항목을 생성할 때 무엇이 생성되는지 사용자에게 명확히 전달하세요.\n * - **검색 최적화**: 대소문자 구분 없는 검색 등 사용자가 입력하기 편한 검색 환경을 제공하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **검색창 없는 콤보박스**: 콤보박스의 핵심은 검색입니다. 검색이 필요 없다면 일반 드롭다운을 사용하세요.\n * - **복잡한 생성 과정**: `onCreateOption`에서 너무 복잡한 로직을 처리하면 UI가 멈춘 것처럼 보일 수 있습니다. 비동기 처리 시 로딩 상태를 적절히 활용하세요.\n *\n * ## Accessibility\n *\n * - **Aria Roles**: `role=\"combobox\"`를 사용하여 입력과 선택이 가능한 요소임을 스크린 리더에 알립니다.\n * - **Live Regions**: 필터링 결과의 개수 변화 등을 시각 장애 사용자에게 알릴 수 있도록 설계되었습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 새로운 옵션을 생성할 수 있는 콤보박스:\n *\n * ```tsx\n * <Combobox\n * options={existingTags}\n * createable={true}\n * onCreateOption={(newTag) => {\n * // 서버에 태그 추가 요청 후 목록 업데이트\n * handleCreateTag(newTag);\n * }}\n * placeholder=\"태그를 검색하거나 새로 추가하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 데이터를 로딩 중인 콤보박스:\n *\n * ```tsx\n * <Combobox\n * options={[]}\n * loading={true}\n * placeholder=\"데이터를 불러오는 중...\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Dropdown}, 기본 검색/선택 기능이 필요한 경우\n * - {@link TagInput}, 여러 개의 값을 검색하여 추가해야 할 때\n * - {@link TextInput}, 단순한 텍스트 입력만 필요한 경우\n */\nexport const Combobox = forwardRef<HTMLButtonElement, ComboboxProps>(\n (\n { options, loading = false, createable = false, onCreateOption, ...props },\n ref,\n ) => {\n const [searchTerm] = useState(\"\");\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\n );\n\n const hasExactMatch = filteredOptions.some(\n (option) => option.label.toLowerCase() === searchTerm.toLowerCase(),\n );\n\n // 검색어가 있고 createable이며 정확히 일치하는 옵션이 없을 때 생성 옵션 추가\n const optionsWithCreate = [\n ...filteredOptions,\n ...(createable && searchTerm && !hasExactMatch\n ? [\n {\n value: `__create__${searchTerm}`,\n label: `\"${searchTerm}\" 생성`,\n disabled: false,\n },\n ]\n : []),\n ];\n\n return (\n <Dropdown\n ref={ref}\n {...props}\n options={optionsWithCreate}\n searchable={true}\n dropdownClassName={cn(loading && \"opacity-75\", props.dropdownClassName)}\n onValueChange={(value) => {\n if (value.startsWith(\"__create__\")) {\n const createValue = value.replace(\"__create__\", \"\");\n onCreateOption?.(createValue);\n } else {\n props.onValueChange?.(value);\n }\n }}\n />\n );\n },\n);\n\nCombobox.displayName = \"Combobox\";\n","\"use client\";\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"@/utils/cn\";\nimport { forwardRef } from \"react\";\n\n/**\n * 특정 요소 근처에 부가적인 정보나 컨트롤을 표시하는 플로팅 컴포넌트입니다.\n *\n * {@link Popover}는 사용자가 버튼이나 아이콘을 클릭했을 때 나타나며,\n * 기존 화면의 맥락을 유지하면서 추가적인 작업(메뉴 선택, 상세 정보 확인 등)을 수행할 수 있게 합니다.\n *\n * Radix UI의 Popover 컴포넌트를 기반으로 구현되어 포커스 트랩, 키보드 내비게이션 등이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **맥락 기반 메뉴**: '더 보기' 버튼 클릭 시 나타나는 관리 기능(수정, 삭제 등)\n * - **상세 정보 표시**: 아이콘 클릭 시 해당 항목에 대한 간단한 설명이나 데이터를 보여줄 때\n * - **간단한 설정**: 필터 옵션이나 정렬 기준을 선택할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **중요한 의사 결정**: 사용자의 주의를 완전히 집중시켜야 하는 작업은 `Modal`을 사용하세요.\n * - **단순 힌트**: 마우스 호버 시에만 짧게 보여주는 정보는 Tooltip을 사용하세요.\n * - **입력 폼**: 복잡한 입력이 필요한 경우 모달이나 별도 페이지가 더 적합할 수 있습니다.\n *\n * ## Layout behavior\n *\n * - **Anchor Positioning**: 트리거(버튼 등)를 기준으로 상하좌우 적절한 위치에 자동으로 배치됩니다.\n * - **Overlay**: 다른 UI 요소들 위에 겹쳐서 나타나며, 배경(Overlay)을 생성하지 않아 뒤쪽 화면을 볼 수 있습니다.\n * - **Size**: 콘텐츠의 양에 따라 크기가 결정되지만, `min-w-[200px]`의 최소 너비를 가집니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 트리거**: 사용자가 무엇을 클릭하면 팝오버가 열릴지 명확히 인지할 수 있는 버튼이나 아이콘을 사용하세요.\n * - **적절한 배치**: `align` 속성을 조절하여 팝오버가 화면 밖으로 나가지 않도록 관리하세요. (기본값: 'end')\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 많은 정보**: 팝오버는 빠르고 간단한 상호작용을 위한 것입니다. 너무 많은 내용을 담지 마세요.\n * - **비정상적인 닫기**: 팝오버 외부를 클릭하거나 `Esc`를 누르면 자연스럽게 닫히도록 기본 동작을 유지하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Interaction**: `Space`나 `Enter`로 열고, `Esc`로 닫으며, 팝오버 내부에서 `Tab` 키로 내비게이션이 가능합니다.\n * - **Aria Attributes**: `aria-expanded`, `aria-controls` 등의 속성이 자동으로 부여됩니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 버튼 클릭 시 상세 정보를 보여주는 팝오버:\n *\n * ```tsx\n * <Popover>\n * <PopoverTrigger asChild>\n * <Button variant=\"ghost\">상세 정보</Button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <div className=\"p-4\">\n * <h4 className=\"font-bold\">계정 상태</h4>\n * <p className=\"text-sm\">현재 활성화된 계정입니다.</p>\n * </div>\n * </PopoverContent>\n * </Popover>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Modal}, 더 중요하거나 복잡한 상호작용이 필요한 경우\n * - {@link Dropdown}, 정해진 리스트에서 값을 선택하는 것이 주 목적인 경우\n * - {@link PopoverMenuItem}, 팝오버 내부의 메뉴 항목을 구성할 때\n */\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverContent = forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"end\", sideOffset = 8, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[200px] p-2\",\n \"border rounded-md border-cms-gray-200\",\n \"bg-cms-white shadow-lg\",\n \"animate-in fade-in-0 zoom-in-95\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","\"use client\";\n\nimport { cn } from \"@/utils/cn\";\nimport { cva, VariantProps } from \"class-variance-authority\";\nimport { ButtonHTMLAttributes, forwardRef } from \"react\";\n\nconst popoverMenuItemVariants = cva(\n cn(\n \"border-0 cursor-pointer flex w-full items-center gap-3 rounded-md px-3 py-2\",\n \"bg-white text-sm font-medium transition-colors\",\n \"hover:bg-cms-gray-100 active:bg-cms-gray-200\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n ),\n {\n variants: {\n variant: {\n default: \"text-cms-foreground\",\n destructive: \"text-cms-red-400 hover:text-cms-red-500\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface PopoverMenuItemProps\n extends\n ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof popoverMenuItemVariants> {\n icon?: React.ReactNode;\n}\n\n/**\n * Popover 내부에 배치되는 개별 액션 항목 컴포넌트입니다.\n *\n * {@link PopoverMenuItem}은 아이콘과 텍스트가 결합된 형태의 메뉴 버튼으로,\n * 일관된 패딩, 폰트, 호버 효과를 제공합니다.\n *\n * ## Example\n *\n * ```tsx\n * <PopoverContent>\n * <div className=\"flex flex-col gap-1\">\n * <PopoverMenuItem icon={<EditIcon />} onClick={handleEdit}>\n * 수정하기\n * </PopoverMenuItem>\n * <PopoverMenuItem\n * variant=\"destructive\"\n * icon={<TrashIcon />}\n * onClick={handleDelete}\n * >\n * 삭제하기\n * </PopoverMenuItem>\n * </div>\n * </PopoverContent>\n * ```\n */\nconst PopoverMenuItem = forwardRef<HTMLButtonElement, PopoverMenuItemProps>(\n ({ className, variant, icon, children, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(popoverMenuItemVariants({ variant }), className)}\n {...props}\n >\n {icon && <span className=\"shrink-0\">{icon}</span>}\n {children}\n </button>\n );\n },\n);\n\nPopoverMenuItem.displayName = \"PopoverMenuItem\";\n\nexport { PopoverMenuItem, popoverMenuItemVariants };\n","import React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nconst textVariants = cva(\"cms-font-pretendard cms-text-black\", {\n variants: {\n variant: {\n h1: \"text-3xl font-bold\",\n h2: \"text-2xl font-semibold\",\n h3: \"text-lg font-semibold\",\n subtitle: \"text-base font-medium\",\n body: \"text-sm font-normal\",\n emphasis: \"text-sm font-semibold\",\n caption: \"text-xs font-normal\",\n price: \"text-xs font-bold\",\n },\n align: {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n },\n decoration: {\n underline: \"underline\",\n lineThrough: \"line-through\",\n none: \"no-underline\",\n },\n },\n defaultVariants: {\n variant: \"body\",\n align: \"left\",\n },\n});\n\nexport interface TextProps\n extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof textVariants> {\n as?: \"p\" | \"span\" | \"div\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"label\";\n children: React.ReactNode;\n}\n\n/**\n * 일관된 타이포그래피 시스템을 적용하기 위한 텍스트 컴포넌트입니다.\n *\n * {@link Text}는 제목(Heading), 본문(Body), 캡션(Caption) 등 미리 정의된 스타일을 제공하여\n * 디자인 일관성을 유지하고 텍스트의 의미적 구조(Semantic Structure)를 쉽게 정의할 수 있게 합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **페이지 제목 및 부제목**: 화면의 위계를 나누는 타이틀을 작성할 때\n * - **본문 콘텐츠**: 일반적인 설명글이나 데이터를 표시할 때\n * - **캡션 및 힌트**: 부가적인 설명이나 작은 크기의 정보가 필요할 때\n * - **정형화된 스타일**: 특정 폰트 두께나 크기를 시스템 규칙에 맞춰 적용해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **복잡한 스타일링**: 시스템 정의 범위를 크게 벗어나는 특수 스타일은 별도 CSS 클래스를 활용하세요.\n *\n * ## Layout behavior\n *\n * - **Semantic Tag**: `as` prop을 통해 실제 HTML 태그(`h1`, `p`, `span` 등)를 결정할 수 있어 SEO와 접근성에 유리합니다.\n * - **Alignment**: `align` 속성을 통해 왼쪽, 중앙, 오른쪽 정렬을 손쉽게 조절할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **의미론적 태그 사용**: 제목에는 `as=\"h1\"`, 본문에는 `as=\"p\"`를 사용하는 등 맥락에 맞는 태그를 선택하세요.\n * - **계층 구조 준수**: 큰 제목(h1) 아래에 작은 제목(h2, h3)이 오도록 논리적인 흐름을 유지하세요.\n * - **변형(Variant) 활용**: 폰트 크기와 두께를 직접 조절하기보다 제공되는 `variant`를 우선적으로 사용하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **과도한 폰트 크기 사용**: 가급적 시스템에서 정의한 크기를 벗어나지 않도록 주의하세요.\n * - **의미와 맞지 않는 태그**: 시각적으로만 크게 보이기 위해 제목 태그를 남용하지 마세요.\n *\n * ## Example\n *\n * {@tool snippet}\n * 다양한 위계의 텍스트 구성:\n *\n * ```tsx\n * <div className=\"space-y-4\">\n * <Text variant=\"h1\" as=\"h1\">대시보드</Text>\n * <Text variant=\"subtitle\">오늘의 요약 정보입니다.</Text>\n * <Text variant=\"body\">\n * 현재 활성화된 사용자는 총 1,234명이며, 어제 대비 5% 증가했습니다.\n * </Text>\n * <Text variant=\"caption\" align=\"right\">최근 업데이트: 2024-01-24</Text>\n * </div>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link TextInput}, 사용자의 입력을 받는 텍스트 필드\n * - {@link Button}, 텍스트를 포함하는 액션 요소\n */\nexport const Text = React.forwardRef<HTMLElement, TextProps>(\n (\n {\n className,\n variant,\n align,\n decoration,\n as: Component = \"p\",\n children,\n ...props\n },\n ref,\n ) => {\n return (\n <Component\n className={cn(textVariants({ variant, align, decoration }), className)}\n ref={ref as any}\n {...props}\n >\n {children}\n </Component>\n );\n },\n);\n\nText.displayName = \"Text\";\n","import React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nconst textInputVariants = cva(\n cn(\n \"w-full box-border\",\n \"px-3 py-2\",\n \"rounded-cms-sm\",\n \"border border-solid\",\n \"font-normal leading-tight\",\n \"transition-colors duration-200\",\n \"outline-none\",\n \"text-md text-cms-black\",\n \"placeholder:text-cms-gray-500\",\n \"placeholder:text-md\",\n ),\n {\n variants: {\n variant: {\n default: cn(\n \"bg-cms-white \",\n \"border-cms-gray-450\",\n \"focus:border-cms-gray-800\",\n \"disabled:bg-cms-gray-150\",\n \"disabled:text-cms-gray-400\",\n \"disabled:cursor-not-allowed\",\n ),\n error: cn(\n \"bg-cms-white\",\n \"border-cms-red-400\",\n \"focus:border-cms-red-500\",\n ),\n },\n fullWidth: {\n true: \"w-full\",\n false: \"w-auto\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n fullWidth: true,\n },\n },\n);\n\nconst labelVariants = cva(\"block text-md font-medium text-cms-black\");\n\nconst errorMessageVariants = cva(\n \"block text-sm font-medium text-cms-red-400 mt-1\",\n);\n\nconst helperTextVariants = cva(\n \"block text-sm font-normal text-cms-gray-700 mt-1\",\n);\n\nexport interface TextInputProps\n extends\n Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof textInputVariants> {\n label?: string;\n required?: boolean;\n error?: boolean;\n errorMessage?: string;\n helperText?: string;\n showCharCount?: boolean;\n labelLayout?: \"vertical\" | \"horizontal\";\n labelWidth?: string;\n}\n\n/**\n * 사용자로부터 텍스트, 이메일, 숫자 등의 단일 라인 데이터를 입력받는 필드입니다.\n *\n * {@link TextInput}은 가장 기본적인 폼 입력 요소로, label, placeholder, 에러 메시지,\n * helper 텍스트, 글자 수 카운터 등을 통합적으로 제공합니다. 일관된 스타일과 동작으로\n * 사용자 경험을 향상시킵니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **단일 라인 텍스트 입력**: 이름, 이메일, 전화번호 등 한 줄로 입력 가능한 정보\n * - **특정 타입 입력**: email, password, number, date 등 HTML input type을 활용\n * - **글자 수 제한**: 최대 글자 수를 지정하고 실시간으로 카운터를 표시\n * - **유효성 검증**: 에러 상태와 메시지를 통해 사용자에게 피드백 제공\n * - **필수 입력**: `required` 속성을 사용하여 반드시 입력해야 함을 시각적으로 안내\n *\n * ## Layout behavior\n *\n * TextInput은 기본적으로 부모 요소의 전체 너비(`fullWidth={true}`)를 차지합니다.\n * `fullWidth={false}`로 설정하면 내용에 맞춰 자동으로 조절됩니다.\n *\n * 레이블 배치는 `labelLayout` prop으로 제어됩니다:\n * - **vertical** (기본값): Label이 입력 필드 위에 세로로 배치됩니다.\n * - **horizontal**: Label과 입력 필드가 가로로 나란히 배치됩니다. `labelWidth`로 Label 너비를 조정할 수 있습니다 (기본값: 120px).\n *\n * 구조는 다음 순서로 배치됩니다:\n * 1. **헤더 영역** (있는 경우): label (좌측, 필수 시 * 표시) + 글자 수 카운터 (우측)\n * 2. **입력 필드**: 텍스트 입력 영역\n * 3. **메시지 영역** (있는 경우): errorMessage 또는 helperText\n *\n * 높이는 `h-10` (2.5rem / 40px)로 고정되어 일관된 버튼 높이와 정렬됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 label 제공**: 무엇을 입력해야 하는지 명확하게 표시하세요\n * - **필수 여부 명시**: 반드시 입력해야 하는 필드라면 `required` 속성을 활성화하세요.\n * - **가로 배치 활용**: 폼에서 여러 입력 필드를 정렬할 때는 `labelLayout=\"horizontal\"`을 사용하여 일관된 레이아웃을 유지하세요.\n *\n * ## Example\n *\n * {@tool snippet}\n * 레이블과 필수 표시가 포함된 입력 필드:\n *\n * ```tsx\n * <TextInput\n * label=\"사용자 아이디\"\n * required={true}\n * placeholder=\"아이디를 입력하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 가로 배치 레이아웃:\n *\n * ```tsx\n * <TextInput\n * label=\"상호(법인명)\"\n * required={true}\n * labelLayout=\"horizontal\"\n * labelWidth=\"150px\"\n * placeholder=\"회사명을 입력하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Textarea}, 여러 줄 텍스트 입력을 위한 컴포넌트\n * - {@link TagInput}, 여러 태그를 입력받는 컴포넌트\n * - {@link DatePicker}, 날짜 선택을 위한 컴포넌트\n * - {@link Dropdown}, 옵션 선택을 위한 컴포넌트\n */\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\n className,\n variant,\n fullWidth,\n label,\n required,\n error,\n errorMessage,\n helperText,\n showCharCount,\n maxLength,\n value,\n defaultValue,\n onChange,\n id,\n labelLayout = \"vertical\",\n labelWidth = \"120px\",\n ...props\n },\n ref,\n ) => {\n const [internalValue, setInternalValue] = React.useState<string>(\n (value || defaultValue || \"\") as string,\n );\n const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;\n const finalVariant = error ? \"error\" : variant;\n\n const currentValue =\n value !== undefined ? (value as string) : internalValue;\n const charCount = currentValue?.length || 0;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const hasHeader = label || (showCharCount && maxLength);\n const isHorizontal = labelLayout === \"horizontal\";\n\n return (\n <div className={cn(\"w-full\", !fullWidth && \"w-auto\")}>\n {isHorizontal && hasHeader ? (\n <div className=\"flex items-center gap-3\">\n {label && (\n <label\n htmlFor={inputId}\n className={cn(labelVariants(), \"mb-0 shrink-0\")}\n style={{ width: labelWidth }}\n >\n {label}\n {required && <span className=\"text-cms-red-400 ml-1\">*</span>}\n </label>\n )}\n <div className=\"flex-1\">\n <input\n id={inputId}\n ref={ref}\n className={cn(\n textInputVariants({ variant: finalVariant, fullWidth: true }),\n className,\n )}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n required={required}\n {...props}\n />\n </div>\n {showCharCount && maxLength && (\n <span className=\"text-sm text-cms-gray-600 shrink-0\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n ) : (\n <>\n {hasHeader && (\n <div className=\"flex justify-between items-center mb-2\">\n {label ? (\n <label htmlFor={inputId} className={labelVariants()}>\n {label}\n {required && (\n <span className=\"text-cms-red-400 ml-1\">*</span>\n )}\n </label>\n ) : (\n <div />\n )}\n {showCharCount && maxLength && (\n <span className=\"text-sm text-cms-gray-600\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n <input\n id={inputId}\n ref={ref}\n className={cn(\n textInputVariants({ variant: finalVariant, fullWidth }),\n className,\n )}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n required={required}\n {...props}\n />\n </>\n )}\n {error && errorMessage && (\n <span className={errorMessageVariants()}>{errorMessage}</span>\n )}\n {!error && helperText && (\n <span className={helperTextVariants()}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nTextInput.displayName = \"TextInput\";\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"1초 미만\",\n other: \"{{count}}초 미만\",\n },\n\n xSeconds: {\n one: \"1초\",\n other: \"{{count}}초\",\n },\n\n halfAMinute: \"30초\",\n\n lessThanXMinutes: {\n one: \"1분 미만\",\n other: \"{{count}}분 미만\",\n },\n\n xMinutes: {\n one: \"1분\",\n other: \"{{count}}분\",\n },\n\n aboutXHours: {\n one: \"약 1시간\",\n other: \"약 {{count}}시간\",\n },\n\n xHours: {\n one: \"1시간\",\n other: \"{{count}}시간\",\n },\n\n xDays: {\n one: \"1일\",\n other: \"{{count}}일\",\n },\n\n aboutXWeeks: {\n one: \"약 1주\",\n other: \"약 {{count}}주\",\n },\n\n xWeeks: {\n one: \"1주\",\n other: \"{{count}}주\",\n },\n\n aboutXMonths: {\n one: \"약 1개월\",\n other: \"약 {{count}}개월\",\n },\n\n xMonths: {\n one: \"1개월\",\n other: \"{{count}}개월\",\n },\n\n aboutXYears: {\n one: \"약 1년\",\n other: \"약 {{count}}년\",\n },\n\n xYears: {\n one: \"1년\",\n other: \"{{count}}년\",\n },\n\n overXYears: {\n one: \"1년 이상\",\n other: \"{{count}}년 이상\",\n },\n\n almostXYears: {\n one: \"거의 1년\",\n other: \"거의 {{count}}년\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return result + \" 후\";\n } else {\n return result + \" 전\";\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"y년 M월 d일 EEEE\",\n long: \"y년 M월 d일\",\n medium: \"y.MM.dd\",\n short: \"y.MM.dd\",\n};\n\nconst timeFormats = {\n full: \"a H시 mm분 ss초 zzzz\",\n long: \"a H:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} {{time}}\",\n long: \"{{date}} {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'지난' eeee p\",\n yesterday: \"'어제' p\",\n today: \"'오늘' p\",\n tomorrow: \"'내일' p\",\n nextWeek: \"'다음' eeee p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"BC\", \"AD\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"기원전\", \"서기\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1분기\", \"2분기\", \"3분기\", \"4분기\"],\n};\n\nconst monthValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"],\n\n abbreviated: [\n \"1월\",\n \"2월\",\n \"3월\",\n \"4월\",\n \"5월\",\n \"6월\",\n \"7월\",\n \"8월\",\n \"9월\",\n \"10월\",\n \"11월\",\n \"12월\",\n ],\n\n wide: [\n \"1월\",\n \"2월\",\n \"3월\",\n \"4월\",\n \"5월\",\n \"6월\",\n \"7월\",\n \"8월\",\n \"9월\",\n \"10월\",\n \"11월\",\n \"12월\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n short: [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n abbreviated: [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n wide: [\"일요일\", \"월요일\", \"화요일\", \"수요일\", \"목요일\", \"금요일\", \"토요일\"],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n abbreviated: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n wide: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n abbreviated: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n wide: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n const unit = String(options?.unit);\n\n switch (unit) {\n case \"minute\":\n case \"second\":\n return String(number);\n case \"date\":\n return number + \"일\";\n default:\n return number + \"번째\";\n }\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(일|번째)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(기원전|서기)/i,\n};\nconst parseEraPatterns = {\n any: [/^(bc|기원전)/i, /^(ad|서기)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234]사?분기/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^(1[012]|[123456789])/,\n abbreviated: /^(1[012]|[123456789])월/i,\n wide: /^(1[012]|[123456789])월/i,\n};\nconst parseMonthPatterns = {\n any: [\n /^1월?$/,\n /^2/,\n /^3/,\n /^4/,\n /^5/,\n /^6/,\n /^7/,\n /^8/,\n /^9/,\n /^10/,\n /^11/,\n /^12/,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[일월화수목금토]/,\n short: /^[일월화수목금토]/,\n abbreviated: /^[일월화수목금토]/,\n wide: /^[일월화수목금토]요일/,\n};\nconst parseDayPatterns = {\n any: [/^일/, /^월/, /^화/, /^수/, /^목/, /^금/, /^토/],\n};\n\nconst matchDayPeriodPatterns = {\n any: /^(am|pm|오전|오후|자정|정오|아침|저녁|밤)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^(am|오전)/i,\n pm: /^(pm|오후)/i,\n midnight: /^자정/i,\n noon: /^정오/i,\n morning: /^아침/i,\n afternoon: /^오후/i,\n evening: /^저녁/i,\n night: /^밤/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./ko/_lib/formatDistance.js\";\nimport { formatLong } from \"./ko/_lib/formatLong.js\";\nimport { formatRelative } from \"./ko/_lib/formatRelative.js\";\nimport { localize } from \"./ko/_lib/localize.js\";\nimport { match } from \"./ko/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary Korean locale.\n * @language Korean\n * @iso-639-2 kor\n * @author Hong Chulju [@angdev](https://github.com/angdev)\n * @author Lee Seoyoen [@iamssen](https://github.com/iamssen)\n * @author Taiki IKeda [@so99ynoodles](https://github.com/so99ynoodles)\n */\nexport const ko = {\n code: \"ko\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default ko;\n","/**\n * Time zone name format.\n */\n\n/**\n * The function returns the time zone name for the given date in the specified\n * time zone.\n *\n * It uses the `Intl.DateTimeFormat` API and by default outputs the time zone\n * name in a long format, e.g. \"Pacific Standard Time\" or\n * \"Singapore Standard Time\".\n *\n * It is possible to specify the format as the third argument using one of the following options\n *\n * - \"short\": e.g. \"EDT\" or \"GMT+8\".\n * - \"long\": e.g. \"Eastern Daylight Time\".\n * - \"shortGeneric\": e.g. \"ET\" or \"Singapore Time\".\n * - \"longGeneric\": e.g. \"Eastern Time\" or \"Singapore Standard Time\".\n *\n * These options correspond to TR35 tokens `z..zzz`, `zzzz`, `v`, and `vvvv` respectively: https://www.unicode.org/reports/tr35/tr35-dates.html#dfst-zone\n *\n * @param timeZone - Time zone name (IANA or UTC offset)\n * @param date - Date object to get the time zone name for\n * @param format - Optional format of the time zone name. Defaults to \"long\". Can be \"short\", \"long\", \"shortGeneric\", or \"longGeneric\".\n *\n * @returns Time zone name (e.g. \"Singapore Standard Time\")\n */\nexport function tzName(timeZone, date, format = \"long\") {\n return new Intl.DateTimeFormat(\"en-US\", {\n // Enforces engine to render the time. Without the option JavaScriptCore omits it.\n hour: \"numeric\",\n timeZone: timeZone,\n timeZoneName: format\n }).format(date).split(/\\s/g) // Format.JS uses non-breaking spaces\n .slice(2) // Skip the hour and AM/PM parts\n .join(\" \");\n}","const offsetFormatCache = {};\nconst offsetCache = {};\n\n/**\n * The function extracts UTC offset in minutes from the given date in specified\n * time zone.\n *\n * Unlike `Date.prototype.getTimezoneOffset`, this function returns the value\n * mirrored to the sign of the offset in the time zone. For Asia/Singapore\n * (UTC+8), `tzOffset` returns 480, while `getTimezoneOffset` returns -480.\n *\n * @param timeZone - Time zone name (IANA or UTC offset)\n * @param date - Date to check the offset for\n *\n * @returns UTC offset in minutes\n */\nexport function tzOffset(timeZone, date) {\n try {\n const format = offsetFormatCache[timeZone] ||= new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n timeZoneName: \"longOffset\"\n }).format;\n const offsetStr = format(date).split(\"GMT\")[1];\n if (offsetStr in offsetCache) return offsetCache[offsetStr];\n return calcOffset(offsetStr, offsetStr.split(\":\"));\n } catch {\n // Fallback to manual parsing if the runtime doesn't support ±HH:MM/±HHMM/±HH\n // See: https://github.com/nodejs/node/issues/53419\n if (timeZone in offsetCache) return offsetCache[timeZone];\n const captures = timeZone?.match(offsetRe);\n if (captures) return calcOffset(timeZone, captures.slice(1));\n return NaN;\n }\n}\nconst offsetRe = /([+-]\\d\\d):?(\\d\\d)?/;\nfunction calcOffset(cacheStr, values) {\n const hours = +(values[0] || 0);\n const minutes = +(values[1] || 0);\n // Convert seconds to minutes by dividing by 60 to keep the function return in minutes.\n const seconds = +(values[2] || 0) / 60;\n return offsetCache[cacheStr] = hours * 60 + minutes > 0 ? hours * 60 + minutes + seconds : hours * 60 - minutes - seconds;\n}","import { tzOffset } from \"../tzOffset/index.js\";\nexport class TZDateMini extends Date {\n //#region static\n\n constructor(...args) {\n super();\n if (args.length > 1 && typeof args[args.length - 1] === \"string\") {\n this.timeZone = args.pop();\n }\n this.internal = new Date();\n if (isNaN(tzOffset(this.timeZone, this))) {\n this.setTime(NaN);\n } else {\n if (!args.length) {\n this.setTime(Date.now());\n } else if (typeof args[0] === \"number\" && (args.length === 1 || args.length === 2 && typeof args[1] !== \"number\")) {\n this.setTime(args[0]);\n } else if (typeof args[0] === \"string\") {\n this.setTime(+new Date(args[0]));\n } else if (args[0] instanceof Date) {\n this.setTime(+args[0]);\n } else {\n this.setTime(+new Date(...args));\n adjustToSystemTZ(this, NaN);\n syncToInternal(this);\n }\n }\n }\n static tz(tz, ...args) {\n return args.length ? new TZDateMini(...args, tz) : new TZDateMini(Date.now(), tz);\n }\n\n //#endregion\n\n //#region time zone\n\n withTimeZone(timeZone) {\n return new TZDateMini(+this, timeZone);\n }\n getTimezoneOffset() {\n const offset = -tzOffset(this.timeZone, this);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n return offset > 0 ? Math.floor(offset) : Math.ceil(offset);\n }\n\n //#endregion\n\n //#region time\n\n setTime(time) {\n Date.prototype.setTime.apply(this, arguments);\n syncToInternal(this);\n return +this;\n }\n\n //#endregion\n\n //#region date-fns integration\n\n [Symbol.for(\"constructDateFrom\")](date) {\n return new TZDateMini(+new Date(date), this.timeZone);\n }\n\n //#endregion\n}\n\n// Assign getters and setters\nconst re = /^(get|set)(?!UTC)/;\nObject.getOwnPropertyNames(Date.prototype).forEach(method => {\n if (!re.test(method)) return;\n const utcMethod = method.replace(re, \"$1UTC\");\n // Filter out methods without UTC counterparts\n if (!TZDateMini.prototype[utcMethod]) return;\n if (method.startsWith(\"get\")) {\n // Delegate to internal date's UTC method\n TZDateMini.prototype[method] = function () {\n return this.internal[utcMethod]();\n };\n } else {\n // Assign regular setter\n TZDateMini.prototype[method] = function () {\n Date.prototype[utcMethod].apply(this.internal, arguments);\n syncFromInternal(this);\n return +this;\n };\n\n // Assign UTC setter\n TZDateMini.prototype[utcMethod] = function () {\n Date.prototype[utcMethod].apply(this, arguments);\n syncToInternal(this);\n return +this;\n };\n }\n});\n\n/**\n * Function syncs time to internal date, applying the time zone offset.\n *\n * @param {Date} date - Date to sync\n */\nfunction syncToInternal(date) {\n date.internal.setTime(+date);\n date.internal.setUTCSeconds(date.internal.getUTCSeconds() - Math.round(-tzOffset(date.timeZone, date) * 60));\n}\n\n/**\n * Function syncs the internal date UTC values to the date. It allows to get\n * accurate timestamp value.\n *\n * @param {Date} date - The date to sync\n */\nfunction syncFromInternal(date) {\n // First we transpose the internal values\n Date.prototype.setFullYear.call(date, date.internal.getUTCFullYear(), date.internal.getUTCMonth(), date.internal.getUTCDate());\n Date.prototype.setHours.call(date, date.internal.getUTCHours(), date.internal.getUTCMinutes(), date.internal.getUTCSeconds(), date.internal.getUTCMilliseconds());\n\n // Now we have to adjust the date to the system time zone\n adjustToSystemTZ(date);\n}\n\n/**\n * Function adjusts the date to the system time zone. It uses the time zone\n * differences to calculate the offset and adjust the date.\n *\n * @param {Date} date - Date to adjust\n */\nfunction adjustToSystemTZ(date) {\n // Save the time zone offset before all the adjustments\n const baseOffset = tzOffset(date.timeZone, date);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n const offset = baseOffset > 0 ? Math.floor(baseOffset) : Math.ceil(baseOffset);\n //#region System DST adjustment\n\n // The biggest problem with using the system time zone is that when we create\n // a date from internal values stored in UTC, the system time zone might end\n // up on the DST hour:\n //\n // $ TZ=America/New_York node\n // > new Date(2020, 2, 8, 1).toString()\n // 'Sun Mar 08 2020 01:00:00 GMT-0500 (Eastern Standard Time)'\n // > new Date(2020, 2, 8, 2).toString()\n // 'Sun Mar 08 2020 03:00:00 GMT-0400 (Eastern Daylight Time)'\n // > new Date(2020, 2, 8, 3).toString()\n // 'Sun Mar 08 2020 03:00:00 GMT-0400 (Eastern Daylight Time)'\n // > new Date(2020, 2, 8, 4).toString()\n // 'Sun Mar 08 2020 04:00:00 GMT-0400 (Eastern Daylight Time)'\n //\n // Here we get the same hour for both 2 and 3, because the system time zone\n // has DST beginning at 8 March 2020, 2 a.m. and jumps to 3 a.m. So we have\n // to adjust the internal date to reflect that.\n //\n // However we want to adjust only if that's the DST hour the change happenes,\n // not the hour where DST moves to.\n\n // We calculate the previous hour to see if the time zone offset has changed\n // and we have landed on the DST hour.\n const prevHour = new Date(+date);\n // We use UTC methods here as we don't want to land on the same hour again\n // in case of DST.\n prevHour.setUTCHours(prevHour.getUTCHours() - 1);\n\n // Calculate if we are on the system DST hour.\n const systemOffset = -new Date(+date).getTimezoneOffset();\n const prevHourSystemOffset = -new Date(+prevHour).getTimezoneOffset();\n const systemDSTChange = systemOffset - prevHourSystemOffset;\n // Detect the DST shift. System DST change will occur both on\n const dstShift = Date.prototype.getHours.apply(date) !== date.internal.getUTCHours();\n\n // Move the internal date when we are on the system DST hour.\n if (systemDSTChange && dstShift) date.internal.setUTCMinutes(date.internal.getUTCMinutes() + systemDSTChange);\n\n //#endregion\n\n //#region System diff adjustment\n\n // Now we need to adjust the date, since we just applied internal values.\n // We need to calculate the difference between the system and date time zones\n // and apply it to the date.\n\n const offsetDiff = systemOffset - offset;\n if (offsetDiff) Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + offsetDiff);\n\n //#endregion\n\n //#region Seconds System diff adjustment\n\n const systemDate = new Date(+date);\n // Set the UTC seconds to 0 to isolate the timezone offset in seconds.\n systemDate.setUTCSeconds(0);\n // For negative systemOffset, invert the seconds.\n const systemSecondsOffset = systemOffset > 0 ? systemDate.getSeconds() : (systemDate.getSeconds() - 60) % 60;\n\n // Calculate the seconds offset based on the timezone offset.\n const secondsOffset = Math.round(-(tzOffset(date.timeZone, date) * 60)) % 60;\n if (secondsOffset || systemSecondsOffset) {\n date.internal.setUTCSeconds(date.internal.getUTCSeconds() + secondsOffset);\n Date.prototype.setUTCSeconds.call(date, Date.prototype.getUTCSeconds.call(date) + secondsOffset + systemSecondsOffset);\n }\n\n //#endregion\n\n //#region Post-adjustment DST fix\n\n const postBaseOffset = tzOffset(date.timeZone, date);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n const postOffset = postBaseOffset > 0 ? Math.floor(postBaseOffset) : Math.ceil(postBaseOffset);\n const postSystemOffset = -new Date(+date).getTimezoneOffset();\n const postOffsetDiff = postSystemOffset - postOffset;\n const offsetChanged = postOffset !== offset;\n const postDiff = postOffsetDiff - offsetDiff;\n if (offsetChanged && postDiff) {\n Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + postDiff);\n\n // Now we need to check if got offset change during the post-adjustment.\n // If so, we also need both dates to reflect that.\n\n const newBaseOffset = tzOffset(date.timeZone, date);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n const newOffset = newBaseOffset > 0 ? Math.floor(newBaseOffset) : Math.ceil(newBaseOffset);\n const offsetChange = postOffset - newOffset;\n if (offsetChange) {\n date.internal.setUTCMinutes(date.internal.getUTCMinutes() + offsetChange);\n Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + offsetChange);\n }\n }\n\n //#endregion\n}","import { tzName } from \"../tzName/index.js\";\nimport { TZDateMini } from \"./mini.js\";\nexport class TZDate extends TZDateMini {\n //#region static\n\n static tz(tz, ...args) {\n return args.length ? new TZDate(...args, tz) : new TZDate(Date.now(), tz);\n }\n\n //#endregion\n\n //#region representation\n\n toISOString() {\n const [sign, hours, minutes] = this.tzComponents();\n const tz = `${sign}${hours}:${minutes}`;\n return this.internal.toISOString().slice(0, -1) + tz;\n }\n toString() {\n // \"Tue Aug 13 2024 07:50:19 GMT+0800 (Singapore Standard Time)\";\n return `${this.toDateString()} ${this.toTimeString()}`;\n }\n toDateString() {\n // toUTCString returns RFC 7231 (\"Mon, 12 Aug 2024 23:36:08 GMT\")\n const [day, date, month, year] = this.internal.toUTCString().split(\" \");\n // \"Tue Aug 13 2024\"\n return `${day?.slice(0, -1) /* Remove \",\" */} ${month} ${date} ${year}`;\n }\n toTimeString() {\n // toUTCString returns RFC 7231 (\"Mon, 12 Aug 2024 23:36:08 GMT\")\n const time = this.internal.toUTCString().split(\" \")[4];\n const [sign, hours, minutes] = this.tzComponents();\n // \"07:42:23 GMT+0800 (Singapore Standard Time)\"\n return `${time} GMT${sign}${hours}${minutes} (${tzName(this.timeZone, this)})`;\n }\n toLocaleString(locales, options) {\n return Date.prototype.toLocaleString.call(this, locales, {\n ...options,\n timeZone: options?.timeZone || this.timeZone\n });\n }\n toLocaleDateString(locales, options) {\n return Date.prototype.toLocaleDateString.call(this, locales, {\n ...options,\n timeZone: options?.timeZone || this.timeZone\n });\n }\n toLocaleTimeString(locales, options) {\n return Date.prototype.toLocaleTimeString.call(this, locales, {\n ...options,\n timeZone: options?.timeZone || this.timeZone\n });\n }\n\n //#endregion\n\n //#region private\n\n tzComponents() {\n const offset = this.getTimezoneOffset();\n const sign = offset > 0 ? \"-\" : \"+\";\n const hours = String(Math.floor(Math.abs(offset) / 60)).padStart(2, \"0\");\n const minutes = String(Math.abs(offset) % 60).padStart(2, \"0\");\n return [sign, hours, minutes];\n }\n\n //#endregion\n\n withTimeZone(timeZone) {\n return new TZDate(+this, timeZone);\n }\n\n //#region date-fns integration\n\n [Symbol.for(\"constructDateFrom\")](date) {\n return new TZDate(+new Date(date), this.timeZone);\n }\n\n //#endregion\n}","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addDays} function options.\n */\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n * @param options - An object with options\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nexport function addDays(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n\n // If 0 days, no-op to avoid changing times in the hour before end of DST\n if (!amount) return _date;\n\n _date.setDate(_date.getDate() + amount);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMonths} function options.\n */\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n * @param options - The options object\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n if (!amount) {\n // If 0 months, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n const dayOfMonth = _date.getDate();\n\n // The JS Date object supports date math by accepting out-of-bounds values for\n // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n // new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we\n // want except that dates will wrap around the end of a month, meaning that\n // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n // we'll default to the end of the desired month by adding 1 to the desired\n // month and using a date of 0 to back up one day to the end of the desired\n // month.\n const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());\n endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n const daysInMonth = endOfDesiredMonth.getDate();\n if (dayOfMonth >= daysInMonth) {\n // If we're already at the end of the month, then this is the correct date\n // and we're done.\n return endOfDesiredMonth;\n } else {\n // Otherwise, we now know that setting the original day-of-month value won't\n // cause an overflow, so set the desired day-of-month. Note that we can't\n // just set the date of `endOfDesiredMonth` because that object may have had\n // its time changed in the unusual case where where a DST transition was on\n // the last day of the month and its local time was in the hour skipped or\n // repeated next to a DST transition. So we use `date` instead which is\n // guaranteed to still have the original time.\n _date.setFullYear(\n endOfDesiredMonth.getFullYear(),\n endOfDesiredMonth.getMonth(),\n dayOfMonth,\n );\n return _date;\n }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link addWeeks} function options.\n */\n\n/**\n * @name addWeeks\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of weeks to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be added.\n * @param options - An object with options\n *\n * @returns The new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * const result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nexport function addWeeks(date, amount, options) {\n return addDays(date, amount * 7, options);\n}\n\n// Fallback for modularized imports:\nexport default addWeeks;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addYears} function options.\n */\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n * @param options - The options\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount, options) {\n return addMonths(date, amount * 12, options);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link max} function options.\n */\n\n/**\n * @name max\n * @category Common Helpers\n * @summary Return the latest of the given dates.\n *\n * @description\n * Return the latest of the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dates - The dates to compare\n *\n * @returns The latest of the dates\n *\n * @example\n * // Which of these dates is the latest?\n * const result = max([\n * new Date(1989, 6, 10),\n * new Date(1987, 1, 11),\n * new Date(1995, 6, 2),\n * new Date(1990, 0, 1)\n * ])\n * //=> Sun Jul 02 1995 00:00:00\n */\nexport function max(dates, options) {\n let result;\n let context = options?.in;\n\n dates.forEach((date) => {\n // Use the first date object as the context function\n if (!context && typeof date === \"object\")\n context = constructFrom.bind(null, date);\n\n const date_ = toDate(date, context);\n if (!result || result < date_ || isNaN(+date_)) result = date_;\n });\n\n return constructFrom(context, result || NaN);\n}\n\n// Fallback for modularized imports:\nexport default max;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link min} function options.\n */\n\n/**\n * @name min\n * @category Common Helpers\n * @summary Returns the earliest of the given dates.\n *\n * @description\n * Returns the earliest of the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dates - The dates to compare\n *\n * @returns The earliest of the dates\n *\n * @example\n * // Which of these dates is the earliest?\n * const result = min([\n * new Date(1989, 6, 10),\n * new Date(1987, 1, 11),\n * new Date(1995, 6, 2),\n * new Date(1990, 0, 1)\n * ])\n * //=> Wed Feb 11 1987 00:00:00\n */\nexport function min(dates, options) {\n let result;\n let context = options?.in;\n\n dates.forEach((date) => {\n // Use the first date object as the context function\n if (!context && typeof date === \"object\")\n context = constructFrom.bind(null, date);\n\n const date_ = toDate(date, context);\n if (!result || result > date_ || isNaN(+date_)) result = date_;\n });\n\n return constructFrom(context, result || NaN);\n}\n\n// Fallback for modularized imports:\nexport default min;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link isSameDay} function options.\n */\n\n/**\n * @name isSameDay\n * @category Day Helpers\n * @summary Are the given dates in the same day (and year and month)?\n *\n * @description\n * Are the given dates in the same day (and year and month)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same day (and year and month)\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4, 6, 0), new Date(2014, 8, 4, 18, 0))\n * //=> true\n *\n * @example\n * // Are 4 September and 4 October in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2014, 9, 4))\n * //=> false\n *\n * @example\n * // Are 4 September, 2014 and 4 September, 2015 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2015, 8, 4))\n * //=> false\n */\nexport function isSameDay(laterDate, earlierDate, options) {\n const [dateLeft_, dateRight_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return +startOfDay(dateLeft_) === +startOfDay(dateRight_);\n}\n\n// Fallback for modularized imports:\nexport default isSameDay;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarMonths} function options.\n */\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const yearsDiff = laterDate_.getFullYear() - earlierDate_.getFullYear();\n const monthsDiff = laterDate_.getMonth() - earlierDate_.getMonth();\n\n return yearsDiff * 12 + monthsDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfMonth} function options.\n */\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { normalizeDates } from \"./normalizeDates.js\";\n\nexport function normalizeInterval(context, interval) {\n const [start, end] = normalizeDates(context, interval.start, interval.end);\n return { start, end };\n}\n","import { normalizeInterval } from \"./_lib/normalizeInterval.js\";\nimport { constructFrom } from \"./constructFrom.js\";\n\n/**\n * The {@link eachMonthOfInterval} function options.\n */\n\n/**\n * The {@link eachMonthOfInterval} function result type. It resolves the proper data type.\n */\n\n/**\n * @name eachMonthOfInterval\n * @category Interval Helpers\n * @summary Return the array of months within the specified time interval.\n *\n * @description\n * Return the array of months within the specified time interval.\n *\n * @typeParam IntervalType - Interval type.\n * @typeParam Options - Options type.\n *\n * @param interval - The interval.\n * @param options - An object with options.\n *\n * @returns The array with starts of months from the month of the interval start to the month of the interval end\n *\n * @example\n * // Each month between 6 February 2014 and 10 August 2014:\n * const result = eachMonthOfInterval({\n * start: new Date(2014, 1, 6),\n * end: new Date(2014, 7, 10)\n * })\n * //=> [\n * // Sat Feb 01 2014 00:00:00,\n * // Sat Mar 01 2014 00:00:00,\n * // Tue Apr 01 2014 00:00:00,\n * // Thu May 01 2014 00:00:00,\n * // Sun Jun 01 2014 00:00:00,\n * // Tue Jul 01 2014 00:00:00,\n * // Fri Aug 01 2014 00:00:00\n * // ]\n */\nexport function eachMonthOfInterval(interval, options) {\n const { start, end } = normalizeInterval(options?.in, interval);\n\n let reversed = +start > +end;\n const endTime = reversed ? +start : +end;\n const date = reversed ? end : start;\n date.setHours(0, 0, 0, 0);\n date.setDate(1);\n\n let step = options?.step ?? 1;\n if (!step) return [];\n if (step < 0) {\n step = -step;\n reversed = !reversed;\n }\n\n const dates = [];\n\n while (+date <= endTime) {\n dates.push(constructFrom(start, date));\n date.setMonth(date.getMonth() + step);\n }\n\n return reversed ? dates.reverse() : dates;\n}\n\n// Fallback for modularized imports:\nexport default eachMonthOfInterval;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfMonth} function options.\n */\n\n/**\n * @name startOfMonth\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date. The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments.\n * Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed,\n * or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n _date.setDate(1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfYear} function options.\n */\n\n/**\n * @name endOfYear\n * @category Year Helpers\n * @summary Return the end of a year for the given date.\n *\n * @description\n * Return the end of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The end of a year\n *\n * @example\n * // The end of a year for 2 September 2014 11:55:00:\n * const result = endOfYear(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Wed Dec 31 2014 23:59:59.999\n */\nexport function endOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n _date.setFullYear(year + 1, 0, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","import { normalizeInterval } from \"./_lib/normalizeInterval.js\";\nimport { constructFrom } from \"./constructFrom.js\";\n\n/**\n * The {@link eachYearOfInterval} function options.\n */\n\n/**\n * The {@link eachYearOfInterval} function result type. It resolves the proper data type.\n * It uses the first argument date object type, starting from the date argument,\n * then the start interval date, and finally the end interval date. If\n * a context function is passed, it uses the context function return type.\n */\n\n/**\n * @name eachYearOfInterval\n * @category Interval Helpers\n * @summary Return the array of yearly timestamps within the specified time interval.\n *\n * @description\n * Return the array of yearly timestamps within the specified time interval.\n *\n * @typeParam IntervalType - Interval type.\n * @typeParam Options - Options type.\n *\n * @param interval - The interval.\n * @param options - An object with options.\n *\n * @returns The array with starts of yearly timestamps from the month of the interval start to the month of the interval end\n *\n * @example\n * // Each year between 6 February 2014 and 10 August 2017:\n * const result = eachYearOfInterval({\n * start: new Date(2014, 1, 6),\n * end: new Date(2017, 7, 10)\n * })\n * //=> [\n * // Wed Jan 01 2014 00:00:00,\n * // Thu Jan 01 2015 00:00:00,\n * // Fri Jan 01 2016 00:00:00,\n * // Sun Jan 01 2017 00:00:00\n * // ]\n */\nexport function eachYearOfInterval(interval, options) {\n const { start, end } = normalizeInterval(options?.in, interval);\n\n let reversed = +start > +end;\n const endTime = reversed ? +start : +end;\n const date = reversed ? end : start;\n date.setHours(0, 0, 0, 0);\n date.setMonth(0, 1);\n\n let step = options?.step ?? 1;\n if (!step) return [];\n if (step < 0) {\n step = -step;\n reversed = !reversed;\n }\n\n const dates = [];\n\n while (+date <= endTime) {\n dates.push(constructFrom(start, date));\n date.setFullYear(date.getFullYear() + step);\n }\n\n return reversed ? dates.reverse() : dates;\n}\n\n// Fallback for modularized imports:\nexport default eachYearOfInterval;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfWeek} function options.\n */\n\n/**\n * @name endOfWeek\n * @category Week Helpers\n * @summary Return the end of a week for the given date.\n *\n * @description\n * Return the end of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a week\n *\n * @example\n * // The end of a week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 23:59:59.999\n *\n * @example\n * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n\n _date.setDate(_date.getDate() + diff);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfWeek;\n","import { endOfWeek } from \"./endOfWeek.js\";\n\n/**\n * The {@link endOfISOWeek} function options.\n */\n\n/**\n * @name endOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the end of an ISO week for the given date.\n *\n * @description\n * Return the end of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of an ISO week\n *\n * @example\n * // The end of an ISO week for 2 September 2014 11:55:00:\n * const result = endOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfISOWeek(date, options) {\n return endOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default endOfISOWeek;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDaysInMonth} function options.\n */\n\n/**\n * @name getDaysInMonth\n * @category Month Helpers\n * @summary Get the number of days in a month of the given date.\n *\n * @description\n * Get the number of days in a month of the given date, considering the context if provided.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The number of days in a month\n *\n * @example\n * // How many days are in February 2000?\n * const result = getDaysInMonth(new Date(2000, 1))\n * //=> 29\n */\nexport function getDaysInMonth(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n const monthIndex = _date.getMonth();\n const lastDayOfMonth = constructFrom(_date, 0);\n lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);\n lastDayOfMonth.setHours(0, 0, 0, 0);\n return lastDayOfMonth.getDate();\n}\n\n// Fallback for modularized imports:\nexport default getDaysInMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getMonth} function options.\n */\n\n/**\n * @name getMonth\n * @category Month Helpers\n * @summary Get the month of the given date.\n *\n * @description\n * Get the month of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The month index (0-11)\n *\n * @example\n * // Which month is 29 February 2012?\n * const result = getMonth(new Date(2012, 1, 29))\n * //=> 1\n */\nexport function getMonth(date, options) {\n return toDate(date, options?.in).getMonth();\n}\n\n// Fallback for modularized imports:\nexport default getMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getYear} function options.\n */\n\n/**\n * @name getYear\n * @category Year Helpers\n * @summary Get the year of the given date.\n *\n * @description\n * Get the year of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The year\n *\n * @example\n * // Which year is 2 July 2014?\n * const result = getYear(new Date(2014, 6, 2))\n * //=> 2014\n */\nexport function getYear(date, options) {\n return toDate(date, options?.in).getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default getYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isAfter\n * @category Common Helpers\n * @summary Is the first date after the second one?\n *\n * @description\n * Is the first date after the second one?\n *\n * @param date - The date that should be after the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is after the second date\n *\n * @example\n * // Is 10 July 1989 after 11 February 1987?\n * const result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> true\n */\nexport function isAfter(date, dateToCompare) {\n return +toDate(date) > +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isAfter;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isBefore\n * @category Common Helpers\n * @summary Is the first date before the second one?\n *\n * @description\n * Is the first date before the second one?\n *\n * @param date - The date that should be before the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is before the second date\n *\n * @example\n * // Is 10 July 1989 before 11 February 1987?\n * const result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> false\n */\nexport function isBefore(date, dateToCompare) {\n return +toDate(date) < +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isBefore;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link isSameMonth} function options.\n */\n\n/**\n * @name isSameMonth\n * @category Month Helpers\n * @summary Are the given dates in the same month (and year)?\n *\n * @description\n * Are the given dates in the same month (and year)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same month (and year)\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n *\n * @example\n * // Are 2 September 2014 and 25 September 2015 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2015, 8, 25))\n * //=> false\n */\nexport function isSameMonth(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return (\n laterDate_.getFullYear() === earlierDate_.getFullYear() &&\n laterDate_.getMonth() === earlierDate_.getMonth()\n );\n}\n\n// Fallback for modularized imports:\nexport default isSameMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link isSameYear} function options.\n */\n\n/**\n * @name isSameYear\n * @category Year Helpers\n * @summary Are the given dates in the same year?\n *\n * @description\n * Are the given dates in the same year?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same year\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same year?\n * const result = isSameYear(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n */\nexport function isSameYear(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return laterDate_.getFullYear() === earlierDate_.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default isSameYear;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getDaysInMonth } from \"./getDaysInMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setMonth} function options.\n */\n\n/**\n * @name setMonth\n * @category Month Helpers\n * @summary Set the month to the given date.\n *\n * @description\n * Set the month to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param month - The month index to set (0-11)\n * @param options - The options\n *\n * @returns The new date with the month set\n *\n * @example\n * // Set February to 1 September 2014:\n * const result = setMonth(new Date(2014, 8, 1), 1)\n * //=> Sat Feb 01 2014 00:00:00\n */\nexport function setMonth(date, month, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n const day = _date.getDate();\n\n const midMonth = constructFrom(options?.in || date, 0);\n midMonth.setFullYear(year, month, 15);\n midMonth.setHours(0, 0, 0, 0);\n const daysInMonth = getDaysInMonth(midMonth);\n\n // Set the earlier date, allows to wrap Jan 31 to Feb 28\n _date.setMonth(month, Math.min(day, daysInMonth));\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default setMonth;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setYear} function options.\n */\n\n/**\n * @name setYear\n * @category Year Helpers\n * @summary Set the year to the given date.\n *\n * @description\n * Set the year to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param year - The year of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the year set\n *\n * @example\n * // Set year 2013 to 1 September 2014:\n * const result = setYear(new Date(2014, 8, 1), 2013)\n * //=> Sun Sep 01 2013 00:00:00\n */\nexport function setYear(date, year, options) {\n const date_ = toDate(date, options?.in);\n\n // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date\n if (isNaN(+date_)) return constructFrom(options?.in || date, NaN);\n\n date_.setFullYear(year);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default setYear;\n","const FIVE_WEEKS = 5;\nconst FOUR_WEEKS = 4;\n/**\n * Returns the number of weeks to display in the broadcast calendar for a given\n * month.\n *\n * The broadcast calendar may have either 4 or 5 weeks in a month, depending on\n * the start and end dates of the broadcast weeks.\n *\n * @since 9.4.0\n * @param month The month for which to calculate the number of weeks.\n * @param dateLib The date library to use for date manipulation.\n * @returns The number of weeks in the broadcast calendar (4 or 5).\n */\nexport function getBroadcastWeeksInMonth(month, dateLib) {\n // Get the first day of the month\n const firstDayOfMonth = dateLib.startOfMonth(month);\n // Get the day of the week for the first day of the month (1-7, where 1 is Monday)\n const firstDayOfWeek = firstDayOfMonth.getDay() > 0 ? firstDayOfMonth.getDay() : 7;\n const broadcastStartDate = dateLib.addDays(month, -firstDayOfWeek + 1);\n const lastDateOfLastWeek = dateLib.addDays(broadcastStartDate, FIVE_WEEKS * 7 - 1);\n const numberOfWeeks = dateLib.getMonth(month) === dateLib.getMonth(lastDateOfLastWeek)\n ? FIVE_WEEKS\n : FOUR_WEEKS;\n return numberOfWeeks;\n}\n","/**\n * Returns the start date of the week in the broadcast calendar.\n *\n * The broadcast week starts on Monday. If the first day of the month is not a\n * Monday, this function calculates the previous Monday as the start of the\n * broadcast week.\n *\n * @since 9.4.0\n * @param date The date for which to calculate the start of the broadcast week.\n * @param dateLib The date library to use for date manipulation.\n * @returns The start date of the broadcast week.\n */\nexport function startOfBroadcastWeek(date, dateLib) {\n const firstOfMonth = dateLib.startOfMonth(date);\n const dayOfWeek = firstOfMonth.getDay();\n if (dayOfWeek === 1) {\n return firstOfMonth;\n }\n else if (dayOfWeek === 0) {\n return dateLib.addDays(firstOfMonth, -1 * 6);\n }\n else {\n return dateLib.addDays(firstOfMonth, -1 * (dayOfWeek - 1));\n }\n}\n","import { getBroadcastWeeksInMonth } from \"./getBroadcastWeeksInMonth.js\";\nimport { startOfBroadcastWeek } from \"./startOfBroadcastWeek.js\";\n/**\n * Returns the end date of the week in the broadcast calendar.\n *\n * The broadcast week ends on the last day of the last broadcast week for the\n * given date.\n *\n * @since 9.4.0\n * @param date The date for which to calculate the end of the broadcast week.\n * @param dateLib The date library to use for date manipulation.\n * @returns The end date of the broadcast week.\n */\nexport function endOfBroadcastWeek(date, dateLib) {\n const startDate = startOfBroadcastWeek(date, dateLib);\n const numberOfWeeks = getBroadcastWeeksInMonth(date, dateLib);\n const endDate = dateLib.addDays(startDate, numberOfWeeks * 7 - 1);\n return endDate;\n}\n","import { format } from \"date-fns\";\nimport { enUS as dateFnsEnUS } from \"date-fns/locale\";\n/** English (United States) locale extended with DayPicker-specific translations. */\nexport const enUS = {\n ...dateFnsEnUS,\n labels: {\n labelDayButton: (date, modifiers, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n let label = formatDate(date, \"PPPP\");\n if (modifiers.today)\n label = `Today, ${label}`;\n if (modifiers.selected)\n label = `${label}, selected`;\n return label;\n },\n labelMonthDropdown: \"Choose the Month\",\n labelNext: \"Go to the Next Month\",\n labelPrevious: \"Go to the Previous Month\",\n labelWeekNumber: (weekNumber) => `Week ${weekNumber}`,\n labelYearDropdown: \"Choose the Year\",\n labelGrid: (date, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n return formatDate(date, \"LLLL yyyy\");\n },\n labelGridcell: (date, modifiers, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n let label = formatDate(date, \"PPPP\");\n if (modifiers?.today) {\n label = `Today, ${label}`;\n }\n return label;\n },\n labelNav: \"Navigation bar\",\n labelWeekNumberHeader: \"Week Number\",\n labelWeekday: (date, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n return formatDate(date, \"cccc\");\n },\n },\n};\n","import { TZDate } from \"@date-fns/tz\";\nimport { addDays, addMonths, addWeeks, addYears, differenceInCalendarDays, differenceInCalendarMonths, eachMonthOfInterval, eachYearOfInterval, endOfISOWeek, endOfMonth, endOfWeek, endOfYear, format, getISOWeek, getMonth, getWeek, getYear, isAfter, isBefore, isDate, isSameDay, isSameMonth, isSameYear, max, min, setMonth, setYear, startOfDay, startOfISOWeek, startOfMonth, startOfWeek, startOfYear, } from \"date-fns\";\nimport { endOfBroadcastWeek } from \"../helpers/endOfBroadcastWeek.js\";\nimport { startOfBroadcastWeek } from \"../helpers/startOfBroadcastWeek.js\";\nimport { enUS } from \"../locale/en-US.js\";\n/**\n * A wrapper class around [date-fns](http://date-fns.org) that provides utility\n * methods for date manipulation and formatting.\n *\n * @since 9.2.0\n * @example\n * const dateLib = new DateLib({ locale: es });\n * const newDate = dateLib.addDays(new Date(), 5);\n */\nexport class DateLib {\n /**\n * Creates an instance of `DateLib`.\n *\n * @param options Configuration options for the date library.\n * @param overrides Custom overrides for the date library functions.\n */\n constructor(options, overrides) {\n /**\n * Reference to the built-in Date constructor.\n *\n * @deprecated Use `newDate()` or `today()`.\n */\n this.Date = Date;\n /**\n * Creates a new `Date` object representing today's date.\n *\n * @since 9.5.0\n * @returns A `Date` object for today's date.\n */\n this.today = () => {\n if (this.overrides?.today) {\n return this.overrides.today();\n }\n if (this.options.timeZone) {\n return TZDate.tz(this.options.timeZone);\n }\n return new this.Date();\n };\n /**\n * Creates a new `Date` object with the specified year, month, and day.\n *\n * @since 9.5.0\n * @param year The year.\n * @param monthIndex The month (0-11).\n * @param date The day of the month.\n * @returns A new `Date` object.\n */\n this.newDate = (year, monthIndex, date) => {\n if (this.overrides?.newDate) {\n return this.overrides.newDate(year, monthIndex, date);\n }\n if (this.options.timeZone) {\n return new TZDate(year, monthIndex, date, this.options.timeZone);\n }\n return new Date(year, monthIndex, date);\n };\n /**\n * Adds the specified number of days to the given date.\n *\n * @param date The date to add days to.\n * @param amount The number of days to add.\n * @returns The new date with the days added.\n */\n this.addDays = (date, amount) => {\n return this.overrides?.addDays\n ? this.overrides.addDays(date, amount)\n : addDays(date, amount);\n };\n /**\n * Adds the specified number of months to the given date.\n *\n * @param date The date to add months to.\n * @param amount The number of months to add.\n * @returns The new date with the months added.\n */\n this.addMonths = (date, amount) => {\n return this.overrides?.addMonths\n ? this.overrides.addMonths(date, amount)\n : addMonths(date, amount);\n };\n /**\n * Adds the specified number of weeks to the given date.\n *\n * @param date The date to add weeks to.\n * @param amount The number of weeks to add.\n * @returns The new date with the weeks added.\n */\n this.addWeeks = (date, amount) => {\n return this.overrides?.addWeeks\n ? this.overrides.addWeeks(date, amount)\n : addWeeks(date, amount);\n };\n /**\n * Adds the specified number of years to the given date.\n *\n * @param date The date to add years to.\n * @param amount The number of years to add.\n * @returns The new date with the years added.\n */\n this.addYears = (date, amount) => {\n return this.overrides?.addYears\n ? this.overrides.addYears(date, amount)\n : addYears(date, amount);\n };\n /**\n * Returns the number of calendar days between the given dates.\n *\n * @param dateLeft The later date.\n * @param dateRight The earlier date.\n * @returns The number of calendar days between the dates.\n */\n this.differenceInCalendarDays = (dateLeft, dateRight) => {\n return this.overrides?.differenceInCalendarDays\n ? this.overrides.differenceInCalendarDays(dateLeft, dateRight)\n : differenceInCalendarDays(dateLeft, dateRight);\n };\n /**\n * Returns the number of calendar months between the given dates.\n *\n * @param dateLeft The later date.\n * @param dateRight The earlier date.\n * @returns The number of calendar months between the dates.\n */\n this.differenceInCalendarMonths = (dateLeft, dateRight) => {\n return this.overrides?.differenceInCalendarMonths\n ? this.overrides.differenceInCalendarMonths(dateLeft, dateRight)\n : differenceInCalendarMonths(dateLeft, dateRight);\n };\n /**\n * Returns the months between the given dates.\n *\n * @param interval The interval to get the months for.\n */\n this.eachMonthOfInterval = (interval) => {\n return this.overrides?.eachMonthOfInterval\n ? this.overrides.eachMonthOfInterval(interval)\n : eachMonthOfInterval(interval);\n };\n /**\n * Returns the years between the given dates.\n *\n * @since 9.11.1\n * @param interval The interval to get the years for.\n * @returns The array of years in the interval.\n */\n this.eachYearOfInterval = (interval) => {\n const years = this.overrides?.eachYearOfInterval\n ? this.overrides.eachYearOfInterval(interval)\n : eachYearOfInterval(interval);\n // Remove duplicates that may happen across DST transitions (e.g., \"America/Sao_Paulo\")\n // See https://github.com/date-fns/tz/issues/72\n const uniqueYears = new Set(years.map((d) => this.getYear(d)));\n if (uniqueYears.size === years.length) {\n // No duplicates, return as is\n return years;\n }\n // Rebuild the array to ensure one date per year\n const yearsArray = [];\n uniqueYears.forEach((y) => {\n yearsArray.push(new Date(y, 0, 1));\n });\n return yearsArray;\n };\n /**\n * Returns the end of the broadcast week for the given date.\n *\n * @param date The original date.\n * @returns The end of the broadcast week.\n */\n this.endOfBroadcastWeek = (date) => {\n return this.overrides?.endOfBroadcastWeek\n ? this.overrides.endOfBroadcastWeek(date)\n : endOfBroadcastWeek(date, this);\n };\n /**\n * Returns the end of the ISO week for the given date.\n *\n * @param date The original date.\n * @returns The end of the ISO week.\n */\n this.endOfISOWeek = (date) => {\n return this.overrides?.endOfISOWeek\n ? this.overrides.endOfISOWeek(date)\n : endOfISOWeek(date);\n };\n /**\n * Returns the end of the month for the given date.\n *\n * @param date The original date.\n * @returns The end of the month.\n */\n this.endOfMonth = (date) => {\n return this.overrides?.endOfMonth\n ? this.overrides.endOfMonth(date)\n : endOfMonth(date);\n };\n /**\n * Returns the end of the week for the given date.\n *\n * @param date The original date.\n * @returns The end of the week.\n */\n this.endOfWeek = (date, options) => {\n return this.overrides?.endOfWeek\n ? this.overrides.endOfWeek(date, options)\n : endOfWeek(date, this.options);\n };\n /**\n * Returns the end of the year for the given date.\n *\n * @param date The original date.\n * @returns The end of the year.\n */\n this.endOfYear = (date) => {\n return this.overrides?.endOfYear\n ? this.overrides.endOfYear(date)\n : endOfYear(date);\n };\n /**\n * Formats the given date using the specified format string.\n *\n * @param date The date to format.\n * @param formatStr The format string.\n * @returns The formatted date string.\n */\n this.format = (date, formatStr, _options) => {\n const formatted = this.overrides?.format\n ? this.overrides.format(date, formatStr, this.options)\n : format(date, formatStr, this.options);\n if (this.options.numerals && this.options.numerals !== \"latn\") {\n return this.replaceDigits(formatted);\n }\n return formatted;\n };\n /**\n * Returns the ISO week number for the given date.\n *\n * @param date The date to get the ISO week number for.\n * @returns The ISO week number.\n */\n this.getISOWeek = (date) => {\n return this.overrides?.getISOWeek\n ? this.overrides.getISOWeek(date)\n : getISOWeek(date);\n };\n /**\n * Returns the month of the given date.\n *\n * @param date The date to get the month for.\n * @returns The month.\n */\n this.getMonth = (date, _options) => {\n return this.overrides?.getMonth\n ? this.overrides.getMonth(date, this.options)\n : getMonth(date, this.options);\n };\n /**\n * Returns the year of the given date.\n *\n * @param date The date to get the year for.\n * @returns The year.\n */\n this.getYear = (date, _options) => {\n return this.overrides?.getYear\n ? this.overrides.getYear(date, this.options)\n : getYear(date, this.options);\n };\n /**\n * Returns the local week number for the given date.\n *\n * @param date The date to get the week number for.\n * @returns The week number.\n */\n this.getWeek = (date, _options) => {\n return this.overrides?.getWeek\n ? this.overrides.getWeek(date, this.options)\n : getWeek(date, this.options);\n };\n /**\n * Checks if the first date is after the second date.\n *\n * @param date The date to compare.\n * @param dateToCompare The date to compare with.\n * @returns True if the first date is after the second date.\n */\n this.isAfter = (date, dateToCompare) => {\n return this.overrides?.isAfter\n ? this.overrides.isAfter(date, dateToCompare)\n : isAfter(date, dateToCompare);\n };\n /**\n * Checks if the first date is before the second date.\n *\n * @param date The date to compare.\n * @param dateToCompare The date to compare with.\n * @returns True if the first date is before the second date.\n */\n this.isBefore = (date, dateToCompare) => {\n return this.overrides?.isBefore\n ? this.overrides.isBefore(date, dateToCompare)\n : isBefore(date, dateToCompare);\n };\n /**\n * Checks if the given value is a Date object.\n *\n * @param value The value to check.\n * @returns True if the value is a Date object.\n */\n this.isDate = (value) => {\n return this.overrides?.isDate\n ? this.overrides.isDate(value)\n : isDate(value);\n };\n /**\n * Checks if the given dates are on the same day.\n *\n * @param dateLeft The first date to compare.\n * @param dateRight The second date to compare.\n * @returns True if the dates are on the same day.\n */\n this.isSameDay = (dateLeft, dateRight) => {\n return this.overrides?.isSameDay\n ? this.overrides.isSameDay(dateLeft, dateRight)\n : isSameDay(dateLeft, dateRight);\n };\n /**\n * Checks if the given dates are in the same month.\n *\n * @param dateLeft The first date to compare.\n * @param dateRight The second date to compare.\n * @returns True if the dates are in the same month.\n */\n this.isSameMonth = (dateLeft, dateRight) => {\n return this.overrides?.isSameMonth\n ? this.overrides.isSameMonth(dateLeft, dateRight)\n : isSameMonth(dateLeft, dateRight);\n };\n /**\n * Checks if the given dates are in the same year.\n *\n * @param dateLeft The first date to compare.\n * @param dateRight The second date to compare.\n * @returns True if the dates are in the same year.\n */\n this.isSameYear = (dateLeft, dateRight) => {\n return this.overrides?.isSameYear\n ? this.overrides.isSameYear(dateLeft, dateRight)\n : isSameYear(dateLeft, dateRight);\n };\n /**\n * Returns the latest date in the given array of dates.\n *\n * @param dates The array of dates to compare.\n * @returns The latest date.\n */\n this.max = (dates) => {\n return this.overrides?.max ? this.overrides.max(dates) : max(dates);\n };\n /**\n * Returns the earliest date in the given array of dates.\n *\n * @param dates The array of dates to compare.\n * @returns The earliest date.\n */\n this.min = (dates) => {\n return this.overrides?.min ? this.overrides.min(dates) : min(dates);\n };\n /**\n * Sets the month of the given date.\n *\n * @param date The date to set the month on.\n * @param month The month to set (0-11).\n * @returns The new date with the month set.\n */\n this.setMonth = (date, month) => {\n return this.overrides?.setMonth\n ? this.overrides.setMonth(date, month)\n : setMonth(date, month);\n };\n /**\n * Sets the year of the given date.\n *\n * @param date The date to set the year on.\n * @param year The year to set.\n * @returns The new date with the year set.\n */\n this.setYear = (date, year) => {\n return this.overrides?.setYear\n ? this.overrides.setYear(date, year)\n : setYear(date, year);\n };\n /**\n * Returns the start of the broadcast week for the given date.\n *\n * @param date The original date.\n * @returns The start of the broadcast week.\n */\n this.startOfBroadcastWeek = (date, _dateLib) => {\n return this.overrides?.startOfBroadcastWeek\n ? this.overrides.startOfBroadcastWeek(date, this)\n : startOfBroadcastWeek(date, this);\n };\n /**\n * Returns the start of the day for the given date.\n *\n * @param date The original date.\n * @returns The start of the day.\n */\n this.startOfDay = (date) => {\n return this.overrides?.startOfDay\n ? this.overrides.startOfDay(date)\n : startOfDay(date);\n };\n /**\n * Returns the start of the ISO week for the given date.\n *\n * @param date The original date.\n * @returns The start of the ISO week.\n */\n this.startOfISOWeek = (date) => {\n return this.overrides?.startOfISOWeek\n ? this.overrides.startOfISOWeek(date)\n : startOfISOWeek(date);\n };\n /**\n * Returns the start of the month for the given date.\n *\n * @param date The original date.\n * @returns The start of the month.\n */\n this.startOfMonth = (date) => {\n return this.overrides?.startOfMonth\n ? this.overrides.startOfMonth(date)\n : startOfMonth(date);\n };\n /**\n * Returns the start of the week for the given date.\n *\n * @param date The original date.\n * @returns The start of the week.\n */\n this.startOfWeek = (date, _options) => {\n return this.overrides?.startOfWeek\n ? this.overrides.startOfWeek(date, this.options)\n : startOfWeek(date, this.options);\n };\n /**\n * Returns the start of the year for the given date.\n *\n * @param date The original date.\n * @returns The start of the year.\n */\n this.startOfYear = (date) => {\n return this.overrides?.startOfYear\n ? this.overrides.startOfYear(date)\n : startOfYear(date);\n };\n this.options = { locale: enUS, ...options };\n this.overrides = overrides;\n }\n /**\n * Generates a mapping of Arabic digits (0-9) to the target numbering system\n * digits.\n *\n * @since 9.5.0\n * @returns A record mapping Arabic digits to the target numerals.\n */\n getDigitMap() {\n const { numerals = \"latn\" } = this.options;\n // Use Intl.NumberFormat to create a formatter with the specified numbering system\n const formatter = new Intl.NumberFormat(\"en-US\", {\n numberingSystem: numerals,\n });\n // Map Arabic digits (0-9) to the target numerals\n const digitMap = {};\n for (let i = 0; i < 10; i++) {\n digitMap[i.toString()] = formatter.format(i);\n }\n return digitMap;\n }\n /**\n * Replaces Arabic digits in a string with the target numbering system digits.\n *\n * @since 9.5.0\n * @param input The string containing Arabic digits.\n * @returns The string with digits replaced.\n */\n replaceDigits(input) {\n const digitMap = this.getDigitMap();\n return input.replace(/\\d/g, (digit) => digitMap[digit] || digit);\n }\n /**\n * Formats a number using the configured numbering system.\n *\n * @since 9.5.0\n * @param value The number to format.\n * @returns The formatted number as a string.\n */\n formatNumber(value) {\n return this.replaceDigits(value.toString());\n }\n /**\n * Returns the preferred ordering for month and year labels for the current\n * locale.\n */\n getMonthYearOrder() {\n const code = this.options.locale?.code;\n if (!code) {\n return \"month-first\";\n }\n return DateLib.yearFirstLocales.has(code) ? \"year-first\" : \"month-first\";\n }\n /**\n * Formats the month/year pair respecting locale conventions.\n *\n * @since 9.11.0\n */\n formatMonthYear(date) {\n const { locale, timeZone, numerals } = this.options;\n const localeCode = locale?.code;\n if (localeCode && DateLib.yearFirstLocales.has(localeCode)) {\n try {\n const intl = new Intl.DateTimeFormat(localeCode, {\n month: \"long\",\n year: \"numeric\",\n timeZone,\n numberingSystem: numerals,\n });\n const formatted = intl.format(date);\n return formatted;\n }\n catch {\n // Fallback to date-fns formatting below.\n }\n }\n const pattern = this.getMonthYearOrder() === \"year-first\" ? \"y LLLL\" : \"LLLL y\";\n return this.format(date, pattern);\n }\n}\nDateLib.yearFirstLocales = new Set([\n \"eu\",\n \"hu\",\n \"ja\",\n \"ja-Hira\",\n \"ja-JP\",\n \"ko\",\n \"ko-KR\",\n \"lt\",\n \"lt-LT\",\n \"lv\",\n \"lv-LV\",\n \"mn\",\n \"mn-MN\",\n \"zh\",\n \"zh-CN\",\n \"zh-HK\",\n \"zh-TW\",\n]);\n/** The default locale (English). */\nexport { enUS as defaultLocale } from \"../locale/en-US.js\";\n/**\n * The default date library with English locale.\n *\n * @since 9.2.0\n */\nexport const defaultDateLib = new DateLib();\n/**\n * @ignore\n * @deprecated Use `defaultDateLib`.\n */\nexport const dateLib = defaultDateLib;\n","import { ko as dateFnsKo } from \"date-fns/locale\";\nimport { DateLib } from \"../classes/DateLib.js\";\n/** Korean locale extended with DayPicker-specific translations. */\nexport const ko = {\n ...dateFnsKo,\n labels: {\n labelDayButton: (date, modifiers, options, dateLib) => {\n const lib = dateLib ?? new DateLib(options);\n let label = lib.format(date, \"PPPP\");\n if (modifiers.today)\n label = `오늘, ${label}`;\n if (modifiers.selected)\n label = `${label}, 선택됨`;\n return label;\n },\n labelMonthDropdown: \"월 선택\",\n labelNext: \"다음 달로 이동\",\n labelPrevious: \"이전 달로 이동\",\n labelWeekNumber: (weekNumber) => `주 ${weekNumber}`,\n labelYearDropdown: \"연도 선택\",\n labelGrid: (date, options, dateLib) => (dateLib ?? new DateLib(options)).formatMonthYear(date),\n labelGridcell: (date, modifiers, options, dateLib) => {\n const lib = dateLib ?? new DateLib(options);\n let label = lib.format(date, \"PPPP\");\n if (modifiers?.today) {\n label = `오늘, ${label}`;\n }\n return label;\n },\n labelNav: \"탐색 모음\",\n labelWeekNumberHeader: \"주 번호\",\n labelWeekday: (date, options, dateLib) => (dateLib ?? new DateLib(options)).format(date, \"cccc\"),\n },\n};\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ko } from \"react-day-picker/locale\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport { cn } from \"@/utils/cn\";\nimport \"react-day-picker/style.css\";\n\nexport interface DatePickerProps {\n value?: string;\n onChange?: (date: string) => void;\n label?: string;\n placeholder?: string;\n min?: string;\n max?: string;\n disabled?: boolean;\n error?: boolean;\n errorMessage?: string;\n helperText?: string;\n className?: string;\n}\n\n/**\n * 사용자가 달력 인터페이스를 통해 특정 날짜를 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link DatePicker}는 직접적인 텍스트 입력 대신 시각적인 달력을 제공하여\n * 날짜 형식의 오류를 방지하고 사용자 편의성을 높입니다.\n *\n * `react-day-picker`와 `dayjs`를 기반으로 구현되었으며, 한국어 로케일을 기본으로 지원합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **특정일 선택**: 생년월일, 예약일, 마감일 등 단일 날짜를 입력받아야 할 때\n * - **제한된 범위 내 선택**: 과거 날짜만 선택 가능하거나, 특정 기간 내에서만 선택해야 할 때\n * - **정확한 날짜 입력**: 텍스트 입력 시 발생할 수 있는 포맷 오류를 방지하고 싶을 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **기간 선택**: 시작일과 종료일을 함께 선택해야 하는 경우 `DateRangePicker`를 사용하세요.\n * - **대략적인 시간/날짜**: '방금 전', '1주일 내' 등 상대적인 시간 선택이 필요한 경우 `Dropdown`이나 `RadioButton`이 더 적절할 수 있습니다.\n * - **빠른 연도 이동**: 수십 년 전의 날짜를 선택해야 하는 경우(예: 생년월일) 달력보다는 직접 입력이나 연도 선택 기능이 포함된 별도 UI를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Popover 기반**: 클릭 시 입력창 아래에 달력 팝오버가 나타나며, 화면 공간을 효율적으로 사용합니다.\n * - **Responsive**: 팝오버는 화면 경계 내에서 최적의 위치를 자동으로 찾아 표시됩니다.\n * - **Full Width**: `className`을 통해 부모 요소의 너비에 맞게 조절할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 Placeholder**: \"YYYY-MM-DD\"와 같이 기대하는 날짜 형식을 명시하세요.\n * - **최소/최대 날짜 설정**: 비즈니스 로직에 따라 `min`, `max` 속성을 사용하여 유효하지 않은 날짜 선택을 방지하세요.\n * - **레이블 및 헬퍼 텍스트**: 입력 항목의 용도를 명확히 하고, 필요한 경우 보충 설명을 제공하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **Read-only 입력**: 사용자가 직접 타이핑하여 입력하는 기능은 현재 지원하지 않으므로, 반드시 달력을 통해 선택하도록 안내하세요.\n * - **복잡한 로직**: 너무 많은 날짜 제한 로직은 사용자에게 혼란을 줄 수 있습니다. 필요한 경우 에러 메시지로 명확히 안내하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Navigation**: 팝오버는 키보드로 열고 닫을 수 있으며, `Esc` 키로 취소할 수 있습니다.\n * - **Focus Trap**: 달력이 열려 있는 동안 포커스가 달력 내부에 머무르도록 관리됩니다.\n * - **Aria Labels**: 달력의 각 요소에는 스크린 리더를 위한 적절한 레이블이 포함되어 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 날짜 선택 예시:\n *\n * ```tsx\n * const [date, setDate] = useState(\"\");\n *\n * <DatePicker\n * label=\"방문 예약일\"\n * value={date}\n * onChange={setDate}\n * placeholder=\"예약 날짜를 선택하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 날짜 범위 제한 및 에러 상태:\n *\n * ```tsx\n * <DatePicker\n * label=\"종료일\"\n * min=\"2024-01-01\"\n * max=\"2024-12-31\"\n * error={true}\n * errorMessage=\"2024년 내의 날짜만 선택 가능합니다\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link DateRangePicker}, 기간을 선택해야 하는 경우\n * - {@link TextInput}, 단순한 텍스트 입력이 필요한 경우\n * - {@link Popover}, 일반적인 팝오버 컴포넌트\n */\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n label,\n placeholder = \"YYYY-MM-DD\",\n min,\n max,\n disabled = false,\n error = false,\n errorMessage,\n helperText,\n className,\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [internalDate, setInternalDate] = useState<Dayjs | undefined>(\n value ? dayjs(value) : undefined,\n );\n\n useEffect(() => {\n if (value) {\n setInternalDate(dayjs(value));\n } else {\n setInternalDate(undefined);\n }\n }, [value]);\n\n const selected = useMemo(() => {\n return internalDate?.toDate();\n }, [internalDate]);\n\n const handleDayClick = (date: Date | undefined) => {\n if (!date) {\n setInternalDate(undefined);\n return;\n }\n\n const selectedDate = dayjs(date);\n setInternalDate(selectedDate);\n };\n\n const handleApply = () => {\n if (internalDate) {\n onChange?.(internalDate.format(\"YYYY-MM-DD\"));\n setIsOpen(false);\n }\n };\n\n const handleCancel = () => {\n setInternalDate(value ? dayjs(value) : undefined);\n setIsOpen(false);\n };\n\n const displayValue = useMemo(() => {\n if (!value) return \"\";\n return dayjs(value).format(\"YYYY-MM-DD\");\n }, [value]);\n\n const disabledDays = useMemo(() => {\n const disabled: any[] = [];\n if (min) {\n disabled.push({ before: dayjs(min).toDate() });\n }\n if (max) {\n disabled.push({ after: dayjs(max).toDate() });\n }\n return disabled.length > 0 ? disabled : undefined;\n }, [min, max]);\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)}>\n {label && (\n <label className=\"text-sm font-medium text-gray-700\">{label}</label>\n )}\n <PopoverPrimitive.Root\n open={isOpen && !disabled}\n onOpenChange={setIsOpen}\n >\n <PopoverPrimitive.Trigger asChild>\n <div className=\"relative\">\n <input\n type=\"text\"\n readOnly\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n \"w-full h-10 px-3 border rounded bg-white text-sm\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"focus:outline-none\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n error ? \"border-red-500\" : \"border-gray-300\",\n disabled &&\n cn(\n \"bg-gray-100 cursor-not-allowed\",\n \"hover:bg-gray-100 hover:border-gray-300\",\n ),\n )}\n />\n </div>\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={5}\n className={cn(\n \"z-50 bg-white rounded-lg shadow-xl p-2\",\n \"border border-gray-200\",\n \"data-[state=open]:animate-in\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"date-picker-calendar\">\n <DayPicker\n mode=\"single\"\n selected={selected}\n onSelect={handleDayClick}\n locale={ko}\n disabled={disabledDays}\n formatters={{\n formatCaption: (date) => {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월`;\n },\n }}\n />\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n \"flex items-end justify-between mt-2 pt-2\",\n \"border-t border-gray-200\",\n )}\n >\n <div className=\"flex flex-col min-h-8\">\n {internalDate ? (\n <span className=\"text-xs text-gray-700\">\n {internalDate.format(\"YYYY-MM-DD\")}\n </span>\n ) : (\n <span className=\"text-xs text-red-500\">\n 날짜를 선택해 주세요.\n </span>\n )}\n </div>\n\n <div className=\"flex gap-2\">\n <button\n onClick={handleCancel}\n className={cn(\n \"w-15 h-8 rounded cursor-pointer\",\n \"text-xs font-medium text-gray-700\",\n \"border border-gray-300 bg-transparent\",\n \"transition-all duration-150\",\n \"active:scale-95\",\n \"hover:bg-gray-50\",\n )}\n >\n 취소\n </button>\n <button\n onClick={handleApply}\n disabled={!internalDate}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-15 h-8 bg-blue-600 rounded\",\n \"text-xs text-white\",\n \"hover:bg-blue-700\",\n \"active:scale-95\",\n \"disabled:bg-gray-300 \",\n \"disabled:cursor-not-allowed\",\n \"disabled:active:scale-100\",\n \"transition-all duration-150\",\n )}\n >\n 적용\n </button>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n\n {/* Helper/Error Text */}\n {(helperText || errorMessage) && (\n <div>\n {error && errorMessage ? (\n <p className=\"text-xs text-red-500\">{errorMessage}</p>\n ) : (\n helperText && (\n <p className=\"text-xs text-gray-500\">{helperText}</p>\n )\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nDatePicker.displayName = \"DatePicker\";\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { DayPicker, DateRange as DayPickerDateRange } from \"react-day-picker\";\nimport { ko } from \"react-day-picker/locale\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport { cn } from \"@/utils/cn\";\nimport \"react-day-picker/style.css\";\n\nexport interface DateRange {\n start: string;\n end: string;\n}\n\nexport interface DateRangePickerProps {\n value?: DateRange;\n onChange?: (range: DateRange) => void;\n startLabel?: string;\n endLabel?: string;\n className?: string;\n}\n\ntype QuickSelectOption = {\n label: string;\n getValue: () => [Dayjs, Dayjs];\n};\n\nconst getQuickSelectOptions = (): QuickSelectOption[] => {\n const now = dayjs();\n\n return [\n {\n label: \"전체\",\n getValue: () => [dayjs(\"1970-01-01\"), dayjs(\"2099-12-31\")],\n },\n {\n label: \"오늘\",\n getValue: () => [now, now],\n },\n {\n label: \"내일\",\n getValue: () => [now.add(1, \"day\"), now.add(1, \"day\")],\n },\n {\n label: \"이번주\",\n getValue: () => [now.startOf(\"week\"), now.endOf(\"week\")],\n },\n {\n label: \"이번달\",\n getValue: () => [now.startOf(\"month\"), now.endOf(\"month\")],\n },\n {\n label: \"7일\",\n getValue: () => [now, now.add(6, \"day\")],\n },\n {\n label: \"30일\",\n getValue: () => [now, now.add(29, \"day\")],\n },\n {\n label: \"다음주\",\n getValue: () => [\n now.add(1, \"week\").startOf(\"week\"),\n now.add(1, \"week\").endOf(\"week\"),\n ],\n },\n {\n label: \"다음달\",\n getValue: () => [\n now.add(1, \"month\").startOf(\"month\"),\n now.add(1, \"month\").endOf(\"month\"),\n ],\n },\n ];\n};\n\n/**\n * 사용자가 특정 기간(시작일과 종료일)을 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link DateRangePicker}는 두 개의 연동된 달력을 통해 기간을 시각적으로 선택할 수 있으며,\n * '오늘', '이번주', '7일' 등 자주 사용되는 기간에 대한 빠른 선택(Quick Select) 기능을 제공합니다.\n *\n * `react-day-picker`와 `dayjs`를 기반으로 구현되었으며, 대규모 데이터 조회나\n * 일정 설정 등 기간 입력이 필요한 서비스에서 주로 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **조회 기간 설정**: 특정 기간 내의 로그, 주문 내역, 통계 데이터 등을 조회할 때\n * - **일정 범위 지정**: 이벤트 진행 기간, 캠페인 유효 기간 등 시작과 끝이 있는 일정을 설정할 때\n * - **상대적 기간 선택**: '최근 7일', '이번 달' 등 현재 시점 기준의 상대적 기간을 빠르게 선택해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **단일 날짜 선택**: 하나의 날짜만 필요한 경우 `DatePicker`를 사용하세요.\n * - **고정된 기간**: '1주일', '1개월' 등 기간이 고정되어 있고 시작일만 선택하면 되는 경우 `DatePicker`와 드롭다운 조합이 더 나을 수 있습니다.\n *\n * ## Layout behavior\n *\n * - **Dual Calendar**: 두 개의 달력이 나란히 표시되어 시작일과 종료일을 한눈에 확인하고 조절할 수 있습니다.\n * - **Side Panels**: 왼쪽 사이드바에 '오늘', '이번주' 등 빠른 선택 버튼이 배치되어 접근성을 높입니다.\n * - **Combined Input**: 두 개의 입력창(시작, 종료)이 하나의 그룹으로 묶여 표시됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 시작/종료 레이블**: \"시작일\", \"종료일\" 또는 \"등록일\", \"수정일\" 등 문맥에 맞는 레이블을 사용하세요.\n * - **기간 확인 피드백**: 선택된 총 일수(예: 7일간)를 하단에 표시하여 사용자가 선택한 범위를 쉽게 인지하게 하세요.\n * - **빠른 선택 활용**: 사용자 조사의 80% 이상이 '최근 7일'이라면 해당 옵션을 눈에 띄게 배치하거나 기본값으로 고려하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 넓은 기본 범위**: 데이터 양이 많을 경우 기본 범위를 너무 넓게 잡으면 성능 문제가 발생할 수 있습니다.\n * - **모바일에서의 레이아웃**: 2개의 달력이 나란히 표시되므로 모바일 환경에서는 화면을 넘칠 수 있습니다. 반응형 대응에 주의하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Management**: `Tab` 키로 시작일/종료일 입력창과 달력 내부 요소를 순차적으로 이동할 수 있습니다.\n * - **Visual Indicators**: 선택된 기간 내의 날짜들은 배경색으로 하이라이트되어 시각적으로 구분됩니다.\n * - **Screen Reader**: 시작일과 종료일의 레이블이 각각 명확히 연결되어 음성으로 안내됩니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 기간 선택 예시:\n *\n * ```tsx\n * const [range, setRange] = useState({ start: \"2024-01-01\", end: \"2024-01-07\" });\n *\n * <DateRangePicker\n * value={range}\n * onChange={setRange}\n * startLabel=\"조회 시작\"\n * endLabel=\"조회 종료\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 빠른 선택 옵션이 포함된 초기 상태:\n *\n * ```tsx\n * // '전체', '오늘', '내일', '이번주', '이번달', '7일', '30일' 등의\n * // 빠른 선택 옵션이 기본적으로 내장되어 있습니다.\n * <DateRangePicker\n * className=\"w-[400px]\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link DatePicker}, 단일 날짜 선택이 필요한 경우\n * - {@link Dropdown}, 기간을 텍스트 기반의 선택지로 제공할 때\n */\nexport const DateRangePicker = React.forwardRef<\n HTMLDivElement,\n DateRangePickerProps\n>(\n (\n {\n value,\n onChange,\n startLabel = \"시작일자\",\n endLabel = \"종료일자\",\n className,\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [internalRange, setInternalRange] = useState<\n [Dayjs | undefined, Dayjs | undefined]\n >([\n value?.start ? dayjs(value.start) : undefined,\n value?.end ? dayjs(value.end) : undefined,\n ]);\n\n useEffect(() => {\n if (value) {\n setInternalRange([\n value.start ? dayjs(value.start) : undefined,\n value.end ? dayjs(value.end) : undefined,\n ]);\n }\n }, [value]);\n\n const [fromDay, toDay] = internalRange;\n\n const selected: DayPickerDateRange | undefined = useMemo(() => {\n if (!fromDay) return undefined;\n return {\n from: fromDay.toDate(),\n to: toDay?.toDate(),\n };\n }, [fromDay, toDay]);\n\n const handleQuickSelect = (option: QuickSelectOption) => {\n const [start, end] = option.getValue();\n setInternalRange([start, end]);\n };\n\n const handleDayClick = (range: DayPickerDateRange | undefined) => {\n if (!range) {\n setInternalRange([undefined, undefined]);\n return;\n }\n\n const from = range.from ? dayjs(range.from) : undefined;\n const to = range.to ? dayjs(range.to) : undefined;\n\n setInternalRange([from, to]);\n };\n\n const handleApply = () => {\n if (fromDay && toDay) {\n onChange?.({\n start: fromDay.format(\"YYYY-MM-DD\"),\n end: toDay.format(\"YYYY-MM-DD\"),\n });\n setIsOpen(false);\n }\n };\n\n const handleCancel = () => {\n setInternalRange([\n value?.start ? dayjs(value.start) : undefined,\n value?.end ? dayjs(value.end) : undefined,\n ]);\n setIsOpen(false);\n };\n\n const numberOfDays = useMemo(() => {\n if (!fromDay || !toDay) return undefined;\n return toDay.diff(fromDay, \"day\") + 1;\n }, [fromDay, toDay]);\n\n const displayValue = useMemo(() => {\n if (!value?.start || !value?.end) {\n return { start: \"\", end: \"\" };\n }\n return {\n start: dayjs(value.start).format(\"YYYY-MM-DD\"),\n end: dayjs(value.end).format(\"YYYY-MM-DD\"),\n };\n }, [value]);\n\n return (\n <PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div ref={ref} className={cn(\"flex items-center gap-0\", className)}>\n <div className=\"relative flex-1\">\n <label\n className={cn(\n \"absolute left-3 top-1/2 -translate-y-1/2\",\n \"text-xs text-gray-500\",\n \"pointer-events-none\",\n )}\n >\n {startLabel}\n </label>\n <input\n type=\"text\"\n readOnly\n value={displayValue.start}\n placeholder=\"YYYY-MM-DD\"\n className={cn(\n \"w-full h-10 pl-[59px] pr-3 bg-white text-sm\",\n \"focus:outline-none\",\n \"border border-gray-300 border-r-0 rounded-l\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n )}\n />\n </div>\n <div className=\"relative flex-1\">\n <label\n className={cn(\n \"absolute left-3 top-1/2 -translate-y-1/2\",\n \"text-xs text-gray-500\",\n \"pointer-events-none\",\n )}\n >\n {endLabel}\n </label>\n <input\n type=\"text\"\n readOnly\n value={displayValue.end}\n placeholder=\"YYYY-MM-DD\"\n className={cn(\n \"w-full h-10 pl-[59px] pr-3 bg-white\",\n \"text-sm\",\n \"border border-gray-300 rounded-r\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"focus:outline-none\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n )}\n />\n </div>\n </div>\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={5}\n className={cn(\n \"z-50 p-2 bg-white rounded-lg\",\n \"border border-gray-200\",\n \"shadow-xl\",\n \"data-[state=open]:animate-in\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"flex gap-2\">\n {/* Quick Select Buttons */}\n <div className=\"flex flex-col border-r border-gray-200 pr-2\">\n {getQuickSelectOptions().map((option) => (\n <button\n key={option.label}\n onClick={() => handleQuickSelect(option)}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-[70px] h-[26px] px-2\",\n \"text-left text-xs text-gray-700\",\n \"bg-white\",\n \"transition-all duration-150\",\n \"hover:bg-blue-50\",\n \"hover:font-medium\",\n \"hover:text-blue-600\",\n )}\n >\n {option.label}\n </button>\n ))}\n </div>\n {/* Calendar */}\n <div className=\"date-range-picker-calendar\">\n <DayPicker\n mode=\"range\"\n selected={selected}\n onSelect={handleDayClick}\n numberOfMonths={2}\n locale={ko}\n formatters={{\n formatCaption: (date) => {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월`;\n },\n }}\n />\n </div>\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n \"flex items-end justify-between mt-2 pt-2\",\n \"border-t border-gray-200\",\n )}\n >\n <div className=\"flex flex-col min-h-8\">\n {!fromDay || !toDay ? (\n <span className=\"text-xs text-red-500\">\n 종료일자를 선택해 주세요.\n </span>\n ) : (\n <>\n <span className=\"text-xs text-gray-700\">\n {fromDay.format(\"YYYY-MM-DD\")} ~{\" \"}\n {toDay.format(\"YYYY-MM-DD\")}\n </span>\n <span className=\"text-xs text-gray-500\">\n ({numberOfDays}일간)\n </span>\n </>\n )}\n </div>\n\n <div className=\"flex gap-2\">\n <button\n onClick={handleCancel}\n className={cn(\n \"w-15 h-8 cursor-pointer\",\n \"border border-gray-300 rounded bg-transparent\",\n \"text-xs font-medium text-gray-700\",\n \"transition-all duration-150\",\n \"hover:bg-gray-50 active:scale-95\",\n )}\n >\n 취소\n </button>\n <button\n onClick={handleApply}\n disabled={!fromDay || !toDay}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-15 h-8\",\n \"bg-blue-600 rounded\",\n \"text-xs font-medium text-cms-white\",\n \"hover:bg-blue-700 active:scale-95\",\n \"disabled:bg-gray-300\",\n \"disabled:active:scale-100\",\n \"disabled:cursor-not-allowed\",\n \"transition-all duration-150\",\n )}\n >\n 적용\n </button>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n },\n);\n\nDateRangePicker.displayName = \"DateRangePicker\";\n","import React, { useState, useEffect, useMemo, useRef } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Clock } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface TimePickerProps {\n value?: string;\n onChange?: (time: string) => void;\n label?: string;\n placeholder?: string;\n format?: \"24h\" | \"12h\";\n disabled?: boolean;\n error?: boolean;\n errorMessage?: string;\n helperText?: string;\n className?: string;\n minuteStep?: number;\n showIcon?: boolean;\n}\n\n/**\n * 사용자가 시간을 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link TimePicker}는 직관적인 스크롤 인터페이스를 통해 시간과 분을 선택할 수 있으며,\n * 24시간 형식과 12시간(AM/PM) 형식을 모두 지원합니다.\n *\n * `@radix-ui/react-popover`를 기반으로 구현되었으며, 사용자가 잘못된 시간을 입력하는 것을 방지합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **특정 시간 입력**: 예약 시간, 알림 시간, 업무 시작/종료 시간 등을 선택해야 할 때\n * - **정확한 시간 선택**: 사용자가 직접 타이핑하여 발생할 수 있는 형식 오류를 방지하고 싶을 때\n * - **제한된 간격 선택**: 5분, 10분, 15분 단위로만 선택이 필요한 경우 (minuteStep 사용)\n *\n * **사용하지 말아야 하는 경우:**\n * - **대략적인 시간**: '오전', '오후', '저녁' 등 상대적인 시간 선택이 필요한 경우 `Dropdown`이나 `RadioButton`이 더 적절할 수 있습니다.\n * - **초 단위 정밀도**: 현재는 시간과 분까지만 지원하므로, 초 단위가 필요한 경우 다른 컴포넌트를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Popover 기반**: 클릭 시 입력창 아래에 시간 선택 팝오버가 나타나며, 화면 공간을 효율적으로 사용합니다.\n * - **스크롤 선택**: 시간과 분을 각각 스크롤하여 선택할 수 있어 직관적입니다.\n * - **Full Width**: `className`을 통해 부모 요소의 너비에 맞게 조절할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 Format**: 사용자가 익숙한 형식(한국: 24시간, 미국: 12시간)을 선택하세요.\n * - **Minute Step 활용**: 일정 간격으로만 선택이 필요한 경우 `minuteStep`을 활용하여 UX를 개선하세요.\n * - **레이블 및 헬퍼 텍스트**: 입력 항목의 용도를 명확히 하고, 필요한 경우 보충 설명을 제공하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **Read-only 입력**: 사용자가 직접 타이핑하여 입력하는 기능은 지원하지 않으므로, 반드시 UI를 통해 선택하도록 안내하세요.\n * - **과도한 Step**: `minuteStep`이 너무 크면 정확한 시간을 선택하기 어려울 수 있습니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Navigation**: 팝오버는 키보드로 열고 닫을 수 있으며, `Esc` 키로 취소할 수 있습니다.\n * - **Focus Management**: 시간 선택기가 열려 있는 동안 포커스가 적절히 관리됩니다.\n * - **Aria Labels**: 각 버튼에는 스크린 리더를 위한 적절한 레이블이 포함되어 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 시간 선택 예시 (24시간 형식):\n *\n * ```tsx\n * const [time, setTime] = useState(\"\");\n *\n * <TimePicker\n * label=\"출근 시간\"\n * value={time}\n * onChange={setTime}\n * placeholder=\"시간을 선택하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 12시간 형식 및 15분 단위 선택:\n *\n * ```tsx\n * <TimePicker\n * label=\"회의 시간\"\n * format=\"12h\"\n * minuteStep={15}\n * value=\"2:30 PM\"\n * onChange={setTime}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 에러 상태:\n *\n * ```tsx\n * <TimePicker\n * label=\"마감 시간\"\n * error={true}\n * errorMessage=\"업무 시간(9:00-18:00) 내에서 선택해주세요\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link DatePicker}, 날짜를 선택해야 하는 경우\n * - {@link DateRangePicker}, 날짜 범위를 선택해야 하는 경우\n * - {@link TextInput}, 단순한 텍스트 입력이 필요한 경우\n */\nexport const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n value,\n onChange,\n label,\n placeholder = \"HH:MM\",\n format = \"24h\",\n disabled = false,\n error = false,\n errorMessage,\n helperText,\n className,\n minuteStep = 1,\n showIcon = true,\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [selectedHour, setSelectedHour] = useState<number | null>(null);\n const [selectedMinute, setSelectedMinute] = useState<number | null>(null);\n const [selectedPeriod, setSelectedPeriod] = useState<\"AM\" | \"PM\">(\"AM\");\n\n const hourScrollRef = useRef<HTMLDivElement>(null);\n const minuteScrollRef = useRef<HTMLDivElement>(null);\n\n // Parse value and set internal state\n useEffect(() => {\n if (!value) {\n setSelectedHour(null);\n setSelectedMinute(null);\n setSelectedPeriod(\"AM\");\n return;\n }\n\n const timeRegex24h = /^(\\d{1,2}):(\\d{2})$/;\n const timeRegex12h = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i;\n\n if (format === \"24h\") {\n const match = value.match(timeRegex24h);\n if (match) {\n setSelectedHour(parseInt(match[1], 10));\n setSelectedMinute(parseInt(match[2], 10));\n }\n } else {\n const match = value.match(timeRegex12h);\n if (match) {\n let hour = parseInt(match[1], 10);\n const period = match[3].toUpperCase() as \"AM\" | \"PM\";\n setSelectedHour(hour);\n setSelectedMinute(parseInt(match[2], 10));\n setSelectedPeriod(period);\n }\n }\n }, [value, format]);\n\n // Generate hour options\n const hours = useMemo(() => {\n if (format === \"24h\") {\n return Array.from({ length: 24 }, (_, i) => i);\n } else {\n return Array.from({ length: 12 }, (_, i) => i + 1);\n }\n }, [format]);\n\n // Generate minute options based on step\n const minutes = useMemo(() => {\n const options: number[] = [];\n for (let i = 0; i < 60; i += minuteStep) {\n options.push(i);\n }\n return options;\n }, [minuteStep]);\n\n // Format display value\n const displayValue = useMemo(() => {\n if (selectedHour === null || selectedMinute === null) return \"\";\n\n const formattedMinute = selectedMinute.toString().padStart(2, \"0\");\n\n if (format === \"24h\") {\n const formattedHour = selectedHour.toString().padStart(2, \"0\");\n return `${formattedHour}:${formattedMinute}`;\n } else {\n return `${selectedHour}:${formattedMinute} ${selectedPeriod}`;\n }\n }, [selectedHour, selectedMinute, selectedPeriod, format]);\n\n const handleApply = () => {\n if (selectedHour !== null && selectedMinute !== null) {\n onChange?.(displayValue);\n setIsOpen(false);\n }\n };\n\n const handleCancel = () => {\n // Reset to current value\n if (value) {\n const timeRegex24h = /^(\\d{1,2}):(\\d{2})$/;\n const timeRegex12h = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i;\n\n if (format === \"24h\") {\n const match = value.match(timeRegex24h);\n if (match) {\n setSelectedHour(parseInt(match[1], 10));\n setSelectedMinute(parseInt(match[2], 10));\n }\n } else {\n const match = value.match(timeRegex12h);\n if (match) {\n setSelectedHour(parseInt(match[1], 10));\n setSelectedMinute(parseInt(match[2], 10));\n setSelectedPeriod(match[3].toUpperCase() as \"AM\" | \"PM\");\n }\n }\n } else {\n setSelectedHour(null);\n setSelectedMinute(null);\n setSelectedPeriod(\"AM\");\n }\n setIsOpen(false);\n };\n\n // Scroll to selected item when popover opens\n useEffect(() => {\n if (isOpen && selectedHour !== null) {\n setTimeout(() => {\n const hourButton = hourScrollRef.current?.querySelector(\n `[data-value=\"${selectedHour}\"]`,\n );\n hourButton?.scrollIntoView({ block: \"center\" });\n }, 0);\n }\n if (isOpen && selectedMinute !== null) {\n setTimeout(() => {\n const minuteButton = minuteScrollRef.current?.querySelector(\n `[data-value=\"${selectedMinute}\"]`,\n );\n minuteButton?.scrollIntoView({ block: \"center\" });\n }, 0);\n }\n }, [isOpen, selectedHour, selectedMinute]);\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)}>\n {label && (\n <label className=\"text-sm font-medium text-gray-700\">{label}</label>\n )}\n <PopoverPrimitive.Root\n open={isOpen && !disabled}\n onOpenChange={setIsOpen}\n >\n <PopoverPrimitive.Trigger asChild>\n <div className=\"relative\">\n <input\n type=\"text\"\n readOnly\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n \"w-full h-10 px-3 border rounded bg-white text-sm\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"focus:outline-none\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n error ? \"border-red-500\" : \"border-gray-300\",\n disabled &&\n cn(\n \"bg-gray-100 cursor-not-allowed\",\n \"hover:bg-gray-100 hover:border-gray-300\",\n ),\n )}\n />\n {showIcon && (\n <Clock\n className={cn(\n \"absolute right-0 top-1/2 -translate-y-1/2\",\n \"w-4 h-4 text-gray-400\",\n disabled && \"opacity-50\",\n )}\n />\n )}\n </div>\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={5}\n className={cn(\n \"z-50 bg-white rounded-lg shadow-xl\",\n \"border border-gray-200\",\n \"data-[state=open]:animate-in\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"p-4\">\n {/* Time Picker Columns */}\n <div className=\"flex gap-2\">\n {/* Hour Column */}\n <div className=\"flex flex-col\">\n <div className=\"text-xs text-gray-500 text-center mb-2 font-medium\">\n {format === \"24h\" ? \"시\" : \"Hour\"}\n </div>\n <div\n ref={hourScrollRef}\n className=\"w-16 h-48 overflow-y-auto border border-gray-200 rounded cms-no-scrollbar\"\n >\n {hours.map((hour) => (\n <button\n key={hour}\n data-value={hour}\n onClick={() => setSelectedHour(hour)}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-full h-10 text-sm transition-colors\",\n \"hover:bg-gray-100\",\n selectedHour === hour\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label={`${hour}${format === \"24h\" ? \"시\" : \"\"}`}\n aria-selected={selectedHour === hour}\n >\n {format === \"24h\"\n ? hour.toString().padStart(2, \"0\")\n : hour}\n </button>\n ))}\n </div>\n </div>\n\n {/* Minute Column */}\n <div className=\"flex flex-col\">\n <div className=\"text-xs text-gray-500 text-center mb-2 font-medium\">\n {format === \"24h\" ? \"분\" : \"Min\"}\n </div>\n <div\n ref={minuteScrollRef}\n className=\"w-16 h-48 overflow-y-auto border border-gray-200 rounded cms-no-scrollbar\"\n >\n {minutes.map((minute) => (\n <button\n key={minute}\n data-value={minute}\n onClick={() => setSelectedMinute(minute)}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-full h-10 text-sm transition-colors\",\n \"hover:bg-gray-100\",\n selectedMinute === minute\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label={`${minute}${format === \"24h\" ? \"분\" : \" minutes\"}`}\n aria-selected={selectedMinute === minute}\n >\n {minute.toString().padStart(2, \"0\")}\n </button>\n ))}\n </div>\n </div>\n\n {/* AM/PM Column for 12h format */}\n {format === \"12h\" && (\n <div className=\"flex flex-col\">\n <div className=\"text-xs text-gray-500 text-center mb-2 font-medium\">\n Period\n </div>\n <div className=\"w-16 flex flex-col gap-1\">\n <button\n onClick={() => setSelectedPeriod(\"AM\")}\n className={cn(\n \"border-0 cursor-pointer\",\n \"h-10 text-sm rounded transition-colors\",\n \"hover:bg-gray-100\",\n selectedPeriod === \"AM\"\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label=\"AM\"\n aria-selected={selectedPeriod === \"AM\"}\n >\n AM\n </button>\n <button\n onClick={() => setSelectedPeriod(\"PM\")}\n className={cn(\n \"border-0 cursor-pointer\",\n \"h-10 text-sm rounded transition-colors\",\n \"hover:bg-gray-100\",\n selectedPeriod === \"PM\"\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label=\"PM\"\n aria-selected={selectedPeriod === \"PM\"}\n >\n PM\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n \"flex items-end justify-end px-4 pb-4\",\n \"border-t border-gray-200 pt-2\",\n )}\n >\n <div className=\"flex gap-2\">\n <button\n onClick={handleCancel}\n className={cn(\n \"w-15 h-8 rounded cursor-pointer\",\n \"text-xs font-medium text-gray-700\",\n \"border border-gray-300 bg-transparent\",\n \"transition-all duration-150\",\n \"active:scale-95\",\n \"hover:bg-gray-50\",\n )}\n >\n 취소\n </button>\n <button\n onClick={handleApply}\n disabled={selectedHour === null || selectedMinute === null}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-15 h-8 bg-blue-600 rounded\",\n \"text-xs text-white\",\n \"hover:bg-blue-700\",\n \"active:scale-95\",\n \"disabled:bg-gray-300\",\n \"disabled:cursor-not-allowed\",\n \"disabled:active:scale-100\",\n \"transition-all duration-150\",\n )}\n >\n 적용\n </button>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n\n {/* Helper/Error Text */}\n {(helperText || errorMessage) && (\n <div>\n {error && errorMessage ? (\n <p className=\"text-xs text-red-500\">{errorMessage}</p>\n ) : (\n helperText && (\n <p className=\"text-xs text-gray-500\">{helperText}</p>\n )\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nTimePicker.displayName = \"TimePicker\";\n","import React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nconst switchVariants = cva(\n cn(\n \"peer inline-flex items-center transition-colors \",\n \"rounded-full border-2 border-transparent box-border\",\n \"h-6 w-10 shrink-0 py-0.5 px-[1px]\",\n \"cursor-pointer\",\n \"focus-visible:outline-none\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=unchecked]:bg-cms-gray-300\",\n ),\n\n {\n variants: {\n variant: {\n default: \"data-[state=checked]:bg-cms-primary-200\",\n green: \"data-[state=checked]:bg-cms-green-500\",\n black: \"data-[state=checked]:bg-cms-black\",\n blue: \"data-[state=checked]:bg-cms-blue-700\",\n red: \"data-[state=checked]:bg-cms-red-400\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface SwitchProps\n extends\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>,\n VariantProps<typeof switchVariants> {}\n\n/**\n * 두 가지 상반된 상태(On/Off, 활성/비활성)를 즉각적으로 전환할 때 사용하는 컴포넌트입니다.\n *\n * {@link Switch}는 실제 전등 스위치와 같은 직관적인 시각적 모델을 제공하며,\n * 체크박스보다 더 '즉각적인 반영'의 의미를 가집니다.\n *\n * Radix UI의 Switch 컴포넌트를 기반으로 구현되어 접근성과 애니메이션이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **즉각적 설정 반영**: 클릭 즉시 시스템 설정이 변경되거나 저장되어야 할 때 (예: 다크모드 켜기, 알림 수신 동의)\n * - **상태 전환**: 특정 기능의 사용 여부를 결정할 때\n * - **단순 토글**: 복잡한 입력 없이 켜고 끄는 행위만 필요할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **제출 버튼 필요**: 여러 정보를 입력하고 '확인' 버튼을 눌러야 결과가 반영되는 폼 내에서는 `Checkbox`를 사용하세요.\n * - **다중 선택**: 여러 항목 중 일부를 골라야 할 때도 `Checkbox`가 더 적합합니다.\n *\n * ## Layout behavior\n *\n * - **Inline Component**: 주변 텍스트나 다른 요소와 자연스럽게 어우러지는 인라인 블록 형태입니다.\n * - **Thumb Animation**: 클릭 시 스위치의 '손잡이(Thumb)'가 부드럽게 좌우로 이동하며 상태 변화를 시각화합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 현재 상태 표시**: 색상 변화(회색 vs 색상)를 통해 켜져 있는지 꺼져 있는지 한눈에 알 수 있게 하세요.\n * - **레이블과 함께 사용**: 스위치 옆에 무엇을 제어하는지 설명하는 텍스트를 반드시 배치하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **모호한 의미**: 상태 전환 후에 어떤 변화가 생길지 명확하지 않은 경우에는 사용을 지양하세요.\n * - **긴 대기 시간**: 서버 통신 등으로 인해 상태 반영에 시간이 걸리는 경우, 로딩 인디케이터를 함께 보여주거나 즉시 반응을 우선 처리하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Support**: `Space` 키를 사용하여 상태를 전환할 수 있습니다.\n * - **Roles**: `role=\"switch\"` 속성을 사용하여 스크린 리더에서 토글 상태를 읽어줍니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 레이블과 함께 사용하는 기본적인 스위치:\n *\n * ```tsx\n * <div className=\"flex items-center gap-2\">\n * <Switch id=\"airplane-mode\" />\n * <label htmlFor=\"airplane-mode\">비행기 모드</label>\n * </div>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Checkbox}, 제출 전까지 상태를 유지해야 하는 경우\n * - {@link RadioButton}, 여러 선택지 중 하나를 고르는 경우\n */\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n SwitchProps\n>(({ className, variant, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(switchVariants({ variant }), className)}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block rounded-full ring-0\",\n \"bg-cms-white shadow-lg\",\n \"h-5 w-5\",\n \"data-[state=unchecked]:translate-x-0 cursor-pointer\",\n \"data-[state=checked]:translate-x-[14px]\",\n \"transition-transform\",\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import React from \"react\";\nimport * as RadioGroupPrimitives from \"@radix-ui/react-radio-group\";\nimport { cn } from \"@/utils/cn\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * 상호 배타적인 옵션 목록 중 단 하나만을 선택해야 할 때 사용하는 컴포넌트입니다.\n *\n * {@link RadioGroup}은 여러 개의 {@link RadioGroupItem}을 포함하는 컨테이너이며,\n * 한 번에 하나의 아이템만 선택될 수 있도록 상태를 관리합니다.\n *\n * Radix UI의 Radio Group 컴포넌트를 기반으로 구현되어 방향키를 이용한 내비게이션 등\n * 표준 라디오 그룹 동작을 지원합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **단일 선택**: 성별 선택, 배송 방법 선택 등 여러 옵션 중 하나만 골라야 할 때\n * - **옵션 노출**: 모든 선택지가 사용자에게 한눈에 보여야 할 때 (옵션이 5개 이하인 경우 권장)\n *\n * **사용하지 말아야 하는 경우:**\n * - **다중 선택**: 여러 개를 동시에 선택할 수 있어야 하는 경우 `Checkbox`를 사용하세요.\n * - **옵션이 많은 경우**: 선택지가 5-6개를 넘어간다면 화면 공간을 위해 `Dropdown`을 사용하는 것이 좋습니다.\n * - **독립적 On/Off**: 단순히 하나의 항목을 켜고 끄는 것이라면 `Checkbox`나 `Switch`가 더 적절합니다.\n *\n * ## Layout behavior\n *\n * - **asChild**: `asChild` 속성을 사용하면 기본 렌더링 요소 대신 자식 요소를 렌더링하고 속성을 병합합니다.\n * 커스텀 컴포넌트나 다른 라이브러리와 연동할 때 유용합니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Navigation**: `Tab` 키로 그룹에 진입한 후, 화살표 키(`Up`, `Down`, `Left`, `Right`)를 사용하여 옵션 간 이동 및 선택이 가능합니다.\n * - **Roles**: `role=\"radiogroup\"` 및 `role=\"radio\"` 속성이 자동으로 부여됩니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 라디오 그룹 사용 예시:\n *\n * ```tsx\n * <RadioGroup defaultValue=\"apple\" onValueChange={(val) => console.log(val)}>\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"apple\" id=\"apple\" />\n * <label htmlFor=\"apple\">사과</label>\n * </div>\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"banana\" id=\"banana\" />\n * <label htmlFor=\"banana\">바나나</label>\n * </div>\n * </RadioGroup>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * `asChild`를 사용한 커스텀 렌더링 예시:\n *\n * ```tsx\n * <RadioGroup asChild>\n * <section className=\"my-custom-group\">\n * <RadioGroupItem asChild value=\"custom\">\n * <button type=\"button\" className=\"custom-radio-trigger\">\n * 커스텀 라디오\n * </button>\n * </RadioGroupItem>\n * </section>\n * </RadioGroup>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Checkbox}, 다중 선택이 필요한 경우\n * - {@link Dropdown}, 옵션이 많아 리스트로 숨겨야 하는 경우\n * - {@link Switch}, 단순 활성화/비활성화를 토글할 때\n */\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitives.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitives.Root className={className} {...props} ref={ref} />\n );\n});\nRadioGroup.displayName = RadioGroupPrimitives.Root.displayName;\n\nconst radioGroupItemVariants = cva(\n cn(\n \"flex items-center justify-center\",\n \"aspect-square rounded-full border-2 transition-colors\",\n \"focus:outline-none\",\n \"focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"cursor-pointer\",\n ),\n {\n variants: {\n variant: {\n black: cn(\n \"border-cms-gray-300 text-cms-black\",\n \"data-[state=checked]:border-cms-black\",\n ),\n default: cn(\n \"border-cms-gray-300 text-cms-primary-300\",\n \"data-[state=checked]:border-cms-primary-300\",\n ),\n green: cn(\n \"border-cms-gray-300 text-cms-green-500\",\n \"data-[state=checked]:border-cms-green-500\",\n ),\n blue: cn(\n \"border-cms-gray-300 text-cms-blue-700\",\n \"data-[state=checked]:border-cms-blue-700\",\n ),\n red: cn(\n \"border-cms-gray-300 text-cms-red-400\",\n \"data-[state=checked]:border-cms-red-400\",\n ),\n },\n size: {\n sm: \"size-4\",\n md: \"size-5\",\n lg: \"size-6\",\n },\n },\n defaultVariants: {\n variant: \"black\",\n size: \"md\",\n },\n },\n);\n\nconst radioGroupIndicatorVariants = cva(\n \"flex items-center justify-center rounded-full bg-current aspect-square\",\n {\n variants: {\n variant: {\n // bg-current를 쓰면 부모 text color를 따라가므로 색상 정의 줄일 수 있음\n black: \"text-cms-black\",\n default: \"text-cms-primary-300\",\n green: \"text-cms-green-500\",\n blue: \"text-cms-blue-700\",\n red: \"text-cms-red-400\",\n },\n size: {\n sm: \"size-2\",\n md: \"size-2.5\",\n lg: \"size-3\",\n },\n },\n defaultVariants: {\n variant: \"black\",\n size: \"md\",\n },\n },\n);\n\nexport interface RadioGroupItemProps\n extends\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitives.Item>,\n VariantProps<typeof radioGroupItemVariants> {}\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitives.Item>,\n RadioGroupItemProps\n>(({ className, variant, size, ...props }, ref) => {\n return (\n <RadioGroupPrimitives.Item\n ref={ref}\n className={cn(radioGroupItemVariants({ variant, size }), className)}\n {...props}\n >\n <RadioGroupPrimitives.Indicator\n className={cn(radioGroupIndicatorVariants({ variant, size }))}\n />\n </RadioGroupPrimitives.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitives.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import React, { useState } from \"react\";\nimport * as Accordion from \"@radix-ui/react-accordion\";\nimport { cn } from \"@/utils/cn\";\nimport { ChevronDown } from \"lucide-react\";\n\nexport interface SubMenuItem {\n url: string;\n title: string;\n}\n\nexport interface MenuItem {\n url: string;\n title: string;\n icon?: React.ReactNode;\n subMenu?: SubMenuItem[];\n}\n\nexport interface SideNavigationProps {\n title?: string;\n menus: MenuItem[];\n selectedUrl: string;\n onMenuClick: (url: string) => void;\n headerSlot?: React.ReactNode;\n className?: string;\n}\n\ninterface NavigationMenuItemProps {\n menu: MenuItem;\n isOpen: boolean;\n isSelected: boolean;\n selectedUrl: string;\n onMenuClick: (url: string) => void;\n}\n\nconst NavigationMenuItem = ({\n menu,\n isOpen,\n isSelected,\n selectedUrl,\n onMenuClick,\n}: NavigationMenuItemProps) => {\n const isSubMenuSelected = menu.subMenu?.some(\n (sub) => sub.url === selectedUrl,\n );\n\n return (\n <Accordion.Item value={menu.url} className=\"border-none\">\n <Accordion.Header className=\"m-0\">\n <Accordion.Trigger\n onClick={(e) => {\n if (!menu.subMenu) {\n e.preventDefault();\n onMenuClick(menu.url);\n }\n }}\n className={cn(\n \"border-0 group flex items-center px-5 bg-cms-gray-850\",\n \"text-white font-bold text-lg\",\n \"w-full h-15\",\n \"transition-colors\",\n \"cursor-pointer\",\n !isSubMenuSelected && \"data-[state=open]:bg-transparent\",\n !menu.subMenu && isSelected && \"bg-cms-primary-400 text-cms-black\",\n isSubMenuSelected && \"bg-cms-primary-200 text-cms-black\",\n )}\n >\n {menu.icon && (\n <div\n className={cn(\n \"mr-3 flex items-center\",\n \"[&>svg]:w-6 [&>svg]:h-6\",\n (!menu.subMenu && isSelected) || isSubMenuSelected\n ? \"text-cms-black\"\n : \"text-white\",\n )}\n >\n {menu.icon}\n </div>\n )}\n <span\n className={cn(\n (!menu.subMenu && isSelected) || isSubMenuSelected\n ? \"text-cms-black\"\n : \"text-white\",\n )}\n >\n {menu.title}\n </span>\n {menu.subMenu && (\n <ChevronDown\n className={cn(\n \"ml-auto transition-transform\",\n (!menu.subMenu && isSelected) || isSubMenuSelected\n ? \"text-cms-black\"\n : \"text-white\",\n isOpen && \"rotate-180\",\n )}\n size={20}\n />\n )}\n </Accordion.Trigger>\n </Accordion.Header>\n {menu.subMenu && (\n <Accordion.Content\n className={cn(\n \"overflow-hidden\",\n \"data-[state=open]:animate-accordion-down\",\n \"data-[state=closed]:animate-accordion-up\",\n )}\n >\n {menu.subMenu.map((subItem) => {\n const subSelected = subItem.url === selectedUrl;\n return (\n <button\n key={subItem.url}\n onClick={() => onMenuClick(subItem.url)}\n className={cn(\n \"border-0 bg-transparent flex items-center\",\n \"w-full h-13 px-5 pl-14\",\n \"cursor-pointer\",\n \"transition-colors\",\n \"hover:bg-cms-gray-900\",\n )}\n >\n <span\n className={cn(\n \"text-base font-bold\",\n \"transition-colors\",\n subSelected\n ? \"text-cms-primary-400 font-bold\"\n : \"text-cms-white\",\n )}\n >\n {subItem.title}\n </span>\n </button>\n );\n })}\n </Accordion.Content>\n )}\n </Accordion.Item>\n );\n};\n\n/**\n * 어플리케이션의 주요 섹션 간 이동을 담당하는 왼쪽 사이드바 메뉴 컴포넌트입니다.\n *\n * {@link SideNavigation}은 계층형 메뉴 구조(1단계 및 서브메뉴)를 지원하며,\n * 현재 사용자의 위치를 시각적으로 강조하여 내비게이션 맥락을 제공합니다.\n * 다크 테마(Dark Theme) 스타일로 고정되어 대시보드 및 CMS 관리 도구에 적합합니다.\n *\n * Radix UI의 Accordion 컴포넌트를 기반으로 구현되어 서브메뉴의 펼침/접힘 동작이\n * 부드럽게 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **메인 내비게이션**: 서비스의 핵심 기능을 상시 노출하고 접근해야 할 때\n * - **계층 구조 관리**: 대메뉴와 그에 속한 소메뉴를 구조적으로 보여줘야 할 때\n * - **관리자 페이지**: 다양한 관리 도구와 설정 항목을 분류하여 제공할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **단순 링크 목록**: 3-4개의 단순한 링크라면 상단 내비게이션(GNB)이 더 적절할 수 있습니다.\n * - **모바일 전용 탭**: 모바일 앱 스타일의 내비게이션이 필요하다면 하단 탭 바를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Fixed Width**: 기본적으로 `w-70` (280px)의 고정 너비를 가지며, 세로 전체(h-full)를 차지합니다.\n * - **Scrollable**: 메뉴 항목이 많아 화면 높이를 넘어가면 메뉴 영역 내부에 스크롤이 발생합니다.\n * - **Accordion**: 서브메뉴가 있는 항목 클릭 시 아래로 펼쳐지는 애니메이션이 적용됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **아이콘 활용**: 각 대메뉴에 적절한 아이콘을 배치하여 사용자가 메뉴의 성격을 빠르게 파악하게 하세요.\n * - **상태 연동**: 현재 활성화된 페이지의 URL과 `selectedUrl`을 정확히 일치시켜 하이라이트가 올바르게 표시되도록 하세요.\n * - **일관된 그룹화**: 연관된 기능들은 하나의 대메뉴 아래 서브메뉴로 묶어 복잡도를 낮추세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **과도한 계층**: 서브메뉴의 서브메뉴(3단계 이상)는 가급적 피하세요. UI가 복잡해지고 사용성이 떨어집니다.\n * - **긴 메뉴 명칭**: 사이드바 너비가 제한적이므로 메뉴 이름은 짧고 명확하게(가급적 10자 이내) 작성하세요.\n *\n * ## Accessibility\n *\n * - **Accordion Support**: 서브메뉴 상태를 스크린 리더에서 '펼쳐짐/접힘'으로 인식합니다.\n * - **Keyboard Interaction**: `Tab` 키로 메뉴를 이동하고, `Enter`나 `Space`로 메뉴를 열거나 이동할 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 서브메뉴를 포함한 사이드 네비게이션:\n *\n * ```tsx\n * const menus = [\n * { url: '/dashboard', title: '홈', icon: <HomeIcon /> },\n * {\n * url: '/contents',\n * title: '콘텐츠 관리',\n * icon: <FileTextIcon />,\n * subMenu: [\n * { url: '/contents/posts', title: '게시글 목록' },\n * { url: '/contents/comments', title: '댓글 관리' },\n * ]\n * },\n * ];\n *\n * <SideNavigation\n * menus={menus}\n * selectedUrl=\"/contents/posts\"\n * onMenuClick={(url) => navigate(url)}\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Button}, 단순 액션 실행을 위한 요소\n * - {@link Popover}, 클릭 시 일시적으로 나타나는 추가 메뉴가 필요한 경우\n */\nexport const SideNavigation = React.forwardRef<\n HTMLDivElement,\n SideNavigationProps\n>(\n (\n { title, menus, selectedUrl, onMenuClick, headerSlot, className, ...props },\n ref,\n ) => {\n const [openedMenus, setOpenedMenus] = useState<string[]>([]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col\",\n \"w-70 min-w-70 max-w-70 h-full\",\n \"bg-cms-gray-850 text-white\",\n className,\n )}\n {...props}\n >\n {/* Header Slot */}\n {headerSlot}\n\n {/* Title */}\n {title && !headerSlot && (\n <div className=\"px-5 py-4 border-b border-[#3a3b3e]\">\n <h2 className=\"text-lg font-semibold text-white\">{title}</h2>\n </div>\n )}\n\n {/* Menu Body */}\n <div\n className={cn(\n \"flex-1 overflow-y-auto\",\n \"scrollbar-thin\",\n \"scrollbar-thumb-[#3a3b3e]\",\n \"scrollbar-track-transparent\",\n )}\n >\n <Accordion.Root\n type=\"multiple\"\n value={openedMenus}\n onValueChange={setOpenedMenus}\n >\n {menus.map((menu) => (\n <NavigationMenuItem\n key={menu.url}\n menu={menu}\n isOpen={openedMenus.includes(menu.url)}\n isSelected={selectedUrl === menu.url}\n selectedUrl={selectedUrl}\n onMenuClick={onMenuClick}\n />\n ))}\n </Accordion.Root>\n </div>\n </div>\n );\n },\n);\n\nSideNavigation.displayName = \"SideNavigation\";\n","import React, { useMemo } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n siblingCount?: number;\n showPrevNext?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nconst paginationButtonVariants = cva(\n cn(\n \"inline-flex items-center justify-center\",\n \"h-10 min-w-10 px-2\",\n \"rounded-md\",\n \"text-sm font-medium\",\n \"transition-colors\",\n \"cursor-pointer\",\n \"focus-visible:outline-none focus-visible:ring-2\",\n ),\n {\n variants: {\n variant: {\n default: cn(\n \"border border-cms-gray-400 bg-transparent\",\n \"text-cms-gray-700\",\n \"hover:bg-cms-gray-200\",\n ),\n active: cn(\n \"bg-cms-primary-400 border border-cms-primary-400\",\n \"text-cms-black\",\n \"hover:bg-cms-primary-300\",\n ),\n ellipsis: cn(\n \"border-0 bg-transparent\",\n \"text-cms-gray-700\",\n \"cursor-default pointer-events-none\",\n ),\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\ntype PageItem = number | \"...\";\n\nconst usePagination = ({\n currentPage,\n totalPages,\n siblingCount = 1,\n}: {\n currentPage: number;\n totalPages: number;\n siblingCount?: number;\n}): PageItem[] => {\n return useMemo(() => {\n const range = (start: number, end: number): number[] => {\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n };\n\n // 총 표시할 페이지 번호 개수 계산\n const totalPageNumbers = siblingCount * 2 + 5;\n\n // 모든 페이지를 표시할 수 있으면 ellipsis 없이 표시\n if (totalPageNumbers >= totalPages) {\n return range(1, totalPages);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2;\n const shouldShowRightEllipsis = rightSiblingIndex < totalPages - 1;\n\n // Case 1: 오른쪽만 ellipsis\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const leftRange = range(1, 3 + 2 * siblingCount);\n return [...leftRange, \"...\", totalPages];\n }\n\n // Case 2: 왼쪽만 ellipsis\n if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n const rightRange = range(totalPages - (2 + 2 * siblingCount), totalPages);\n return [1, \"...\", ...rightRange];\n }\n\n // Case 3: 양쪽 모두 ellipsis\n if (shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [1, \"...\", ...middleRange, \"...\", totalPages];\n }\n\n return [];\n }, [currentPage, totalPages, siblingCount]);\n};\n\n/**\n * 사용자가 여러 페이지로 나뉜 콘텐츠를 탐색할 수 있게 하는 페이지네이션 컴포넌트입니다.\n *\n * {@link Pagination}은 이전/다음 버튼과 페이지 번호를 제공하며,\n * 많은 페이지가 있을 때 중간 페이지를 생략(ellipsis)하여 UI를 깔끔하게 유지합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **긴 목록**: 많은 항목을 여러 페이지로 나누어 표시할 때\n * - **검색 결과**: 검색 결과가 여러 페이지에 걸쳐 있을 때\n * - **데이터 테이블**: 대량의 데이터를 페이지 단위로 보여줄 때\n * - **명확한 페이지 구분**: 사용자가 특정 페이지로 직접 이동할 필요가 있을 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **무한 스크롤**: 지속적으로 콘텐츠가 로드되는 피드 형태가 더 적절한 경우\n * - **적은 항목**: 한 페이지에 모두 표시할 수 있는 소량의 데이터\n * - **단계별 프로세스**: 순차적인 단계를 나타낼 때는 Stepper 컴포넌트 사용\n *\n * ## Layout behavior\n *\n * - **Responsive**: 모바일에서는 siblingCount를 줄여 더 적은 페이지 번호를 표시하는 것을 권장\n * - **Centered**: 일반적으로 페이지 하단 중앙에 배치\n * - **Ellipsis**: 많은 페이지가 있을 때 자동으로 중간 페이지를 생략 (...으로 표시)\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 페이지당 항목 수**: 10-50개 사이가 적절 (콘텐츠 유형에 따라 조정)\n * - **현재 페이지 명확히 표시**: 활성 페이지는 시각적으로 구분되어야 함\n * - **충분한 클릭 영역**: 모바일에서도 쉽게 탭할 수 있도록 버튼 크기 유지\n * - **첫/마지막 페이지 비활성화**: 이동할 수 없는 경우 버튼을 비활성화하여 명확히 표시\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 많은 페이지 번호**: siblingCount를 너무 크게 설정하지 마세요\n * - **불명확한 상태**: 로딩 중이거나 에러 상태일 때도 적절한 피드백 제공 필요\n *\n * ## Accessibility\n *\n * - **ARIA Labels**: 각 버튼에 명확한 레이블 제공 (aria-label, aria-current)\n * - **Keyboard Navigation**: Tab 키로 버튼 간 이동, Enter/Space로 페이지 변경\n * - **Screen Reader**: 현재 페이지와 전체 페이지 수를 읽어주도록 설정\n * - **Disabled State**: 비활성화된 버튼은 포커스할 수 없도록 처리\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 페이지네이션 사용:\n *\n * ```tsx\n * const [currentPage, setCurrentPage] = useState(1);\n * const totalPages = 10;\n *\n * <Pagination\n * currentPage={currentPage}\n * totalPages={totalPages}\n * onPageChange={setCurrentPage}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 많은 페이지와 커스텀 siblingCount:\n *\n * ```tsx\n * <Pagination\n * currentPage={25}\n * totalPages={100}\n * siblingCount={2}\n * onPageChange={handlePageChange}\n * />\n * // 결과: 1 ... 23 24 25 26 27 ... 100\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 비활성화 상태:\n *\n * ```tsx\n * <Pagination\n * currentPage={5}\n * totalPages={10}\n * onPageChange={handlePageChange}\n * disabled={isLoading}\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Button}, 단일 버튼 컴포넌트\n */\nexport const Pagination = React.forwardRef<HTMLDivElement, PaginationProps>(\n (\n {\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n showPrevNext = true,\n disabled = false,\n className,\n },\n ref,\n ) => {\n const pages = usePagination({ currentPage, totalPages, siblingCount });\n\n const handlePrevious = () => {\n if (currentPage > 1 && !disabled) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages && !disabled) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handlePageClick = (page: number) => {\n if (!disabled && page !== currentPage) {\n onPageChange(page);\n }\n };\n\n return (\n <nav\n ref={ref}\n role=\"navigation\"\n aria-label=\"페이지네이션\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n {/* Previous Button */}\n {showPrevNext && (\n <button\n onClick={handlePrevious}\n disabled={disabled || currentPage === 1}\n aria-label=\"이전 페이지\"\n className={cn(\n paginationButtonVariants({ variant: \"default\" }),\n (disabled || currentPage === 1) &&\n \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n <ChevronLeft className=\"w-4 h-4\" />\n </button>\n )}\n\n {/* Page Numbers */}\n {pages.map((page, index) => {\n if (page === \"...\") {\n return (\n <span\n key={`ellipsis-${index}`}\n className={cn(\n paginationButtonVariants({ variant: \"ellipsis\" }),\n )}\n aria-hidden=\"true\"\n >\n ...\n </span>\n );\n }\n\n const isActive = page === currentPage;\n\n return (\n <button\n key={page}\n onClick={() => handlePageClick(page)}\n disabled={disabled}\n aria-label={`페이지 ${page}${isActive ? \" (현재 페이지)\" : \"로 이동\"}`}\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n paginationButtonVariants({\n variant: isActive ? \"active\" : \"default\",\n }),\n disabled && \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n {page}\n </button>\n );\n })}\n\n {/* Next Button */}\n {showPrevNext && (\n <button\n onClick={handleNext}\n disabled={disabled || currentPage === totalPages}\n aria-label=\"다음 페이지\"\n className={cn(\n paginationButtonVariants({ variant: \"default\" }),\n (disabled || currentPage === totalPages) &&\n \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </button>\n )}\n </nav>\n );\n },\n);\n\nPagination.displayName = \"Pagination\";\n","import React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface CheckboxProps extends React.ComponentPropsWithoutRef<\n typeof CheckboxPrimitive.Root\n> {\n label?: string;\n id?: string;\n}\n\n/**\n * 사용자가 여러 옵션 중 하나 이상을 선택하거나, 특정 항목의 활성화 상태를 제어할 때 사용하는 컴포넌트입니다.\n *\n * {@link Checkbox}는 개별적인 On/Off 상태를 표시하며, 주로 목록에서의 다중 선택이나\n * 설정 화면에서 특정 기능의 사용 여부를 결정할 때 사용됩니다.\n *\n * Radix UI의 Checkbox 컴포넌트를 기반으로 구현되어 접근성과 키보드 내비게이션이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **다중 선택**: 목록에서 여러 항목을 동시에 선택해야 할 때\n * - **단일 승인**: 이용약관 동의와 같이 하나의 항목에 대해 확인이 필요할 때\n * - **설정 제어**: 특정 기능의 활성화/비활성화 상태를 토글할 때\n * - **필터링**: 여러 조건(카테고리, 날짜 등)을 동시에 적용하여 결과를 필터링할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **상호 배타적 선택**: 여러 옵션 중 단 하나만 선택해야 하는 경우 `RadioButton`을 사용하세요.\n * - **즉각적인 상태 반영**: 설정을 바꾸자마자 페이지에 즉시 반영되는 경우 `Switch` 컴포넌트가 더 적절할 수 있습니다.\n *\n * ## Layout behavior\n *\n * - **Inline Alignment**: 레이블과 함께 가로로 나란히 배치되며, 기본적으로 인라인 블록 요소처럼 동작합니다.\n * - **Spacing**: 체크박스와 레이블 사이에는 일정한 간격(8px/0.5rem)이 유지됩니다.\n * - **Touch Area**: 모바일 대응을 위해 레이블 클릭 시에도 체크박스가 선택되도록 `htmlFor` 속성이 연결되어 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 레이블 제공**: 체크박스가 무엇을 제어하는지 명확하게 설명하는 레이블을 함께 사용하세요.\n * - **긍정형 문장 사용**: '알림 받지 않기'보다는 '알림 받기'와 같이 긍정형 문구로 작성하는 것이 혼란을 줄입니다.\n * - **그룹화**: 여러 체크박스가 하나의 주제를 다룬다면 적절한 제목 아래에 그룹화하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **레이블 생략 지양**: 공간이 매우 협소한 경우가 아니라면 항상 레이블을 함께 제공하세요.\n * - **복잡한 텍스트**: 레이블에 너무 많은 정보나 설명을 넣지 마세요. 필요하다면 툴팁이나 별도의 설명 텍스트를 사용하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Interaction**: `Space` 키를 사용하여 체크 상태를 전환할 수 있습니다.\n * - **Focus Management**: 탭 키를 통해 포커스를 이동할 수 있으며, 포커스 시 시각적인 강조 효과가 나타납니다.\n * - **WAI-ARIA**: `role=\"checkbox\"`를 사용하며, 체크 상태에 따라 `aria-checked` 값이 자동으로 업데이트됩니다.\n * - **Label Connection**: `id`와 `htmlFor`가 자동으로 연결되어 스크린 리더가 레이블을 읽어줍니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 체크박스 사용 예시:\n *\n * ```tsx\n * <Checkbox\n * label=\"이용약관에 동의합니다\"\n * checked={agreed}\n * onCheckedChange={setAgreed}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 비활성화된 체크박스:\n *\n * ```tsx\n * <Checkbox\n * label=\"선택 불가능한 옵션\"\n * disabled\n * checked={true}\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link RadioButton}, 하나만 선택해야 하는 경우\n * - {@link Switch}, 즉각적인 상태 반영이 필요한 경우\n * - {@link Button}, 단순 액션 실행이 필요한 경우\n */\nexport const Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, label, id, disabled, ...props }, ref) => {\n const checkboxId =\n id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;\n\n return (\n <div className=\"flex items-center\">\n <CheckboxPrimitive.Root\n ref={ref}\n id={checkboxId}\n disabled={disabled}\n className={cn(\n \"peer h-5 w-5 shrink-0 rounded\",\n \"border border-gray-400 bg-white\",\n \"focus-visible:outline-none\",\n \"focus-visible:ring-2\",\n \"focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:bg-black data-[state=checked]:border-black\",\n \"transition-colors\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center\", \"text-white\")}\n >\n <Check className=\"h-[18px] w-[18px]\" strokeWidth={4} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n {label && (\n <label\n htmlFor={checkboxId}\n className={cn(\n \"ml-2 text-base font-normal text-gray-500\",\n \"hover:text-black transition-colors\",\n disabled && \"cursor-not-allowed opacity-50\",\n \"cursor-pointer select-none\"\n )}\n >\n {label}\n </label>\n )}\n </div>\n );\n});\n\nCheckbox.displayName = \"Checkbox\";\n","import React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"../Button\";\n\nexport interface ModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n icon?: React.ReactNode;\n title?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n showCloseButton?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n};\n\n/**\n * 사용자에게 중요한 정보를 표시하거나 입력을 요구하는 오버레이 대화상자입니다.\n *\n * {@link Modal}은 사용자의 주의를 집중시켜야 하는 상황에서 사용됩니다.\n * 모달이 열리면 배경이 어두워지며, 사용자는 모달과 상호작용하거나 닫기 전까지\n * 페이지의 다른 부분과 상호작용할 수 없습니다.\n *\n * Radix UI의 Dialog 컴포넌트를 기반으로 구현되어 접근성과 키보드 내비게이션이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **중요한 의사 결정**: 삭제, 저장, 제출 등 되돌릴 수 없는 작업 확인\n * - **필수 정보 입력**: 다음 단계로 진행하기 전 반드시 입력해야 하는 정보 수집\n * - **중요 알림**: 사용자가 반드시 확인해야 하는 에러, 경고, 성공 메시지\n * - **간단한 폼**: 페이지 전환 없이 빠르게 정보를 입력받아야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **긴급하지 않은 알림**: Toast 컴포넌트를 사용하세요\n * - **복잡한 다단계 폼**: 별도 페이지로 이동하세요\n * - **많은 정보 표시**: 페이지 내 섹션으로 구현하세요\n * - **비필수 부가 정보**: Popover나 Tooltip을 사용하세요\n *\n * ## Layout behavior\n *\n * 모달은 항상 화면 중앙에 고정되며, 배경 오버레이는 전체 화면을 덮습니다.\n * 크기는 `size` prop에 따라 결정됩니다:\n * - `sm`: 최대 너비 24rem (384px) - 간단한 확인 대화상자\n * - `md`: 최대 너비 28rem (448px) - 기본값, 일반적인 폼이나 메시지\n * - `lg`: 최대 너비 32rem (512px) - 많은 내용이나 복잡한 폼\n *\n * 모달의 높이는 콘텐츠에 따라 자동으로 조절되며, 화면을 넘어가면 스크롤이 발생합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 제목 사용**: 모달의 목적을 한눈에 알 수 있는 제목을 제공하세요\n * ```tsx\n * <Modal title=\"항목 삭제\">...</Modal> // Good\n * <Modal title=\"확인\">...</Modal> // Bad - 너무 모호함\n * ```\n *\n * - **행동 지향적 버튼**: 버튼 레이블은 수행할 동작을 명확히 표현하세요\n * ```tsx\n * <Button>삭제하기</Button> // Good\n * <Button>확인</Button> // Bad - 무엇을 확인하는지 불명확\n * ```\n *\n * - **적절한 크기 선택**: 콘텐츠 양에 맞는 size를 선택하세요\n * - **명확한 닫기 방법**: X 버튼, 취소 버튼, 배경 클릭 중 최소 하나는 제공하세요\n * - **중요도에 따른 변형**: ConfirmModal, SuccessModal, ErrorModal 등 사용\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **모달 위에 모달을 띄우지 마세요** - UX가 복잡해지고 혼란스러워집니다\n * - **긴 스크롤이 필요한 콘텐츠는 피하세요** - 별도 페이지로 이동하는 것이 좋습니다\n * - **자동으로 모달을 열지 마세요** - 사용자의 명시적 동작(클릭 등) 후에만 열어야 합니다\n * - **모달 없이도 작업 가능한 경우** - 불필요하게 모달을 사용하지 마세요\n * - **모바일에서 큰 모달(lg) 사용 지양** - 화면을 거의 다 차지하므로 페이지 이동 권장\n *\n * ## Accessibility\n *\n * 이 컴포넌트는 WAI-ARIA Dialog 패턴을 따릅니다:\n *\n * - **키보드 내비게이션**:\n * - `Esc`: 모달 닫기\n * - `Tab`: 모달 내부 포커스 순환 (모달 외부로 나가지 않음)\n * - 모달이 열리면 첫 번째 포커스 가능한 요소로 자동 포커스\n *\n * - **스크린 리더**:\n * - `role=\"dialog\"`: 대화상자임을 인식\n * - `aria-labelledby`: title이 모달의 레이블로 연결됨\n * - `aria-describedby`: children 콘텐츠가 설명으로 연결됨\n *\n * - **포커스 트랩**: 모달이 열려있는 동안 포커스가 모달 내부에서만 순환합니다\n * - **배경 스크롤 방지**: 모달이 열리면 body 스크롤이 자동으로 비활성화됩니다\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 확인 모달 예시:\n *\n * ```tsx\n * function DeleteConfirmDialog() {\n * const [open, setOpen] = useState(false);\n *\n * return (\n * <>\n * <Button onClick={() => setOpen(true)}>삭제</Button>\n * <Modal\n * open={open}\n * onOpenChange={setOpen}\n * title=\"항목 삭제\"\n * footer={\n * <div className=\"flex gap-2\">\n * <Button onClick={() => setOpen(false)} variant=\"outline\">\n * 취소\n * </Button>\n * <Button onClick={handleDelete} variant=\"destructive\">\n * 삭제하기\n * </Button>\n * </div>\n * }\n * >\n * 이 항목을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.\n * </Modal>\n * </>\n * );\n * }\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 성공 아이콘이 포함된 모달 예시:\n *\n * ```tsx\n * <Modal\n * open={open}\n * onOpenChange={setOpen}\n * icon={<CheckCircle className=\"w-12 h-12 text-green-500\" />}\n * title=\"저장 완료\"\n * footer={\n * <Button onClick={() => setOpen(false)} className=\"w-full\">\n * 확인\n * </Button>\n * }\n * >\n * 데이터가 성공적으로 저장되었습니다.\n * </Modal>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 큰 크기의 폼 모달 예시:\n *\n * ```tsx\n * <Modal\n * open={open}\n * onOpenChange={setOpen}\n * title=\"새 사용자 추가\"\n * size=\"lg\"\n * footer={\n * <div className=\"flex justify-end gap-2\">\n * <Button variant=\"outline\" onClick={() => setOpen(false)}>\n * 취소\n * </Button>\n * <Button onClick={handleSubmit}>저장</Button>\n * </div>\n * }\n * >\n * <form className=\"space-y-4\">\n * <TextInput label=\"이름\" required />\n * <TextInput label=\"이메일\" type=\"email\" required />\n * <TextInput label=\"전화번호\" />\n * </form>\n * </Modal>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link ConfirmModal}, 간단한 확인 모달을 위한 사전 구성된 변형\n * - {@link SuccessModal}, 성공 메시지를 표시하는 모달\n * - {@link ErrorModal}, 에러 메시지를 표시하는 모달\n * - {@link WarningModal}, 경고 메시지를 표시하는 모달\n * - {@link DeleteModal}, 삭제 확인을 위한 모달\n * - {@link Toast}, 긴급하지 않은 알림을 위한 컴포넌트\n * - {@link Popover}, 비필수 부가 정보를 표시하는 컴포넌트\n */\nexport const Modal = React.forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n open,\n onOpenChange,\n icon,\n title,\n children,\n footer,\n className,\n showCloseButton = true,\n size = \"md\",\n },\n ref,\n ) => {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-150 bg-black/50\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n )}\n />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-150\",\n \"translate-x-[-50%] translate-y-[-50%]\",\n \"w-full\",\n sizeClasses[size],\n \"bg-white rounded-lg shadow-lg\",\n \"p-6\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n className,\n )}\n >\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"h-6 w-6\", \"absolute right-4 top-4\")}\n >\n <X />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n\n {icon && <div className=\"flex justify-center mb-4\">{icon}</div>}\n\n {title && (\n <DialogPrimitive.Title\n className={cn(\n \"text-lg font-bold text-cms-gray-900 mb-2\",\n \"flex items-center justify-center\",\n )}\n >\n {title}\n </DialogPrimitive.Title>\n )}\n\n <DialogPrimitive.Description className=\"text-sm text-cms-gray-700 text-center\">\n {children}\n </DialogPrimitive.Description>\n\n {footer && <div className=\"mt-6\">{footer}</div>}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n },\n);\n\nModal.displayName = \"Modal\";\n","import React from \"react\";\nimport { CheckCircle2 } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface ConfirmModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n className?: string;\n}\n\n/**\n * 사용자에게 특정 작업에 대한 최종 확인을 받기 위한 단순화된 모달 컴포넌트입니다.\n *\n * {@link ConfirmModal}은 {@link Modal}을 기반으로 구성되었으며, 상징적인 체크 아이콘과\n * 하나의 '확인' 버튼만을 제공하여 사용자의 빠른 의사결정을 돕습니다.\n * 주로 성공적인 처리 알림이나 단순한 동의가 필요할 때 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **결과 확인**: 설정 변경, 데이터 저장 등 작업이 정상적으로 완료되었음을 알릴 때\n * - **단순 안내**: 사용자에게 중요한 안내 사항을 전달하고 확인을 받아야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **중요한 결정/취소 필요**: '예/아니오'와 같이 선택지가 필요한 경우 일반 `Modal`이나 `DeleteModal`을 사용하세요.\n * - **데이터 입력**: 폼 입력이 필요한 경우 일반 `Modal`을 사용하세요.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **간결한 메시지**: 메시지는 가급적 2-3줄 이내로 짧고 명확하게 작성하세요.\n * - **적절한 타이틀**: \"저장 완료\", \"안내\" 등 문맥에 맞는 타이틀을 사용하세요.\n */\nexport const ConfirmModal = React.forwardRef<HTMLDivElement, ConfirmModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"확인\",\n message,\n confirmText = \"확인\",\n onConfirm,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n footer={\n <Button\n onClick={handleConfirm}\n className=\"w-full h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n icon={<CheckCircle2 className=\"w-15 h-15 text-cms-black\" />}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nConfirmModal.displayName = \"ConfirmModal\";\n","import React from \"react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface DeleteModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message?: React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n onConfirm: () => void;\n onCancel?: () => void;\n className?: string;\n}\n\n/**\n * 데이터를 삭제하거나 영구적인 작업을 수행하기 전, 사용자의 최종 승인을 받기 위한 경고 모달입니다.\n *\n * {@link DeleteModal}은 파괴적인(Destructive) 액션을 강조하기 위해 빨간색 경고 아이콘과\n * 눈에 띄는 삭제 버튼을 제공합니다. 사용자가 실수로 데이터를 삭제하는 것을 방지하는 안전장치 역할을 합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **영구적 데이터 삭제**: 게시글, 사용자 계정, 설정값 등을 삭제할 때\n * - **되돌릴 수 없는 작업**: 초기화, 데이터 덮어쓰기 등 주의가 필요한 작업을 수행할 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **구체적인 정보 포함**: 단순히 \"삭제하시겠습니까?\" 보다는 \"사용자 '홍길동'의 정보를 삭제하시겠습니까?\"와 같이 구체적인 대상을 명시하는 것이 좋습니다.\n * - **위험성 강조**: 해당 작업이 되돌릴 수 없음을 메시지에 포함하세요.\n */\nexport const DeleteModal = React.forwardRef<HTMLDivElement, DeleteModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"삭제\",\n message = \"정말로 삭제하시겠습니까?\",\n confirmText = \"삭제\",\n cancelText = \"취소\",\n onConfirm,\n onCancel,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm();\n onOpenChange(false);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={<AlertTriangle className=\"w-15 h-15 text-cms-red-400\" />}\n title={title}\n footer={\n <div className=\"flex gap-2 w-full\">\n <Button\n onClick={handleCancel}\n variant=\"outline\"\n className=\"flex-1 h-12\"\n >\n {cancelText}\n </Button>\n <Button\n onClick={handleConfirm}\n className={cn(\n \"flex-1 h-12\",\n \"bg-cms-red-400 hover:bg-cms-red-500\",\n )}\n >\n {confirmText}\n </Button>\n </div>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nDeleteModal.displayName = \"DeleteModal\";\n","import React from \"react\";\nimport { XCircle } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface ErrorModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n className?: string;\n}\n\n/**\n * 시스템 오류나 사용자의 잘못된 조작으로 인해 작업이 실패했음을 알리는 모달입니다.\n *\n * {@link ErrorModal}은 빨간색 X 아이콘을 통해 부정적인 결과임을 즉각적으로 전달하며,\n * 사용자가 문제를 인지하고 다음 행동을 취할 수 있도록 돕습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **API 통신 실패**: 서버 오류나 네트워크 문제로 요청을 처리할 수 없을 때\n * - **유효성 검사 실패**: 입력한 정보에 중대한 결함이 있어 처리가 중단되었을 때\n * - **권한 부족**: 특정 기능을 사용할 권한이 없음을 알릴 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **구체적인 원인 안내**: 단순히 \"오류가 발생했습니다\" 보다는 \"이미 존재하는 이메일입니다\"와 같이 해결 가능한 정보를 제공하세요.\n * - **해결 방법 제시**: 가능하다면 \"나중에 다시 시도해 주세요\" 또는 \"고객센터로 문의해 주세요\"와 같은 가이드를 포함하세요.\n */\nexport const ErrorModal = React.forwardRef<HTMLDivElement, ErrorModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"오류\",\n message,\n confirmText = \"확인\",\n onConfirm,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={<XCircle className=\"w-15 h-15 text-cms-red-400\" />}\n title={title}\n footer={\n <Button\n onClick={handleConfirm}\n className=\"w-full h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nErrorModal.displayName = \"ErrorModal\";\n","import React from \"react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface WarningModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n // 추가된 Props\n cancelText?: string;\n onCancel?: () => void;\n className?: string;\n}\n\n/**\n * 잠재적인 문제를 경고하거나 주의가 필요한 작업을 수행하기 전 사용자의 동의를 구하는 모달입니다.\n *\n * {@link WarningModal}은 주황색 경고 아이콘을 통해 주의를 환기시킵니다.\n * 완전한 파괴적 액션(삭제)은 아니지만, 데이터 변경이나 시스템 설정 변경 등\n * 신중함이 필요한 상황에서 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **데이터 변경**: 기존 정보를 대량으로 수정하거나 업데이트할 때\n * - **민감한 설정 변경**: 시스템 동작에 영향을 줄 수 있는 설정을 변경할 때\n * - **동작 확인**: 예기치 않은 부작용이 발생할 수 있는 기능을 실행할 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **위험성 명시**: 이 작업을 실행했을 때 어떤 결과가 초래될 수 있는지 명확히 설명하세요.\n * - **취소 옵션 제공**: 사용자가 마음을 바꿀 수 있도록 명확한 취소 버튼을 함께 배치하세요.\n */\nexport const WarningModal = React.forwardRef<HTMLDivElement, WarningModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"경고\",\n message,\n confirmText = \"확인\",\n onConfirm,\n // 기본값 설정\n cancelText = \"취소\",\n onCancel,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n // 취소 핸들러 추가\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={<AlertTriangle className=\"w-15 h-15 text-cms-orange-500\" />}\n title={title}\n footer={\n // 버튼 두 개를 가로로 배치하기 위해 flex 컨테이너 사용\n <div className=\"flex w-full gap-2\">\n <Button\n onClick={handleCancel}\n className=\"flex-1 h-12 bg-white border border-cms-gray-200 text-cms-gray-700 hover:bg-cms-gray-50\"\n >\n {cancelText}\n </Button>\n <Button\n onClick={handleConfirm}\n className=\"flex-1 h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n </div>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nWarningModal.displayName = \"WarningModal\";\n","import React from \"react\";\nimport { CheckCircle2 } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface SuccessModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n className?: string;\n}\n\n/**\n * 요청한 작업이 성공적으로 완료되었음을 축하하거나 알리는 모달입니다.\n *\n * {@link SuccessModal}은 초록색 체크 아이콘을 통해 긍정적인 결과를 전달합니다.\n * 단순한 Toast 알림보다 더 강조된 확인이 필요할 때 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **중요 작업 완료**: 회원가입 완료, 대규모 데이터 처리 완료 등\n * - **영구적 저장 완료**: 중요한 설정이나 게시글이 성공적으로 서버에 저장되었을 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **긍정적인 피드백**: \"처리가 완료되었습니다\" 보다는 \"성공적으로 저장되었습니다\"와 같이 명확한 피드백을 제공하세요.\n * - **후속 조치 안내**: 필요한 경우 다음 단계로 무엇을 해야 하는지(예: 리스트로 이동 등) 메시지에 포함하세요.\n */\nexport const SuccessModal = React.forwardRef<HTMLDivElement, SuccessModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"성공\",\n message,\n confirmText = \"확인\",\n onConfirm,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={\n <CheckCircle2 className=\"w-15 h-15 text-cms-green-500 border-cms-green-500\" />\n }\n title={title}\n footer={\n <Button\n onClick={handleConfirm}\n className=\"w-full h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nSuccessModal.displayName = \"SuccessModal\";\n","import { Toaster as Sonner } from \"sonner\";\nimport { type ComponentProps } from \"react\";\n\ntype ToasterProps = ComponentProps<typeof Sonner>;\n\n/**\n * 사용자의 액션에 대한 가벼운 피드백을 화면 구석에 일시적으로 표시하는 알림 컴포넌트입니다.\n *\n * {@link Toaster}는 시스템의 상태 변화(성공, 실패, 경고 등)를 비침습적인 방식으로 알립니다.\n * `sonner` 라이브러리를 기반으로 하며, CMS 디자인 가이드에 맞춘 스타일링이 적용되어 있습니다.\n * 어플리케이션 최상위 수준(App.tsx 등)에 한 번만 배치하면 어디서든 `toast()` 함수를 통해 알림을 띄울 수 있습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **간단한 결과 알림**: \"저장되었습니다\", \"복사 완료\" 등 짧은 피드백\n * - **비파괴적 액션 확인**: 사용자의 흐름을 방해하지 않고 알림만 주고 싶을 때\n * - **백그라운드 작업 완료**: 서버 요청이 성공적으로 처리되었음을 알릴 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **중요한 의사 결정**: 사용자가 반드시 읽고 확인 버튼을 눌러야 하는 내용은 `Modal`을 사용하세요.\n * - **긴 메시지**: 토스트는 수초 후 사라지므로, 읽는 데 시간이 걸리는 긴 텍스트는 부적절합니다.\n * - **에러 세부 정보**: 복잡한 에러 로그나 해결 방법이 포함된 에러는 `Modal`이나 전용 에러 페이지에서 보여주세요.\n *\n * ## Layout behavior\n *\n * - **Floating**: 화면 최상단 레이어에 고정된 위치(기본값: 하단 중앙)에 나타납니다.\n * - **Stacking**: 여러 개의 토스트가 동시에 발생하면 차례대로 쌓여서 표시됩니다.\n * - **Auto-dismiss**: 일정 시간(기본 4초)이 지나면 자동으로 사라집니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확하고 간결하게**: 핵심만 담은 짧은 문장을 사용하세요. (예: \"이미지가 업로드되었습니다\")\n * - **적절한 타입 사용**: `toast.success`, `toast.error` 등 상황에 맞는 메서드를 사용하여 색상과 아이콘으로 의미를 전달하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **중요 정보 포함**: 토스트는 금방 사라지므로, 계좌번호나 비밀번호 같은 중요 정보를 여기에만 표시해서는 안 됩니다.\n * - **과도한 사용**: 짧은 시간에 너무 많은 토스트가 발생하면 사용자에게 스트레스를 줄 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 최상위 컴포넌트 설정:\n *\n * ```tsx\n * function App() {\n * return (\n * <>\n * <Router />\n * <Toaster />\n * </>\n * );\n * }\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 다양한 토스트 호출 방법:\n *\n * ```tsx\n * // 기본\n * toast(\"환영합니다!\");\n *\n * // 성공\n * toast.success(\"저장에 성공했습니다.\");\n *\n * // 에러\n * toast.error(\"서버와의 연결이 원활하지 않습니다.\");\n *\n * // 상세 설명 포함\n * toast(\"알림\", {\n * description: \"새로운 메시지가 도착했습니다.\"\n * });\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Modal}, 더 중요하거나 명시적 확인이 필요한 알림\n */\nconst Toaster = ({ position = \"bottom-center\", ...props }: ToasterProps) => {\n return (\n <Sonner\n position={position}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast w-full flex items-center gap-3 p-4 rounded-cms-lg shadow-lg bg-cms-white text-cms-gray-900 !border !border-cms-blue-600 [&_[data-content]]:!flex-row [&_[data-content]]:!items-baseline\",\n title:\n \"group-[.toast]:text-cms-gray-900 group-[.toast]:font-bold group-[.toast]:text-sm group-[.toast]:mr-2 group-[.toast]:!font-bold\",\n description:\n \"group-[.toast]:text-cms-gray-500 group-[.toast]:text-xs group-[.toast]:font-medium\",\n actionButton:\n \"group-[.toast]:bg-cms-gray-900 group-[.toast]:text-cms-white\",\n cancelButton:\n \"group-[.toast]:bg-cms-gray-100 group-[.toast]:text-cms-gray-500\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","\"use client\";\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { cn } from \"@/utils/cn\";\nimport React from \"react\";\n\n/**\n * 마우스 호버나 포커스 시 간단한 힌트나 설명을 제공하는 툴팁 컴포넌트입니다.\n *\n * {@link ToolTip}은 UI 요소에 대한 추가 정보를 간결하게 제공하여\n * 사용자가 인터페이스를 더 쉽게 이해할 수 있도록 돕습니다.\n *\n * Radix UI의 Tooltip 컴포넌트를 기반으로 구현되어 접근성 기능이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **아이콘 설명**: 텍스트 레이블이 없는 아이콘 버튼의 기능을 설명할 때\n * - **축약된 텍스트**: 말줄임표(...)로 잘린 텍스트의 전체 내용을 보여줄 때\n * - **간단한 힌트**: 입력 필드나 기능에 대한 짧은 도움말을 제공할 때\n * - **추가 정보**: UI 요소의 상태나 제약사항을 간단히 알려줄 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **필수 정보**: 사용자가 반드시 알아야 하는 정보는 본문에 직접 표시하세요.\n * - **복잡한 내용**: 여러 줄의 긴 텍스트나 인터랙티브 요소는 Popover나 Modal을 사용하세요.\n * - **모바일 전용 UI**: 터치 기기에서는 호버가 없으므로 중요한 정보를 툴팁에만 의존하지 마세요.\n *\n * ## Layout behavior\n *\n * - **Positioning**: 트리거 요소를 기준으로 상하좌우 원하는 위치에 배치됩니다. (기본: top)\n * - **Auto-adjustment**: 화면 경계를 벗어나지 않도록 자동으로 위치를 조정합니다.\n * - **Floating**: 다른 UI 요소들 위에 떠 있으며, 레이아웃에 영향을 주지 않습니다.\n * - **Arrow**: 트리거와의 연결을 시각적으로 나타내는 화살표를 선택적으로 표시할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **간결한 텍스트**: 한두 줄 이내의 짧은 텍스트로 핵심만 전달하세요.\n * - **적절한 지연**: `delayDuration`을 조절하여 우발적인 호버로 인한 깜빡임을 방지하세요. (기본: 200ms)\n * - **명확한 트리거**: 툴팁이 붙는 요소가 호버 가능함을 사용자가 인지할 수 있도록 하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **중요 정보 숨기기**: 필수적인 정보를 툴팁에만 넣지 마세요.\n * - **상호작용 요소**: 툴팁 내부에 클릭 가능한 버튼이나 링크를 넣지 마세요. (Popover 사용 권장)\n * - **과도한 사용**: 모든 요소에 툴팁을 붙이면 오히려 사용성이 떨어집니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Support**: 포커스 가능한 요소에 툴팁이 붙으면 포커스 시 자동으로 표시됩니다.\n * - **ESC Key**: `Esc` 키를 누르면 툴팁이 닫힙니다.\n * - **Screen Readers**: `aria-describedby` 속성이 자동으로 부여되어 스크린 리더가 내용을 읽습니다.\n * - **Touch Devices**: 터치 기기에서는 탭으로 툴팁을 활성화할 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 아이콘 버튼에 툴팁 추가:\n *\n * ```tsx\n * <ToolTip content=\"설정\">\n * <Button variant=\"ghost\" size=\"icon\">\n * <SettingsIcon />\n * </Button>\n * </ToolTip>\n * ```\n *\n * 위치와 지연 시간 커스터마이징:\n *\n * ```tsx\n * <ToolTip\n * content=\"이 기능은 프리미엄 사용자만 이용할 수 있습니다\"\n * side=\"bottom\"\n * delayDuration={300}\n * >\n * <Button disabled>프리미엄 기능</Button>\n * </ToolTip>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Popover}, 클릭으로 열고 상호작용이 필요한 경우\n * - {@link Modal}, 중요한 정보나 복잡한 작업이 필요한 경우\n */\n\nexport interface ToolTipProps\n extends Omit<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>,\n \"content\"\n > {\n /** 툴팁을 트리거하는 요소 */\n children: React.ReactNode;\n /** 툴팁에 표시할 내용 */\n content: React.ReactNode;\n /** 툴팁이 나타날 위치 (기본: \"top\") */\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n /** 트리거로부터의 거리 (픽셀) (기본: 4) */\n sideOffset?: number;\n /** 트리거와의 정렬 방식 (기본: \"center\") */\n align?: \"start\" | \"center\" | \"end\";\n /** 마우스 호버 후 툴팁이 나타나기까지의 지연 시간 (밀리초) (기본: 200) */\n delayDuration?: number;\n /** 다른 툴팁에서 빠르게 진입 시 지연 건너뛰기 시간 (밀리초) (기본: 300) */\n skipDelayDuration?: number;\n /** 툴팁 위로 마우스를 이동할 수 있는지 여부 (기본: true) */\n disableHoverableContent?: boolean;\n /** 화살표 표시 여부 (기본: true) */\n showArrow?: boolean;\n /** Controlled 모드: 툴팁 열림 상태 */\n open?: boolean;\n /** Uncontrolled 모드: 초기 열림 상태 */\n defaultOpen?: boolean;\n /** 툴팁 열림 상태 변경 시 콜백 */\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const ToolTip = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n ToolTipProps\n>(\n (\n {\n children,\n content,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n delayDuration = 200,\n skipDelayDuration = 300,\n disableHoverableContent,\n showArrow = true,\n open,\n defaultOpen,\n onOpenChange,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <TooltipPrimitive.Provider\n delayDuration={delayDuration}\n skipDelayDuration={skipDelayDuration}\n disableHoverableContent={disableHoverableContent}\n >\n <TooltipPrimitive.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n >\n <TooltipPrimitive.Trigger asChild>\n {children}\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n side={side}\n sideOffset={sideOffset}\n align={align}\n className={cn(\n \"z-50 px-3 py-1.5\",\n \"rounded-md\",\n \"bg-cms-black text-cms-white\",\n \"text-xs font-medium\",\n \"shadow-md\",\n \"max-w-xs\",\n \"animate-in fade-in-0 zoom-in-95\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n >\n {content}\n {showArrow && (\n <TooltipPrimitive.Arrow className=\"fill-cms-black\" />\n )}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n },\n);\n\nToolTip.displayName = \"ToolTip\";\n","\"use client\";\n\nimport React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\nimport { ChevronUp, ChevronDown, ChevronsUpDown } from \"lucide-react\";\n\n/**\n * 데이터를 행과 열로 구조화하여 표시하는 테이블 컴포넌트입니다.\n *\n * {@link Table}은 Compound Component 패턴을 사용하여 구성되며,\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, TableCaption\n * 등의 하위 컴포넌트를 조합하여 유연한 테이블 레이아웃을 만들 수 있습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **데이터 목록**: 사용자 목록, 주문 내역, 제품 리스트 등 구조화된 데이터를 표시할 때\n * - **비교**: 여러 항목의 속성을 나란히 비교해야 할 때\n * - **정렬 및 필터**: 데이터를 정렬하거나 필터링해서 보여줄 때\n * - **대량 데이터**: 많은 양의 정보를 조직적으로 표시해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **레이아웃 목적**: 단순히 레이아웃을 만들기 위해서는 CSS Grid나 Flexbox를 사용하세요.\n * - **소량 데이터**: 2-3개의 간단한 정보는 리스트나 카드 형태가 더 적합할 수 있습니다.\n * - **복잡한 인터랙션**: 각 행마다 많은 버튼이나 입력이 필요하다면 카드 레이아웃을 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Responsive**: 기본적으로 스크롤 가능한 컨테이너로 래핑되어 모바일에서도 사용 가능합니다.\n * - **Full Width**: 부모 컨테이너의 전체 너비를 차지합니다.\n * - **Auto Height**: 내용에 따라 높이가 자동으로 조정됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 헤더**: TableHead를 사용하여 각 열의 의미를 명확히 표시하세요.\n * - **일관된 정렬**: 숫자는 오른쪽, 텍스트는 왼쪽 정렬하는 것이 일반적입니다.\n * - **적절한 variant**: 데이터가 많을 때는 `striped`나 `hoverable`을 사용하여 가독성을 높이세요.\n * - **Caption 활용**: 테이블의 목적을 설명하는 caption을 추가하면 접근성이 향상됩니다.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **과도한 열**: 너무 많은 열은 가독성을 해칩니다. 중요한 정보만 표시하세요.\n * - **중첩 테이블**: 테이블 안에 테이블을 넣지 마세요. 복잡도가 급격히 증가합니다.\n * - **빈 셀 남용**: 빈 셀이 많으면 데이터 구조를 다시 검토하세요.\n *\n * ## Accessibility\n *\n * - **Semantic HTML**: 적절한 `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` 태그를 사용합니다.\n * - **Scope Attribute**: TableHead는 `scope=\"col\"`을 자동으로 가집니다.\n * - **ARIA Attributes**: 정렬, 선택 등의 상태는 `aria-sort`, `aria-selected`로 표현됩니다.\n * - **Caption**: 테이블의 목적을 설명하는 `<caption>`을 사용할 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본 테이블 사용:\n *\n * ```tsx\n * <Table>\n * <TableCaption>사용자 목록</TableCaption>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>이메일</TableHead>\n * <TableHead align=\"right\">역할</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>hong@example.com</TableCell>\n * <TableCell align=\"right\">관리자</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * ```\n *\n * Striped 테이블:\n *\n * ```tsx\n * <Table striped hoverable>\n * <TableHeader>\n * <TableRow>\n * <TableHead>제품명</TableHead>\n * <TableHead align=\"right\">가격</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * {products.map((product) => (\n * <TableRow key={product.id}>\n * <TableCell>{product.name}</TableCell>\n * <TableCell align=\"right\">{product.price}</TableCell>\n * </TableRow>\n * ))}\n * </TableBody>\n * </Table>\n * ```\n * {@end-tool}\n */\n\nconst tableVariants = cva(cn(\"w-full caption-bottom text-sm [border-spacing:0]\"), {\n variants: {\n bordered: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n bordered: false,\n },\n});\n\nexport interface TableProps\n extends React.TableHTMLAttributes<HTMLTableElement>,\n VariantProps<typeof tableVariants> {\n /** zebra stripe 패턴 적용 여부 */\n striped?: boolean;\n /** row hover 효과 적용 여부 */\n hoverable?: boolean;\n /** 테두리 표시 여부 */\n bordered?: boolean;\n /** 좁은 padding 적용 여부 */\n compact?: boolean;\n}\n\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, striped, hoverable, bordered, compact, ...props }, ref) => (\n <div\n className={cn(\n \"relative w-full overflow-auto\",\n bordered && \"border border-cms-gray-300 rounded-lg\"\n )}\n >\n <table\n ref={ref}\n className={cn(tableVariants({ bordered }), className)}\n data-striped={striped}\n data-hoverable={hoverable}\n data-compact={compact}\n {...props}\n />\n </div>\n ),\n);\nTable.displayName = \"Table\";\n\n/* --------------------------------- TableHeader --------------------------------- */\n\nexport interface TableHeaderProps\n extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n TableHeaderProps\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(\n \"[&_tr]:border-0\",\n \"[&_th:first-child]:rounded-tl-lg\",\n \"[&_th:last-child]:rounded-tr-lg\",\n className\n )}\n {...props}\n />\n));\nTableHeader.displayName = \"TableHeader\";\n\n/* --------------------------------- TableBody --------------------------------- */\n\nexport interface TableBodyProps\n extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n TableBodyProps\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\n/* --------------------------------- TableFooter --------------------------------- */\n\nexport interface TableFooterProps\n extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n TableFooterProps\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-cms-gray-50 font-medium [&>tr]:last:border-b-0\",\n className,\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\n/* --------------------------------- TableRow --------------------------------- */\n\nconst tableRowVariants = cva(cn(\"border-b border-cms-gray-200\"), {\n variants: {\n hoverable: {\n true: \"hover:bg-cms-gray-100\",\n false: \"\",\n },\n selected: {\n true: \"bg-cms-primary-100\",\n false: \"\",\n },\n },\n defaultVariants: {\n hoverable: false,\n selected: false,\n },\n});\n\nexport interface TableRowProps\n extends React.HTMLAttributes<HTMLTableRowElement>,\n VariantProps<typeof tableRowVariants> {\n /** 선택된 행 표시 여부 */\n selected?: boolean;\n}\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, selected, ...props }, ref) => {\n const table = (ref as any)?.current?.closest(\"table\");\n const hoverable = table?.dataset?.hoverable === \"true\";\n const striped = table?.dataset?.striped === \"true\";\n\n return (\n <tr\n ref={ref}\n className={cn(\n tableRowVariants({ hoverable, selected }),\n striped && \"even:bg-cms-gray-50\",\n className,\n )}\n aria-selected={selected}\n {...props}\n />\n );\n },\n);\nTableRow.displayName = \"TableRow\";\n\n/* --------------------------------- TableHead --------------------------------- */\n\nexport interface TableHeadProps\n extends React.ThHTMLAttributes<HTMLTableCellElement> {\n /** 정렬 가능 여부 */\n sortable?: boolean;\n /** 정렬 방향 */\n sortDirection?: \"asc\" | \"desc\" | null;\n /** 정렬 클릭 핸들러 */\n onSort?: () => void;\n}\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n (\n {\n className,\n children,\n sortable,\n sortDirection,\n onSort,\n scope = \"col\",\n ...props\n },\n ref,\n ) => {\n const getSortIcon = () => {\n if (!sortable) return null;\n if (sortDirection === \"asc\") return <ChevronUp className=\"ml-2 h-4 w-4\" />;\n if (sortDirection === \"desc\")\n return <ChevronDown className=\"ml-2 h-4 w-4\" />;\n return <ChevronsUpDown className=\"ml-2 h-4 w-4 opacity-50\" />;\n };\n\n const content = (\n <>\n {children}\n {getSortIcon()}\n </>\n );\n\n return (\n <th\n ref={ref}\n scope={scope}\n className={cn(\n \"h-12 px-4 text-left align-middle font-semibold text-cms-gray-800\",\n \"bg-amber-50 border-0\",\n \"[&:has([role=checkbox])]:pr-0\",\n sortable && \"cursor-pointer select-none hover:bg-amber-100\",\n className,\n )}\n onClick={sortable ? onSort : undefined}\n aria-sort={\n sortDirection === \"asc\"\n ? \"ascending\"\n : sortDirection === \"desc\"\n ? \"descending\"\n : undefined\n }\n {...props}\n >\n {sortable ? (\n <div className=\"flex items-center\">{content}</div>\n ) : (\n content\n )}\n </th>\n );\n },\n);\nTableHead.displayName = \"TableHead\";\n\n/* --------------------------------- TableCell --------------------------------- */\n\nconst tableCellVariants = cva(cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\"), {\n variants: {\n align: {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n },\n },\n defaultVariants: {\n align: \"left\",\n },\n});\n\nexport interface TableCellProps\n extends React.TdHTMLAttributes<HTMLTableCellElement>,\n VariantProps<typeof tableCellVariants> {\n /** 텍스트 정렬 방식 */\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, align, ...props }, ref) => {\n const table = (ref as any)?.current?.closest(\"table\");\n const compact = table?.dataset?.compact === \"true\";\n\n return (\n <td\n ref={ref}\n className={cn(\n tableCellVariants({ align }),\n compact && \"p-2\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableCell.displayName = \"TableCell\";\n\n/* --------------------------------- TableCaption --------------------------------- */\n\nexport interface TableCaptionProps\n extends React.HTMLAttributes<HTMLTableCaptionElement> {}\n\nexport const TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n TableCaptionProps\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-cms-gray-600\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n","import { cn } from \"@/utils/cn\";\nimport { useCallback, useState } from \"react\";\nimport { useDropzone, Accept } from \"react-dropzone\";\nimport { ImageUploadIcon, XIcon as CloseIcon } from \"../icons\";\n\nexport interface ImageMetadata {\n width: number;\n height: number;\n aspectRatio: number;\n size: number;\n}\n\nexport interface ImageUploadProps {\n value?: File[];\n onChange?: (files: File[]) => void;\n maxFiles?: number;\n maxSize?: number;\n accept?: Accept;\n disabled?: boolean;\n className?: string;\n showPreview?: boolean;\n error?: boolean;\n onError?: (error: string) => void;\n validateImage?: (file: File, metadata: ImageMetadata) => string | null | Promise<string | null>;\n placeholder?: string;\n placeholderActive?: string;\n}\n\n/**\n * 드래그 앤 드롭 및 클릭을 통해 이미지를 업로드할 수 있는 컴포넌트입니다.\n *\n * {@link ImageUpload}는 사용자가 이미지 파일을 선택하고 업로드할 수 있게 합니다.\n * 드래그 앤 드롭, 클릭하여 선택, 미리보기 등의 기능을 제공합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **프로필 이미지 업로드**: 사용자 프로필 사진 등록 시\n * - **상품 이미지 등록**: 여러 상품 이미지를 한 번에 업로드해야 할 때\n * - **문서 첨부**: 이미지 형태의 문서나 스크린샷을 첨부할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **일반 파일 업로드**: 이미지가 아닌 다양한 형식의 파일을 업로드할 때는 일반 FileUpload 컴포넌트 사용\n * - **대용량 파일**: 매우 큰 파일의 경우 진행률 표시가 있는 별도 업로드 컴포넌트 고려\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본 이미지 업로드:\n *\n * ```tsx\n * <ImageUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={1}\n * maxSize={5 * 1024 * 1024} // 5MB\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 다중 이미지 업로드:\n *\n * ```tsx\n * <ImageUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={5}\n * showPreview={true}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 최소 이미지 크기 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * if (metadata.width < 800 || metadata.height < 600) {\n * return \"이미지는 최소 800x600 이상이어야 합니다.\";\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 정확한 이미지 크기 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * if (metadata.width !== 1920 || metadata.height !== 1080) {\n * return `이미지는 정확히 1920x1080이어야 합니다. (현재: ${metadata.width}x${metadata.height})`;\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 이미지 비율 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * const targetRatio = 16 / 9;\n * const tolerance = 0.1;\n * if (Math.abs(metadata.aspectRatio - targetRatio) > tolerance) {\n * return \"이미지 비율은 16:9여야 합니다.\";\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 복합 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * if (metadata.width > 4000) {\n * return \"이미지 너비는 4000px를 초과할 수 없습니다.\";\n * }\n * if (metadata.aspectRatio < 1) {\n * return \"세로 이미지는 업로드할 수 없습니다.\";\n * }\n * if (metadata.size > 2 * 1024 * 1024) {\n * return \"파일 크기는 2MB를 초과할 수 없습니다.\";\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 커스텀 안내 문구:\n *\n * ```tsx\n * <ImageUpload\n * placeholder=\"상품 이미지를 업로드하세요\"\n * placeholderActive=\"이미지를 드롭하세요\"\n * onChange={(files) => console.log(files)}\n * />\n * ```\n * {@end-tool}\n */\nexport const ImageUpload = ({\n value = [],\n onChange,\n maxFiles = 1,\n maxSize = 5 * 1024 * 1024, // 5MB\n accept = { \"image/*\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\"] },\n disabled = false,\n className,\n showPreview = true,\n error = false,\n onError,\n validateImage,\n placeholder = \"클릭하거나 파일을 드래그하세요\",\n placeholderActive = \"파일을 여기에 놓으세요\",\n}: ImageUploadProps) => {\n const [files, setFiles] = useState<File[]>(value);\n\n const loadImageMetadata = (file: File): Promise<ImageMetadata> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve({\n width: img.width,\n height: img.height,\n aspectRatio: img.width / img.height,\n size: file.size,\n });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(\"이미지를 로드할 수 없습니다.\"));\n };\n\n img.src = url;\n });\n };\n\n const onDrop = useCallback(\n async (acceptedFiles: File[], rejectedFiles: any[]) => {\n if (rejectedFiles.length > 0) {\n const error = rejectedFiles[0].errors[0];\n if (error.code === \"file-too-large\") {\n onError?.(`파일 크기는 ${maxSize / 1024 / 1024}MB를 초과할 수 없습니다.`);\n } else if (error.code === \"file-invalid-type\") {\n onError?.(\"지원하지 않는 파일 형식입니다.\");\n } else if (error.code === \"too-many-files\") {\n onError?.(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`);\n }\n return;\n }\n\n // 커스텀 검증 로직 실행\n if (validateImage) {\n const validatedFiles: File[] = [];\n\n for (const file of acceptedFiles) {\n try {\n const metadata = await loadImageMetadata(file);\n const validationError = await validateImage(file, metadata);\n\n if (validationError) {\n onError?.(validationError);\n continue;\n }\n\n validatedFiles.push(file);\n } catch (error) {\n onError?.((error as Error).message);\n }\n }\n\n if (validatedFiles.length === 0) return;\n\n const newFiles = maxFiles === 1 ? validatedFiles : [...files, ...validatedFiles].slice(0, maxFiles);\n setFiles(newFiles);\n onChange?.(newFiles);\n } else {\n const newFiles = maxFiles === 1 ? acceptedFiles : [...files, ...acceptedFiles].slice(0, maxFiles);\n setFiles(newFiles);\n onChange?.(newFiles);\n }\n },\n [files, maxFiles, maxSize, onChange, onError, validateImage]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept,\n maxSize,\n maxFiles,\n disabled,\n multiple: maxFiles > 1,\n });\n\n const removeFile = (index: number) => {\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onChange?.(newFiles);\n };\n\n const isSingleMode = maxFiles === 1;\n const hasFile = files.length > 0;\n const isMaxReached = files.length >= maxFiles;\n\n return (\n <div className={cn(\"w-full\", className)}>\n {!(!isSingleMode && isMaxReached) && (\n <div\n {...getRootProps()}\n className={cn(\n \"relative rounded-md border-2 border-solid\",\n \"transition-colors cursor-pointer\",\n \"flex flex-col items-center justify-center\",\n \"min-h-[200px]\",\n error\n ? \"border-red-500\"\n : isDragActive\n ? \"border-cms-black bg-cms-gray-100\"\n : \"border-cms-gray-300 bg-white hover:bg-cms-gray-50\",\n disabled && \"opacity-50 cursor-not-allowed pointer-events-none\",\n isSingleMode && hasFile && \"p-0\"\n )}\n >\n <input {...getInputProps()} />\n\n {isSingleMode && hasFile && showPreview ? (\n <div className=\"relative w-full h-full min-h-[200px] group flex items-center justify-center bg-cms-gray-100 rounded-md overflow-hidden\">\n <img\n src={URL.createObjectURL(files[0])}\n alt={files[0].name}\n className=\"max-w-full max-h-full object-contain\"\n />\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(0);\n }}\n className={cn(\n \"absolute top-2 right-2\",\n \"w-8 h-8 rounded-full\",\n \"flex items-center justify-center\",\n \"bg-white shadow-md\",\n \"hover:bg-cms-gray-100\",\n \"cursor-pointer\",\n \"border-none\"\n )}\n aria-label=\"파일 제거\"\n >\n <CloseIcon className=\"w-4 h-4\" />\n </button>\n </div>\n ) : (\n <div className=\"p-6 flex flex-col items-center\">\n <ImageUploadIcon className=\"text-cms-gray-400\" />\n <p className=\"mt-4 text-sm font-medium text-cms-black text-center\">\n {isDragActive ? placeholderActive : placeholder}\n </p>\n <p className=\"mt-1 text-xs text-cms-gray-400 text-center\">\n {maxFiles > 1 ? `최대 ${maxFiles}개` : \"1개\"} 파일, 최대{\" \"}\n {maxSize / 1024 / 1024}MB\n </p>\n </div>\n )}\n </div>\n )}\n\n {!isSingleMode && showPreview && files.length > 0 && (\n <div className=\"mt-4 grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 justify-items-center\">\n {files.map((file, index) => (\n <div\n key={index}\n className=\"relative group rounded-md overflow-hidden border border-cms-gray-300\"\n >\n <div className=\"aspect-square bg-cms-gray-100\">\n <img\n src={URL.createObjectURL(file)}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className={cn(\n \"absolute top-2 right-2\",\n \"w-7 h-7 rounded-full\",\n \"flex items-center justify-center\",\n \"bg-white shadow-md\",\n \"hover:bg-cms-gray-100\",\n \"cursor-pointer\",\n \"border-none\"\n )}\n aria-label=\"파일 제거\"\n >\n <CloseIcon className=\"w-3 h-3\" />\n </button>\n <div className=\"px-2 py-1.5 bg-white border-t border-cms-gray-300\">\n <p className=\"text-xs text-cms-gray-600 truncate\">{file.name}</p>\n <p className=\"text-xs text-cms-gray-400\">\n {(file.size / 1024).toFixed(1)} KB\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nImageUpload.displayName = \"ImageUpload\";\n","import { cn } from \"@/utils/cn\";\nimport { useCallback, useState } from \"react\";\nimport { useDropzone, Accept } from \"react-dropzone\";\nimport { FileUploadIcon, FileIcon, XIcon as CloseIcon } from \"../icons\";\n\nexport interface FileUploadProps {\n value?: File[];\n onChange?: (files: File[]) => void;\n maxFiles?: number;\n maxSize?: number;\n accept?: Accept;\n disabled?: boolean;\n className?: string;\n onError?: (error: string) => void;\n}\n\n/**\n * 드래그 앤 드롭 및 클릭을 통해 파일을 업로드할 수 있는 컴포넌트입니다.\n *\n * {@link FileUpload}는 사용자가 다양한 형식의 파일을 선택하고 업로드할 수 있게 합니다.\n * 드래그 앤 드롭, 클릭하여 선택, 파일 목록 표시 등의 기능을 제공합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **문서 첨부**: PDF, Word, Excel 등의 문서 파일을 업로드할 때\n * - **다양한 파일 형식**: 이미지뿐만 아니라 여러 종류의 파일을 업로드할 때\n * - **파일 목록 관리**: 업로드된 파일의 이름과 크기를 확인해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **이미지 전용**: 이미지만 업로드하고 미리보기가 필요한 경우는 {@link ImageUpload} 사용\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본 파일 업로드:\n *\n * ```tsx\n * <FileUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={1}\n * maxSize={10 * 1024 * 1024} // 10MB\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 다중 파일 업로드 (PDF만):\n *\n * ```tsx\n * <FileUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={5}\n * accept={{ \"application/pdf\": [\".pdf\"] }}\n * />\n * ```\n * {@end-tool}\n */\nexport const FileUpload = ({\n value = [],\n onChange,\n maxFiles = 5,\n maxSize = 10 * 1024 * 1024, // 10MB\n accept,\n disabled = false,\n className,\n onError,\n}: FileUploadProps) => {\n const [files, setFiles] = useState<File[]>(value);\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: any[]) => {\n if (rejectedFiles.length > 0) {\n const error = rejectedFiles[0].errors[0];\n if (error.code === \"file-too-large\") {\n onError?.(\n `파일 크기는 ${maxSize / 1024 / 1024}MB를 초과할 수 없습니다.`,\n );\n } else if (error.code === \"file-invalid-type\") {\n onError?.(\"지원하지 않는 파일 형식입니다.\");\n } else if (error.code === \"too-many-files\") {\n onError?.(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`);\n }\n return;\n }\n\n const newFiles = [...files, ...acceptedFiles].slice(0, maxFiles);\n setFiles(newFiles);\n onChange?.(newFiles);\n },\n [files, maxFiles, maxSize, onChange, onError],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept,\n maxSize,\n maxFiles,\n disabled,\n multiple: maxFiles > 1,\n });\n\n const removeFile = (index: number) => {\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onChange?.(newFiles);\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n };\n\n const isMaxReached = files.length >= maxFiles;\n\n return (\n <div className={cn(\"w-full\", className)}>\n {!isMaxReached && (\n <div\n {...getRootProps()}\n className={cn(\n \"relative rounded-md border-2 border-dashed\",\n \"transition-colors cursor-pointer\",\n \"flex flex-col items-center justify-center\",\n \"min-h-[200px] p-6\",\n isDragActive\n ? \"border-cms-black bg-cms-gray-100\"\n : \"border-cms-gray-300 bg-white hover:bg-cms-gray-50\",\n disabled && \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n <input {...getInputProps()} />\n <FileUploadIcon className=\"text-cms-gray-400\" />\n <p className=\"mt-4 text-sm font-medium text-cms-black text-center\">\n {isDragActive\n ? \"파일을 여기에 놓으세요\"\n : \"클릭하거나 파일을 드래그하세요\"}\n </p>\n <p className=\"mt-1 text-xs text-cms-gray-400 text-center\">\n 최대 {maxFiles}개 파일, 최대 {maxSize / 1024 / 1024}MB\n </p>\n </div>\n )}\n\n {files.length > 0 && (\n <div className={cn(\"space-y-1.5\", isMaxReached ? \"\" : \"mt-4\")}>\n {files.map((file, index) => (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-2 px-3 py-2\",\n \"rounded-md border border-cms-gray-300\",\n \"bg-white hover:bg-cms-gray-50\",\n \"transition-colors group\",\n )}\n >\n <FileIcon className=\"w-8 h-8\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-cms-black truncate leading-tight\">\n {file.name}\n </p>\n <p className=\"text-xs text-cms-gray-400 leading-tight\">\n {formatFileSize(file.size)}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => removeFile(index)}\n className={cn(\n \"w-7 h-7 rounded-full shrink-0\",\n \"flex items-center justify-center\",\n \"text-cms-gray-400\",\n \"hover:bg-cms-gray-100 hover:text-cms-black\",\n \"transition-colors\",\n \"border-none\",\n )}\n aria-label=\"파일 제거\"\n >\n <CloseIcon className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nFileUpload.displayName = \"FileUpload\";\n"],"names":["cn","inputs","twMerge","clsx","buttonVariants","cva","Button","forwardRef","className","variant","size","props","ref","jsx","sizeClasses","LoadingCircle","DEFAULT_SIZE","DEFAULT_STROKE_WIDTH","IconWrapper","React","children","strokeWidth","viewBox","ChevronDownIcon","ChevronDownFillIcon","ChevronUpIcon","ChevronUpFillIcon","ChevronLeftIcon","ChevronLeftFillIcon","ChevronRightIcon","ChevronRightFillIcon","ChevronsLeftIcon","ChevronsRightIcon","ArrowLeftIcon","ArrowRightIcon","MenuIcon","AlignIcon","XIcon","CheckIcon","CheckCircleIcon","InfoIcon","ErrorIcon","WarningIcon","HelpIcon","CloseIcon","PlusIcon","PlusCircleIcon","TrashIcon","SaveIcon","SettingsIcon","RefreshIcon","LinkIcon","PinIcon","FileIcon","FileTextIcon","ExcelIcon","FileUploadIcon","ImageUploadIcon","CalendarIcon","MedicashIcon","jsxs","NewBadgeIcon","dropdownTriggerVariants","Dropdown","options","value","placeholder","onValueChange","disabled","dropdownClassName","searchable","clearable","multiple","maxHeight","isOpen","setIsOpen","useState","searchTerm","setSearchTerm","selectedValues","setSelectedValues","dropdownRef","useRef","searchInputRef","selectedOption","option","selectedLabel","filteredOptions","handleToggle","handleOptionClick","newSelectedValues","v","handleClear","e","handleKeyDown","useEffect","handleClickOutside","event","ClearIcon","isSelected","Select","label","helperText","error","required","Combobox","loading","createable","onCreateOption","hasExactMatch","optionsWithCreate","createValue","_a","Popover","PopoverPrimitive","PopoverTrigger","PopoverContent","align","sideOffset","popoverMenuItemVariants","PopoverMenuItem","icon","textVariants","Text","decoration","Component","textInputVariants","labelVariants","errorMessageVariants","helperTextVariants","TextInput","fullWidth","errorMessage","showCharCount","maxLength","defaultValue","onChange","id","labelLayout","labelWidth","internalValue","setInternalValue","inputId","finalVariant","currentValue","charCount","handleChange","hasHeader","isHorizontal","Fragment","buildFormatLongFn","args","width","buildLocalizeFn","context","valuesArray","defaultWidth","index","buildMatchFn","string","matchPattern","matchResult","matchedString","parsePatterns","key","findIndex","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","millisecondsInWeek","millisecondsInDay","constructFromSymbol","constructFrom","date","normalizeDates","dates","normalize","defaultOptions","getDefaultOptions","toDate","argument","startOfWeek","weekStartsOn","_b","_d","_c","_date","day","diff","formatDistanceLocale","formatDistance","token","count","result","tokenValue","formatRelativeLocale","formatRelative","_baseDate","_options","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","localize","dirtyNumber","number","rem100","quarter","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","dateFormats","timeFormats","dateTimeFormats","formatLong","enUS","ko","tzName","timeZone","format","offsetFormatCache","offsetCache","tzOffset","offsetStr","calcOffset","captures","offsetRe","cacheStr","values","hours","minutes","seconds","TZDateMini","adjustToSystemTZ","syncToInternal","tz","offset","time","re","method","utcMethod","syncFromInternal","baseOffset","prevHour","systemOffset","prevHourSystemOffset","systemDSTChange","dstShift","offsetDiff","systemDate","systemSecondsOffset","secondsOffset","postBaseOffset","postOffset","postOffsetDiff","offsetChanged","postDiff","newBaseOffset","newOffset","offsetChange","TZDate","sign","month","year","locales","addDays","amount","addMonths","dayOfMonth","endOfDesiredMonth","daysInMonth","startOfISOWeek","getISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","getTimezoneOffsetInMilliseconds","utcDate","startOfDay","differenceInCalendarDays","laterDate","earlierDate","laterDate_","earlierDate_","laterStartOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","startOfISOWeekYear","fourthOfJanuary","addWeeks","addYears","max","date_","min","isSameDay","dateLeft_","dateRight_","isDate","isValid","differenceInCalendarMonths","yearsDiff","monthsDiff","endOfMonth","normalizeInterval","interval","start","end","eachMonthOfInterval","reversed","endTime","step","startOfMonth","endOfYear","startOfYear","eachYearOfInterval","endOfWeek","endOfISOWeek","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","output","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","timestamp","delimiter","absOffset","dateLongFormatter","timeLongFormatter","longFormatters","datePattern","timePattern","dateTimeFormat","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","input","_message","message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","locale","defaultLocale","_f","_e","_h","_g","originalDate","parts","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","part","formatter","matched","getDaysInMonth","monthIndex","lastDayOfMonth","getMonth","getYear","isAfter","dateToCompare","isBefore","isSameMonth","isSameYear","setMonth","midMonth","setYear","FIVE_WEEKS","FOUR_WEEKS","getBroadcastWeeksInMonth","dateLib","firstDayOfMonth","firstDayOfWeek","broadcastStartDate","lastDateOfLastWeek","startOfBroadcastWeek","firstOfMonth","endOfBroadcastWeek","startDate","numberOfWeeks","dateFnsEnUS","modifiers","formatDate","d","weekNumber","DateLib","overrides","dateLeft","dateRight","years","uniqueYears","yearsArray","y","formatted","_dateLib","numerals","digitMap","i","digit","code","localeCode","dateFnsKo","DatePicker","internalDate","setInternalDate","dayjs","selected","useMemo","handleDayClick","selectedDate","handleApply","handleCancel","displayValue","disabledDays","DayPicker","getQuickSelectOptions","now","DateRangePicker","startLabel","endLabel","internalRange","setInternalRange","fromDay","toDay","handleQuickSelect","range","from","to","numberOfDays","TimePicker","minuteStep","showIcon","selectedHour","setSelectedHour","selectedMinute","setSelectedMinute","selectedPeriod","setSelectedPeriod","hourScrollRef","minuteScrollRef","timeRegex24h","timeRegex12h","hour","period","_","formattedMinute","hourButton","minuteButton","Clock","minute","switchVariants","Switch","SwitchPrimitives","RadioGroup","RadioGroupPrimitives","radioGroupItemVariants","radioGroupIndicatorVariants","RadioGroupItem","NavigationMenuItem","menu","selectedUrl","onMenuClick","isSubMenuSelected","sub","Accordion","ChevronDown","subItem","subSelected","SideNavigation","title","menus","headerSlot","openedMenus","setOpenedMenus","paginationButtonVariants","usePagination","currentPage","totalPages","siblingCount","leftSiblingIndex","rightSiblingIndex","shouldShowLeftEllipsis","shouldShowRightEllipsis","Pagination","onPageChange","showPrevNext","pages","handlePrevious","handleNext","handlePageClick","page","ChevronLeft","isActive","ChevronRight","Checkbox","checkboxId","CheckboxPrimitive","Check","Modal","open","onOpenChange","footer","showCloseButton","DialogPrimitive","X","ConfirmModal","confirmText","onConfirm","handleConfirm","CheckCircle2","DeleteModal","cancelText","onCancel","AlertTriangle","ErrorModal","XCircle","WarningModal","SuccessModal","Toaster","position","Sonner","ToolTip","content","side","delayDuration","skipDelayDuration","disableHoverableContent","showArrow","defaultOpen","TooltipPrimitive","tableVariants","Table","striped","hoverable","bordered","compact","TableHeader","TableBody","TableFooter","tableRowVariants","TableRow","table","TableHead","sortable","sortDirection","onSort","scope","getSortIcon","ChevronUp","ChevronsUpDown","tableCellVariants","TableCell","TableCaption","ImageUpload","maxFiles","maxSize","accept","showPreview","onError","validateImage","placeholderActive","files","setFiles","loadImageMetadata","file","resolve","reject","img","url","onDrop","useCallback","acceptedFiles","rejectedFiles","validatedFiles","metadata","validationError","newFiles","getRootProps","getInputProps","isDragActive","useDropzone","removeFile","isSingleMode","hasFile","isMaxReached","FileUpload","formatFileSize","bytes"],"mappings":"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","x_google_ignoreList":[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87]}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/utils/cn.ts","../src/components/Button/Button.tsx","../src/components/LoadingCircle/LoadingCircle.tsx","../src/components/icons/index.tsx","../src/components/Dropdown/Dropdown.tsx","../src/components/Dropdown/Select.tsx","../src/components/Dropdown/Combobox.tsx","../src/components/Popover/Popover.tsx","../src/components/Popover/PopoverMenuItem.tsx","../src/components/Text/Text.tsx","../src/components/TextInput/TextInput.tsx","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildFormatLongFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildLocalizeFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constants.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/constructFrom.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/normalizeDates.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/defaultOptions.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/toDate.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatDistance.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatRelative.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/localize.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/match.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US/_lib/formatLong.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/en-US.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/formatDistance.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/formatLong.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/formatRelative.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/localize.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko/_lib/match.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/locale/ko.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/tzName/index.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/tzOffset/index.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/date/mini.js","../node_modules/.pnpm/@date-fns+tz@1.4.1/node_modules/@date-fns/tz/date/index.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addDays.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addMonths.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfDay.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarDays.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfISOWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addWeeks.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/addYears.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/max.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/min.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameDay.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isDate.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isValid.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/differenceInCalendarMonths.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/normalizeInterval.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachMonthOfInterval.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/eachYearOfInterval.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/endOfISOWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDayOfYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getISOWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/startOfWeekYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getWeek.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/addLeadingZeros.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/lightFormatters.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/formatters.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/format/longFormatters.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/_lib/protectedTokens.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/format.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getDaysInMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/getYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isAfter.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isBefore.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/isSameYear.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setMonth.js","../node_modules/.pnpm/date-fns@4.1.0/node_modules/date-fns/setYear.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/helpers/getBroadcastWeeksInMonth.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/helpers/startOfBroadcastWeek.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/helpers/endOfBroadcastWeek.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/locale/en-US.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/classes/DateLib.js","../node_modules/.pnpm/react-day-picker@9.13.0_react@18.3.1/node_modules/react-day-picker/dist/esm/locale/ko.js","../src/components/DatePicker/DatePicker.tsx","../src/components/DateRangePicker/DateRangePicker.tsx","../src/components/TimePicker/TimePicker.tsx","../src/components/Switch/Switch.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/SideNavigation/SideNavigation.tsx","../src/components/Pagination/Pagination.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Modal/Modal.tsx","../src/components/Modal/ConfirmModal.tsx","../src/components/Modal/DeleteModal.tsx","../src/components/Modal/ErrorModal.tsx","../src/components/Modal/WarningModal.tsx","../src/components/Modal/SuccessModal.tsx","../src/components/Toast/Toaster.tsx","../src/components/ToolTip/ToolTip.tsx","../src/components/Table/Table.tsx","../src/components/ImageUpload/ImageUpload.tsx","../src/components/FileUpload/FileUpload.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { cn } from \"@/utils/cn\";\nimport { cva, VariantProps } from \"class-variance-authority\";\nimport { ButtonHTMLAttributes, forwardRef } from \"react\";\n\n/**\n * 버튼 컴포넌트의 스타일 variant를 정의합니다.\n *\n * @variant default - 기본 스타일 (회색 배경)\n * @variant secondary - 보조 스타일 (밝은 회색 배경)\n * @variant outline - 테두리 스타일 (투명 배경)\n * @variant ghost - 고스트 스타일 (투명 배경, hover시 배경)\n * @variant link - 링크 스타일 (밑줄)\n *\n * @size default - 기본 크기 (h-10)\n * @size sm - 작은 크기 (h-8)\n * @size lg - 큰 크기 (h-11)\n * @size icon - 아이콘 크기 (정사각형 10x10)\n */\nexport const buttonVariants = cva(\n cn(\n \"inline-flex items-center justify-center gap-2\",\n \"rounded-md ring-offset-white\",\n \"text-sm font-medium\",\n \"focus-visible:outline-none focus-visible:ring-2\",\n \"focus-visible:ring-slate-950 focus-visible:ring-offset-2\",\n \"disabled:pointer-events-none disabled:opacity-60\",\n \"transition-colors cursor-pointer\",\n ),\n {\n variants: {\n variant: {\n default:\n \"border-0 bg-cms-gray-850 text-cms-white hover:bg-cms-gray-750\",\n secondary: cn(\n \"border-0 bg-cms-gray-300 text-cms-black\",\n \"hover:bg-cms-gray-200 hover:text-cms-gray-800\",\n ),\n outline: cn(\n \"border border-cms-gray-400 bg-transparent\",\n \"hover:bg-cms-gray-200 hover:text-cms-gray-900\",\n ),\n\n ghost:\n \"border-0 bg-transparent hover:bg-cms-gray-200 hover:text-cms-gray-800\",\n link: \"border-0 text-cms-black underline-offset-4 hover:underline\",\n },\n size: {\n default: \"h-10 px-4 py-2\",\n sm: \"h-8 rounded-sm px-3\",\n lg: \"h-11 rounded-sm px-8\",\n icon: \"h-10 w-10\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ButtonProps\n extends\n ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {}\n\n/**\n * 사용자의 클릭 동작을 통해 특정 액션을 실행하거나 페이지를 이동시키는 기본적인 컴포넌트입니다.\n *\n * {@link Button}은 다양한 시각적 스타일(Variant)과 크기(Size)를 제공하여 인터페이스의\n * 계층 구조를 명확히 하고 사용자의 행동을 유도합니다.\n *\n * ## When (언제 사용해야 하는가)\n * ### 사용해야 하는 경우\n *\n * - **액션 실행**: 데이터 저장, 삭제, 전송 등 시스템 상태를 변경하는 작업을 수행할 때\n * - **명확한 콜 투 액션(CTA)**: 페이지 내에서 가장 중요한 작업을 강조할 때\n * - **내비게이션**: 다른 페이지로의 이동이나 섹션 전환이 필요할 때\n * - **상태 변경**: 모달 열기, 드롭다운 토글 등 UI 요소를 제어할 때\n *\n * ### 사용하지 말아야 하는 경우:\n *\n * - **단순 링크**: 본문 내에서 다른 페이지로 연결되는 텍스트 링크는 `<a>` 태그나 별도의 Link 컴포넌트를 사용하세요\n * - **여러 선택지 중 하나 선택**: `RadioButton`이나 `Checkbox`를 고려하세요\n * - **탐색 메뉴**: `SideNavigation`이나 상단 메뉴에는 전용 메뉴 아이템을 사용하세요\n *\n * ---\n *\n * ## Layout behavior\n *\n * - **Inline-flex**: 기본적으로 인라인 블록 요소처럼 동작하여 텍스트 흐름 내에 배치됩니다.\n * - **W-full**: `fullWidth` prop을 통해 부모 컨테이너의 전체 너비를 차지하게 할 수 있습니다.\n * - **Center Alignment**: 버튼 내부의 텍스트와 아이콘은 항상 중앙에 정렬됩니다.\n * - **Responsive**: 모바일 환경을 위해 `fullWidth`를 적극 활용하는 것이 좋습니다.\n *\n * ---\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 동사 사용**: '저장', '삭제', '추가' 등 행동을 직접적으로 나타내는 레이블을 사용하세요.\n * - **계층 구조 유지**: 한 화면에 여러 버튼이 있다면 가장 중요한 버튼에만 'primary' variant를 적용하세요.\n * - **일관된 위치**: 확인 버튼은 오른쪽, 취소 버튼은 왼쪽에 배치하는 등 일관된 배치 규칙을 따르세요.\n * - **로딩 상태 활용**: 서버 통신 등 시간이 걸리는 작업 시 `isLoading` 상태를 표시하여 중복 클릭을 방지하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **레이블 생략 지양**: 아이콘만 있는 버튼(Icon Button)의 경우 접근성을 위해 반드시 `aria-label`을 제공하세요.\n * - **너무 긴 텍스트**: 버튼 레이블은 가급적 짧고 간결하게 유지하세요 (보통 2-4자).\n * - **모호한 표현**: '확인'보다는 '변경사항 저장'과 같이 구체적인 결과가 예상되는 레이블이 좋습니다.\n *\n * ---\n *\n * ## Accessibility\n *\n * - **Keyboard Support**: `Enter`와 `Space` 키로 실행 가능하며, 포커스 상태가 시각적으로 명확히 표시됩니다.\n * - **ARIA Attributes**: `disabled` 상태 시 `aria-disabled`가 자동으로 처리됩니다.\n * - **Role**: 기본적으로 `<button>` 태그를 사용하며, 필요한 경우 `asChild`를 통해 다른 요소(Link 등)로 렌더링하면서도 버튼의 스타일을 유지할 수 있습니다.\n *\n * ---\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 버튼 사용 예시:\n *\n * ```tsx\n * <div className=\"flex gap-2\">\n * <Button variant=\"primary\">저장하기</Button>\n * <Button variant=\"outline\">취소</Button>\n * <Button variant=\"ghost\">닫기</Button>\n * </div>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 아이콘과 로딩 상태가 포함된 버튼:\n *\n * ```tsx\n * <Button\n * isLoading={isSubmitting}\n * leftIcon={<SaveIcon />}\n * onClick={handleSubmit}\n * >\n * 데이터 저장\n * </Button>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 크기 변형 예시:\n *\n * ```tsx\n * <div className=\"flex items-center gap-2\">\n * <Button size=\"sm\">Small</Button>\n * <Button size=\"md\">Medium</Button>\n * <Button size=\"lg\">Large</Button>\n * </div>\n * ```\n * {@end-tool}\n *s\n * See also:\n *\n * - {@link TextInput}, 입력과 함께 액션이 필요한 경우\n * - {@link Modal}, 중요한 결정을 위한 버튼을 포함하는 오버레이\n * - {@link IconButton}, 아이콘만으로 구성된 버튼을 구성할 때\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, ...props }, ref) => {\n return (\n <button\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","import { cn } from \"@/utils/cn\";\n\ninterface LoadingCircleProps {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\nconst sizeClasses = {\n sm: \"h-4 w-4\",\n md: \"h-8 w-8\",\n lg: \"h-16 w-16\",\n};\n\n/**\n * 시스템이 데이터를 처리 중이거나 다음 화면을 준비 중임을 시각적으로 나타내는 인디케이터입니다.\n *\n * {@link LoadingCircle}은 회전하는 원형 애니메이션을 통해 작업이 진행 중임을 알려\n * 사용자가 시스템이 멈춘 것으로 오해하지 않도록 돕습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **데이터 로딩**: 페이지 진입 시 API로부터 데이터를 불러올 때\n * - **작업 처리 중**: 버튼 클릭 후 서버 응답을 기다릴 때\n * - **업로드/다운로드**: 파일 전송 상태를 표시할 때\n * - **점진적 로딩**: 무한 스크롤 등 하단에 추가 데이터를 불러올 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **짧은 대기 시간**: 0.3초 미만의 아주 짧은 대기 시간에는 오히려 화면을 깜빡거리게 할 수 있으므로 생략하는 것이 좋습니다.\n * - **진행률 표시**: 전체 작업 중 어느 정도 진행되었는지 정확한 수치가 중요한 경우 Progress Bar를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Centered**: 기본적으로 컨테이너의 중앙에 배치되도록 설정되어 있습니다.\n * - **Fixed vs Inline**: 페이지 전체 로딩 시에는 고정된 위치(Overlay)에, 버튼 내부 등에는 인라인으로 배치할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 크기 선택**: 로딩이 일어나는 맥락(페이지 전체, 카드 내부, 버튼 내부 등)에 맞는 `size`를 선택하세요.\n * - **텍스트와 병행**: 필요한 경우 '불러오는 중...'과 같은 텍스트를 함께 표시하여 의미를 더 명확히 하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **남용 지양**: 한 화면에 너무 많은 로딩 서클이 동시에 나타나면 사용자에게 피로감을 줄 수 있습니다.\n * - **무한 로딩**: 작업이 실패한 경우 로딩을 멈추고 적절한 에러 메시지를 표시해야 합니다.\n *\n * ## Accessibility\n *\n * - **Role**: `role=\"status\"` 또는 `role=\"progressbar\"`를 사용하여 현재 상태를 스크린 리더에 알립니다.\n * - **Aria Label**: 시각적으로 확인이 어려운 사용자를 위해 `aria-label=\"로딩 중\"`과 같은 정보를 제공하는 것이 좋습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 로딩 서클 사용 예시:\n *\n * ```tsx\n * {isLoading ? (\n * <LoadingCircle size=\"md\" />\n * ) : (\n * <DataContent />\n * )}\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 버튼 내부의 로딩 상태:\n *\n * ```tsx\n * <Button disabled={isSubmitting}>\n * {isSubmitting && <LoadingCircle size=\"sm\" className=\"mr-2\" />}\n * 제출하기\n * </Button>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Button}, 버튼 자체의 로딩 상태를 지원함\n * - {@link Modal}, 로딩 상태를 포함할 수 있는 오버레이\n */\nexport function LoadingCircle({ size = \"lg\", className }: LoadingCircleProps) {\n return (\n <div className=\"flex items-center justify-center\">\n <div\n className={cn(\n sizeClasses[size],\n \"animate-spin rounded-full\",\n \"border-2 border-cms-gray-500 border-b-transparent\",\n className,\n )}\n />\n </div>\n );\n}\n","/**\n * @license\n * This icon set incorporates path data from Lucide (https://lucide.dev)\n * and Feather Icons (https://feathericons.com), which are licensed under the ISC License.\n *\n * ISC License\n * Copyright (c) 2022, Lucide Contributors\n */\n\nimport React, { SVGProps } from \"react\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface IconProps extends SVGProps<SVGSVGElement> {\n size?: number;\n strokeWidth?: number;\n}\n\nconst DEFAULT_SIZE = 40;\nconst DEFAULT_STROKE_WIDTH = 2.0;\n\nconst IconWrapper = React.forwardRef<SVGSVGElement, IconProps>(\n (\n {\n children,\n className,\n size = DEFAULT_SIZE,\n strokeWidth = DEFAULT_STROKE_WIDTH,\n viewBox = \"0 0 24 24\",\n ...props\n },\n ref,\n ) => (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox={viewBox}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={cn(\"text-current\", className)}\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n {children}\n </svg>\n ),\n);\nIconWrapper.displayName = \"IconWrapper\";\n\n// --- Navigation & Arrows ---\nexport const ChevronDownIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M6 9L12 15L18 9\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronDownFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M6 9L12 15L18 9Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronUpIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M18 15L12 9L6 15\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronUpFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M18 15L12 9L6 15Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronLeftIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M15 18L9 12L15 6\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronLeftFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M15 18L9 12L15 6Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronRightIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M9 18L15 12L9 6\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronRightFillIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M9 18L15 12L9 6Z\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronsLeftIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M11 17L6 12L11 7\" />\n <path d=\"M18 17L13 12L18 7\" />\n </IconWrapper>\n ),\n);\n\nexport const ChevronsRightIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M13 17L18 12L13 7\" />\n <path d=\"M6 17L11 12L6 7\" />\n </IconWrapper>\n ),\n);\n\nexport const ArrowLeftIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M19 12H5\" />\n <path d=\"M12 19L5 12L12 5\" />\n </IconWrapper>\n ),\n);\n\nexport const ArrowRightIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M5 12H19\" />\n <path d=\"M12 5L19 12L12 19\" />\n </IconWrapper>\n ),\n);\n\nexport const MenuIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </IconWrapper>\n ),\n);\n\nexport const AlignIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"9\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" fill=\"currentColor\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" fill=\"currentColor\" />\n </IconWrapper>\n ),\n);\n\nexport const MessageSquareIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </IconWrapper>\n ),\n);\n\nexport const MessageSquareTextIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n <line x1=\"8\" x2=\"16\" y1=\"7\" y2=\"7\" />\n <line x1=\"8\" x2=\"16\" y1=\"10\" y2=\"10\" />\n <line x1=\"8\" x2=\"16\" y1=\"13\" y2=\"13\" />\n </IconWrapper>\n ),\n);\n\nexport const MessageCircleIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M21 11.5a8.38 8.38 0 0 1-.9 3.8 8.5 8.5 0 0 1-7.6 4.7 8.38 8.38 0 0 1-3.8-.9L3 21l1.9-5.7a8.38 8.38 0 0 1-.9-3.8 8.5 8.5 0 0 1 4.7-7.6 8.38 8.38 0 0 1 3.8-.9h.5a8.48 8.48 0 0 1 8 8v.5z\" />\n </IconWrapper>\n ),\n);\n\n// --- Status & Feedback ---\nexport const XIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m15 9-6 6\" />\n <path d=\"m9 9 6 6\" />\n </IconWrapper>\n ),\n);\n\nexport const CheckIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M20 6L9 17L4 12\" />\n </IconWrapper>\n ),\n);\n\nexport const CheckCircleIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m8.5 12 2.5 2.5 5-5\" />\n </IconWrapper>\n ),\n);\n\nexport const InfoIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"16\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"8\" y2=\"8\" />\n </IconWrapper>\n ),\n);\n\nexport const ErrorIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"12\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"16\" y2=\"16\" />\n </IconWrapper>\n ),\n);\n\nexport const WarningIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" x2=\"12\" y1=\"9\" y2=\"13\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </IconWrapper>\n ),\n);\n\nexport const HelpIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" x2=\"12.01\" y1=\"17\" y2=\"17\" />\n </IconWrapper>\n ),\n);\n\n// --- Actions ---\nexport const CloseIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M18 6L6 18\" />\n <path d=\"M6 6L18 18\" />\n </IconWrapper>\n ),\n);\n\nexport const PlusIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <line x1=\"12\" x2=\"12\" y1=\"5\" y2=\"19\" />\n <line x1=\"5\" x2=\"19\" y1=\"12\" y2=\"12\" />\n </IconWrapper>\n ),\n);\n\nexport const PlusCircleIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" x2=\"12\" y1=\"8\" y2=\"16\" />\n <line x1=\"8\" x2=\"16\" y1=\"12\" y2=\"12\" />\n </IconWrapper>\n ),\n);\n\nexport const TrashIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M3 6H21\" />\n <path d=\"M19 6V20A2 2 0 0 1 17 22H7A2 2 0 0 1 5 20V6\" />\n <path d=\"M8 6V4A2 2 0 0 1 10 2H14A2 2 0 0 1 16 4V6\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </IconWrapper>\n ),\n);\n\nexport const SaveIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M19 21H5A2 2 0 0 1 3 19V5A2 2 0 0 1 5 3H16L21 8V19A2 2 0 0 1 19 21Z\" />\n <polyline points=\"17 21 17 13 7 13 7 21\" />\n <polyline points=\"7 3 7 8 15 8\" />\n </IconWrapper>\n ),\n);\n\nexport const SettingsIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </IconWrapper>\n ),\n);\n\nexport const RefreshIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3V8H16\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M3 21V16H8\" />\n </IconWrapper>\n ),\n);\n\nexport const LinkIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </IconWrapper>\n ),\n);\n\nexport const PinIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"22\" />\n <path d=\"M5 17H19V15.24A2 2 0 0 0 17.89 13.45L16.1 12.55A0.5 0.5 0 0 1 15.8 12.3V8A4 4 0 0 0 7.8 8V12.3A0.5 0.5 0 0 1 7.5 12.55L5.71 13.45A2 2 0 0 0 4.6 15.24V17Z\" />\n </IconWrapper>\n ),\n);\n\n// --- Files & Content ---\nexport const FileIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n </IconWrapper>\n ),\n);\n\nexport const FileTextIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" x2=\"16\" y1=\"13\" y2=\"13\" />\n <line x1=\"8\" x2=\"16\" y1=\"17\" y2=\"17\" />\n <line x1=\"8\" x2=\"12\" y1=\"9\" y2=\"9\" />\n </IconWrapper>\n ),\n);\n\nexport const ExcelIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <rect x=\"8\" y=\"13\" width=\"8\" height=\"6\" rx=\"1\" />\n <line x1=\"12\" x2=\"12\" y1=\"13\" y2=\"19\" />\n <line x1=\"8\" x2=\"16\" y1=\"16\" y2=\"16\" />\n </IconWrapper>\n ),\n);\n\nexport const FileUploadIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <path d=\"M14.5 2H6A2 2 0 0 0 4 4V20A2 2 0 0 0 6 22H18A2 2 0 0 0 20 20V7.5L14.5 2Z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <path d=\"M12 12V18\" />\n <path d=\"M15 15L12 12L9 15\" />\n </IconWrapper>\n ),\n);\n\nexport const ImageUploadIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" ry=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"M21 15L17.91 11.91A2 2 0 0 0 15.09 11.91L6 21\" />\n </IconWrapper>\n ),\n);\n\nexport const CalendarIcon = React.forwardRef<SVGSVGElement, IconProps>(\n (props, ref) => (\n <IconWrapper ref={ref} {...props}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" x2=\"16\" y1=\"2\" y2=\"6\" />\n <line x1=\"8\" x2=\"8\" y1=\"2\" y2=\"6\" />\n <line x1=\"3\" x2=\"21\" y1=\"10\" y2=\"10\" />\n </IconWrapper>\n ),\n);\n\n// --- Custom Brand Icons ---\nexport const MedicashIcon = React.forwardRef<SVGSVGElement, IconProps>(\n ({ className, size = DEFAULT_SIZE, ...props }, ref) => (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 24 22\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n className={cn(\"text-current\", className)}\n {...props}\n >\n <g fill=\"currentColor\">\n <path d=\"M17.9361 18.3242C18.5184 19.9414 20.3015 20.7804 21.9188 20.1981C23.536 19.6157 24.375 17.8326 23.7927 16.2154L19.2776 3.67591C18.6953 2.05867 16.9122 1.21969 15.2949 1.802C13.6777 2.38432 12.8387 4.16742 13.421 5.78466L17.9361 18.3242Z\" />\n <path d=\"M13.3741 3.67585C13.9564 2.0586 15.7395 1.21962 17.3568 1.80194C18.974 2.38425 19.813 4.16735 19.2307 5.7846L14.7156 18.3241C14.1333 19.9413 12.3502 20.7803 10.7329 20.198C9.11569 19.6157 8.27671 17.8326 8.85903 16.2153L13.3741 3.67585Z\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M1.21568 15.8655L3.40558 9.78358L8.00981 11.4414L5.81991 17.5233C5.36212 18.7948 3.96031 19.4543 2.68888 18.9965C1.41746 18.5387 0.757885 17.1369 1.21568 15.8655ZM6.82668 17.8858C6.16868 19.7133 4.15382 20.6613 2.32638 20.0033C0.498935 19.3453 -0.449084 17.3305 0.208918 15.503L2.39882 9.42108L2.76131 8.41435L2.76123 8.41432L4.55271 3.43893C5.21071 1.61148 7.22556 0.663465 9.05301 1.32147C10.8804 1.97947 11.8285 3.99432 11.1705 5.82177L9.379 10.7971L9.37908 10.7972L9.01658 11.8039L6.82668 17.8858ZM8.31315 10.1149C8.24214 10.3082 8.02787 10.4074 7.83456 10.3364C7.64124 10.2654 7.54209 10.0511 7.6131 9.85778L9.13383 5.71775C9.20484 5.52444 9.41912 5.42529 9.61243 5.4963C9.80575 5.56731 9.90489 5.78158 9.83388 5.9749L8.31315 10.1149ZM9.96695 4.76687C10.1639 4.76687 10.3236 4.60718 10.3236 4.41019C10.3236 4.2132 10.1639 4.05351 9.96695 4.05351C9.76996 4.05351 9.61027 4.2132 9.61027 4.41019C9.61027 4.60718 9.76996 4.76687 9.96695 4.76687Z\"\n />\n </g>\n </svg>\n ),\n);\n\nexport const NewBadgeIcon = React.forwardRef<SVGSVGElement, IconProps>(\n ({ className, size = DEFAULT_SIZE, ...props }, ref) => (\n <svg\n ref={ref}\n width={size}\n height={size}\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n className={cn(className)}\n {...props}\n >\n <g transform=\"translate(-1841 -61)\">\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"6\"\n transform=\"translate(1841 61)\"\n fill=\"#ffd200\"\n />\n <text\n transform=\"translate(1844 70)\"\n fill=\"#424242\"\n fontSize=\"8\"\n fontFamily=\"Pretendard-Bold, Pretendard\"\n fontWeight=\"700\"\n >\n <tspan x=\"0\" y=\"0\">\n N\n </tspan>\n </text>\n </g>\n </svg>\n ),\n);\n","import { cn } from \"@/utils/cn\";\nimport { cva, VariantProps } from \"class-variance-authority\";\nimport { useState, useRef, useEffect, forwardRef, KeyboardEvent } from \"react\";\nimport { ChevronDownFillIcon, XIcon as ClearIcon } from \"../icons\";\n\nexport const dropdownTriggerVariants = cva(\n cn(\n \"flex items-center justify-between\",\n \"rounded-md px-4 py-2.5\",\n \"text-sm font-medium\",\n \"outline-none\",\n \"transition-all\",\n \"w-full min-w-0\"\n ),\n {\n variants: {\n variant: {\n default: cn(\n \"bg-white text-cms-black border border-black\",\n \"hover:bg-cms-gray-100\"\n ),\n outline: cn(\n \"border border-cms-outline bg-transparent\",\n \"hover:bg-cms-gray-200\"\n ),\n ghost: \"border-none bg-transparent hover:bg-cms-gray-200 hover:text-black\",\n },\n size: {\n sm: \"px-3 py-2 text-xs\",\n default: \"px-4 py-2.5 text-sm\",\n lg: \"px-6 py-3 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n }\n);\n\nexport interface DropdownOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\nexport interface DropdownProps extends VariantProps<\n typeof dropdownTriggerVariants\n> {\n options: DropdownOption[];\n value?: string;\n placeholder?: string;\n onValueChange?: (value: string) => void;\n disabled?: boolean;\n className?: string;\n dropdownClassName?: string;\n searchable?: boolean;\n clearable?: boolean;\n multiple?: boolean;\n maxHeight?: number;\n}\n\n/**\n * 사용자가 목록에서 하나 또는 여러 개의 옵션을 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link Dropdown}은 공간이 제한적인 UI에서 다양한 선택지를 효율적으로 제공합니다.\n * 검색 기능, 다중 선택(Multiple), 선택 해제(Clearable) 등 복잡한 선택 시나리오를 지원합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **단일/다중 선택**: 5개 이상의 옵션 중 하나 또는 여러 개를 선택해야 할 때\n * - **공간 절약**: 라디오 버튼이나 체크박스 그룹을 표시하기엔 화면 공간이 부족할 때\n * - **동적 필터링**: 옵션이 너무 많아 검색을 통해 원하는 항목을 찾아야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **옵션이 적은 경우(2-4개)**: 사용자가 모든 옵션을 한눈에 볼 수 있는 `RadioButton`이나 `Checkbox`가 더 좋습니다.\n * - **설정 토글**: 단순히 On/Off를 전환하는 것이라면 `Switch`를 사용하세요.\n * - **단순 내비게이션**: 클릭 시 다른 페이지로 이동만 하는 기능이라면 `Button`이나 `SideNavigation` 아이템이 더 적절합니다.\n *\n * ## Layout behavior\n *\n * - **Popover Menu**: 클릭 시 버튼 아래(또는 위)에 옵션 목록이 나타나며, 다른 요소들 위에 오버레이됩니다.\n * - **Flexible Width**: 부모 컨테이너의 너비에 맞춰지거나, `className`을 통해 고정 너비를 가질 수 있습니다.\n * - **Scrolling**: 옵션이 많아지면 `maxHeight` 설정에 따라 목록 내부에 스크롤이 발생합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **논리적 정렬**: 옵션 목록은 가나다순, 사용 빈도순 등 사용자가 예측 가능한 순서로 정렬하세요.\n * - **검색 기능 활용**: 옵션이 10개 이상인 경우 `searchable` 속성을 활성화하여 편의성을 높이세요.\n * - **상태 표시**: `placeholder`를 통해 무엇을 선택해야 하는지 안내하고, 선택 후에는 선택된 항목을 명확히 표시하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 많은 텍스트**: 각 옵션의 레이블은 가급적 한 줄에 들어오도록 짧게 작성하세요.\n * - **중첩 드롭다운 지양**: 드롭다운 안에서 또 다른 드롭다운이 열리는 복잡한 계층 구조는 피하는 것이 좋습니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Interaction**: `Enter`나 `Space`로 열고, 화살표 키로 이동하며, `Esc`로 닫을 수 있습니다.\n * - **Screen Reader**: `aria-expanded`, `aria-haspopup` 등의 속성을 통해 드롭다운의 상태와 역할을 스크린 리더에 전달합니다.\n * - **Focus Management**: 드롭다운이 열리면 검색창이나 첫 번째 옵션으로 포커스가 이동합니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 단일 선택 드롭다운:\n *\n * ```tsx\n * <Dropdown\n * options={[\n * { value: 'ko', label: '한국어' },\n * { value: 'en', label: '영어' },\n * { value: 'ja', label: '일본어' },\n * ]}\n * placeholder=\"언어를 선택하세요\"\n * onValueChange={(val) => console.log(val)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 검색과 다중 선택이 가능한 드롭다운:\n *\n * ```tsx\n * <Dropdown\n * options={largeOptionList}\n * multiple={true}\n * searchable={true}\n * clearable={true}\n * placeholder=\"태그 선택\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Select}, 기본적인 HTML select 스타일의 컴포넌트\n * - {@link Combobox}, 입력과 선택이 결합된 컴포넌트\n * - {@link Popover}, 더 자유로운 형태의 팝오버가 필요한 경우\n */\nexport const Dropdown = forwardRef<HTMLButtonElement, DropdownProps>(\n (\n {\n options,\n value,\n placeholder = \"선택하세요\",\n onValueChange,\n disabled = false,\n className,\n dropdownClassName,\n variant,\n size,\n searchable = false,\n clearable = false,\n multiple = false,\n maxHeight = 200,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const [selectedValues, setSelectedValues] = useState<string[]>(\n multiple ? (value ? [value] : []) : []\n );\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n const selectedOption = options.find((option) => option.value === value);\n const selectedLabel = multiple\n ? selectedValues.length > 0\n ? `${selectedValues.length}개 선택됨`\n : placeholder\n : selectedOption?.label || placeholder;\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase())\n );\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n setSearchTerm(\"\");\n }\n };\n\n const handleOptionClick = (option: DropdownOption) => {\n if (option.disabled) return;\n\n if (multiple) {\n const newSelectedValues = selectedValues.includes(option.value)\n ? selectedValues.filter((v) => v !== option.value)\n : [...selectedValues, option.value];\n\n setSelectedValues(newSelectedValues);\n onValueChange?.(newSelectedValues.join(\",\"));\n } else {\n onValueChange?.(option.value);\n setIsOpen(false);\n }\n };\n\n const handleClear = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (multiple) {\n setSelectedValues([]);\n onValueChange?.(\"\");\n } else {\n onValueChange?.(\"\");\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n setIsOpen(false);\n } else if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleToggle();\n }\n };\n\n // 외부 클릭 감지\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }, []);\n\n // 드롭다운이 열릴 때 검색 입력창에 포커스\n useEffect(() => {\n if (isOpen && searchable && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen, searchable]);\n\n return (\n <div ref={dropdownRef} className=\"relative w-full\">\n <button\n ref={ref}\n type=\"button\"\n className={cn(\n dropdownTriggerVariants({ variant, size }),\n disabled && \"opacity-50 cursor-not-allowed\",\n className\n )}\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n disabled={disabled}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n {...props}\n >\n <span\n className={cn(\n \"truncate flex-1 text-left\",\n !selectedOption && !multiple && \"text-cms-gray-400\"\n )}\n >\n {selectedLabel}\n </span>\n\n <div className=\"flex items-center gap-2 ml-3\">\n {clearable && (value || selectedValues.length > 0) && (\n <button\n type=\"button\"\n className={cn(\n \"border-0 bg-transparent\",\n \"p-1 rounded text-cms-gray-400 transition-colors\",\n \"hover:text-cms-black\"\n )}\n onClick={handleClear}\n aria-label=\"선택 취소\"\n >\n <ClearIcon className=\"w-3 h-3\" />\n </button>\n )}\n <ChevronDownFillIcon\n className={cn(\"w-3 h-3 transition-transform duration-200\", isOpen && \"rotate-180\")}\n />\n </div>\n </button>\n\n {isOpen && (\n <div\n className={cn(\n \"absolute z-50 mt-1 py-1 w-full min-w-0\",\n \"rounded-md border border-cms-gray-300\",\n \"bg-white shadow-lg\",\n dropdownClassName\n )}\n style={{ maxHeight: `${maxHeight}px` }}\n >\n {searchable && (\n <div className=\"px-3 py-2 border-b border-cms-gray-200\">\n <input\n ref={searchInputRef}\n type=\"text\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n placeholder=\"검색...\"\n className={cn(\n \"w-full px-2 py-1 text-sm\",\n \"rounded outline-none\",\n \"border border-cms-gray-300\",\n \"focus:ring-1 focus:ring-cms-gray-400\"\n )}\n />\n </div>\n )}\n\n <div className=\"max-h-48 overflow-y-auto\">\n {filteredOptions.length === 0 ? (\n <div className=\"px-3 py-2 text-sm text-cms-gray-400 text-center\">\n {searchTerm ? \"검색 결과가 없습니다\" : \"옵션이 없습니다\"}\n </div>\n ) : (\n filteredOptions.map((option) => {\n const isSelected = multiple\n ? selectedValues.includes(option.value)\n : value === option.value;\n\n return (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"border-0\",\n \"flex items-center justify-between gap-2\",\n \"w-full px-3 py-2 \",\n \"text-left text-sm\",\n \"transition-colors\",\n option.disabled\n ? \"text-cms-gray-400 cursor-not-allowed bg-white\"\n : \"text-cms-black bg-white hover:bg-cms-gray-100 cursor-pointer\",\n isSelected && \"bg-cms-gray-150 font-medium\"\n )}\n onClick={() => handleOptionClick(option)}\n disabled={option.disabled}\n >\n <span className=\"truncate\">{option.label}</span>\n {isSelected && (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n className=\"w-4 h-4 text-black shrink-0\"\n >\n <path\n d=\"M13.5 4.5L6 12L2.5 8.5\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </button>\n );\n })\n )}\n </div>\n </div>\n )}\n </div>\n );\n }\n);\n\nDropdown.displayName = \"Dropdown\";\n","import { cn } from \"@/utils/cn\";\nimport { forwardRef } from \"react\";\nimport { Dropdown, DropdownProps } from \"./Dropdown\";\n\nexport interface SelectProps extends Omit<\n DropdownProps,\n \"multiple\" | \"searchable\" | \"clearable\"\n> {\n label?: string;\n helperText?: string;\n error?: string;\n required?: boolean;\n}\n\n/**\n * 사용자에게 레이블, 도움말, 에러 메시지와 함께 단일 선택 드롭다운을 제공하는 컴포넌트입니다.\n *\n * {@link Select}는 {@link Dropdown}을 기반으로 하며, 폼(Form) 구성에 필요한\n * 추가적인 UI 요소(레이블, 필수 표시, 유효성 검사 메시지 등)를 포함하고 있습니다.\n * 주로 입력 폼 내에서 하나의 값을 선택받아야 할 때 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **표준 폼 입력**: 이름, 이메일 등과 함께 성별, 지역, 카테고리 등을 선택받을 때\n * - **유효성 검사가 필요한 경우**: 선택하지 않았을 때 에러 메시지를 표시해야 하는 상황\n * - **상세 설명 필요**: 입력 항목에 대한 추가적인 도움말(helperText)이 필요한 경우\n *\n * **사용하지 말아야 하는 경우:**\n * - **단순 필터/정렬**: 레이블 없이 목록 위에 놓이는 필터 등은 `Dropdown`을 직접 사용하세요.\n * - **다중 선택/검색**: 다중 선택이나 검색 기능이 필요하다면 `Dropdown` 또는 `Combobox`를 사용하세요.\n *\n * ## Layout behavior\n *\n * - **Vertical Stack**: 레이블 - 드롭다운 버튼 - 도움말/에러 메시지가 수직으로 배치됩니다.\n * - **Consistency**: 다른 입력 컴포넌트(TextInput 등)와 동일한 간격과 스타일을 유지하여 일관된 폼 레이아웃을 구성합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 레이블**: 사용자가 무엇을 선택해야 하는지 알 수 있도록 구체적인 레이블을 제공하세요.\n * - **필수 여부 표시**: `required` 속성을 사용하여 필수 입력 항목임을 시각적으로 나타내세요.\n * - **에러 메시지 활용**: 유효성 검사 실패 시 `error` prop을 통해 구체적인 오류 원인을 안내하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **레이블 생략 지양**: 폼 내에서는 접근성과 사용자 경험을 위해 가급적 레이블을 생략하지 마세요.\n * - **과도한 도움말**: 도움말이 너무 길어지면 폼 전체의 가독성이 떨어집니다. 가급적 한 줄 이내로 작성하세요.\n *\n * ## Accessibility\n *\n * - **Label Association**: 레이블은 드롭다운 버튼과 논리적으로 연결되어 스크린 리더에서 함께 읽어줍니다.\n * - **Error States**: 에러 상태가 되면 `aria-invalid` 등의 속성을 통해 시각 장애 사용자에게도 오류 상태를 전달합니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 레이블과 필수 표시가 포함된 선택 창:\n *\n * ```tsx\n * <Select\n * label=\"사용자 등급\"\n * required={true}\n * options={[\n * { value: 'admin', label: '관리자' },\n * { value: 'editor', label: '편집자' },\n * { value: 'viewer', label: '뷰어' },\n * ]}\n * placeholder=\"등급을 선택해 주세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 에러 메시지가 표시된 상태:\n *\n * ```tsx\n * <Select\n * label=\"국가 선택\"\n * options={countryOptions}\n * error=\"국가를 선택하는 것은 필수입니다\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Dropdown}, 레이블 없이 단순한 선택 기능만 필요한 경우\n * - {@link TextInput}, 텍스트 직접 입력이 필요한 경우\n * - {@link RadioButton}, 옵션이 적고 한눈에 보여야 하는 경우\n */\nexport const Select = forwardRef<HTMLButtonElement, SelectProps>(\n ({ label, helperText, error, required, className, ...props }, ref) => {\n return (\n <div className={cn(\"space-y-1\", className)}>\n {label && (\n <label className=\"block text-sm font-medium text-cms-black\">\n {label}\n {required && <span className=\"text-cms-red-500 ml-1\">*</span>}\n </label>\n )}\n\n <Dropdown\n ref={ref}\n {...props}\n className={cn(error && \"border-cms-red-500 focus:ring-cms-red-500\")}\n />\n\n {(helperText || error) && (\n <p\n className={cn(\n \"text-xs\",\n error ? \"text-cms-red-500\" : \"text-cms-gray-400\",\n )}\n >\n {error || helperText}\n </p>\n )}\n </div>\n );\n },\n);\n\nSelect.displayName = \"Select\";\n","import { cn } from \"@/utils/cn\";\nimport { useState, forwardRef } from \"react\";\nimport { Dropdown, DropdownProps } from \"./Dropdown\";\n\nexport interface ComboboxProps extends Omit<DropdownProps, \"searchable\"> {\n loading?: boolean;\n createable?: boolean;\n onCreateOption?: (value: string) => void;\n}\n\n/**\n * 텍스트 입력과 드롭다운 선택 기능이 결합되어, 목록에서 검색하거나 새로운 옵션을 생성할 수 있는 컴포넌트입니다.\n *\n * {@link Combobox}는 사용자가 방대한 목록에서 원하는 항목을 빠르게 찾을 수 있도록 돕고,\n * 만약 찾는 항목이 없을 경우 즉석에서 새로운 값을 추가할 수 있는 유연성을 제공합니다.\n *\n * {@link Dropdown}의 확장 버전으로, 기본적으로 `searchable` 기능이 활성화되어 있습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **대량 데이터 검색**: 옵션이 수백 개 이상이어서 단순 스크롤로는 찾기 어려운 경우\n * - **동적 옵션 추가**: 목록에 없는 값을 사용자가 직접 입력하여 데이터베이스에 추가해야 할 때 (예: 태그 입력, 신규 제조사 추가 등)\n * - **빠른 필터링**: 사용자가 정확한 명칭을 입력하여 필터링된 결과만 보고 싶어 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **옵션이 고정된 경우**: 새로운 값을 추가할 필요가 없고 옵션 개수가 적다면 일반 `Dropdown`이나 `Select`가 더 단순합니다.\n * - **자유 텍스트 입력**: 미리 정의된 옵션 없이 자유로운 입력을 받는 것이 주 목적이라면 `TextInput`을 사용하세요.\n *\n * ## Layout behavior\n *\n * - **Auto-filtering**: 사용자가 입력할 때마다 목록이 즉시 필터링되어 업데이트됩니다.\n * - **Create Option**: `createable` 설정 시, 검색 결과가 없을 경우 최하단에 '생성' 옵션이 나타납니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **로딩 상태 표시**: 대규모 데이터를 원격에서 가져오는 경우 `loading` 속성을 통해 사용자에게 진행 상황을 알리세요.\n * - **명확한 생성 문구**: 새로운 항목을 생성할 때 무엇이 생성되는지 사용자에게 명확히 전달하세요.\n * - **검색 최적화**: 대소문자 구분 없는 검색 등 사용자가 입력하기 편한 검색 환경을 제공하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **검색창 없는 콤보박스**: 콤보박스의 핵심은 검색입니다. 검색이 필요 없다면 일반 드롭다운을 사용하세요.\n * - **복잡한 생성 과정**: `onCreateOption`에서 너무 복잡한 로직을 처리하면 UI가 멈춘 것처럼 보일 수 있습니다. 비동기 처리 시 로딩 상태를 적절히 활용하세요.\n *\n * ## Accessibility\n *\n * - **Aria Roles**: `role=\"combobox\"`를 사용하여 입력과 선택이 가능한 요소임을 스크린 리더에 알립니다.\n * - **Live Regions**: 필터링 결과의 개수 변화 등을 시각 장애 사용자에게 알릴 수 있도록 설계되었습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 새로운 옵션을 생성할 수 있는 콤보박스:\n *\n * ```tsx\n * <Combobox\n * options={existingTags}\n * createable={true}\n * onCreateOption={(newTag) => {\n * // 서버에 태그 추가 요청 후 목록 업데이트\n * handleCreateTag(newTag);\n * }}\n * placeholder=\"태그를 검색하거나 새로 추가하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 데이터를 로딩 중인 콤보박스:\n *\n * ```tsx\n * <Combobox\n * options={[]}\n * loading={true}\n * placeholder=\"데이터를 불러오는 중...\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Dropdown}, 기본 검색/선택 기능이 필요한 경우\n * - {@link TagInput}, 여러 개의 값을 검색하여 추가해야 할 때\n * - {@link TextInput}, 단순한 텍스트 입력만 필요한 경우\n */\nexport const Combobox = forwardRef<HTMLButtonElement, ComboboxProps>(\n (\n { options, loading = false, createable = false, onCreateOption, ...props },\n ref,\n ) => {\n const [searchTerm] = useState(\"\");\n\n const filteredOptions = options.filter((option) =>\n option.label.toLowerCase().includes(searchTerm.toLowerCase()),\n );\n\n const hasExactMatch = filteredOptions.some(\n (option) => option.label.toLowerCase() === searchTerm.toLowerCase(),\n );\n\n // 검색어가 있고 createable이며 정확히 일치하는 옵션이 없을 때 생성 옵션 추가\n const optionsWithCreate = [\n ...filteredOptions,\n ...(createable && searchTerm && !hasExactMatch\n ? [\n {\n value: `__create__${searchTerm}`,\n label: `\"${searchTerm}\" 생성`,\n disabled: false,\n },\n ]\n : []),\n ];\n\n return (\n <Dropdown\n ref={ref}\n {...props}\n options={optionsWithCreate}\n searchable={true}\n dropdownClassName={cn(loading && \"opacity-75\", props.dropdownClassName)}\n onValueChange={(value) => {\n if (value.startsWith(\"__create__\")) {\n const createValue = value.replace(\"__create__\", \"\");\n onCreateOption?.(createValue);\n } else {\n props.onValueChange?.(value);\n }\n }}\n />\n );\n },\n);\n\nCombobox.displayName = \"Combobox\";\n","\"use client\";\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { cn } from \"@/utils/cn\";\nimport { forwardRef } from \"react\";\n\n/**\n * 특정 요소 근처에 부가적인 정보나 컨트롤을 표시하는 플로팅 컴포넌트입니다.\n *\n * {@link Popover}는 사용자가 버튼이나 아이콘을 클릭했을 때 나타나며,\n * 기존 화면의 맥락을 유지하면서 추가적인 작업(메뉴 선택, 상세 정보 확인 등)을 수행할 수 있게 합니다.\n *\n * Radix UI의 Popover 컴포넌트를 기반으로 구현되어 포커스 트랩, 키보드 내비게이션 등이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **맥락 기반 메뉴**: '더 보기' 버튼 클릭 시 나타나는 관리 기능(수정, 삭제 등)\n * - **상세 정보 표시**: 아이콘 클릭 시 해당 항목에 대한 간단한 설명이나 데이터를 보여줄 때\n * - **간단한 설정**: 필터 옵션이나 정렬 기준을 선택할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **중요한 의사 결정**: 사용자의 주의를 완전히 집중시켜야 하는 작업은 `Modal`을 사용하세요.\n * - **단순 힌트**: 마우스 호버 시에만 짧게 보여주는 정보는 Tooltip을 사용하세요.\n * - **입력 폼**: 복잡한 입력이 필요한 경우 모달이나 별도 페이지가 더 적합할 수 있습니다.\n *\n * ## Layout behavior\n *\n * - **Anchor Positioning**: 트리거(버튼 등)를 기준으로 상하좌우 적절한 위치에 자동으로 배치됩니다.\n * - **Overlay**: 다른 UI 요소들 위에 겹쳐서 나타나며, 배경(Overlay)을 생성하지 않아 뒤쪽 화면을 볼 수 있습니다.\n * - **Size**: 콘텐츠의 양에 따라 크기가 결정되지만, `min-w-[200px]`의 최소 너비를 가집니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 트리거**: 사용자가 무엇을 클릭하면 팝오버가 열릴지 명확히 인지할 수 있는 버튼이나 아이콘을 사용하세요.\n * - **적절한 배치**: `align` 속성을 조절하여 팝오버가 화면 밖으로 나가지 않도록 관리하세요. (기본값: 'end')\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 많은 정보**: 팝오버는 빠르고 간단한 상호작용을 위한 것입니다. 너무 많은 내용을 담지 마세요.\n * - **비정상적인 닫기**: 팝오버 외부를 클릭하거나 `Esc`를 누르면 자연스럽게 닫히도록 기본 동작을 유지하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Interaction**: `Space`나 `Enter`로 열고, `Esc`로 닫으며, 팝오버 내부에서 `Tab` 키로 내비게이션이 가능합니다.\n * - **Aria Attributes**: `aria-expanded`, `aria-controls` 등의 속성이 자동으로 부여됩니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 버튼 클릭 시 상세 정보를 보여주는 팝오버:\n *\n * ```tsx\n * <Popover>\n * <PopoverTrigger asChild>\n * <Button variant=\"ghost\">상세 정보</Button>\n * </PopoverTrigger>\n * <PopoverContent>\n * <div className=\"p-4\">\n * <h4 className=\"font-bold\">계정 상태</h4>\n * <p className=\"text-sm\">현재 활성화된 계정입니다.</p>\n * </div>\n * </PopoverContent>\n * </Popover>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Modal}, 더 중요하거나 복잡한 상호작용이 필요한 경우\n * - {@link Dropdown}, 정해진 리스트에서 값을 선택하는 것이 주 목적인 경우\n * - {@link PopoverMenuItem}, 팝오버 내부의 메뉴 항목을 구성할 때\n */\nconst Popover = PopoverPrimitive.Root;\n\nconst PopoverTrigger = PopoverPrimitive.Trigger;\n\nconst PopoverContent = forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"end\", sideOffset = 8, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-[200px] p-2\",\n \"border rounded-md border-cms-gray-200\",\n \"bg-cms-white shadow-lg\",\n \"animate-in fade-in-0 zoom-in-95\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent };\n","\"use client\";\n\nimport { cn } from \"@/utils/cn\";\nimport { cva, VariantProps } from \"class-variance-authority\";\nimport { ButtonHTMLAttributes, forwardRef } from \"react\";\n\nconst popoverMenuItemVariants = cva(\n cn(\n \"border-0 cursor-pointer flex w-full items-center gap-3 rounded-md px-3 py-2\",\n \"bg-white text-sm font-medium transition-colors\",\n \"hover:bg-cms-gray-100 active:bg-cms-gray-200\",\n \"disabled:pointer-events-none disabled:opacity-50\",\n ),\n {\n variants: {\n variant: {\n default: \"text-cms-foreground\",\n destructive: \"text-cms-red-400 hover:text-cms-red-500\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface PopoverMenuItemProps\n extends\n ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof popoverMenuItemVariants> {\n icon?: React.ReactNode;\n}\n\n/**\n * Popover 내부에 배치되는 개별 액션 항목 컴포넌트입니다.\n *\n * {@link PopoverMenuItem}은 아이콘과 텍스트가 결합된 형태의 메뉴 버튼으로,\n * 일관된 패딩, 폰트, 호버 효과를 제공합니다.\n *\n * ## Example\n *\n * ```tsx\n * <PopoverContent>\n * <div className=\"flex flex-col gap-1\">\n * <PopoverMenuItem icon={<EditIcon />} onClick={handleEdit}>\n * 수정하기\n * </PopoverMenuItem>\n * <PopoverMenuItem\n * variant=\"destructive\"\n * icon={<TrashIcon />}\n * onClick={handleDelete}\n * >\n * 삭제하기\n * </PopoverMenuItem>\n * </div>\n * </PopoverContent>\n * ```\n */\nconst PopoverMenuItem = forwardRef<HTMLButtonElement, PopoverMenuItemProps>(\n ({ className, variant, icon, children, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(popoverMenuItemVariants({ variant }), className)}\n {...props}\n >\n {icon && <span className=\"shrink-0\">{icon}</span>}\n {children}\n </button>\n );\n },\n);\n\nPopoverMenuItem.displayName = \"PopoverMenuItem\";\n\nexport { PopoverMenuItem, popoverMenuItemVariants };\n","import React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nconst textVariants = cva(\"cms-font-pretendard cms-text-black\", {\n variants: {\n variant: {\n h1: \"text-3xl font-bold\",\n h2: \"text-2xl font-semibold\",\n h3: \"text-lg font-semibold\",\n subtitle: \"text-base font-medium\",\n body: \"text-sm font-normal\",\n emphasis: \"text-sm font-semibold\",\n caption: \"text-xs font-normal\",\n price: \"text-xs font-bold\",\n },\n align: {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n },\n decoration: {\n underline: \"underline\",\n lineThrough: \"line-through\",\n none: \"no-underline\",\n },\n },\n defaultVariants: {\n variant: \"body\",\n align: \"left\",\n },\n});\n\nexport interface TextProps\n extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof textVariants> {\n as?: \"p\" | \"span\" | \"div\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"label\";\n children: React.ReactNode;\n}\n\n/**\n * 일관된 타이포그래피 시스템을 적용하기 위한 텍스트 컴포넌트입니다.\n *\n * {@link Text}는 제목(Heading), 본문(Body), 캡션(Caption) 등 미리 정의된 스타일을 제공하여\n * 디자인 일관성을 유지하고 텍스트의 의미적 구조(Semantic Structure)를 쉽게 정의할 수 있게 합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **페이지 제목 및 부제목**: 화면의 위계를 나누는 타이틀을 작성할 때\n * - **본문 콘텐츠**: 일반적인 설명글이나 데이터를 표시할 때\n * - **캡션 및 힌트**: 부가적인 설명이나 작은 크기의 정보가 필요할 때\n * - **정형화된 스타일**: 특정 폰트 두께나 크기를 시스템 규칙에 맞춰 적용해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **복잡한 스타일링**: 시스템 정의 범위를 크게 벗어나는 특수 스타일은 별도 CSS 클래스를 활용하세요.\n *\n * ## Layout behavior\n *\n * - **Semantic Tag**: `as` prop을 통해 실제 HTML 태그(`h1`, `p`, `span` 등)를 결정할 수 있어 SEO와 접근성에 유리합니다.\n * - **Alignment**: `align` 속성을 통해 왼쪽, 중앙, 오른쪽 정렬을 손쉽게 조절할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **의미론적 태그 사용**: 제목에는 `as=\"h1\"`, 본문에는 `as=\"p\"`를 사용하는 등 맥락에 맞는 태그를 선택하세요.\n * - **계층 구조 준수**: 큰 제목(h1) 아래에 작은 제목(h2, h3)이 오도록 논리적인 흐름을 유지하세요.\n * - **변형(Variant) 활용**: 폰트 크기와 두께를 직접 조절하기보다 제공되는 `variant`를 우선적으로 사용하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **과도한 폰트 크기 사용**: 가급적 시스템에서 정의한 크기를 벗어나지 않도록 주의하세요.\n * - **의미와 맞지 않는 태그**: 시각적으로만 크게 보이기 위해 제목 태그를 남용하지 마세요.\n *\n * ## Example\n *\n * {@tool snippet}\n * 다양한 위계의 텍스트 구성:\n *\n * ```tsx\n * <div className=\"space-y-4\">\n * <Text variant=\"h1\" as=\"h1\">대시보드</Text>\n * <Text variant=\"subtitle\">오늘의 요약 정보입니다.</Text>\n * <Text variant=\"body\">\n * 현재 활성화된 사용자는 총 1,234명이며, 어제 대비 5% 증가했습니다.\n * </Text>\n * <Text variant=\"caption\" align=\"right\">최근 업데이트: 2024-01-24</Text>\n * </div>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link TextInput}, 사용자의 입력을 받는 텍스트 필드\n * - {@link Button}, 텍스트를 포함하는 액션 요소\n */\nexport const Text = React.forwardRef<HTMLElement, TextProps>(\n (\n {\n className,\n variant,\n align,\n decoration,\n as: Component = \"p\",\n children,\n ...props\n },\n ref,\n ) => {\n return (\n <Component\n className={cn(textVariants({ variant, align, decoration }), className)}\n ref={ref as any}\n {...props}\n >\n {children}\n </Component>\n );\n },\n);\n\nText.displayName = \"Text\";\n","import React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nconst textInputVariants = cva(\n cn(\n \"w-full box-border\",\n \"px-3 py-2\",\n \"rounded-cms-sm\",\n \"border border-solid\",\n \"font-normal leading-tight\",\n \"transition-colors duration-200\",\n \"outline-none\",\n \"text-md text-cms-black\",\n \"placeholder:text-cms-gray-500\",\n \"placeholder:text-md\",\n ),\n {\n variants: {\n variant: {\n default: cn(\n \"bg-cms-white \",\n \"border-cms-gray-450\",\n \"focus:border-cms-gray-800\",\n \"disabled:bg-cms-gray-150\",\n \"disabled:text-cms-gray-400\",\n \"disabled:cursor-not-allowed\",\n ),\n error: cn(\n \"bg-cms-white\",\n \"border-cms-red-400\",\n \"focus:border-cms-red-500\",\n ),\n },\n fullWidth: {\n true: \"w-full\",\n false: \"w-auto\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n fullWidth: true,\n },\n },\n);\n\nconst labelVariants = cva(\"block text-md font-medium text-cms-black\");\n\nconst errorMessageVariants = cva(\n \"block text-sm font-medium text-cms-red-400 mt-1\",\n);\n\nconst helperTextVariants = cva(\n \"block text-sm font-normal text-cms-gray-700 mt-1\",\n);\n\nexport interface TextInputProps\n extends\n Omit<React.InputHTMLAttributes<HTMLInputElement>, \"size\">,\n VariantProps<typeof textInputVariants> {\n label?: string;\n required?: boolean;\n error?: boolean;\n errorMessage?: string;\n helperText?: string;\n showCharCount?: boolean;\n labelLayout?: \"vertical\" | \"horizontal\";\n labelWidth?: string;\n}\n\n/**\n * 사용자로부터 텍스트, 이메일, 숫자 등의 단일 라인 데이터를 입력받는 필드입니다.\n *\n * {@link TextInput}은 가장 기본적인 폼 입력 요소로, label, placeholder, 에러 메시지,\n * helper 텍스트, 글자 수 카운터 등을 통합적으로 제공합니다. 일관된 스타일과 동작으로\n * 사용자 경험을 향상시킵니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **단일 라인 텍스트 입력**: 이름, 이메일, 전화번호 등 한 줄로 입력 가능한 정보\n * - **특정 타입 입력**: email, password, number, date 등 HTML input type을 활용\n * - **글자 수 제한**: 최대 글자 수를 지정하고 실시간으로 카운터를 표시\n * - **유효성 검증**: 에러 상태와 메시지를 통해 사용자에게 피드백 제공\n * - **필수 입력**: `required` 속성을 사용하여 반드시 입력해야 함을 시각적으로 안내\n *\n * ## Layout behavior\n *\n * TextInput은 기본적으로 부모 요소의 전체 너비(`fullWidth={true}`)를 차지합니다.\n * `fullWidth={false}`로 설정하면 내용에 맞춰 자동으로 조절됩니다.\n *\n * 레이블 배치는 `labelLayout` prop으로 제어됩니다:\n * - **vertical** (기본값): Label이 입력 필드 위에 세로로 배치됩니다.\n * - **horizontal**: Label과 입력 필드가 가로로 나란히 배치됩니다. `labelWidth`로 Label 너비를 조정할 수 있습니다 (기본값: 120px).\n *\n * 구조는 다음 순서로 배치됩니다:\n * 1. **헤더 영역** (있는 경우): label (좌측, 필수 시 * 표시) + 글자 수 카운터 (우측)\n * 2. **입력 필드**: 텍스트 입력 영역\n * 3. **메시지 영역** (있는 경우): errorMessage 또는 helperText\n *\n * 높이는 `h-10` (2.5rem / 40px)로 고정되어 일관된 버튼 높이와 정렬됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 label 제공**: 무엇을 입력해야 하는지 명확하게 표시하세요\n * - **필수 여부 명시**: 반드시 입력해야 하는 필드라면 `required` 속성을 활성화하세요.\n * - **가로 배치 활용**: 폼에서 여러 입력 필드를 정렬할 때는 `labelLayout=\"horizontal\"`을 사용하여 일관된 레이아웃을 유지하세요.\n *\n * ## Example\n *\n * {@tool snippet}\n * 레이블과 필수 표시가 포함된 입력 필드:\n *\n * ```tsx\n * <TextInput\n * label=\"사용자 아이디\"\n * required={true}\n * placeholder=\"아이디를 입력하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 가로 배치 레이아웃:\n *\n * ```tsx\n * <TextInput\n * label=\"상호(법인명)\"\n * required={true}\n * labelLayout=\"horizontal\"\n * labelWidth=\"150px\"\n * placeholder=\"회사명을 입력하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Textarea}, 여러 줄 텍스트 입력을 위한 컴포넌트\n * - {@link TagInput}, 여러 태그를 입력받는 컴포넌트\n * - {@link DatePicker}, 날짜 선택을 위한 컴포넌트\n * - {@link Dropdown}, 옵션 선택을 위한 컴포넌트\n */\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>(\n (\n {\n className,\n variant,\n fullWidth,\n label,\n required,\n error,\n errorMessage,\n helperText,\n showCharCount,\n maxLength,\n value,\n defaultValue,\n onChange,\n id,\n labelLayout = \"vertical\",\n labelWidth = \"120px\",\n ...props\n },\n ref,\n ) => {\n const [internalValue, setInternalValue] = React.useState<string>(\n (value || defaultValue || \"\") as string,\n );\n const inputId = id || `input-${Math.random().toString(36).substr(2, 9)}`;\n const finalVariant = error ? \"error\" : variant;\n\n const currentValue =\n value !== undefined ? (value as string) : internalValue;\n const charCount = currentValue?.length || 0;\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (value === undefined) {\n setInternalValue(e.target.value);\n }\n onChange?.(e);\n };\n\n const hasHeader = label || (showCharCount && maxLength);\n const isHorizontal = labelLayout === \"horizontal\";\n\n return (\n <div className={cn(\"w-full\", !fullWidth && \"w-auto\")}>\n {isHorizontal && hasHeader ? (\n <div className=\"flex items-center gap-3\">\n {label && (\n <label\n htmlFor={inputId}\n className={cn(labelVariants(), \"mb-0 shrink-0\")}\n style={{ width: labelWidth }}\n >\n {label}\n {required && <span className=\"text-cms-red-400 ml-1\">*</span>}\n </label>\n )}\n <div className=\"flex-1\">\n <input\n id={inputId}\n ref={ref}\n className={cn(\n textInputVariants({ variant: finalVariant, fullWidth: true }),\n className,\n )}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n required={required}\n {...props}\n />\n </div>\n {showCharCount && maxLength && (\n <span className=\"text-sm text-cms-gray-600 shrink-0\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n ) : (\n <>\n {hasHeader && (\n <div className=\"flex justify-between items-center mb-2\">\n {label ? (\n <label htmlFor={inputId} className={labelVariants()}>\n {label}\n {required && (\n <span className=\"text-cms-red-400 ml-1\">*</span>\n )}\n </label>\n ) : (\n <div />\n )}\n {showCharCount && maxLength && (\n <span className=\"text-sm text-cms-gray-600\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n <input\n id={inputId}\n ref={ref}\n className={cn(\n textInputVariants({ variant: finalVariant, fullWidth }),\n className,\n )}\n maxLength={maxLength}\n value={value}\n defaultValue={defaultValue}\n onChange={handleChange}\n required={required}\n {...props}\n />\n </>\n )}\n {error && errorMessage && (\n <span className={errorMessageVariants()}>{errorMessage}</span>\n )}\n {!error && helperText && (\n <span className={helperTextVariants()}>{helperText}</span>\n )}\n </div>\n );\n },\n);\n\nTextInput.displayName = \"TextInput\";\n","export function buildFormatLongFn(args) {\n return (options = {}) => {\n // TODO: Remove String()\n const width = options.width ? String(options.width) : args.defaultWidth;\n const format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}\n","/**\n * The localize function argument callback which allows to convert raw value to\n * the actual type.\n *\n * @param value - The value to convert\n *\n * @returns The converted value\n */\n\n/**\n * The map of localized values for each width.\n */\n\n/**\n * The index type of the locale unit value. It types conversion of units of\n * values that don't start at 0 (i.e. quarters).\n */\n\n/**\n * Converts the unit value to the tuple of values.\n */\n\n/**\n * The tuple of localized era values. The first element represents BC,\n * the second element represents AD.\n */\n\n/**\n * The tuple of localized quarter values. The first element represents Q1.\n */\n\n/**\n * The tuple of localized day values. The first element represents Sunday.\n */\n\n/**\n * The tuple of localized month values. The first element represents January.\n */\n\nexport function buildLocalizeFn(args) {\n return (value, options) => {\n const context = options?.context ? String(options.context) : \"standalone\";\n\n let valuesArray;\n if (context === \"formatting\" && args.formattingValues) {\n const defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n const width = options?.width ? String(options.width) : defaultWidth;\n\n valuesArray =\n args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n const defaultWidth = args.defaultWidth;\n const width = options?.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[width] || args.values[defaultWidth];\n }\n const index = args.argumentCallback ? args.argumentCallback(value) : value;\n\n // @ts-expect-error - For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n return valuesArray[index];\n };\n}\n","export function buildMatchFn(args) {\n return (string, options = {}) => {\n const width = options.width;\n\n const matchPattern =\n (width && args.matchPatterns[width]) ||\n args.matchPatterns[args.defaultMatchWidth];\n const matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n const matchedString = matchResult[0];\n\n const parsePatterns =\n (width && args.parsePatterns[width]) ||\n args.parsePatterns[args.defaultParseWidth];\n\n const key = Array.isArray(parsePatterns)\n ? findIndex(parsePatterns, (pattern) => pattern.test(matchedString))\n : // [TODO] -- I challenge you to fix the type\n findKey(parsePatterns, (pattern) => pattern.test(matchedString));\n\n let value;\n\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback\n ? // [TODO] -- I challenge you to fix the type\n options.valueCallback(value)\n : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n\nfunction findKey(object, predicate) {\n for (const key in object) {\n if (\n Object.prototype.hasOwnProperty.call(object, key) &&\n predicate(object[key])\n ) {\n return key;\n }\n }\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (let key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n return undefined;\n}\n","export function buildMatchPatternFn(args) {\n return (string, options = {}) => {\n const matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n const matchedString = matchResult[0];\n\n const parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n let value = args.valueCallback\n ? args.valueCallback(parseResult[0])\n : parseResult[0];\n\n // [TODO] I challenge you to fix the type\n value = options.valueCallback ? options.valueCallback(value) : value;\n\n const rest = string.slice(matchedString.length);\n\n return { value, rest };\n };\n}\n","/**\n * @module constants\n * @summary Useful constants\n * @description\n * Collection of useful date constants.\n *\n * The constants could be imported from `date-fns/constants`:\n *\n * ```ts\n * import { maxTime, minTime } from \"./constants/date-fns/constants\";\n *\n * function isAllowedTime(time) {\n * return time <= maxTime && time >= minTime;\n * }\n * ```\n */\n\n/**\n * @constant\n * @name daysInWeek\n * @summary Days in 1 week.\n */\nexport const daysInWeek = 7;\n\n/**\n * @constant\n * @name daysInYear\n * @summary Days in 1 year.\n *\n * @description\n * How many days in a year.\n *\n * One years equals 365.2425 days according to the formula:\n *\n * > Leap year occurs every 4 years, except for years that are divisible by 100 and not divisible by 400.\n * > 1 mean year = (365+1/4-1/100+1/400) days = 365.2425 days\n */\nexport const daysInYear = 365.2425;\n\n/**\n * @constant\n * @name maxTime\n * @summary Maximum allowed time.\n *\n * @example\n * import { maxTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = 8640000000000001 <= maxTime;\n * //=> false\n *\n * new Date(8640000000000001);\n * //=> Invalid Date\n */\nexport const maxTime = Math.pow(10, 8) * 24 * 60 * 60 * 1000;\n\n/**\n * @constant\n * @name minTime\n * @summary Minimum allowed time.\n *\n * @example\n * import { minTime } from \"./constants/date-fns/constants\";\n *\n * const isValid = -8640000000000001 >= minTime;\n * //=> false\n *\n * new Date(-8640000000000001)\n * //=> Invalid Date\n */\nexport const minTime = -maxTime;\n\n/**\n * @constant\n * @name millisecondsInWeek\n * @summary Milliseconds in 1 week.\n */\nexport const millisecondsInWeek = 604800000;\n\n/**\n * @constant\n * @name millisecondsInDay\n * @summary Milliseconds in 1 day.\n */\nexport const millisecondsInDay = 86400000;\n\n/**\n * @constant\n * @name millisecondsInMinute\n * @summary Milliseconds in 1 minute\n */\nexport const millisecondsInMinute = 60000;\n\n/**\n * @constant\n * @name millisecondsInHour\n * @summary Milliseconds in 1 hour\n */\nexport const millisecondsInHour = 3600000;\n\n/**\n * @constant\n * @name millisecondsInSecond\n * @summary Milliseconds in 1 second\n */\nexport const millisecondsInSecond = 1000;\n\n/**\n * @constant\n * @name minutesInYear\n * @summary Minutes in 1 year.\n */\nexport const minutesInYear = 525600;\n\n/**\n * @constant\n * @name minutesInMonth\n * @summary Minutes in 1 month.\n */\nexport const minutesInMonth = 43200;\n\n/**\n * @constant\n * @name minutesInDay\n * @summary Minutes in 1 day.\n */\nexport const minutesInDay = 1440;\n\n/**\n * @constant\n * @name minutesInHour\n * @summary Minutes in 1 hour.\n */\nexport const minutesInHour = 60;\n\n/**\n * @constant\n * @name monthsInQuarter\n * @summary Months in 1 quarter.\n */\nexport const monthsInQuarter = 3;\n\n/**\n * @constant\n * @name monthsInYear\n * @summary Months in 1 year.\n */\nexport const monthsInYear = 12;\n\n/**\n * @constant\n * @name quartersInYear\n * @summary Quarters in 1 year\n */\nexport const quartersInYear = 4;\n\n/**\n * @constant\n * @name secondsInHour\n * @summary Seconds in 1 hour.\n */\nexport const secondsInHour = 3600;\n\n/**\n * @constant\n * @name secondsInMinute\n * @summary Seconds in 1 minute.\n */\nexport const secondsInMinute = 60;\n\n/**\n * @constant\n * @name secondsInDay\n * @summary Seconds in 1 day.\n */\nexport const secondsInDay = secondsInHour * 24;\n\n/**\n * @constant\n * @name secondsInWeek\n * @summary Seconds in 1 week.\n */\nexport const secondsInWeek = secondsInDay * 7;\n\n/**\n * @constant\n * @name secondsInYear\n * @summary Seconds in 1 year.\n */\nexport const secondsInYear = secondsInDay * daysInYear;\n\n/**\n * @constant\n * @name secondsInMonth\n * @summary Seconds in 1 month\n */\nexport const secondsInMonth = secondsInYear / 12;\n\n/**\n * @constant\n * @name secondsInQuarter\n * @summary Seconds in 1 quarter.\n */\nexport const secondsInQuarter = secondsInMonth * 3;\n\n/**\n * @constant\n * @name constructFromSymbol\n * @summary Symbol enabling Date extensions to inherit properties from the reference date.\n *\n * The symbol is used to enable the `constructFrom` function to construct a date\n * using a reference date and a value. It allows to transfer extra properties\n * from the reference date to the new date. It's useful for extensions like\n * [`TZDate`](https://github.com/date-fns/tz) that accept a time zone as\n * a constructor argument.\n */\nexport const constructFromSymbol = Symbol.for(\"constructDateFrom\");\n","import { constructFromSymbol } from \"./constants.js\";\n\n/**\n * @name constructFrom\n * @category Generic Helpers\n * @summary Constructs a date using the reference date and the value\n *\n * @description\n * The function constructs a new date using the constructor from the reference\n * date and the given value. It helps to build generic functions that accept\n * date extensions.\n *\n * It defaults to `Date` if the passed reference date is a number or a string.\n *\n * Starting from v3.7.0, it allows to construct a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n *\n * @param date - The reference date to take constructor from\n * @param value - The value to create the date\n *\n * @returns Date initialized using the given date and value\n *\n * @example\n * import { constructFrom } from \"./constructFrom/date-fns\";\n *\n * // A function that clones a date preserving the original type\n * function cloneDate<DateType extends Date>(date: DateType): DateType {\n * return constructFrom(\n * date, // Use constructor from the given date\n * date.getTime() // Use the date value to create a new date\n * );\n * }\n */\nexport function constructFrom(date, value) {\n if (typeof date === \"function\") return date(value);\n\n if (date && typeof date === \"object\" && constructFromSymbol in date)\n return date[constructFromSymbol](value);\n\n if (date instanceof Date) return new date.constructor(value);\n\n return new Date(value);\n}\n\n// Fallback for modularized imports:\nexport default constructFrom;\n","import { constructFrom } from \"../constructFrom.js\";\n\nexport function normalizeDates(context, ...dates) {\n const normalize = constructFrom.bind(\n null,\n context || dates.find((date) => typeof date === \"object\"),\n );\n return dates.map(normalize);\n}\n","let defaultOptions = {};\n\nexport function getDefaultOptions() {\n return defaultOptions;\n}\n\nexport function setDefaultOptions(newOptions) {\n defaultOptions = newOptions;\n}\n","import { constructFrom } from \"./constructFrom.js\";\n\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * Starting from v3.7.0, it clones a date using `[Symbol.for(\"constructDateFrom\")]`\n * enabling to transfer extra properties from the reference date to the new date.\n * It's useful for extensions like [`TZDate`](https://github.com/date-fns/tz)\n * that accept a time zone as a constructor argument.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param argument - The value to convert\n *\n * @returns The parsed date in the local time zone\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\nexport function toDate(argument, context) {\n // [TODO] Get rid of `toDate` or `constructFrom`?\n return constructFrom(context || argument, argument);\n}\n\n// Fallback for modularized imports:\nexport default toDate;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfWeek} function options.\n */\n\n/**\n * @name startOfWeek\n * @category Week Helpers\n * @summary Return the start of a week for the given date.\n *\n * @description\n * Return the start of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week\n *\n * @example\n * // The start of a week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Aug 31 2014 00:00:00\n *\n * @example\n * // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:\n * const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n\n _date.setDate(_date.getDate() - diff);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeek;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"less than a second\",\n other: \"less than {{count}} seconds\",\n },\n\n xSeconds: {\n one: \"1 second\",\n other: \"{{count}} seconds\",\n },\n\n halfAMinute: \"half a minute\",\n\n lessThanXMinutes: {\n one: \"less than a minute\",\n other: \"less than {{count}} minutes\",\n },\n\n xMinutes: {\n one: \"1 minute\",\n other: \"{{count}} minutes\",\n },\n\n aboutXHours: {\n one: \"about 1 hour\",\n other: \"about {{count}} hours\",\n },\n\n xHours: {\n one: \"1 hour\",\n other: \"{{count}} hours\",\n },\n\n xDays: {\n one: \"1 day\",\n other: \"{{count}} days\",\n },\n\n aboutXWeeks: {\n one: \"about 1 week\",\n other: \"about {{count}} weeks\",\n },\n\n xWeeks: {\n one: \"1 week\",\n other: \"{{count}} weeks\",\n },\n\n aboutXMonths: {\n one: \"about 1 month\",\n other: \"about {{count}} months\",\n },\n\n xMonths: {\n one: \"1 month\",\n other: \"{{count}} months\",\n },\n\n aboutXYears: {\n one: \"about 1 year\",\n other: \"about {{count}} years\",\n },\n\n xYears: {\n one: \"1 year\",\n other: \"{{count}} years\",\n },\n\n overXYears: {\n one: \"over 1 year\",\n other: \"over {{count}} years\",\n },\n\n almostXYears: {\n one: \"almost 1 year\",\n other: \"almost {{count}} years\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return \"in \" + result;\n } else {\n return result + \" ago\";\n }\n }\n\n return result;\n};\n","const formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"B\", \"A\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"Before Christ\", \"Anno Domini\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1st quarter\", \"2nd quarter\", \"3rd quarter\", \"4th quarter\"],\n};\n\n// Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\nconst monthValues = {\n narrow: [\"J\", \"F\", \"M\", \"A\", \"M\", \"J\", \"J\", \"A\", \"S\", \"O\", \"N\", \"D\"],\n abbreviated: [\n \"Jan\",\n \"Feb\",\n \"Mar\",\n \"Apr\",\n \"May\",\n \"Jun\",\n \"Jul\",\n \"Aug\",\n \"Sep\",\n \"Oct\",\n \"Nov\",\n \"Dec\",\n ],\n\n wide: [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"S\", \"M\", \"T\", \"W\", \"T\", \"F\", \"S\"],\n short: [\"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\"],\n abbreviated: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n wide: [\n \"Sunday\",\n \"Monday\",\n \"Tuesday\",\n \"Wednesday\",\n \"Thursday\",\n \"Friday\",\n \"Saturday\",\n ],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"a\",\n pm: \"p\",\n midnight: \"mi\",\n noon: \"n\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n abbreviated: {\n am: \"AM\",\n pm: \"PM\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n wide: {\n am: \"a.m.\",\n pm: \"p.m.\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"in the morning\",\n afternoon: \"in the afternoon\",\n evening: \"in the evening\",\n night: \"at night\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, _options) => {\n const number = Number(dirtyNumber);\n\n // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n const rem100 = number % 100;\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + \"st\";\n case 2:\n return number + \"nd\";\n case 3:\n return number + \"rd\";\n }\n }\n return number + \"th\";\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i,\n};\nconst parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i,\n};\nconst parseMonthPatterns = {\n narrow: [\n /^j/i,\n /^f/i,\n /^m/i,\n /^a/i,\n /^m/i,\n /^j/i,\n /^j/i,\n /^a/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n\n any: [\n /^ja/i,\n /^f/i,\n /^mar/i,\n /^ap/i,\n /^may/i,\n /^jun/i,\n /^jul/i,\n /^au/i,\n /^s/i,\n /^o/i,\n /^n/i,\n /^d/i,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i,\n};\nconst parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i],\n};\n\nconst matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"EEEE, MMMM do, y\",\n long: \"MMMM do, y\",\n medium: \"MMM d, y\",\n short: \"MM/dd/yyyy\",\n};\n\nconst timeFormats = {\n full: \"h:mm:ss a zzzz\",\n long: \"h:mm:ss a z\",\n medium: \"h:mm:ss a\",\n short: \"h:mm a\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: \"{{date}}, {{time}}\",\n short: \"{{date}}, {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","import { formatDistance } from \"./en-US/_lib/formatDistance.js\";\nimport { formatLong } from \"./en-US/_lib/formatLong.js\";\nimport { formatRelative } from \"./en-US/_lib/formatRelative.js\";\nimport { localize } from \"./en-US/_lib/localize.js\";\nimport { match } from \"./en-US/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp](https://github.com/kossnocorp)\n * @author Lesha Koss [@leshakoss](https://github.com/leshakoss)\n */\nexport const enUS = {\n code: \"en-US\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default enUS;\n","const formatDistanceLocale = {\n lessThanXSeconds: {\n one: \"1초 미만\",\n other: \"{{count}}초 미만\",\n },\n\n xSeconds: {\n one: \"1초\",\n other: \"{{count}}초\",\n },\n\n halfAMinute: \"30초\",\n\n lessThanXMinutes: {\n one: \"1분 미만\",\n other: \"{{count}}분 미만\",\n },\n\n xMinutes: {\n one: \"1분\",\n other: \"{{count}}분\",\n },\n\n aboutXHours: {\n one: \"약 1시간\",\n other: \"약 {{count}}시간\",\n },\n\n xHours: {\n one: \"1시간\",\n other: \"{{count}}시간\",\n },\n\n xDays: {\n one: \"1일\",\n other: \"{{count}}일\",\n },\n\n aboutXWeeks: {\n one: \"약 1주\",\n other: \"약 {{count}}주\",\n },\n\n xWeeks: {\n one: \"1주\",\n other: \"{{count}}주\",\n },\n\n aboutXMonths: {\n one: \"약 1개월\",\n other: \"약 {{count}}개월\",\n },\n\n xMonths: {\n one: \"1개월\",\n other: \"{{count}}개월\",\n },\n\n aboutXYears: {\n one: \"약 1년\",\n other: \"약 {{count}}년\",\n },\n\n xYears: {\n one: \"1년\",\n other: \"{{count}}년\",\n },\n\n overXYears: {\n one: \"1년 이상\",\n other: \"{{count}}년 이상\",\n },\n\n almostXYears: {\n one: \"거의 1년\",\n other: \"거의 {{count}}년\",\n },\n};\n\nexport const formatDistance = (token, count, options) => {\n let result;\n\n const tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === \"string\") {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace(\"{{count}}\", count.toString());\n }\n\n if (options?.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return result + \" 후\";\n } else {\n return result + \" 전\";\n }\n }\n\n return result;\n};\n","import { buildFormatLongFn } from \"../../_lib/buildFormatLongFn.js\";\n\nconst dateFormats = {\n full: \"y년 M월 d일 EEEE\",\n long: \"y년 M월 d일\",\n medium: \"y.MM.dd\",\n short: \"y.MM.dd\",\n};\n\nconst timeFormats = {\n full: \"a H시 mm분 ss초 zzzz\",\n long: \"a H:mm:ss z\",\n medium: \"HH:mm:ss\",\n short: \"HH:mm\",\n};\n\nconst dateTimeFormats = {\n full: \"{{date}} {{time}}\",\n long: \"{{date}} {{time}}\",\n medium: \"{{date}} {{time}}\",\n short: \"{{date}} {{time}}\",\n};\n\nexport const formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: \"full\",\n }),\n\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: \"full\",\n }),\n\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: \"full\",\n }),\n};\n","const formatRelativeLocale = {\n lastWeek: \"'지난' eeee p\",\n yesterday: \"'어제' p\",\n today: \"'오늘' p\",\n tomorrow: \"'내일' p\",\n nextWeek: \"'다음' eeee p\",\n other: \"P\",\n};\n\nexport const formatRelative = (token, _date, _baseDate, _options) =>\n formatRelativeLocale[token];\n","import { buildLocalizeFn } from \"../../_lib/buildLocalizeFn.js\";\n\nconst eraValues = {\n narrow: [\"BC\", \"AD\"],\n abbreviated: [\"BC\", \"AD\"],\n wide: [\"기원전\", \"서기\"],\n};\n\nconst quarterValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\"],\n abbreviated: [\"Q1\", \"Q2\", \"Q3\", \"Q4\"],\n wide: [\"1분기\", \"2분기\", \"3분기\", \"4분기\"],\n};\n\nconst monthValues = {\n narrow: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"10\", \"11\", \"12\"],\n\n abbreviated: [\n \"1월\",\n \"2월\",\n \"3월\",\n \"4월\",\n \"5월\",\n \"6월\",\n \"7월\",\n \"8월\",\n \"9월\",\n \"10월\",\n \"11월\",\n \"12월\",\n ],\n\n wide: [\n \"1월\",\n \"2월\",\n \"3월\",\n \"4월\",\n \"5월\",\n \"6월\",\n \"7월\",\n \"8월\",\n \"9월\",\n \"10월\",\n \"11월\",\n \"12월\",\n ],\n};\n\nconst dayValues = {\n narrow: [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n short: [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n abbreviated: [\"일\", \"월\", \"화\", \"수\", \"목\", \"금\", \"토\"],\n wide: [\"일요일\", \"월요일\", \"화요일\", \"수요일\", \"목요일\", \"금요일\", \"토요일\"],\n};\n\nconst dayPeriodValues = {\n narrow: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n abbreviated: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n wide: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n};\n\nconst formattingDayPeriodValues = {\n narrow: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n abbreviated: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n wide: {\n am: \"오전\",\n pm: \"오후\",\n midnight: \"자정\",\n noon: \"정오\",\n morning: \"아침\",\n afternoon: \"오후\",\n evening: \"저녁\",\n night: \"밤\",\n },\n};\n\nconst ordinalNumber = (dirtyNumber, options) => {\n const number = Number(dirtyNumber);\n const unit = String(options?.unit);\n\n switch (unit) {\n case \"minute\":\n case \"second\":\n return String(number);\n case \"date\":\n return number + \"일\";\n default:\n return number + \"번째\";\n }\n};\n\nexport const localize = {\n ordinalNumber,\n\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: \"wide\",\n }),\n\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: \"wide\",\n argumentCallback: (quarter) => quarter - 1,\n }),\n\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: \"wide\",\n }),\n\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: \"wide\",\n }),\n\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: \"wide\",\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: \"wide\",\n }),\n};\n","import { buildMatchFn } from \"../../_lib/buildMatchFn.js\";\nimport { buildMatchPatternFn } from \"../../_lib/buildMatchPatternFn.js\";\n\nconst matchOrdinalNumberPattern = /^(\\d+)(일|번째)?/i;\nconst parseOrdinalNumberPattern = /\\d+/i;\n\nconst matchEraPatterns = {\n narrow: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(기원전|서기)/i,\n};\nconst parseEraPatterns = {\n any: [/^(bc|기원전)/i, /^(ad|서기)/i],\n};\n\nconst matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234]사?분기/i,\n};\nconst parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i],\n};\n\nconst matchMonthPatterns = {\n narrow: /^(1[012]|[123456789])/,\n abbreviated: /^(1[012]|[123456789])월/i,\n wide: /^(1[012]|[123456789])월/i,\n};\nconst parseMonthPatterns = {\n any: [\n /^1월?$/,\n /^2/,\n /^3/,\n /^4/,\n /^5/,\n /^6/,\n /^7/,\n /^8/,\n /^9/,\n /^10/,\n /^11/,\n /^12/,\n ],\n};\n\nconst matchDayPatterns = {\n narrow: /^[일월화수목금토]/,\n short: /^[일월화수목금토]/,\n abbreviated: /^[일월화수목금토]/,\n wide: /^[일월화수목금토]요일/,\n};\nconst parseDayPatterns = {\n any: [/^일/, /^월/, /^화/, /^수/, /^목/, /^금/, /^토/],\n};\n\nconst matchDayPeriodPatterns = {\n any: /^(am|pm|오전|오후|자정|정오|아침|저녁|밤)/i,\n};\nconst parseDayPeriodPatterns = {\n any: {\n am: /^(am|오전)/i,\n pm: /^(pm|오후)/i,\n midnight: /^자정/i,\n noon: /^정오/i,\n morning: /^아침/i,\n afternoon: /^오후/i,\n evening: /^저녁/i,\n night: /^밤/i,\n },\n};\n\nexport const match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: (value) => parseInt(value, 10),\n }),\n\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseEraPatterns,\n defaultParseWidth: \"any\",\n }),\n\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: \"any\",\n valueCallback: (index) => index + 1,\n }),\n\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: \"any\",\n }),\n\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: \"wide\",\n parsePatterns: parseDayPatterns,\n defaultParseWidth: \"any\",\n }),\n\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: \"any\",\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: \"any\",\n }),\n};\n","import { formatDistance } from \"./ko/_lib/formatDistance.js\";\nimport { formatLong } from \"./ko/_lib/formatLong.js\";\nimport { formatRelative } from \"./ko/_lib/formatRelative.js\";\nimport { localize } from \"./ko/_lib/localize.js\";\nimport { match } from \"./ko/_lib/match.js\";\n\n/**\n * @category Locales\n * @summary Korean locale.\n * @language Korean\n * @iso-639-2 kor\n * @author Hong Chulju [@angdev](https://github.com/angdev)\n * @author Lee Seoyoen [@iamssen](https://github.com/iamssen)\n * @author Taiki IKeda [@so99ynoodles](https://github.com/so99ynoodles)\n */\nexport const ko = {\n code: \"ko\",\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0 /* Sunday */,\n firstWeekContainsDate: 1,\n },\n};\n\n// Fallback for modularized imports:\nexport default ko;\n","/**\n * Time zone name format.\n */\n\n/**\n * The function returns the time zone name for the given date in the specified\n * time zone.\n *\n * It uses the `Intl.DateTimeFormat` API and by default outputs the time zone\n * name in a long format, e.g. \"Pacific Standard Time\" or\n * \"Singapore Standard Time\".\n *\n * It is possible to specify the format as the third argument using one of the following options\n *\n * - \"short\": e.g. \"EDT\" or \"GMT+8\".\n * - \"long\": e.g. \"Eastern Daylight Time\".\n * - \"shortGeneric\": e.g. \"ET\" or \"Singapore Time\".\n * - \"longGeneric\": e.g. \"Eastern Time\" or \"Singapore Standard Time\".\n *\n * These options correspond to TR35 tokens `z..zzz`, `zzzz`, `v`, and `vvvv` respectively: https://www.unicode.org/reports/tr35/tr35-dates.html#dfst-zone\n *\n * @param timeZone - Time zone name (IANA or UTC offset)\n * @param date - Date object to get the time zone name for\n * @param format - Optional format of the time zone name. Defaults to \"long\". Can be \"short\", \"long\", \"shortGeneric\", or \"longGeneric\".\n *\n * @returns Time zone name (e.g. \"Singapore Standard Time\")\n */\nexport function tzName(timeZone, date, format = \"long\") {\n return new Intl.DateTimeFormat(\"en-US\", {\n // Enforces engine to render the time. Without the option JavaScriptCore omits it.\n hour: \"numeric\",\n timeZone: timeZone,\n timeZoneName: format\n }).format(date).split(/\\s/g) // Format.JS uses non-breaking spaces\n .slice(2) // Skip the hour and AM/PM parts\n .join(\" \");\n}","const offsetFormatCache = {};\nconst offsetCache = {};\n\n/**\n * The function extracts UTC offset in minutes from the given date in specified\n * time zone.\n *\n * Unlike `Date.prototype.getTimezoneOffset`, this function returns the value\n * mirrored to the sign of the offset in the time zone. For Asia/Singapore\n * (UTC+8), `tzOffset` returns 480, while `getTimezoneOffset` returns -480.\n *\n * @param timeZone - Time zone name (IANA or UTC offset)\n * @param date - Date to check the offset for\n *\n * @returns UTC offset in minutes\n */\nexport function tzOffset(timeZone, date) {\n try {\n const format = offsetFormatCache[timeZone] ||= new Intl.DateTimeFormat(\"en-US\", {\n timeZone,\n timeZoneName: \"longOffset\"\n }).format;\n const offsetStr = format(date).split(\"GMT\")[1];\n if (offsetStr in offsetCache) return offsetCache[offsetStr];\n return calcOffset(offsetStr, offsetStr.split(\":\"));\n } catch {\n // Fallback to manual parsing if the runtime doesn't support ±HH:MM/±HHMM/±HH\n // See: https://github.com/nodejs/node/issues/53419\n if (timeZone in offsetCache) return offsetCache[timeZone];\n const captures = timeZone?.match(offsetRe);\n if (captures) return calcOffset(timeZone, captures.slice(1));\n return NaN;\n }\n}\nconst offsetRe = /([+-]\\d\\d):?(\\d\\d)?/;\nfunction calcOffset(cacheStr, values) {\n const hours = +(values[0] || 0);\n const minutes = +(values[1] || 0);\n // Convert seconds to minutes by dividing by 60 to keep the function return in minutes.\n const seconds = +(values[2] || 0) / 60;\n return offsetCache[cacheStr] = hours * 60 + minutes > 0 ? hours * 60 + minutes + seconds : hours * 60 - minutes - seconds;\n}","import { tzOffset } from \"../tzOffset/index.js\";\nexport class TZDateMini extends Date {\n //#region static\n\n constructor(...args) {\n super();\n if (args.length > 1 && typeof args[args.length - 1] === \"string\") {\n this.timeZone = args.pop();\n }\n this.internal = new Date();\n if (isNaN(tzOffset(this.timeZone, this))) {\n this.setTime(NaN);\n } else {\n if (!args.length) {\n this.setTime(Date.now());\n } else if (typeof args[0] === \"number\" && (args.length === 1 || args.length === 2 && typeof args[1] !== \"number\")) {\n this.setTime(args[0]);\n } else if (typeof args[0] === \"string\") {\n this.setTime(+new Date(args[0]));\n } else if (args[0] instanceof Date) {\n this.setTime(+args[0]);\n } else {\n this.setTime(+new Date(...args));\n adjustToSystemTZ(this, NaN);\n syncToInternal(this);\n }\n }\n }\n static tz(tz, ...args) {\n return args.length ? new TZDateMini(...args, tz) : new TZDateMini(Date.now(), tz);\n }\n\n //#endregion\n\n //#region time zone\n\n withTimeZone(timeZone) {\n return new TZDateMini(+this, timeZone);\n }\n getTimezoneOffset() {\n const offset = -tzOffset(this.timeZone, this);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n return offset > 0 ? Math.floor(offset) : Math.ceil(offset);\n }\n\n //#endregion\n\n //#region time\n\n setTime(time) {\n Date.prototype.setTime.apply(this, arguments);\n syncToInternal(this);\n return +this;\n }\n\n //#endregion\n\n //#region date-fns integration\n\n [Symbol.for(\"constructDateFrom\")](date) {\n return new TZDateMini(+new Date(date), this.timeZone);\n }\n\n //#endregion\n}\n\n// Assign getters and setters\nconst re = /^(get|set)(?!UTC)/;\nObject.getOwnPropertyNames(Date.prototype).forEach(method => {\n if (!re.test(method)) return;\n const utcMethod = method.replace(re, \"$1UTC\");\n // Filter out methods without UTC counterparts\n if (!TZDateMini.prototype[utcMethod]) return;\n if (method.startsWith(\"get\")) {\n // Delegate to internal date's UTC method\n TZDateMini.prototype[method] = function () {\n return this.internal[utcMethod]();\n };\n } else {\n // Assign regular setter\n TZDateMini.prototype[method] = function () {\n Date.prototype[utcMethod].apply(this.internal, arguments);\n syncFromInternal(this);\n return +this;\n };\n\n // Assign UTC setter\n TZDateMini.prototype[utcMethod] = function () {\n Date.prototype[utcMethod].apply(this, arguments);\n syncToInternal(this);\n return +this;\n };\n }\n});\n\n/**\n * Function syncs time to internal date, applying the time zone offset.\n *\n * @param {Date} date - Date to sync\n */\nfunction syncToInternal(date) {\n date.internal.setTime(+date);\n date.internal.setUTCSeconds(date.internal.getUTCSeconds() - Math.round(-tzOffset(date.timeZone, date) * 60));\n}\n\n/**\n * Function syncs the internal date UTC values to the date. It allows to get\n * accurate timestamp value.\n *\n * @param {Date} date - The date to sync\n */\nfunction syncFromInternal(date) {\n // First we transpose the internal values\n Date.prototype.setFullYear.call(date, date.internal.getUTCFullYear(), date.internal.getUTCMonth(), date.internal.getUTCDate());\n Date.prototype.setHours.call(date, date.internal.getUTCHours(), date.internal.getUTCMinutes(), date.internal.getUTCSeconds(), date.internal.getUTCMilliseconds());\n\n // Now we have to adjust the date to the system time zone\n adjustToSystemTZ(date);\n}\n\n/**\n * Function adjusts the date to the system time zone. It uses the time zone\n * differences to calculate the offset and adjust the date.\n *\n * @param {Date} date - Date to adjust\n */\nfunction adjustToSystemTZ(date) {\n // Save the time zone offset before all the adjustments\n const baseOffset = tzOffset(date.timeZone, date);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n const offset = baseOffset > 0 ? Math.floor(baseOffset) : Math.ceil(baseOffset);\n //#region System DST adjustment\n\n // The biggest problem with using the system time zone is that when we create\n // a date from internal values stored in UTC, the system time zone might end\n // up on the DST hour:\n //\n // $ TZ=America/New_York node\n // > new Date(2020, 2, 8, 1).toString()\n // 'Sun Mar 08 2020 01:00:00 GMT-0500 (Eastern Standard Time)'\n // > new Date(2020, 2, 8, 2).toString()\n // 'Sun Mar 08 2020 03:00:00 GMT-0400 (Eastern Daylight Time)'\n // > new Date(2020, 2, 8, 3).toString()\n // 'Sun Mar 08 2020 03:00:00 GMT-0400 (Eastern Daylight Time)'\n // > new Date(2020, 2, 8, 4).toString()\n // 'Sun Mar 08 2020 04:00:00 GMT-0400 (Eastern Daylight Time)'\n //\n // Here we get the same hour for both 2 and 3, because the system time zone\n // has DST beginning at 8 March 2020, 2 a.m. and jumps to 3 a.m. So we have\n // to adjust the internal date to reflect that.\n //\n // However we want to adjust only if that's the DST hour the change happenes,\n // not the hour where DST moves to.\n\n // We calculate the previous hour to see if the time zone offset has changed\n // and we have landed on the DST hour.\n const prevHour = new Date(+date);\n // We use UTC methods here as we don't want to land on the same hour again\n // in case of DST.\n prevHour.setUTCHours(prevHour.getUTCHours() - 1);\n\n // Calculate if we are on the system DST hour.\n const systemOffset = -new Date(+date).getTimezoneOffset();\n const prevHourSystemOffset = -new Date(+prevHour).getTimezoneOffset();\n const systemDSTChange = systemOffset - prevHourSystemOffset;\n // Detect the DST shift. System DST change will occur both on\n const dstShift = Date.prototype.getHours.apply(date) !== date.internal.getUTCHours();\n\n // Move the internal date when we are on the system DST hour.\n if (systemDSTChange && dstShift) date.internal.setUTCMinutes(date.internal.getUTCMinutes() + systemDSTChange);\n\n //#endregion\n\n //#region System diff adjustment\n\n // Now we need to adjust the date, since we just applied internal values.\n // We need to calculate the difference between the system and date time zones\n // and apply it to the date.\n\n const offsetDiff = systemOffset - offset;\n if (offsetDiff) Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + offsetDiff);\n\n //#endregion\n\n //#region Seconds System diff adjustment\n\n const systemDate = new Date(+date);\n // Set the UTC seconds to 0 to isolate the timezone offset in seconds.\n systemDate.setUTCSeconds(0);\n // For negative systemOffset, invert the seconds.\n const systemSecondsOffset = systemOffset > 0 ? systemDate.getSeconds() : (systemDate.getSeconds() - 60) % 60;\n\n // Calculate the seconds offset based on the timezone offset.\n const secondsOffset = Math.round(-(tzOffset(date.timeZone, date) * 60)) % 60;\n if (secondsOffset || systemSecondsOffset) {\n date.internal.setUTCSeconds(date.internal.getUTCSeconds() + secondsOffset);\n Date.prototype.setUTCSeconds.call(date, Date.prototype.getUTCSeconds.call(date) + secondsOffset + systemSecondsOffset);\n }\n\n //#endregion\n\n //#region Post-adjustment DST fix\n\n const postBaseOffset = tzOffset(date.timeZone, date);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n const postOffset = postBaseOffset > 0 ? Math.floor(postBaseOffset) : Math.ceil(postBaseOffset);\n const postSystemOffset = -new Date(+date).getTimezoneOffset();\n const postOffsetDiff = postSystemOffset - postOffset;\n const offsetChanged = postOffset !== offset;\n const postDiff = postOffsetDiff - offsetDiff;\n if (offsetChanged && postDiff) {\n Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + postDiff);\n\n // Now we need to check if got offset change during the post-adjustment.\n // If so, we also need both dates to reflect that.\n\n const newBaseOffset = tzOffset(date.timeZone, date);\n // Remove the seconds offset\n // use Math.floor for negative GMT timezones and Math.ceil for positive GMT timezones.\n const newOffset = newBaseOffset > 0 ? Math.floor(newBaseOffset) : Math.ceil(newBaseOffset);\n const offsetChange = postOffset - newOffset;\n if (offsetChange) {\n date.internal.setUTCMinutes(date.internal.getUTCMinutes() + offsetChange);\n Date.prototype.setUTCMinutes.call(date, Date.prototype.getUTCMinutes.call(date) + offsetChange);\n }\n }\n\n //#endregion\n}","import { tzName } from \"../tzName/index.js\";\nimport { TZDateMini } from \"./mini.js\";\nexport class TZDate extends TZDateMini {\n //#region static\n\n static tz(tz, ...args) {\n return args.length ? new TZDate(...args, tz) : new TZDate(Date.now(), tz);\n }\n\n //#endregion\n\n //#region representation\n\n toISOString() {\n const [sign, hours, minutes] = this.tzComponents();\n const tz = `${sign}${hours}:${minutes}`;\n return this.internal.toISOString().slice(0, -1) + tz;\n }\n toString() {\n // \"Tue Aug 13 2024 07:50:19 GMT+0800 (Singapore Standard Time)\";\n return `${this.toDateString()} ${this.toTimeString()}`;\n }\n toDateString() {\n // toUTCString returns RFC 7231 (\"Mon, 12 Aug 2024 23:36:08 GMT\")\n const [day, date, month, year] = this.internal.toUTCString().split(\" \");\n // \"Tue Aug 13 2024\"\n return `${day?.slice(0, -1) /* Remove \",\" */} ${month} ${date} ${year}`;\n }\n toTimeString() {\n // toUTCString returns RFC 7231 (\"Mon, 12 Aug 2024 23:36:08 GMT\")\n const time = this.internal.toUTCString().split(\" \")[4];\n const [sign, hours, minutes] = this.tzComponents();\n // \"07:42:23 GMT+0800 (Singapore Standard Time)\"\n return `${time} GMT${sign}${hours}${minutes} (${tzName(this.timeZone, this)})`;\n }\n toLocaleString(locales, options) {\n return Date.prototype.toLocaleString.call(this, locales, {\n ...options,\n timeZone: options?.timeZone || this.timeZone\n });\n }\n toLocaleDateString(locales, options) {\n return Date.prototype.toLocaleDateString.call(this, locales, {\n ...options,\n timeZone: options?.timeZone || this.timeZone\n });\n }\n toLocaleTimeString(locales, options) {\n return Date.prototype.toLocaleTimeString.call(this, locales, {\n ...options,\n timeZone: options?.timeZone || this.timeZone\n });\n }\n\n //#endregion\n\n //#region private\n\n tzComponents() {\n const offset = this.getTimezoneOffset();\n const sign = offset > 0 ? \"-\" : \"+\";\n const hours = String(Math.floor(Math.abs(offset) / 60)).padStart(2, \"0\");\n const minutes = String(Math.abs(offset) % 60).padStart(2, \"0\");\n return [sign, hours, minutes];\n }\n\n //#endregion\n\n withTimeZone(timeZone) {\n return new TZDate(+this, timeZone);\n }\n\n //#region date-fns integration\n\n [Symbol.for(\"constructDateFrom\")](date) {\n return new TZDate(+new Date(date), this.timeZone);\n }\n\n //#endregion\n}","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addDays} function options.\n */\n\n/**\n * @name addDays\n * @category Day Helpers\n * @summary Add the specified number of days to the given date.\n *\n * @description\n * Add the specified number of days to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of days to be added.\n * @param options - An object with options\n *\n * @returns The new date with the days added\n *\n * @example\n * // Add 10 days to 1 September 2014:\n * const result = addDays(new Date(2014, 8, 1), 10)\n * //=> Thu Sep 11 2014 00:00:00\n */\nexport function addDays(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n\n // If 0 days, no-op to avoid changing times in the hour before end of DST\n if (!amount) return _date;\n\n _date.setDate(_date.getDate() + amount);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default addDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link addMonths} function options.\n */\n\n/**\n * @name addMonths\n * @category Month Helpers\n * @summary Add the specified number of months to the given date.\n *\n * @description\n * Add the specified number of months to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of months to be added.\n * @param options - The options object\n *\n * @returns The new date with the months added\n *\n * @example\n * // Add 5 months to 1 September 2014:\n * const result = addMonths(new Date(2014, 8, 1), 5)\n * //=> Sun Feb 01 2015 00:00:00\n *\n * // Add one month to 30 January 2023:\n * const result = addMonths(new Date(2023, 0, 30), 1)\n * //=> Tue Feb 28 2023 00:00:00\n */\nexport function addMonths(date, amount, options) {\n const _date = toDate(date, options?.in);\n if (isNaN(amount)) return constructFrom(options?.in || date, NaN);\n if (!amount) {\n // If 0 months, no-op to avoid changing times in the hour before end of DST\n return _date;\n }\n const dayOfMonth = _date.getDate();\n\n // The JS Date object supports date math by accepting out-of-bounds values for\n // month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and\n // new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we\n // want except that dates will wrap around the end of a month, meaning that\n // new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So\n // we'll default to the end of the desired month by adding 1 to the desired\n // month and using a date of 0 to back up one day to the end of the desired\n // month.\n const endOfDesiredMonth = constructFrom(options?.in || date, _date.getTime());\n endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);\n const daysInMonth = endOfDesiredMonth.getDate();\n if (dayOfMonth >= daysInMonth) {\n // If we're already at the end of the month, then this is the correct date\n // and we're done.\n return endOfDesiredMonth;\n } else {\n // Otherwise, we now know that setting the original day-of-month value won't\n // cause an overflow, so set the desired day-of-month. Note that we can't\n // just set the date of `endOfDesiredMonth` because that object may have had\n // its time changed in the unusual case where where a DST transition was on\n // the last day of the month and its local time was in the hour skipped or\n // repeated next to a DST transition. So we use `date` instead which is\n // guaranteed to still have the original time.\n _date.setFullYear(\n endOfDesiredMonth.getFullYear(),\n endOfDesiredMonth.getMonth(),\n dayOfMonth,\n );\n return _date;\n }\n}\n\n// Fallback for modularized imports:\nexport default addMonths;\n","import { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfISOWeek} function options.\n */\n\n/**\n * @name startOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the start of an ISO week for the given date.\n *\n * @description\n * Return the start of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week\n *\n * @example\n * // The start of an ISO week for 2 September 2014 11:55:00:\n * const result = startOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfISOWeek(date, options) {\n return startOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeek;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeekYear} function options.\n */\n\n/**\n * @name getISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Get the ISO week-numbering year of the given date.\n *\n * @description\n * Get the ISO week-numbering year of the given date,\n * which always starts 3 days before the year's first Thursday.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n *\n * @returns The ISO week-numbering year\n *\n * @example\n * // Which ISO-week numbering year is 2 January 2005?\n * const result = getISOWeekYear(new Date(2005, 0, 2))\n * //=> 2004\n */\nexport function getISOWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const fourthOfJanuaryOfNextYear = constructFrom(_date, 0);\n fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);\n\n const fourthOfJanuaryOfThisYear = constructFrom(_date, 0);\n fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);\n\n if (_date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (_date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getISOWeekYear;\n","import { toDate } from \"../toDate.js\";\n\n/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport function getTimezoneOffsetInMilliseconds(date) {\n const _date = toDate(date);\n const utcDate = new Date(\n Date.UTC(\n _date.getFullYear(),\n _date.getMonth(),\n _date.getDate(),\n _date.getHours(),\n _date.getMinutes(),\n _date.getSeconds(),\n _date.getMilliseconds(),\n ),\n );\n utcDate.setUTCFullYear(_date.getFullYear());\n return +date - +utcDate;\n}\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfDay} function options.\n */\n\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a day\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\nexport function startOfDay(date, options) {\n const _date = toDate(date, options?.in);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfDay;\n","import { getTimezoneOffsetInMilliseconds } from \"./_lib/getTimezoneOffsetInMilliseconds.js\";\nimport { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { millisecondsInDay } from \"./constants.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link differenceInCalendarDays} function options.\n */\n\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - The options object\n *\n * @returns The number of calendar days\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\nexport function differenceInCalendarDays(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const laterStartOfDay = startOfDay(laterDate_);\n const earlierStartOfDay = startOfDay(earlierDate_);\n\n const laterTimestamp =\n +laterStartOfDay - getTimezoneOffsetInMilliseconds(laterStartOfDay);\n const earlierTimestamp =\n +earlierStartOfDay - getTimezoneOffsetInMilliseconds(earlierStartOfDay);\n\n // Round the number of days to the nearest integer because the number of\n // milliseconds in a day is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round((laterTimestamp - earlierTimestamp) / millisecondsInDay);\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarDays;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getISOWeekYear } from \"./getISOWeekYear.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\n\n/**\n * The {@link startOfISOWeekYear} function options.\n */\n\n/**\n * @name startOfISOWeekYear\n * @category ISO Week-Numbering Year Helpers\n * @summary Return the start of an ISO week-numbering year for the given date.\n *\n * @description\n * Return the start of an ISO week-numbering year,\n * which always starts 3 days before the year's first Thursday.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of an ISO week-numbering year\n *\n * @example\n * // The start of an ISO week-numbering year for 2 July 2005:\n * const result = startOfISOWeekYear(new Date(2005, 6, 2))\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfISOWeekYear(date, options) {\n const year = getISOWeekYear(date, options);\n const fourthOfJanuary = constructFrom(options?.in || date, 0);\n fourthOfJanuary.setFullYear(year, 0, 4);\n fourthOfJanuary.setHours(0, 0, 0, 0);\n return startOfISOWeek(fourthOfJanuary);\n}\n\n// Fallback for modularized imports:\nexport default startOfISOWeekYear;\n","import { addDays } from \"./addDays.js\";\n\n/**\n * The {@link addWeeks} function options.\n */\n\n/**\n * @name addWeeks\n * @category Week Helpers\n * @summary Add the specified number of weeks to the given date.\n *\n * @description\n * Add the specified number of weeks to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param amount - The amount of weeks to be added.\n * @param options - An object with options\n *\n * @returns The new date with the weeks added\n *\n * @example\n * // Add 4 weeks to 1 September 2014:\n * const result = addWeeks(new Date(2014, 8, 1), 4)\n * //=> Mon Sep 29 2014 00:00:00\n */\nexport function addWeeks(date, amount, options) {\n return addDays(date, amount * 7, options);\n}\n\n// Fallback for modularized imports:\nexport default addWeeks;\n","import { addMonths } from \"./addMonths.js\";\n\n/**\n * The {@link addYears} function options.\n */\n\n/**\n * @name addYears\n * @category Year Helpers\n * @summary Add the specified number of years to the given date.\n *\n * @description\n * Add the specified number of years to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The date to be changed\n * @param amount - The amount of years to be added.\n * @param options - The options\n *\n * @returns The new date with the years added\n *\n * @example\n * // Add 5 years to 1 September 2014:\n * const result = addYears(new Date(2014, 8, 1), 5)\n * //=> Sun Sep 01 2019 00:00:00\n */\nexport function addYears(date, amount, options) {\n return addMonths(date, amount * 12, options);\n}\n\n// Fallback for modularized imports:\nexport default addYears;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link max} function options.\n */\n\n/**\n * @name max\n * @category Common Helpers\n * @summary Return the latest of the given dates.\n *\n * @description\n * Return the latest of the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dates - The dates to compare\n *\n * @returns The latest of the dates\n *\n * @example\n * // Which of these dates is the latest?\n * const result = max([\n * new Date(1989, 6, 10),\n * new Date(1987, 1, 11),\n * new Date(1995, 6, 2),\n * new Date(1990, 0, 1)\n * ])\n * //=> Sun Jul 02 1995 00:00:00\n */\nexport function max(dates, options) {\n let result;\n let context = options?.in;\n\n dates.forEach((date) => {\n // Use the first date object as the context function\n if (!context && typeof date === \"object\")\n context = constructFrom.bind(null, date);\n\n const date_ = toDate(date, context);\n if (!result || result < date_ || isNaN(+date_)) result = date_;\n });\n\n return constructFrom(context, result || NaN);\n}\n\n// Fallback for modularized imports:\nexport default max;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link min} function options.\n */\n\n/**\n * @name min\n * @category Common Helpers\n * @summary Returns the earliest of the given dates.\n *\n * @description\n * Returns the earliest of the given dates.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param dates - The dates to compare\n *\n * @returns The earliest of the dates\n *\n * @example\n * // Which of these dates is the earliest?\n * const result = min([\n * new Date(1989, 6, 10),\n * new Date(1987, 1, 11),\n * new Date(1995, 6, 2),\n * new Date(1990, 0, 1)\n * ])\n * //=> Wed Feb 11 1987 00:00:00\n */\nexport function min(dates, options) {\n let result;\n let context = options?.in;\n\n dates.forEach((date) => {\n // Use the first date object as the context function\n if (!context && typeof date === \"object\")\n context = constructFrom.bind(null, date);\n\n const date_ = toDate(date, context);\n if (!result || result > date_ || isNaN(+date_)) result = date_;\n });\n\n return constructFrom(context, result || NaN);\n}\n\n// Fallback for modularized imports:\nexport default min;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\nimport { startOfDay } from \"./startOfDay.js\";\n\n/**\n * The {@link isSameDay} function options.\n */\n\n/**\n * @name isSameDay\n * @category Day Helpers\n * @summary Are the given dates in the same day (and year and month)?\n *\n * @description\n * Are the given dates in the same day (and year and month)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same day (and year and month)\n *\n * @example\n * // Are 4 September 06:00:00 and 4 September 18:00:00 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4, 6, 0), new Date(2014, 8, 4, 18, 0))\n * //=> true\n *\n * @example\n * // Are 4 September and 4 October in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2014, 9, 4))\n * //=> false\n *\n * @example\n * // Are 4 September, 2014 and 4 September, 2015 in the same day?\n * const result = isSameDay(new Date(2014, 8, 4), new Date(2015, 8, 4))\n * //=> false\n */\nexport function isSameDay(laterDate, earlierDate, options) {\n const [dateLeft_, dateRight_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return +startOfDay(dateLeft_) === +startOfDay(dateRight_);\n}\n\n// Fallback for modularized imports:\nexport default isSameDay;\n","/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * @param value - The value to check\n *\n * @returns True if the given value is a date\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\nexport function isDate(value) {\n return (\n value instanceof Date ||\n (typeof value === \"object\" &&\n Object.prototype.toString.call(value) === \"[object Date]\")\n );\n}\n\n// Fallback for modularized imports:\nexport default isDate;\n","import { isDate } from \"./isDate.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate](https://date-fns.org/docs/toDate)\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * @param date - The date to check\n *\n * @returns The date is valid\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertible into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\nexport function isValid(date) {\n return !((!isDate(date) && typeof date !== \"number\") || isNaN(+toDate(date)));\n}\n\n// Fallback for modularized imports:\nexport default isValid;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link differenceInCalendarMonths} function options.\n */\n\n/**\n * @name differenceInCalendarMonths\n * @category Month Helpers\n * @summary Get the number of calendar months between the given dates.\n *\n * @description\n * Get the number of calendar months between the given dates.\n *\n * @param laterDate - The later date\n * @param earlierDate - The earlier date\n * @param options - An object with options\n *\n * @returns The number of calendar months\n *\n * @example\n * // How many calendar months are between 31 January 2014 and 1 September 2014?\n * const result = differenceInCalendarMonths(\n * new Date(2014, 8, 1),\n * new Date(2014, 0, 31)\n * )\n * //=> 8\n */\nexport function differenceInCalendarMonths(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n\n const yearsDiff = laterDate_.getFullYear() - earlierDate_.getFullYear();\n const monthsDiff = laterDate_.getMonth() - earlierDate_.getMonth();\n\n return yearsDiff * 12 + monthsDiff;\n}\n\n// Fallback for modularized imports:\nexport default differenceInCalendarMonths;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfMonth} function options.\n */\n\n/**\n * @name endOfMonth\n * @category Month Helpers\n * @summary Return the end of a month for the given date.\n *\n * @description\n * Return the end of a month for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a month\n *\n * @example\n * // The end of a month for 2 September 2014 11:55:00:\n * const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 30 2014 23:59:59.999\n */\nexport function endOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n const month = _date.getMonth();\n _date.setFullYear(_date.getFullYear(), month + 1, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfMonth;\n","import { normalizeDates } from \"./normalizeDates.js\";\n\nexport function normalizeInterval(context, interval) {\n const [start, end] = normalizeDates(context, interval.start, interval.end);\n return { start, end };\n}\n","import { normalizeInterval } from \"./_lib/normalizeInterval.js\";\nimport { constructFrom } from \"./constructFrom.js\";\n\n/**\n * The {@link eachMonthOfInterval} function options.\n */\n\n/**\n * The {@link eachMonthOfInterval} function result type. It resolves the proper data type.\n */\n\n/**\n * @name eachMonthOfInterval\n * @category Interval Helpers\n * @summary Return the array of months within the specified time interval.\n *\n * @description\n * Return the array of months within the specified time interval.\n *\n * @typeParam IntervalType - Interval type.\n * @typeParam Options - Options type.\n *\n * @param interval - The interval.\n * @param options - An object with options.\n *\n * @returns The array with starts of months from the month of the interval start to the month of the interval end\n *\n * @example\n * // Each month between 6 February 2014 and 10 August 2014:\n * const result = eachMonthOfInterval({\n * start: new Date(2014, 1, 6),\n * end: new Date(2014, 7, 10)\n * })\n * //=> [\n * // Sat Feb 01 2014 00:00:00,\n * // Sat Mar 01 2014 00:00:00,\n * // Tue Apr 01 2014 00:00:00,\n * // Thu May 01 2014 00:00:00,\n * // Sun Jun 01 2014 00:00:00,\n * // Tue Jul 01 2014 00:00:00,\n * // Fri Aug 01 2014 00:00:00\n * // ]\n */\nexport function eachMonthOfInterval(interval, options) {\n const { start, end } = normalizeInterval(options?.in, interval);\n\n let reversed = +start > +end;\n const endTime = reversed ? +start : +end;\n const date = reversed ? end : start;\n date.setHours(0, 0, 0, 0);\n date.setDate(1);\n\n let step = options?.step ?? 1;\n if (!step) return [];\n if (step < 0) {\n step = -step;\n reversed = !reversed;\n }\n\n const dates = [];\n\n while (+date <= endTime) {\n dates.push(constructFrom(start, date));\n date.setMonth(date.getMonth() + step);\n }\n\n return reversed ? dates.reverse() : dates;\n}\n\n// Fallback for modularized imports:\nexport default eachMonthOfInterval;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfMonth} function options.\n */\n\n/**\n * @name startOfMonth\n * @category Month Helpers\n * @summary Return the start of a month for the given date.\n *\n * @description\n * Return the start of a month for the given date. The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments.\n * Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed,\n * or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a month\n *\n * @example\n * // The start of a month for 2 September 2014 11:55:00:\n * const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Mon Sep 01 2014 00:00:00\n */\nexport function startOfMonth(date, options) {\n const _date = toDate(date, options?.in);\n _date.setDate(1);\n _date.setHours(0, 0, 0, 0);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfYear} function options.\n */\n\n/**\n * @name endOfYear\n * @category Year Helpers\n * @summary Return the end of a year for the given date.\n *\n * @description\n * Return the end of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The end of a year\n *\n * @example\n * // The end of a year for 2 September 2014 11:55:00:\n * const result = endOfYear(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Wed Dec 31 2014 23:59:59.999\n */\nexport function endOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n _date.setFullYear(year + 1, 0, 0);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link startOfYear} function options.\n */\n\n/**\n * @name startOfYear\n * @category Year Helpers\n * @summary Return the start of a year for the given date.\n *\n * @description\n * Return the start of a year for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - The options\n *\n * @returns The start of a year\n *\n * @example\n * // The start of a year for 2 September 2014 11:55:00:\n * const result = startOfYear(new Date(2014, 8, 2, 11, 55, 00))\n * //=> Wed Jan 01 2014 00:00:00\n */\nexport function startOfYear(date, options) {\n const date_ = toDate(date, options?.in);\n date_.setFullYear(date_.getFullYear(), 0, 1);\n date_.setHours(0, 0, 0, 0);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default startOfYear;\n","import { normalizeInterval } from \"./_lib/normalizeInterval.js\";\nimport { constructFrom } from \"./constructFrom.js\";\n\n/**\n * The {@link eachYearOfInterval} function options.\n */\n\n/**\n * The {@link eachYearOfInterval} function result type. It resolves the proper data type.\n * It uses the first argument date object type, starting from the date argument,\n * then the start interval date, and finally the end interval date. If\n * a context function is passed, it uses the context function return type.\n */\n\n/**\n * @name eachYearOfInterval\n * @category Interval Helpers\n * @summary Return the array of yearly timestamps within the specified time interval.\n *\n * @description\n * Return the array of yearly timestamps within the specified time interval.\n *\n * @typeParam IntervalType - Interval type.\n * @typeParam Options - Options type.\n *\n * @param interval - The interval.\n * @param options - An object with options.\n *\n * @returns The array with starts of yearly timestamps from the month of the interval start to the month of the interval end\n *\n * @example\n * // Each year between 6 February 2014 and 10 August 2017:\n * const result = eachYearOfInterval({\n * start: new Date(2014, 1, 6),\n * end: new Date(2017, 7, 10)\n * })\n * //=> [\n * // Wed Jan 01 2014 00:00:00,\n * // Thu Jan 01 2015 00:00:00,\n * // Fri Jan 01 2016 00:00:00,\n * // Sun Jan 01 2017 00:00:00\n * // ]\n */\nexport function eachYearOfInterval(interval, options) {\n const { start, end } = normalizeInterval(options?.in, interval);\n\n let reversed = +start > +end;\n const endTime = reversed ? +start : +end;\n const date = reversed ? end : start;\n date.setHours(0, 0, 0, 0);\n date.setMonth(0, 1);\n\n let step = options?.step ?? 1;\n if (!step) return [];\n if (step < 0) {\n step = -step;\n reversed = !reversed;\n }\n\n const dates = [];\n\n while (+date <= endTime) {\n dates.push(constructFrom(start, date));\n date.setFullYear(date.getFullYear() + step);\n }\n\n return reversed ? dates.reverse() : dates;\n}\n\n// Fallback for modularized imports:\nexport default eachYearOfInterval;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link endOfWeek} function options.\n */\n\n/**\n * @name endOfWeek\n * @category Week Helpers\n * @summary Return the end of a week for the given date.\n *\n * @description\n * Return the end of a week for the given date.\n * The result will be in the local timezone.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of a week\n *\n * @example\n * // The end of a week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sat Sep 06 2014 23:59:59.999\n *\n * @example\n * // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:\n * const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfWeek(date, options) {\n const defaultOptions = getDefaultOptions();\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const _date = toDate(date, options?.in);\n const day = _date.getDay();\n const diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);\n\n _date.setDate(_date.getDate() + diff);\n _date.setHours(23, 59, 59, 999);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default endOfWeek;\n","import { endOfWeek } from \"./endOfWeek.js\";\n\n/**\n * The {@link endOfISOWeek} function options.\n */\n\n/**\n * @name endOfISOWeek\n * @category ISO Week Helpers\n * @summary Return the end of an ISO week for the given date.\n *\n * @description\n * Return the end of an ISO week for the given date.\n * The result will be in the local timezone.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The end of an ISO week\n *\n * @example\n * // The end of an ISO week for 2 September 2014 11:55:00:\n * const result = endOfISOWeek(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Sun Sep 07 2014 23:59:59.999\n */\nexport function endOfISOWeek(date, options) {\n return endOfWeek(date, { ...options, weekStartsOn: 1 });\n}\n\n// Fallback for modularized imports:\nexport default endOfISOWeek;\n","import { differenceInCalendarDays } from \"./differenceInCalendarDays.js\";\nimport { startOfYear } from \"./startOfYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDayOfYear} function options.\n */\n\n/**\n * @name getDayOfYear\n * @category Day Helpers\n * @summary Get the day of the year of the given date.\n *\n * @description\n * Get the day of the year of the given date.\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The day of year\n *\n * @example\n * // Which day of the year is 2 July 2014?\n * const result = getDayOfYear(new Date(2014, 6, 2))\n * //=> 183\n */\nexport function getDayOfYear(date, options) {\n const _date = toDate(date, options?.in);\n const diff = differenceInCalendarDays(_date, startOfYear(_date));\n const dayOfYear = diff + 1;\n return dayOfYear;\n}\n\n// Fallback for modularized imports:\nexport default getDayOfYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfISOWeek } from \"./startOfISOWeek.js\";\nimport { startOfISOWeekYear } from \"./startOfISOWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getISOWeek} function options.\n */\n\n/**\n * @name getISOWeek\n * @category ISO Week Helpers\n * @summary Get the ISO week of the given date.\n *\n * @description\n * Get the ISO week of the given date.\n *\n * ISO week-numbering year: http://en.wikipedia.org/wiki/ISO_week_date\n *\n * @param date - The given date\n * @param options - The options\n *\n * @returns The ISO week\n *\n * @example\n * // Which week of the ISO-week numbering year is 2 January 2005?\n * const result = getISOWeek(new Date(2005, 0, 2))\n * //=> 53\n */\nexport function getISOWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfISOWeek(_date) - +startOfISOWeekYear(_date);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getISOWeek;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeekYear} function options.\n */\n\n/**\n * @name getWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Get the local week-numbering year of the given date.\n *\n * @description\n * Get the local week-numbering year of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options.\n *\n * @returns The local week-numbering year\n *\n * @example\n * // Which week numbering year is 26 December 2004 with the default settings?\n * const result = getWeekYear(new Date(2004, 11, 26))\n * //=> 2005\n *\n * @example\n * // Which week numbering year is 26 December 2004 if week starts on Saturday?\n * const result = getWeekYear(new Date(2004, 11, 26), { weekStartsOn: 6 })\n * //=> 2004\n *\n * @example\n * // Which week numbering year is 26 December 2004 if the first week contains 4 January?\n * const result = getWeekYear(new Date(2004, 11, 26), { firstWeekContainsDate: 4 })\n * //=> 2004\n */\nexport function getWeekYear(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const firstWeekOfNextYear = constructFrom(options?.in || date, 0);\n firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setHours(0, 0, 0, 0);\n const startOfNextYear = startOfWeek(firstWeekOfNextYear, options);\n\n const firstWeekOfThisYear = constructFrom(options?.in || date, 0);\n firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setHours(0, 0, 0, 0);\n const startOfThisYear = startOfWeek(firstWeekOfThisYear, options);\n\n if (+_date >= +startOfNextYear) {\n return year + 1;\n } else if (+_date >= +startOfThisYear) {\n return year;\n } else {\n return year - 1;\n }\n}\n\n// Fallback for modularized imports:\nexport default getWeekYear;\n","import { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { constructFrom } from \"./constructFrom.js\";\nimport { getWeekYear } from \"./getWeekYear.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\n\n/**\n * The {@link startOfWeekYear} function options.\n */\n\n/**\n * @name startOfWeekYear\n * @category Week-Numbering Year Helpers\n * @summary Return the start of a local week-numbering year for the given date.\n *\n * @description\n * Return the start of a local week-numbering year.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type.\n *\n * @param date - The original date\n * @param options - An object with options\n *\n * @returns The start of a week-numbering year\n *\n * @example\n * // The start of an a week-numbering year for 2 July 2005 with default settings:\n * const result = startOfWeekYear(new Date(2005, 6, 2))\n * //=> Sun Dec 26 2004 00:00:00\n *\n * @example\n * // The start of a week-numbering year for 2 July 2005\n * // if Monday is the first day of week\n * // and 4 January is always in the first week of the year:\n * const result = startOfWeekYear(new Date(2005, 6, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> Mon Jan 03 2005 00:00:00\n */\nexport function startOfWeekYear(date, options) {\n const defaultOptions = getDefaultOptions();\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const year = getWeekYear(date, options);\n const firstWeek = constructFrom(options?.in || date, 0);\n firstWeek.setFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setHours(0, 0, 0, 0);\n const _date = startOfWeek(firstWeek, options);\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default startOfWeekYear;\n","import { millisecondsInWeek } from \"./constants.js\";\nimport { startOfWeek } from \"./startOfWeek.js\";\nimport { startOfWeekYear } from \"./startOfWeekYear.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getWeek} function options.\n */\n\n/**\n * @name getWeek\n * @category Week Helpers\n * @summary Get the local week index of the given date.\n *\n * @description\n * Get the local week index of the given date.\n * The exact calculation depends on the values of\n * `options.weekStartsOn` (which is the index of the first day of the week)\n * and `options.firstWeekContainsDate` (which is the day of January, which is always in\n * the first week of the week-numbering year)\n *\n * Week numbering: https://en.wikipedia.org/wiki/Week#The_ISO_week_date_system\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The week\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005 with default options?\n * const result = getWeek(new Date(2005, 0, 2))\n * //=> 2\n *\n * @example\n * // Which week of the local week numbering year is 2 January 2005,\n * // if Monday is the first day of the week,\n * // and the first week of the year always contains 4 January?\n * const result = getWeek(new Date(2005, 0, 2), {\n * weekStartsOn: 1,\n * firstWeekContainsDate: 4\n * })\n * //=> 53\n */\nexport function getWeek(date, options) {\n const _date = toDate(date, options?.in);\n const diff = +startOfWeek(_date, options) - +startOfWeekYear(_date, options);\n\n // Round the number of weeks to the nearest integer because the number of\n // milliseconds in a week is not constant (e.g. it's different in the week of\n // the daylight saving time clock shift).\n return Math.round(diff / millisecondsInWeek) + 1;\n}\n\n// Fallback for modularized imports:\nexport default getWeek;\n","export function addLeadingZeros(number, targetLength) {\n const sign = number < 0 ? \"-\" : \"\";\n const output = Math.abs(number).toString().padStart(targetLength, \"0\");\n return sign + output;\n}\n","import { addLeadingZeros } from \"../addLeadingZeros.js\";\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nexport const lightFormatters = {\n // Year\n y(date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === \"yy\" ? year % 100 : year, token.length);\n },\n\n // Month\n M(date, token) {\n const month = date.getMonth();\n return token === \"M\" ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n\n // Day of the month\n d(date, token) {\n return addLeadingZeros(date.getDate(), token.length);\n },\n\n // AM or PM\n a(date, token) {\n const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return dayPeriodEnumValue.toUpperCase();\n case \"aaa\":\n return dayPeriodEnumValue;\n case \"aaaaa\":\n return dayPeriodEnumValue[0];\n case \"aaaa\":\n default:\n return dayPeriodEnumValue === \"am\" ? \"a.m.\" : \"p.m.\";\n }\n },\n\n // Hour [1-12]\n h(date, token) {\n return addLeadingZeros(date.getHours() % 12 || 12, token.length);\n },\n\n // Hour [0-23]\n H(date, token) {\n return addLeadingZeros(date.getHours(), token.length);\n },\n\n // Minute\n m(date, token) {\n return addLeadingZeros(date.getMinutes(), token.length);\n },\n\n // Second\n s(date, token) {\n return addLeadingZeros(date.getSeconds(), token.length);\n },\n\n // Fraction of second\n S(date, token) {\n const numberOfDigits = token.length;\n const milliseconds = date.getMilliseconds();\n const fractionalSeconds = Math.trunc(\n milliseconds * Math.pow(10, numberOfDigits - 3),\n );\n return addLeadingZeros(fractionalSeconds, token.length);\n },\n};\n","import { getDayOfYear } from \"../../getDayOfYear.js\";\nimport { getISOWeek } from \"../../getISOWeek.js\";\nimport { getISOWeekYear } from \"../../getISOWeekYear.js\";\nimport { getWeek } from \"../../getWeek.js\";\nimport { getWeekYear } from \"../../getWeekYear.js\";\n\nimport { addLeadingZeros } from \"../addLeadingZeros.js\";\nimport { lightFormatters } from \"./lightFormatters.js\";\n\nconst dayPeriodEnum = {\n am: \"am\",\n pm: \"pm\",\n midnight: \"midnight\",\n noon: \"noon\",\n morning: \"morning\",\n afternoon: \"afternoon\",\n evening: \"evening\",\n night: \"night\",\n};\n\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nexport const formatters = {\n // Era\n G: function (date, token, localize) {\n const era = date.getFullYear() > 0 ? 1 : 0;\n switch (token) {\n // AD, BC\n case \"G\":\n case \"GG\":\n case \"GGG\":\n return localize.era(era, { width: \"abbreviated\" });\n // A, B\n case \"GGGGG\":\n return localize.era(era, { width: \"narrow\" });\n // Anno Domini, Before Christ\n case \"GGGG\":\n default:\n return localize.era(era, { width: \"wide\" });\n }\n },\n\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === \"yo\") {\n const signedYear = date.getFullYear();\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, { unit: \"year\" });\n }\n\n return lightFormatters.y(date, token);\n },\n\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n const signedWeekYear = getWeekYear(date, options);\n // Returns 1 for 1 BC (which is year 0 in JavaScript)\n const weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;\n\n // Two digit year\n if (token === \"YY\") {\n const twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n }\n\n // Ordinal number\n if (token === \"Yo\") {\n return localize.ordinalNumber(weekYear, { unit: \"year\" });\n }\n\n // Padding\n return addLeadingZeros(weekYear, token.length);\n },\n\n // ISO week-numbering year\n R: function (date, token) {\n const isoWeekYear = getISOWeekYear(date);\n\n // Padding\n return addLeadingZeros(isoWeekYear, token.length);\n },\n\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n const year = date.getFullYear();\n return addLeadingZeros(year, token.length);\n },\n\n // Quarter\n Q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"Q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"QQ\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"Qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"QQQ\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"QQQQQ\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"QQQQ\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone quarter\n q: function (date, token, localize) {\n const quarter = Math.ceil((date.getMonth() + 1) / 3);\n switch (token) {\n // 1, 2, 3, 4\n case \"q\":\n return String(quarter);\n // 01, 02, 03, 04\n case \"qq\":\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n case \"qo\":\n return localize.ordinalNumber(quarter, { unit: \"quarter\" });\n // Q1, Q2, Q3, Q4\n case \"qqq\":\n return localize.quarter(quarter, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n case \"qqqqq\":\n return localize.quarter(quarter, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // 1st quarter, 2nd quarter, ...\n case \"qqqq\":\n default:\n return localize.quarter(quarter, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // Month\n M: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n case \"M\":\n case \"MM\":\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n case \"Mo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"MMM\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // J, F, ..., D\n case \"MMMMM\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // January, February, ..., December\n case \"MMMM\":\n default:\n return localize.month(month, { width: \"wide\", context: \"formatting\" });\n }\n },\n\n // Stand-alone month\n L: function (date, token, localize) {\n const month = date.getMonth();\n switch (token) {\n // 1, 2, ..., 12\n case \"L\":\n return String(month + 1);\n // 01, 02, ..., 12\n case \"LL\":\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n case \"Lo\":\n return localize.ordinalNumber(month + 1, { unit: \"month\" });\n // Jan, Feb, ..., Dec\n case \"LLL\":\n return localize.month(month, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // J, F, ..., D\n case \"LLLLL\":\n return localize.month(month, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // January, February, ..., December\n case \"LLLL\":\n default:\n return localize.month(month, { width: \"wide\", context: \"standalone\" });\n }\n },\n\n // Local week of year\n w: function (date, token, localize, options) {\n const week = getWeek(date, options);\n\n if (token === \"wo\") {\n return localize.ordinalNumber(week, { unit: \"week\" });\n }\n\n return addLeadingZeros(week, token.length);\n },\n\n // ISO week of year\n I: function (date, token, localize) {\n const isoWeek = getISOWeek(date);\n\n if (token === \"Io\") {\n return localize.ordinalNumber(isoWeek, { unit: \"week\" });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n\n // Day of the month\n d: function (date, token, localize) {\n if (token === \"do\") {\n return localize.ordinalNumber(date.getDate(), { unit: \"date\" });\n }\n\n return lightFormatters.d(date, token);\n },\n\n // Day of year\n D: function (date, token, localize) {\n const dayOfYear = getDayOfYear(date);\n\n if (token === \"Do\") {\n return localize.ordinalNumber(dayOfYear, { unit: \"dayOfYear\" });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n\n // Day of week\n E: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n switch (token) {\n // Tue\n case \"E\":\n case \"EE\":\n case \"EEE\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"EEEEE\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"EEEEEE\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"EEEE\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Local day of week\n e: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case \"e\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"ee\":\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n case \"eo\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"eee\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"eeeee\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"eeeeee\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"eeee\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n const dayOfWeek = date.getDay();\n const localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n switch (token) {\n // Numerical value (same as in `e`)\n case \"c\":\n return String(localDayOfWeek);\n // Padded numerical value\n case \"cc\":\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n case \"co\":\n return localize.ordinalNumber(localDayOfWeek, { unit: \"day\" });\n case \"ccc\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"standalone\",\n });\n // T\n case \"ccccc\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"standalone\",\n });\n // Tu\n case \"cccccc\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"standalone\",\n });\n // Tuesday\n case \"cccc\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"standalone\",\n });\n }\n },\n\n // ISO day of week\n i: function (date, token, localize) {\n const dayOfWeek = date.getDay();\n const isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n switch (token) {\n // 2\n case \"i\":\n return String(isoDayOfWeek);\n // 02\n case \"ii\":\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n case \"io\":\n return localize.ordinalNumber(isoDayOfWeek, { unit: \"day\" });\n // Tue\n case \"iii\":\n return localize.day(dayOfWeek, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n // T\n case \"iiiii\":\n return localize.day(dayOfWeek, {\n width: \"narrow\",\n context: \"formatting\",\n });\n // Tu\n case \"iiiiii\":\n return localize.day(dayOfWeek, {\n width: \"short\",\n context: \"formatting\",\n });\n // Tuesday\n case \"iiii\":\n default:\n return localize.day(dayOfWeek, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM or PM\n a: function (date, token, localize) {\n const hours = date.getHours();\n const dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n\n switch (token) {\n case \"a\":\n case \"aa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"aaa\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"aaaaa\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"aaaa\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? \"pm\" : \"am\";\n }\n\n switch (token) {\n case \"b\":\n case \"bb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"bbb\":\n return localize\n .dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n })\n .toLowerCase();\n case \"bbbbb\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"bbbb\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n const hours = date.getHours();\n let dayPeriodEnumValue;\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case \"B\":\n case \"BB\":\n case \"BBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"abbreviated\",\n context: \"formatting\",\n });\n case \"BBBBB\":\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"narrow\",\n context: \"formatting\",\n });\n case \"BBBB\":\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: \"wide\",\n context: \"formatting\",\n });\n }\n },\n\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === \"ho\") {\n let hours = date.getHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return lightFormatters.h(date, token);\n },\n\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === \"Ho\") {\n return localize.ordinalNumber(date.getHours(), { unit: \"hour\" });\n }\n\n return lightFormatters.H(date, token);\n },\n\n // Hour [0-11]\n K: function (date, token, localize) {\n const hours = date.getHours() % 12;\n\n if (token === \"Ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Hour [1-24]\n k: function (date, token, localize) {\n let hours = date.getHours();\n if (hours === 0) hours = 24;\n\n if (token === \"ko\") {\n return localize.ordinalNumber(hours, { unit: \"hour\" });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n\n // Minute\n m: function (date, token, localize) {\n if (token === \"mo\") {\n return localize.ordinalNumber(date.getMinutes(), { unit: \"minute\" });\n }\n\n return lightFormatters.m(date, token);\n },\n\n // Second\n s: function (date, token, localize) {\n if (token === \"so\") {\n return localize.ordinalNumber(date.getSeconds(), { unit: \"second\" });\n }\n\n return lightFormatters.s(date, token);\n },\n\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return \"Z\";\n }\n\n switch (token) {\n // Hours and optional minutes\n case \"X\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n case \"XXXX\":\n case \"XX\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n case \"XXXXX\":\n case \"XXX\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case \"x\":\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n case \"xxxx\":\n case \"xx\": // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n case \"xxxxx\":\n case \"xxx\": // Hours and minutes with `:` delimiter\n default:\n return formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (GMT)\n O: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"O\":\n case \"OO\":\n case \"OOO\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"OOOO\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Timezone (specific non-location)\n z: function (date, token, _localize) {\n const timezoneOffset = date.getTimezoneOffset();\n\n switch (token) {\n // Short\n case \"z\":\n case \"zz\":\n case \"zzz\":\n return \"GMT\" + formatTimezoneShort(timezoneOffset, \":\");\n // Long\n case \"zzzz\":\n default:\n return \"GMT\" + formatTimezone(timezoneOffset, \":\");\n }\n },\n\n // Seconds timestamp\n t: function (date, token, _localize) {\n const timestamp = Math.trunc(+date / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n\n // Milliseconds timestamp\n T: function (date, token, _localize) {\n return addLeadingZeros(+date, token.length);\n },\n};\n\nfunction formatTimezoneShort(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = Math.trunc(absOffset / 60);\n const minutes = absOffset % 60;\n if (minutes === 0) {\n return sign + String(hours);\n }\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, delimiter) {\n if (offset % 60 === 0) {\n const sign = offset > 0 ? \"-\" : \"+\";\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n return formatTimezone(offset, delimiter);\n}\n\nfunction formatTimezone(offset, delimiter = \"\") {\n const sign = offset > 0 ? \"-\" : \"+\";\n const absOffset = Math.abs(offset);\n const hours = addLeadingZeros(Math.trunc(absOffset / 60), 2);\n const minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n","const dateLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"P\":\n return formatLong.date({ width: \"short\" });\n case \"PP\":\n return formatLong.date({ width: \"medium\" });\n case \"PPP\":\n return formatLong.date({ width: \"long\" });\n case \"PPPP\":\n default:\n return formatLong.date({ width: \"full\" });\n }\n};\n\nconst timeLongFormatter = (pattern, formatLong) => {\n switch (pattern) {\n case \"p\":\n return formatLong.time({ width: \"short\" });\n case \"pp\":\n return formatLong.time({ width: \"medium\" });\n case \"ppp\":\n return formatLong.time({ width: \"long\" });\n case \"pppp\":\n default:\n return formatLong.time({ width: \"full\" });\n }\n};\n\nconst dateTimeLongFormatter = (pattern, formatLong) => {\n const matchResult = pattern.match(/(P+)(p+)?/) || [];\n const datePattern = matchResult[1];\n const timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n let dateTimeFormat;\n\n switch (datePattern) {\n case \"P\":\n dateTimeFormat = formatLong.dateTime({ width: \"short\" });\n break;\n case \"PP\":\n dateTimeFormat = formatLong.dateTime({ width: \"medium\" });\n break;\n case \"PPP\":\n dateTimeFormat = formatLong.dateTime({ width: \"long\" });\n break;\n case \"PPPP\":\n default:\n dateTimeFormat = formatLong.dateTime({ width: \"full\" });\n break;\n }\n\n return dateTimeFormat\n .replace(\"{{date}}\", dateLongFormatter(datePattern, formatLong))\n .replace(\"{{time}}\", timeLongFormatter(timePattern, formatLong));\n};\n\nexport const longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter,\n};\n","const dayOfYearTokenRE = /^D+$/;\nconst weekYearTokenRE = /^Y+$/;\n\nconst throwTokens = [\"D\", \"DD\", \"YY\", \"YYYY\"];\n\nexport function isProtectedDayOfYearToken(token) {\n return dayOfYearTokenRE.test(token);\n}\n\nexport function isProtectedWeekYearToken(token) {\n return weekYearTokenRE.test(token);\n}\n\nexport function warnOrThrowProtectedError(token, format, input) {\n const _message = message(token, format, input);\n console.warn(_message);\n if (throwTokens.includes(token)) throw new RangeError(_message);\n}\n\nfunction message(token, format, input) {\n const subject = token[0] === \"Y\" ? \"years\" : \"days of the month\";\n return `Use \\`${token.toLowerCase()}\\` instead of \\`${token}\\` (in \\`${format}\\`) for formatting ${subject} to the input \\`${input}\\`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md`;\n}\n","import { defaultLocale } from \"./_lib/defaultLocale.js\";\nimport { getDefaultOptions } from \"./_lib/defaultOptions.js\";\nimport { formatters } from \"./_lib/format/formatters.js\";\nimport { longFormatters } from \"./_lib/format/longFormatters.js\";\nimport {\n isProtectedDayOfYearToken,\n isProtectedWeekYearToken,\n warnOrThrowProtectedError,\n} from \"./_lib/protectedTokens.js\";\nimport { isValid } from \"./isValid.js\";\nimport { toDate } from \"./toDate.js\";\n\n// Rexports of internal for libraries to use.\n// See: https://github.com/date-fns/date-fns/issues/3638#issuecomment-1877082874\nexport { formatters, longFormatters };\n\n// This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\nconst formattingTokensRegExp =\n /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g;\n\n// This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\nconst longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\n\nconst escapedStringRegExp = /^'([^]*?)'?$/;\nconst doubleQuoteRegExp = /''/g;\nconst unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n\nexport { format as formatDate };\n\n/**\n * The {@link format} function options.\n */\n\n/**\n * @name format\n * @alias formatDate\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear](https://date-fns.org/docs/getISOWeekYear)\n * and [getWeekYear](https://date-fns.org/docs/getWeekYear)).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n *\n * @param date - The original date\n * @param format - The string of tokens\n * @param options - An object with options\n *\n * @returns The formatted date string\n *\n * @throws `date` must not be Invalid Date\n * @throws `options.locale` must contain `localize` property\n * @throws `options.locale` must contain `formatLong` property\n * @throws use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md\n * @throws format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * const result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * const result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * const result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\nexport function format(date, formatStr, options) {\n const defaultOptions = getDefaultOptions();\n const locale = options?.locale ?? defaultOptions.locale ?? defaultLocale;\n\n const firstWeekContainsDate =\n options?.firstWeekContainsDate ??\n options?.locale?.options?.firstWeekContainsDate ??\n defaultOptions.firstWeekContainsDate ??\n defaultOptions.locale?.options?.firstWeekContainsDate ??\n 1;\n\n const weekStartsOn =\n options?.weekStartsOn ??\n options?.locale?.options?.weekStartsOn ??\n defaultOptions.weekStartsOn ??\n defaultOptions.locale?.options?.weekStartsOn ??\n 0;\n\n const originalDate = toDate(date, options?.in);\n\n if (!isValid(originalDate)) {\n throw new RangeError(\"Invalid time value\");\n }\n\n let parts = formatStr\n .match(longFormattingTokensRegExp)\n .map((substring) => {\n const firstCharacter = substring[0];\n if (firstCharacter === \"p\" || firstCharacter === \"P\") {\n const longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong);\n }\n return substring;\n })\n .join(\"\")\n .match(formattingTokensRegExp)\n .map((substring) => {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return { isToken: false, value: \"'\" };\n }\n\n const firstCharacter = substring[0];\n if (firstCharacter === \"'\") {\n return { isToken: false, value: cleanEscapedString(substring) };\n }\n\n if (formatters[firstCharacter]) {\n return { isToken: true, value: substring };\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError(\n \"Format string contains an unescaped latin alphabet character `\" +\n firstCharacter +\n \"`\",\n );\n }\n\n return { isToken: false, value: substring };\n });\n\n // invoke localize preprocessor (only for french locales at the moment)\n if (locale.localize.preprocessor) {\n parts = locale.localize.preprocessor(originalDate, parts);\n }\n\n const formatterOptions = {\n firstWeekContainsDate,\n weekStartsOn,\n locale,\n };\n\n return parts\n .map((part) => {\n if (!part.isToken) return part.value;\n\n const token = part.value;\n\n if (\n (!options?.useAdditionalWeekYearTokens &&\n isProtectedWeekYearToken(token)) ||\n (!options?.useAdditionalDayOfYearTokens &&\n isProtectedDayOfYearToken(token))\n ) {\n warnOrThrowProtectedError(token, formatStr, String(date));\n }\n\n const formatter = formatters[token[0]];\n return formatter(originalDate, token, locale.localize, formatterOptions);\n })\n .join(\"\");\n}\n\nfunction cleanEscapedString(input) {\n const matched = input.match(escapedStringRegExp);\n\n if (!matched) {\n return input;\n }\n\n return matched[1].replace(doubleQuoteRegExp, \"'\");\n}\n\n// Fallback for modularized imports:\nexport default format;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getDaysInMonth} function options.\n */\n\n/**\n * @name getDaysInMonth\n * @category Month Helpers\n * @summary Get the number of days in a month of the given date.\n *\n * @description\n * Get the number of days in a month of the given date, considering the context if provided.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The number of days in a month\n *\n * @example\n * // How many days are in February 2000?\n * const result = getDaysInMonth(new Date(2000, 1))\n * //=> 29\n */\nexport function getDaysInMonth(date, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n const monthIndex = _date.getMonth();\n const lastDayOfMonth = constructFrom(_date, 0);\n lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);\n lastDayOfMonth.setHours(0, 0, 0, 0);\n return lastDayOfMonth.getDate();\n}\n\n// Fallback for modularized imports:\nexport default getDaysInMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getMonth} function options.\n */\n\n/**\n * @name getMonth\n * @category Month Helpers\n * @summary Get the month of the given date.\n *\n * @description\n * Get the month of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The month index (0-11)\n *\n * @example\n * // Which month is 29 February 2012?\n * const result = getMonth(new Date(2012, 1, 29))\n * //=> 1\n */\nexport function getMonth(date, options) {\n return toDate(date, options?.in).getMonth();\n}\n\n// Fallback for modularized imports:\nexport default getMonth;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * The {@link getYear} function options.\n */\n\n/**\n * @name getYear\n * @category Year Helpers\n * @summary Get the year of the given date.\n *\n * @description\n * Get the year of the given date.\n *\n * @param date - The given date\n * @param options - An object with options\n *\n * @returns The year\n *\n * @example\n * // Which year is 2 July 2014?\n * const result = getYear(new Date(2014, 6, 2))\n * //=> 2014\n */\nexport function getYear(date, options) {\n return toDate(date, options?.in).getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default getYear;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isAfter\n * @category Common Helpers\n * @summary Is the first date after the second one?\n *\n * @description\n * Is the first date after the second one?\n *\n * @param date - The date that should be after the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is after the second date\n *\n * @example\n * // Is 10 July 1989 after 11 February 1987?\n * const result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> true\n */\nexport function isAfter(date, dateToCompare) {\n return +toDate(date) > +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isAfter;\n","import { toDate } from \"./toDate.js\";\n\n/**\n * @name isBefore\n * @category Common Helpers\n * @summary Is the first date before the second one?\n *\n * @description\n * Is the first date before the second one?\n *\n * @param date - The date that should be before the other one to return true\n * @param dateToCompare - The date to compare with\n *\n * @returns The first date is before the second date\n *\n * @example\n * // Is 10 July 1989 before 11 February 1987?\n * const result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))\n * //=> false\n */\nexport function isBefore(date, dateToCompare) {\n return +toDate(date) < +toDate(dateToCompare);\n}\n\n// Fallback for modularized imports:\nexport default isBefore;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link isSameMonth} function options.\n */\n\n/**\n * @name isSameMonth\n * @category Month Helpers\n * @summary Are the given dates in the same month (and year)?\n *\n * @description\n * Are the given dates in the same month (and year)?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same month (and year)\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n *\n * @example\n * // Are 2 September 2014 and 25 September 2015 in the same month?\n * const result = isSameMonth(new Date(2014, 8, 2), new Date(2015, 8, 25))\n * //=> false\n */\nexport function isSameMonth(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return (\n laterDate_.getFullYear() === earlierDate_.getFullYear() &&\n laterDate_.getMonth() === earlierDate_.getMonth()\n );\n}\n\n// Fallback for modularized imports:\nexport default isSameMonth;\n","import { normalizeDates } from \"./_lib/normalizeDates.js\";\n\n/**\n * The {@link isSameYear} function options.\n */\n\n/**\n * @name isSameYear\n * @category Year Helpers\n * @summary Are the given dates in the same year?\n *\n * @description\n * Are the given dates in the same year?\n *\n * @param laterDate - The first date to check\n * @param earlierDate - The second date to check\n * @param options - An object with options\n *\n * @returns The dates are in the same year\n *\n * @example\n * // Are 2 September 2014 and 25 September 2014 in the same year?\n * const result = isSameYear(new Date(2014, 8, 2), new Date(2014, 8, 25))\n * //=> true\n */\nexport function isSameYear(laterDate, earlierDate, options) {\n const [laterDate_, earlierDate_] = normalizeDates(\n options?.in,\n laterDate,\n earlierDate,\n );\n return laterDate_.getFullYear() === earlierDate_.getFullYear();\n}\n\n// Fallback for modularized imports:\nexport default isSameYear;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { getDaysInMonth } from \"./getDaysInMonth.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setMonth} function options.\n */\n\n/**\n * @name setMonth\n * @category Month Helpers\n * @summary Set the month to the given date.\n *\n * @description\n * Set the month to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param month - The month index to set (0-11)\n * @param options - The options\n *\n * @returns The new date with the month set\n *\n * @example\n * // Set February to 1 September 2014:\n * const result = setMonth(new Date(2014, 8, 1), 1)\n * //=> Sat Feb 01 2014 00:00:00\n */\nexport function setMonth(date, month, options) {\n const _date = toDate(date, options?.in);\n const year = _date.getFullYear();\n const day = _date.getDate();\n\n const midMonth = constructFrom(options?.in || date, 0);\n midMonth.setFullYear(year, month, 15);\n midMonth.setHours(0, 0, 0, 0);\n const daysInMonth = getDaysInMonth(midMonth);\n\n // Set the earlier date, allows to wrap Jan 31 to Feb 28\n _date.setMonth(month, Math.min(day, daysInMonth));\n return _date;\n}\n\n// Fallback for modularized imports:\nexport default setMonth;\n","import { constructFrom } from \"./constructFrom.js\";\nimport { toDate } from \"./toDate.js\";\n\n/**\n * The {@link setYear} function options.\n */\n\n/**\n * @name setYear\n * @category Year Helpers\n * @summary Set the year to the given date.\n *\n * @description\n * Set the year to the given date.\n *\n * @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).\n * @typeParam ResultDate - The result `Date` type, it is the type returned from the context function if it is passed, or inferred from the arguments.\n *\n * @param date - The date to be changed\n * @param year - The year of the new date\n * @param options - An object with options.\n *\n * @returns The new date with the year set\n *\n * @example\n * // Set year 2013 to 1 September 2014:\n * const result = setYear(new Date(2014, 8, 1), 2013)\n * //=> Sun Sep 01 2013 00:00:00\n */\nexport function setYear(date, year, options) {\n const date_ = toDate(date, options?.in);\n\n // Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date\n if (isNaN(+date_)) return constructFrom(options?.in || date, NaN);\n\n date_.setFullYear(year);\n return date_;\n}\n\n// Fallback for modularized imports:\nexport default setYear;\n","const FIVE_WEEKS = 5;\nconst FOUR_WEEKS = 4;\n/**\n * Returns the number of weeks to display in the broadcast calendar for a given\n * month.\n *\n * The broadcast calendar may have either 4 or 5 weeks in a month, depending on\n * the start and end dates of the broadcast weeks.\n *\n * @since 9.4.0\n * @param month The month for which to calculate the number of weeks.\n * @param dateLib The date library to use for date manipulation.\n * @returns The number of weeks in the broadcast calendar (4 or 5).\n */\nexport function getBroadcastWeeksInMonth(month, dateLib) {\n // Get the first day of the month\n const firstDayOfMonth = dateLib.startOfMonth(month);\n // Get the day of the week for the first day of the month (1-7, where 1 is Monday)\n const firstDayOfWeek = firstDayOfMonth.getDay() > 0 ? firstDayOfMonth.getDay() : 7;\n const broadcastStartDate = dateLib.addDays(month, -firstDayOfWeek + 1);\n const lastDateOfLastWeek = dateLib.addDays(broadcastStartDate, FIVE_WEEKS * 7 - 1);\n const numberOfWeeks = dateLib.getMonth(month) === dateLib.getMonth(lastDateOfLastWeek)\n ? FIVE_WEEKS\n : FOUR_WEEKS;\n return numberOfWeeks;\n}\n","/**\n * Returns the start date of the week in the broadcast calendar.\n *\n * The broadcast week starts on Monday. If the first day of the month is not a\n * Monday, this function calculates the previous Monday as the start of the\n * broadcast week.\n *\n * @since 9.4.0\n * @param date The date for which to calculate the start of the broadcast week.\n * @param dateLib The date library to use for date manipulation.\n * @returns The start date of the broadcast week.\n */\nexport function startOfBroadcastWeek(date, dateLib) {\n const firstOfMonth = dateLib.startOfMonth(date);\n const dayOfWeek = firstOfMonth.getDay();\n if (dayOfWeek === 1) {\n return firstOfMonth;\n }\n else if (dayOfWeek === 0) {\n return dateLib.addDays(firstOfMonth, -1 * 6);\n }\n else {\n return dateLib.addDays(firstOfMonth, -1 * (dayOfWeek - 1));\n }\n}\n","import { getBroadcastWeeksInMonth } from \"./getBroadcastWeeksInMonth.js\";\nimport { startOfBroadcastWeek } from \"./startOfBroadcastWeek.js\";\n/**\n * Returns the end date of the week in the broadcast calendar.\n *\n * The broadcast week ends on the last day of the last broadcast week for the\n * given date.\n *\n * @since 9.4.0\n * @param date The date for which to calculate the end of the broadcast week.\n * @param dateLib The date library to use for date manipulation.\n * @returns The end date of the broadcast week.\n */\nexport function endOfBroadcastWeek(date, dateLib) {\n const startDate = startOfBroadcastWeek(date, dateLib);\n const numberOfWeeks = getBroadcastWeeksInMonth(date, dateLib);\n const endDate = dateLib.addDays(startDate, numberOfWeeks * 7 - 1);\n return endDate;\n}\n","import { format } from \"date-fns\";\nimport { enUS as dateFnsEnUS } from \"date-fns/locale\";\n/** English (United States) locale extended with DayPicker-specific translations. */\nexport const enUS = {\n ...dateFnsEnUS,\n labels: {\n labelDayButton: (date, modifiers, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n let label = formatDate(date, \"PPPP\");\n if (modifiers.today)\n label = `Today, ${label}`;\n if (modifiers.selected)\n label = `${label}, selected`;\n return label;\n },\n labelMonthDropdown: \"Choose the Month\",\n labelNext: \"Go to the Next Month\",\n labelPrevious: \"Go to the Previous Month\",\n labelWeekNumber: (weekNumber) => `Week ${weekNumber}`,\n labelYearDropdown: \"Choose the Year\",\n labelGrid: (date, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n return formatDate(date, \"LLLL yyyy\");\n },\n labelGridcell: (date, modifiers, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n let label = formatDate(date, \"PPPP\");\n if (modifiers?.today) {\n label = `Today, ${label}`;\n }\n return label;\n },\n labelNav: \"Navigation bar\",\n labelWeekNumberHeader: \"Week Number\",\n labelWeekday: (date, options, dateLib) => {\n let formatDate;\n if (dateLib && typeof dateLib.format === \"function\") {\n formatDate = dateLib.format.bind(dateLib);\n }\n else {\n formatDate = (d, pattern) => format(d, pattern, { locale: dateFnsEnUS, ...options });\n }\n return formatDate(date, \"cccc\");\n },\n },\n};\n","import { TZDate } from \"@date-fns/tz\";\nimport { addDays, addMonths, addWeeks, addYears, differenceInCalendarDays, differenceInCalendarMonths, eachMonthOfInterval, eachYearOfInterval, endOfISOWeek, endOfMonth, endOfWeek, endOfYear, format, getISOWeek, getMonth, getWeek, getYear, isAfter, isBefore, isDate, isSameDay, isSameMonth, isSameYear, max, min, setMonth, setYear, startOfDay, startOfISOWeek, startOfMonth, startOfWeek, startOfYear, } from \"date-fns\";\nimport { endOfBroadcastWeek } from \"../helpers/endOfBroadcastWeek.js\";\nimport { startOfBroadcastWeek } from \"../helpers/startOfBroadcastWeek.js\";\nimport { enUS } from \"../locale/en-US.js\";\n/**\n * A wrapper class around [date-fns](http://date-fns.org) that provides utility\n * methods for date manipulation and formatting.\n *\n * @since 9.2.0\n * @example\n * const dateLib = new DateLib({ locale: es });\n * const newDate = dateLib.addDays(new Date(), 5);\n */\nexport class DateLib {\n /**\n * Creates an instance of `DateLib`.\n *\n * @param options Configuration options for the date library.\n * @param overrides Custom overrides for the date library functions.\n */\n constructor(options, overrides) {\n /**\n * Reference to the built-in Date constructor.\n *\n * @deprecated Use `newDate()` or `today()`.\n */\n this.Date = Date;\n /**\n * Creates a new `Date` object representing today's date.\n *\n * @since 9.5.0\n * @returns A `Date` object for today's date.\n */\n this.today = () => {\n if (this.overrides?.today) {\n return this.overrides.today();\n }\n if (this.options.timeZone) {\n return TZDate.tz(this.options.timeZone);\n }\n return new this.Date();\n };\n /**\n * Creates a new `Date` object with the specified year, month, and day.\n *\n * @since 9.5.0\n * @param year The year.\n * @param monthIndex The month (0-11).\n * @param date The day of the month.\n * @returns A new `Date` object.\n */\n this.newDate = (year, monthIndex, date) => {\n if (this.overrides?.newDate) {\n return this.overrides.newDate(year, monthIndex, date);\n }\n if (this.options.timeZone) {\n return new TZDate(year, monthIndex, date, this.options.timeZone);\n }\n return new Date(year, monthIndex, date);\n };\n /**\n * Adds the specified number of days to the given date.\n *\n * @param date The date to add days to.\n * @param amount The number of days to add.\n * @returns The new date with the days added.\n */\n this.addDays = (date, amount) => {\n return this.overrides?.addDays\n ? this.overrides.addDays(date, amount)\n : addDays(date, amount);\n };\n /**\n * Adds the specified number of months to the given date.\n *\n * @param date The date to add months to.\n * @param amount The number of months to add.\n * @returns The new date with the months added.\n */\n this.addMonths = (date, amount) => {\n return this.overrides?.addMonths\n ? this.overrides.addMonths(date, amount)\n : addMonths(date, amount);\n };\n /**\n * Adds the specified number of weeks to the given date.\n *\n * @param date The date to add weeks to.\n * @param amount The number of weeks to add.\n * @returns The new date with the weeks added.\n */\n this.addWeeks = (date, amount) => {\n return this.overrides?.addWeeks\n ? this.overrides.addWeeks(date, amount)\n : addWeeks(date, amount);\n };\n /**\n * Adds the specified number of years to the given date.\n *\n * @param date The date to add years to.\n * @param amount The number of years to add.\n * @returns The new date with the years added.\n */\n this.addYears = (date, amount) => {\n return this.overrides?.addYears\n ? this.overrides.addYears(date, amount)\n : addYears(date, amount);\n };\n /**\n * Returns the number of calendar days between the given dates.\n *\n * @param dateLeft The later date.\n * @param dateRight The earlier date.\n * @returns The number of calendar days between the dates.\n */\n this.differenceInCalendarDays = (dateLeft, dateRight) => {\n return this.overrides?.differenceInCalendarDays\n ? this.overrides.differenceInCalendarDays(dateLeft, dateRight)\n : differenceInCalendarDays(dateLeft, dateRight);\n };\n /**\n * Returns the number of calendar months between the given dates.\n *\n * @param dateLeft The later date.\n * @param dateRight The earlier date.\n * @returns The number of calendar months between the dates.\n */\n this.differenceInCalendarMonths = (dateLeft, dateRight) => {\n return this.overrides?.differenceInCalendarMonths\n ? this.overrides.differenceInCalendarMonths(dateLeft, dateRight)\n : differenceInCalendarMonths(dateLeft, dateRight);\n };\n /**\n * Returns the months between the given dates.\n *\n * @param interval The interval to get the months for.\n */\n this.eachMonthOfInterval = (interval) => {\n return this.overrides?.eachMonthOfInterval\n ? this.overrides.eachMonthOfInterval(interval)\n : eachMonthOfInterval(interval);\n };\n /**\n * Returns the years between the given dates.\n *\n * @since 9.11.1\n * @param interval The interval to get the years for.\n * @returns The array of years in the interval.\n */\n this.eachYearOfInterval = (interval) => {\n const years = this.overrides?.eachYearOfInterval\n ? this.overrides.eachYearOfInterval(interval)\n : eachYearOfInterval(interval);\n // Remove duplicates that may happen across DST transitions (e.g., \"America/Sao_Paulo\")\n // See https://github.com/date-fns/tz/issues/72\n const uniqueYears = new Set(years.map((d) => this.getYear(d)));\n if (uniqueYears.size === years.length) {\n // No duplicates, return as is\n return years;\n }\n // Rebuild the array to ensure one date per year\n const yearsArray = [];\n uniqueYears.forEach((y) => {\n yearsArray.push(new Date(y, 0, 1));\n });\n return yearsArray;\n };\n /**\n * Returns the end of the broadcast week for the given date.\n *\n * @param date The original date.\n * @returns The end of the broadcast week.\n */\n this.endOfBroadcastWeek = (date) => {\n return this.overrides?.endOfBroadcastWeek\n ? this.overrides.endOfBroadcastWeek(date)\n : endOfBroadcastWeek(date, this);\n };\n /**\n * Returns the end of the ISO week for the given date.\n *\n * @param date The original date.\n * @returns The end of the ISO week.\n */\n this.endOfISOWeek = (date) => {\n return this.overrides?.endOfISOWeek\n ? this.overrides.endOfISOWeek(date)\n : endOfISOWeek(date);\n };\n /**\n * Returns the end of the month for the given date.\n *\n * @param date The original date.\n * @returns The end of the month.\n */\n this.endOfMonth = (date) => {\n return this.overrides?.endOfMonth\n ? this.overrides.endOfMonth(date)\n : endOfMonth(date);\n };\n /**\n * Returns the end of the week for the given date.\n *\n * @param date The original date.\n * @returns The end of the week.\n */\n this.endOfWeek = (date, options) => {\n return this.overrides?.endOfWeek\n ? this.overrides.endOfWeek(date, options)\n : endOfWeek(date, this.options);\n };\n /**\n * Returns the end of the year for the given date.\n *\n * @param date The original date.\n * @returns The end of the year.\n */\n this.endOfYear = (date) => {\n return this.overrides?.endOfYear\n ? this.overrides.endOfYear(date)\n : endOfYear(date);\n };\n /**\n * Formats the given date using the specified format string.\n *\n * @param date The date to format.\n * @param formatStr The format string.\n * @returns The formatted date string.\n */\n this.format = (date, formatStr, _options) => {\n const formatted = this.overrides?.format\n ? this.overrides.format(date, formatStr, this.options)\n : format(date, formatStr, this.options);\n if (this.options.numerals && this.options.numerals !== \"latn\") {\n return this.replaceDigits(formatted);\n }\n return formatted;\n };\n /**\n * Returns the ISO week number for the given date.\n *\n * @param date The date to get the ISO week number for.\n * @returns The ISO week number.\n */\n this.getISOWeek = (date) => {\n return this.overrides?.getISOWeek\n ? this.overrides.getISOWeek(date)\n : getISOWeek(date);\n };\n /**\n * Returns the month of the given date.\n *\n * @param date The date to get the month for.\n * @returns The month.\n */\n this.getMonth = (date, _options) => {\n return this.overrides?.getMonth\n ? this.overrides.getMonth(date, this.options)\n : getMonth(date, this.options);\n };\n /**\n * Returns the year of the given date.\n *\n * @param date The date to get the year for.\n * @returns The year.\n */\n this.getYear = (date, _options) => {\n return this.overrides?.getYear\n ? this.overrides.getYear(date, this.options)\n : getYear(date, this.options);\n };\n /**\n * Returns the local week number for the given date.\n *\n * @param date The date to get the week number for.\n * @returns The week number.\n */\n this.getWeek = (date, _options) => {\n return this.overrides?.getWeek\n ? this.overrides.getWeek(date, this.options)\n : getWeek(date, this.options);\n };\n /**\n * Checks if the first date is after the second date.\n *\n * @param date The date to compare.\n * @param dateToCompare The date to compare with.\n * @returns True if the first date is after the second date.\n */\n this.isAfter = (date, dateToCompare) => {\n return this.overrides?.isAfter\n ? this.overrides.isAfter(date, dateToCompare)\n : isAfter(date, dateToCompare);\n };\n /**\n * Checks if the first date is before the second date.\n *\n * @param date The date to compare.\n * @param dateToCompare The date to compare with.\n * @returns True if the first date is before the second date.\n */\n this.isBefore = (date, dateToCompare) => {\n return this.overrides?.isBefore\n ? this.overrides.isBefore(date, dateToCompare)\n : isBefore(date, dateToCompare);\n };\n /**\n * Checks if the given value is a Date object.\n *\n * @param value The value to check.\n * @returns True if the value is a Date object.\n */\n this.isDate = (value) => {\n return this.overrides?.isDate\n ? this.overrides.isDate(value)\n : isDate(value);\n };\n /**\n * Checks if the given dates are on the same day.\n *\n * @param dateLeft The first date to compare.\n * @param dateRight The second date to compare.\n * @returns True if the dates are on the same day.\n */\n this.isSameDay = (dateLeft, dateRight) => {\n return this.overrides?.isSameDay\n ? this.overrides.isSameDay(dateLeft, dateRight)\n : isSameDay(dateLeft, dateRight);\n };\n /**\n * Checks if the given dates are in the same month.\n *\n * @param dateLeft The first date to compare.\n * @param dateRight The second date to compare.\n * @returns True if the dates are in the same month.\n */\n this.isSameMonth = (dateLeft, dateRight) => {\n return this.overrides?.isSameMonth\n ? this.overrides.isSameMonth(dateLeft, dateRight)\n : isSameMonth(dateLeft, dateRight);\n };\n /**\n * Checks if the given dates are in the same year.\n *\n * @param dateLeft The first date to compare.\n * @param dateRight The second date to compare.\n * @returns True if the dates are in the same year.\n */\n this.isSameYear = (dateLeft, dateRight) => {\n return this.overrides?.isSameYear\n ? this.overrides.isSameYear(dateLeft, dateRight)\n : isSameYear(dateLeft, dateRight);\n };\n /**\n * Returns the latest date in the given array of dates.\n *\n * @param dates The array of dates to compare.\n * @returns The latest date.\n */\n this.max = (dates) => {\n return this.overrides?.max ? this.overrides.max(dates) : max(dates);\n };\n /**\n * Returns the earliest date in the given array of dates.\n *\n * @param dates The array of dates to compare.\n * @returns The earliest date.\n */\n this.min = (dates) => {\n return this.overrides?.min ? this.overrides.min(dates) : min(dates);\n };\n /**\n * Sets the month of the given date.\n *\n * @param date The date to set the month on.\n * @param month The month to set (0-11).\n * @returns The new date with the month set.\n */\n this.setMonth = (date, month) => {\n return this.overrides?.setMonth\n ? this.overrides.setMonth(date, month)\n : setMonth(date, month);\n };\n /**\n * Sets the year of the given date.\n *\n * @param date The date to set the year on.\n * @param year The year to set.\n * @returns The new date with the year set.\n */\n this.setYear = (date, year) => {\n return this.overrides?.setYear\n ? this.overrides.setYear(date, year)\n : setYear(date, year);\n };\n /**\n * Returns the start of the broadcast week for the given date.\n *\n * @param date The original date.\n * @returns The start of the broadcast week.\n */\n this.startOfBroadcastWeek = (date, _dateLib) => {\n return this.overrides?.startOfBroadcastWeek\n ? this.overrides.startOfBroadcastWeek(date, this)\n : startOfBroadcastWeek(date, this);\n };\n /**\n * Returns the start of the day for the given date.\n *\n * @param date The original date.\n * @returns The start of the day.\n */\n this.startOfDay = (date) => {\n return this.overrides?.startOfDay\n ? this.overrides.startOfDay(date)\n : startOfDay(date);\n };\n /**\n * Returns the start of the ISO week for the given date.\n *\n * @param date The original date.\n * @returns The start of the ISO week.\n */\n this.startOfISOWeek = (date) => {\n return this.overrides?.startOfISOWeek\n ? this.overrides.startOfISOWeek(date)\n : startOfISOWeek(date);\n };\n /**\n * Returns the start of the month for the given date.\n *\n * @param date The original date.\n * @returns The start of the month.\n */\n this.startOfMonth = (date) => {\n return this.overrides?.startOfMonth\n ? this.overrides.startOfMonth(date)\n : startOfMonth(date);\n };\n /**\n * Returns the start of the week for the given date.\n *\n * @param date The original date.\n * @returns The start of the week.\n */\n this.startOfWeek = (date, _options) => {\n return this.overrides?.startOfWeek\n ? this.overrides.startOfWeek(date, this.options)\n : startOfWeek(date, this.options);\n };\n /**\n * Returns the start of the year for the given date.\n *\n * @param date The original date.\n * @returns The start of the year.\n */\n this.startOfYear = (date) => {\n return this.overrides?.startOfYear\n ? this.overrides.startOfYear(date)\n : startOfYear(date);\n };\n this.options = { locale: enUS, ...options };\n this.overrides = overrides;\n }\n /**\n * Generates a mapping of Arabic digits (0-9) to the target numbering system\n * digits.\n *\n * @since 9.5.0\n * @returns A record mapping Arabic digits to the target numerals.\n */\n getDigitMap() {\n const { numerals = \"latn\" } = this.options;\n // Use Intl.NumberFormat to create a formatter with the specified numbering system\n const formatter = new Intl.NumberFormat(\"en-US\", {\n numberingSystem: numerals,\n });\n // Map Arabic digits (0-9) to the target numerals\n const digitMap = {};\n for (let i = 0; i < 10; i++) {\n digitMap[i.toString()] = formatter.format(i);\n }\n return digitMap;\n }\n /**\n * Replaces Arabic digits in a string with the target numbering system digits.\n *\n * @since 9.5.0\n * @param input The string containing Arabic digits.\n * @returns The string with digits replaced.\n */\n replaceDigits(input) {\n const digitMap = this.getDigitMap();\n return input.replace(/\\d/g, (digit) => digitMap[digit] || digit);\n }\n /**\n * Formats a number using the configured numbering system.\n *\n * @since 9.5.0\n * @param value The number to format.\n * @returns The formatted number as a string.\n */\n formatNumber(value) {\n return this.replaceDigits(value.toString());\n }\n /**\n * Returns the preferred ordering for month and year labels for the current\n * locale.\n */\n getMonthYearOrder() {\n const code = this.options.locale?.code;\n if (!code) {\n return \"month-first\";\n }\n return DateLib.yearFirstLocales.has(code) ? \"year-first\" : \"month-first\";\n }\n /**\n * Formats the month/year pair respecting locale conventions.\n *\n * @since 9.11.0\n */\n formatMonthYear(date) {\n const { locale, timeZone, numerals } = this.options;\n const localeCode = locale?.code;\n if (localeCode && DateLib.yearFirstLocales.has(localeCode)) {\n try {\n const intl = new Intl.DateTimeFormat(localeCode, {\n month: \"long\",\n year: \"numeric\",\n timeZone,\n numberingSystem: numerals,\n });\n const formatted = intl.format(date);\n return formatted;\n }\n catch {\n // Fallback to date-fns formatting below.\n }\n }\n const pattern = this.getMonthYearOrder() === \"year-first\" ? \"y LLLL\" : \"LLLL y\";\n return this.format(date, pattern);\n }\n}\nDateLib.yearFirstLocales = new Set([\n \"eu\",\n \"hu\",\n \"ja\",\n \"ja-Hira\",\n \"ja-JP\",\n \"ko\",\n \"ko-KR\",\n \"lt\",\n \"lt-LT\",\n \"lv\",\n \"lv-LV\",\n \"mn\",\n \"mn-MN\",\n \"zh\",\n \"zh-CN\",\n \"zh-HK\",\n \"zh-TW\",\n]);\n/** The default locale (English). */\nexport { enUS as defaultLocale } from \"../locale/en-US.js\";\n/**\n * The default date library with English locale.\n *\n * @since 9.2.0\n */\nexport const defaultDateLib = new DateLib();\n/**\n * @ignore\n * @deprecated Use `defaultDateLib`.\n */\nexport const dateLib = defaultDateLib;\n","import { ko as dateFnsKo } from \"date-fns/locale\";\nimport { DateLib } from \"../classes/DateLib.js\";\n/** Korean locale extended with DayPicker-specific translations. */\nexport const ko = {\n ...dateFnsKo,\n labels: {\n labelDayButton: (date, modifiers, options, dateLib) => {\n const lib = dateLib ?? new DateLib(options);\n let label = lib.format(date, \"PPPP\");\n if (modifiers.today)\n label = `오늘, ${label}`;\n if (modifiers.selected)\n label = `${label}, 선택됨`;\n return label;\n },\n labelMonthDropdown: \"월 선택\",\n labelNext: \"다음 달로 이동\",\n labelPrevious: \"이전 달로 이동\",\n labelWeekNumber: (weekNumber) => `주 ${weekNumber}`,\n labelYearDropdown: \"연도 선택\",\n labelGrid: (date, options, dateLib) => (dateLib ?? new DateLib(options)).formatMonthYear(date),\n labelGridcell: (date, modifiers, options, dateLib) => {\n const lib = dateLib ?? new DateLib(options);\n let label = lib.format(date, \"PPPP\");\n if (modifiers?.today) {\n label = `오늘, ${label}`;\n }\n return label;\n },\n labelNav: \"탐색 모음\",\n labelWeekNumberHeader: \"주 번호\",\n labelWeekday: (date, options, dateLib) => (dateLib ?? new DateLib(options)).format(date, \"cccc\"),\n },\n};\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { DayPicker } from \"react-day-picker\";\nimport { ko } from \"react-day-picker/locale\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport { cn } from \"@/utils/cn\";\nimport { CalendarIcon } from \"@/components/icons\";\nimport \"react-day-picker/style.css\";\n\nexport interface DatePickerProps {\n value?: string;\n onChange?: (date: string) => void;\n label?: string;\n placeholder?: string;\n min?: string;\n max?: string;\n disabled?: boolean;\n error?: boolean;\n errorMessage?: string;\n helperText?: string;\n className?: string;\n}\n\n/**\n * 사용자가 달력 인터페이스를 통해 특정 날짜를 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link DatePicker}는 직접적인 텍스트 입력 대신 시각적인 달력을 제공하여\n * 날짜 형식의 오류를 방지하고 사용자 편의성을 높입니다.\n *\n * `react-day-picker`와 `dayjs`를 기반으로 구현되었으며, 한국어 로케일을 기본으로 지원합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **특정일 선택**: 생년월일, 예약일, 마감일 등 단일 날짜를 입력받아야 할 때\n * - **제한된 범위 내 선택**: 과거 날짜만 선택 가능하거나, 특정 기간 내에서만 선택해야 할 때\n * - **정확한 날짜 입력**: 텍스트 입력 시 발생할 수 있는 포맷 오류를 방지하고 싶을 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **기간 선택**: 시작일과 종료일을 함께 선택해야 하는 경우 `DateRangePicker`를 사용하세요.\n * - **대략적인 시간/날짜**: '방금 전', '1주일 내' 등 상대적인 시간 선택이 필요한 경우 `Dropdown`이나 `RadioButton`이 더 적절할 수 있습니다.\n * - **빠른 연도 이동**: 수십 년 전의 날짜를 선택해야 하는 경우(예: 생년월일) 달력보다는 직접 입력이나 연도 선택 기능이 포함된 별도 UI를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Popover 기반**: 클릭 시 입력창 아래에 달력 팝오버가 나타나며, 화면 공간을 효율적으로 사용합니다.\n * - **Responsive**: 팝오버는 화면 경계 내에서 최적의 위치를 자동으로 찾아 표시됩니다.\n * - **Full Width**: `className`을 통해 부모 요소의 너비에 맞게 조절할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 Placeholder**: \"YYYY-MM-DD\"와 같이 기대하는 날짜 형식을 명시하세요.\n * - **최소/최대 날짜 설정**: 비즈니스 로직에 따라 `min`, `max` 속성을 사용하여 유효하지 않은 날짜 선택을 방지하세요.\n * - **레이블 및 헬퍼 텍스트**: 입력 항목의 용도를 명확히 하고, 필요한 경우 보충 설명을 제공하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **Read-only 입력**: 사용자가 직접 타이핑하여 입력하는 기능은 현재 지원하지 않으므로, 반드시 달력을 통해 선택하도록 안내하세요.\n * - **복잡한 로직**: 너무 많은 날짜 제한 로직은 사용자에게 혼란을 줄 수 있습니다. 필요한 경우 에러 메시지로 명확히 안내하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Navigation**: 팝오버는 키보드로 열고 닫을 수 있으며, `Esc` 키로 취소할 수 있습니다.\n * - **Focus Trap**: 달력이 열려 있는 동안 포커스가 달력 내부에 머무르도록 관리됩니다.\n * - **Aria Labels**: 달력의 각 요소에는 스크린 리더를 위한 적절한 레이블이 포함되어 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 날짜 선택 예시:\n *\n * ```tsx\n * const [date, setDate] = useState(\"\");\n *\n * <DatePicker\n * label=\"방문 예약일\"\n * value={date}\n * onChange={setDate}\n * placeholder=\"예약 날짜를 선택하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 날짜 범위 제한 및 에러 상태:\n *\n * ```tsx\n * <DatePicker\n * label=\"종료일\"\n * min=\"2024-01-01\"\n * max=\"2024-12-31\"\n * error={true}\n * errorMessage=\"2024년 내의 날짜만 선택 가능합니다\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link DateRangePicker}, 기간을 선택해야 하는 경우\n * - {@link TextInput}, 단순한 텍스트 입력이 필요한 경우\n * - {@link Popover}, 일반적인 팝오버 컴포넌트\n */\nexport const DatePicker = React.forwardRef<HTMLDivElement, DatePickerProps>(\n (\n {\n value,\n onChange,\n label,\n placeholder = \"YYYY-MM-DD\",\n min,\n max,\n disabled = false,\n error = false,\n errorMessage,\n helperText,\n className,\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [internalDate, setInternalDate] = useState<Dayjs | undefined>(\n value ? dayjs(value) : undefined,\n );\n\n useEffect(() => {\n if (value) {\n setInternalDate(dayjs(value));\n } else {\n setInternalDate(undefined);\n }\n }, [value]);\n\n const selected = useMemo(() => {\n return internalDate?.toDate();\n }, [internalDate]);\n\n const handleDayClick = (date: Date | undefined) => {\n if (!date) {\n setInternalDate(undefined);\n return;\n }\n\n const selectedDate = dayjs(date);\n setInternalDate(selectedDate);\n };\n\n const handleApply = () => {\n if (internalDate) {\n onChange?.(internalDate.format(\"YYYY-MM-DD\"));\n setIsOpen(false);\n }\n };\n\n const handleCancel = () => {\n setInternalDate(value ? dayjs(value) : undefined);\n setIsOpen(false);\n };\n\n const displayValue = useMemo(() => {\n if (!value) return \"\";\n return dayjs(value).format(\"YYYY-MM-DD\");\n }, [value]);\n\n const disabledDays = useMemo(() => {\n const disabled: any[] = [];\n if (min) {\n disabled.push({ before: dayjs(min).toDate() });\n }\n if (max) {\n disabled.push({ after: dayjs(max).toDate() });\n }\n return disabled.length > 0 ? disabled : undefined;\n }, [min, max]);\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)}>\n {label && (\n <label className=\"text-sm font-medium text-gray-700\">{label}</label>\n )}\n <PopoverPrimitive.Root\n open={isOpen && !disabled}\n onOpenChange={setIsOpen}\n >\n <PopoverPrimitive.Trigger asChild>\n <div className=\"relative\">\n <div className=\"absolute left-3 top-0 h-full flex items-center pointer-events-none\">\n <CalendarIcon\n size={20}\n strokeWidth={1.5}\n className={cn(\n \"text-gray-400\",\n disabled && \"text-gray-300\",\n )}\n />\n </div>\n <input\n type=\"text\"\n readOnly\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n \"w-full h-10 pl-10 pr-3 border rounded bg-white text-sm\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"focus:outline-none\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n error ? \"border-red-500\" : \"border-gray-300\",\n disabled &&\n cn(\n \"bg-gray-100 cursor-not-allowed\",\n \"hover:bg-gray-100 hover:border-gray-300\",\n ),\n )}\n />\n </div>\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={5}\n className={cn(\n \"z-50 bg-white rounded-lg shadow-xl p-2\",\n \"border border-gray-200\",\n \"data-[state=open]:animate-in\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"date-picker-calendar\">\n <DayPicker\n mode=\"single\"\n selected={selected}\n onSelect={handleDayClick}\n locale={ko}\n disabled={disabledDays}\n formatters={{\n formatCaption: (date) => {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월`;\n },\n }}\n />\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n \"flex items-end justify-between mt-2 pt-2\",\n \"border-t border-gray-200\",\n )}\n >\n <div className=\"flex flex-col min-h-8\">\n {internalDate ? (\n <span className=\"text-xs text-gray-700\">\n {internalDate.format(\"YYYY-MM-DD\")}\n </span>\n ) : (\n <span className=\"text-xs text-red-500\">\n 날짜를 선택해 주세요.\n </span>\n )}\n </div>\n\n <div className=\"flex gap-2\">\n <button\n onClick={handleCancel}\n className={cn(\n \"w-15 h-8 rounded cursor-pointer\",\n \"text-xs font-medium text-gray-700\",\n \"border border-gray-300 bg-transparent\",\n \"transition-all duration-150\",\n \"active:scale-95\",\n \"hover:bg-gray-50\",\n )}\n >\n 취소\n </button>\n <button\n onClick={handleApply}\n disabled={!internalDate}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-15 h-8 bg-blue-600 rounded\",\n \"text-xs text-white\",\n \"hover:bg-blue-700\",\n \"active:scale-95\",\n \"disabled:bg-gray-300 \",\n \"disabled:cursor-not-allowed\",\n \"disabled:active:scale-100\",\n \"transition-all duration-150\",\n )}\n >\n 적용\n </button>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n\n {/* Helper/Error Text */}\n {(helperText || errorMessage) && (\n <div>\n {error && errorMessage ? (\n <p className=\"text-xs text-red-500\">{errorMessage}</p>\n ) : (\n helperText && (\n <p className=\"text-xs text-gray-500\">{helperText}</p>\n )\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nDatePicker.displayName = \"DatePicker\";\n","import React, { useState, useEffect, useMemo } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { DayPicker, DateRange as DayPickerDateRange } from \"react-day-picker\";\nimport { ko } from \"react-day-picker/locale\";\nimport dayjs, { Dayjs } from \"dayjs\";\nimport { cn } from \"@/utils/cn\";\nimport \"react-day-picker/style.css\";\n\nexport interface DateRange {\n start: string;\n end: string;\n}\n\nexport interface DateRangePickerProps {\n value?: DateRange;\n onChange?: (range: DateRange) => void;\n startLabel?: string;\n endLabel?: string;\n className?: string;\n}\n\ntype QuickSelectOption = {\n label: string;\n getValue: () => [Dayjs, Dayjs];\n};\n\nconst getQuickSelectOptions = (): QuickSelectOption[] => {\n const now = dayjs();\n\n return [\n {\n label: \"전체\",\n getValue: () => [dayjs(\"1970-01-01\"), dayjs(\"2099-12-31\")],\n },\n {\n label: \"오늘\",\n getValue: () => [now, now],\n },\n {\n label: \"내일\",\n getValue: () => [now.add(1, \"day\"), now.add(1, \"day\")],\n },\n {\n label: \"이번주\",\n getValue: () => [now.startOf(\"week\"), now.endOf(\"week\")],\n },\n {\n label: \"이번달\",\n getValue: () => [now.startOf(\"month\"), now.endOf(\"month\")],\n },\n {\n label: \"7일\",\n getValue: () => [now, now.add(6, \"day\")],\n },\n {\n label: \"30일\",\n getValue: () => [now, now.add(29, \"day\")],\n },\n {\n label: \"다음주\",\n getValue: () => [\n now.add(1, \"week\").startOf(\"week\"),\n now.add(1, \"week\").endOf(\"week\"),\n ],\n },\n {\n label: \"다음달\",\n getValue: () => [\n now.add(1, \"month\").startOf(\"month\"),\n now.add(1, \"month\").endOf(\"month\"),\n ],\n },\n ];\n};\n\n/**\n * 사용자가 특정 기간(시작일과 종료일)을 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link DateRangePicker}는 두 개의 연동된 달력을 통해 기간을 시각적으로 선택할 수 있으며,\n * '오늘', '이번주', '7일' 등 자주 사용되는 기간에 대한 빠른 선택(Quick Select) 기능을 제공합니다.\n *\n * `react-day-picker`와 `dayjs`를 기반으로 구현되었으며, 대규모 데이터 조회나\n * 일정 설정 등 기간 입력이 필요한 서비스에서 주로 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **조회 기간 설정**: 특정 기간 내의 로그, 주문 내역, 통계 데이터 등을 조회할 때\n * - **일정 범위 지정**: 이벤트 진행 기간, 캠페인 유효 기간 등 시작과 끝이 있는 일정을 설정할 때\n * - **상대적 기간 선택**: '최근 7일', '이번 달' 등 현재 시점 기준의 상대적 기간을 빠르게 선택해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **단일 날짜 선택**: 하나의 날짜만 필요한 경우 `DatePicker`를 사용하세요.\n * - **고정된 기간**: '1주일', '1개월' 등 기간이 고정되어 있고 시작일만 선택하면 되는 경우 `DatePicker`와 드롭다운 조합이 더 나을 수 있습니다.\n *\n * ## Layout behavior\n *\n * - **Dual Calendar**: 두 개의 달력이 나란히 표시되어 시작일과 종료일을 한눈에 확인하고 조절할 수 있습니다.\n * - **Side Panels**: 왼쪽 사이드바에 '오늘', '이번주' 등 빠른 선택 버튼이 배치되어 접근성을 높입니다.\n * - **Combined Input**: 두 개의 입력창(시작, 종료)이 하나의 그룹으로 묶여 표시됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 시작/종료 레이블**: \"시작일\", \"종료일\" 또는 \"등록일\", \"수정일\" 등 문맥에 맞는 레이블을 사용하세요.\n * - **기간 확인 피드백**: 선택된 총 일수(예: 7일간)를 하단에 표시하여 사용자가 선택한 범위를 쉽게 인지하게 하세요.\n * - **빠른 선택 활용**: 사용자 조사의 80% 이상이 '최근 7일'이라면 해당 옵션을 눈에 띄게 배치하거나 기본값으로 고려하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 넓은 기본 범위**: 데이터 양이 많을 경우 기본 범위를 너무 넓게 잡으면 성능 문제가 발생할 수 있습니다.\n * - **모바일에서의 레이아웃**: 2개의 달력이 나란히 표시되므로 모바일 환경에서는 화면을 넘칠 수 있습니다. 반응형 대응에 주의하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Management**: `Tab` 키로 시작일/종료일 입력창과 달력 내부 요소를 순차적으로 이동할 수 있습니다.\n * - **Visual Indicators**: 선택된 기간 내의 날짜들은 배경색으로 하이라이트되어 시각적으로 구분됩니다.\n * - **Screen Reader**: 시작일과 종료일의 레이블이 각각 명확히 연결되어 음성으로 안내됩니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 기간 선택 예시:\n *\n * ```tsx\n * const [range, setRange] = useState({ start: \"2024-01-01\", end: \"2024-01-07\" });\n *\n * <DateRangePicker\n * value={range}\n * onChange={setRange}\n * startLabel=\"조회 시작\"\n * endLabel=\"조회 종료\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 빠른 선택 옵션이 포함된 초기 상태:\n *\n * ```tsx\n * // '전체', '오늘', '내일', '이번주', '이번달', '7일', '30일' 등의\n * // 빠른 선택 옵션이 기본적으로 내장되어 있습니다.\n * <DateRangePicker\n * className=\"w-[400px]\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link DatePicker}, 단일 날짜 선택이 필요한 경우\n * - {@link Dropdown}, 기간을 텍스트 기반의 선택지로 제공할 때\n */\nexport const DateRangePicker = React.forwardRef<\n HTMLDivElement,\n DateRangePickerProps\n>(\n (\n {\n value,\n onChange,\n startLabel = \"시작일자\",\n endLabel = \"종료일자\",\n className,\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [internalRange, setInternalRange] = useState<\n [Dayjs | undefined, Dayjs | undefined]\n >([\n value?.start ? dayjs(value.start) : undefined,\n value?.end ? dayjs(value.end) : undefined,\n ]);\n\n useEffect(() => {\n if (value) {\n setInternalRange([\n value.start ? dayjs(value.start) : undefined,\n value.end ? dayjs(value.end) : undefined,\n ]);\n }\n }, [value]);\n\n const [fromDay, toDay] = internalRange;\n\n const selected: DayPickerDateRange | undefined = useMemo(() => {\n if (!fromDay) return undefined;\n return {\n from: fromDay.toDate(),\n to: toDay?.toDate(),\n };\n }, [fromDay, toDay]);\n\n const handleQuickSelect = (option: QuickSelectOption) => {\n const [start, end] = option.getValue();\n setInternalRange([start, end]);\n };\n\n const handleDayClick = (range: DayPickerDateRange | undefined) => {\n if (!range) {\n setInternalRange([undefined, undefined]);\n return;\n }\n\n const from = range.from ? dayjs(range.from) : undefined;\n const to = range.to ? dayjs(range.to) : undefined;\n\n setInternalRange([from, to]);\n };\n\n const handleApply = () => {\n if (fromDay && toDay) {\n onChange?.({\n start: fromDay.format(\"YYYY-MM-DD\"),\n end: toDay.format(\"YYYY-MM-DD\"),\n });\n setIsOpen(false);\n }\n };\n\n const handleCancel = () => {\n setInternalRange([\n value?.start ? dayjs(value.start) : undefined,\n value?.end ? dayjs(value.end) : undefined,\n ]);\n setIsOpen(false);\n };\n\n const numberOfDays = useMemo(() => {\n if (!fromDay || !toDay) return undefined;\n return toDay.diff(fromDay, \"day\") + 1;\n }, [fromDay, toDay]);\n\n const displayValue = useMemo(() => {\n if (!value?.start || !value?.end) {\n return { start: \"\", end: \"\" };\n }\n return {\n start: dayjs(value.start).format(\"YYYY-MM-DD\"),\n end: dayjs(value.end).format(\"YYYY-MM-DD\"),\n };\n }, [value]);\n\n return (\n <PopoverPrimitive.Root open={isOpen} onOpenChange={setIsOpen}>\n <PopoverPrimitive.Trigger asChild>\n <div ref={ref} className={cn(\"flex items-center gap-0\", className)}>\n <div className=\"relative flex-1\">\n <div\n className={cn(\n \"absolute left-3 top-0 h-full flex items-center\",\n \"text-xs text-gray-500\",\n \"pointer-events-none\",\n )}\n >\n <label>{startLabel}</label>\n </div>\n <input\n type=\"text\"\n readOnly\n value={displayValue.start}\n placeholder=\"YYYY-MM-DD\"\n className={cn(\n \"w-full h-10 pl-[59px] pr-3 bg-white text-sm\",\n \"focus:outline-none\",\n \"border border-gray-300 border-r-0 rounded-l\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n )}\n />\n </div>\n <div className=\"relative flex-1\">\n <div\n className={cn(\n \"absolute left-3 top-0 h-full flex items-center\",\n \"text-xs text-gray-500\",\n \"pointer-events-none\",\n )}\n >\n <label>{endLabel}</label>\n </div>\n <input\n type=\"text\"\n readOnly\n value={displayValue.end}\n placeholder=\"YYYY-MM-DD\"\n className={cn(\n \"w-full h-10 pl-[59px] pr-3 bg-white\",\n \"text-sm\",\n \"border border-gray-300 rounded-r\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"focus:outline-none\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n )}\n />\n </div>\n </div>\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={5}\n className={cn(\n \"z-50 p-2 bg-white rounded-lg\",\n \"border border-gray-200\",\n \"shadow-xl\",\n \"data-[state=open]:animate-in\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"flex gap-2\">\n {/* Quick Select Buttons */}\n <div className=\"flex flex-col border-r border-gray-200 pr-2\">\n {getQuickSelectOptions().map((option) => (\n <button\n key={option.label}\n onClick={() => handleQuickSelect(option)}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-[70px] h-[26px] px-2\",\n \"text-left text-xs text-gray-700\",\n \"bg-white\",\n \"transition-all duration-150\",\n \"hover:bg-blue-50\",\n \"hover:font-medium\",\n \"hover:text-blue-600\",\n )}\n >\n {option.label}\n </button>\n ))}\n </div>\n {/* Calendar */}\n <div className=\"date-range-picker-calendar\">\n <DayPicker\n mode=\"range\"\n selected={selected}\n onSelect={handleDayClick}\n numberOfMonths={2}\n locale={ko}\n formatters={{\n formatCaption: (date) => {\n return `${date.getFullYear()}년 ${date.getMonth() + 1}월`;\n },\n }}\n />\n </div>\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n \"flex items-end justify-between mt-2 pt-2\",\n \"border-t border-gray-200\",\n )}\n >\n <div className=\"flex flex-col min-h-8\">\n {!fromDay || !toDay ? (\n <span className=\"text-xs text-red-500\">\n 종료일자를 선택해 주세요.\n </span>\n ) : (\n <>\n <span className=\"text-xs text-gray-700\">\n {fromDay.format(\"YYYY-MM-DD\")} ~{\" \"}\n {toDay.format(\"YYYY-MM-DD\")}\n </span>\n <span className=\"text-xs text-gray-500\">\n ({numberOfDays}일간)\n </span>\n </>\n )}\n </div>\n\n <div className=\"flex gap-2\">\n <button\n onClick={handleCancel}\n className={cn(\n \"w-15 h-8 cursor-pointer\",\n \"border border-gray-300 rounded bg-transparent\",\n \"text-xs font-medium text-gray-700\",\n \"transition-all duration-150\",\n \"hover:bg-gray-50 active:scale-95\",\n )}\n >\n 취소\n </button>\n <button\n onClick={handleApply}\n disabled={!fromDay || !toDay}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-15 h-8\",\n \"bg-blue-600 rounded\",\n \"text-xs font-medium text-cms-white\",\n \"hover:bg-blue-700 active:scale-95\",\n \"disabled:bg-gray-300\",\n \"disabled:active:scale-100\",\n \"disabled:cursor-not-allowed\",\n \"transition-all duration-150\",\n )}\n >\n 적용\n </button>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n },\n);\n\nDateRangePicker.displayName = \"DateRangePicker\";\n","import React, { useState, useEffect, useMemo, useRef } from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Clock } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface TimePickerProps {\n value?: string;\n onChange?: (time: string) => void;\n label?: string;\n placeholder?: string;\n format?: \"24h\" | \"12h\";\n disabled?: boolean;\n error?: boolean;\n errorMessage?: string;\n helperText?: string;\n className?: string;\n minuteStep?: number;\n showIcon?: boolean;\n}\n\n/**\n * 사용자가 시간을 선택할 수 있게 하는 컴포넌트입니다.\n *\n * {@link TimePicker}는 직관적인 스크롤 인터페이스를 통해 시간과 분을 선택할 수 있으며,\n * 24시간 형식과 12시간(AM/PM) 형식을 모두 지원합니다.\n *\n * `@radix-ui/react-popover`를 기반으로 구현되었으며, 사용자가 잘못된 시간을 입력하는 것을 방지합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **특정 시간 입력**: 예약 시간, 알림 시간, 업무 시작/종료 시간 등을 선택해야 할 때\n * - **정확한 시간 선택**: 사용자가 직접 타이핑하여 발생할 수 있는 형식 오류를 방지하고 싶을 때\n * - **제한된 간격 선택**: 5분, 10분, 15분 단위로만 선택이 필요한 경우 (minuteStep 사용)\n *\n * **사용하지 말아야 하는 경우:**\n * - **대략적인 시간**: '오전', '오후', '저녁' 등 상대적인 시간 선택이 필요한 경우 `Dropdown`이나 `RadioButton`이 더 적절할 수 있습니다.\n * - **초 단위 정밀도**: 현재는 시간과 분까지만 지원하므로, 초 단위가 필요한 경우 다른 컴포넌트를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Popover 기반**: 클릭 시 입력창 아래에 시간 선택 팝오버가 나타나며, 화면 공간을 효율적으로 사용합니다.\n * - **스크롤 선택**: 시간과 분을 각각 스크롤하여 선택할 수 있어 직관적입니다.\n * - **Full Width**: `className`을 통해 부모 요소의 너비에 맞게 조절할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 Format**: 사용자가 익숙한 형식(한국: 24시간, 미국: 12시간)을 선택하세요.\n * - **Minute Step 활용**: 일정 간격으로만 선택이 필요한 경우 `minuteStep`을 활용하여 UX를 개선하세요.\n * - **레이블 및 헬퍼 텍스트**: 입력 항목의 용도를 명확히 하고, 필요한 경우 보충 설명을 제공하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **Read-only 입력**: 사용자가 직접 타이핑하여 입력하는 기능은 지원하지 않으므로, 반드시 UI를 통해 선택하도록 안내하세요.\n * - **과도한 Step**: `minuteStep`이 너무 크면 정확한 시간을 선택하기 어려울 수 있습니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Navigation**: 팝오버는 키보드로 열고 닫을 수 있으며, `Esc` 키로 취소할 수 있습니다.\n * - **Focus Management**: 시간 선택기가 열려 있는 동안 포커스가 적절히 관리됩니다.\n * - **Aria Labels**: 각 버튼에는 스크린 리더를 위한 적절한 레이블이 포함되어 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 시간 선택 예시 (24시간 형식):\n *\n * ```tsx\n * const [time, setTime] = useState(\"\");\n *\n * <TimePicker\n * label=\"출근 시간\"\n * value={time}\n * onChange={setTime}\n * placeholder=\"시간을 선택하세요\"\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 12시간 형식 및 15분 단위 선택:\n *\n * ```tsx\n * <TimePicker\n * label=\"회의 시간\"\n * format=\"12h\"\n * minuteStep={15}\n * value=\"2:30 PM\"\n * onChange={setTime}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 에러 상태:\n *\n * ```tsx\n * <TimePicker\n * label=\"마감 시간\"\n * error={true}\n * errorMessage=\"업무 시간(9:00-18:00) 내에서 선택해주세요\"\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link DatePicker}, 날짜를 선택해야 하는 경우\n * - {@link DateRangePicker}, 날짜 범위를 선택해야 하는 경우\n * - {@link TextInput}, 단순한 텍스트 입력이 필요한 경우\n */\nexport const TimePicker = React.forwardRef<HTMLDivElement, TimePickerProps>(\n (\n {\n value,\n onChange,\n label,\n placeholder = \"HH:MM\",\n format = \"24h\",\n disabled = false,\n error = false,\n errorMessage,\n helperText,\n className,\n minuteStep = 1,\n showIcon = true,\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [selectedHour, setSelectedHour] = useState<number | null>(null);\n const [selectedMinute, setSelectedMinute] = useState<number | null>(null);\n const [selectedPeriod, setSelectedPeriod] = useState<\"AM\" | \"PM\">(\"AM\");\n\n const hourScrollRef = useRef<HTMLDivElement>(null);\n const minuteScrollRef = useRef<HTMLDivElement>(null);\n\n // Parse value and set internal state\n useEffect(() => {\n if (!value) {\n setSelectedHour(null);\n setSelectedMinute(null);\n setSelectedPeriod(\"AM\");\n return;\n }\n\n const timeRegex24h = /^(\\d{1,2}):(\\d{2})$/;\n const timeRegex12h = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i;\n\n if (format === \"24h\") {\n const match = value.match(timeRegex24h);\n if (match) {\n setSelectedHour(parseInt(match[1], 10));\n setSelectedMinute(parseInt(match[2], 10));\n }\n } else {\n const match = value.match(timeRegex12h);\n if (match) {\n let hour = parseInt(match[1], 10);\n const period = match[3].toUpperCase() as \"AM\" | \"PM\";\n setSelectedHour(hour);\n setSelectedMinute(parseInt(match[2], 10));\n setSelectedPeriod(period);\n }\n }\n }, [value, format]);\n\n // Generate hour options\n const hours = useMemo(() => {\n if (format === \"24h\") {\n return Array.from({ length: 24 }, (_, i) => i);\n } else {\n return Array.from({ length: 12 }, (_, i) => i + 1);\n }\n }, [format]);\n\n // Generate minute options based on step\n const minutes = useMemo(() => {\n const options: number[] = [];\n for (let i = 0; i < 60; i += minuteStep) {\n options.push(i);\n }\n return options;\n }, [minuteStep]);\n\n // Format display value\n const displayValue = useMemo(() => {\n if (selectedHour === null || selectedMinute === null) return \"\";\n\n const formattedMinute = selectedMinute.toString().padStart(2, \"0\");\n\n if (format === \"24h\") {\n const formattedHour = selectedHour.toString().padStart(2, \"0\");\n return `${formattedHour}:${formattedMinute}`;\n } else {\n return `${selectedHour}:${formattedMinute} ${selectedPeriod}`;\n }\n }, [selectedHour, selectedMinute, selectedPeriod, format]);\n\n const handleApply = () => {\n if (selectedHour !== null && selectedMinute !== null) {\n onChange?.(displayValue);\n setIsOpen(false);\n }\n };\n\n const handleCancel = () => {\n // Reset to current value\n if (value) {\n const timeRegex24h = /^(\\d{1,2}):(\\d{2})$/;\n const timeRegex12h = /^(\\d{1,2}):(\\d{2})\\s*(AM|PM)$/i;\n\n if (format === \"24h\") {\n const match = value.match(timeRegex24h);\n if (match) {\n setSelectedHour(parseInt(match[1], 10));\n setSelectedMinute(parseInt(match[2], 10));\n }\n } else {\n const match = value.match(timeRegex12h);\n if (match) {\n setSelectedHour(parseInt(match[1], 10));\n setSelectedMinute(parseInt(match[2], 10));\n setSelectedPeriod(match[3].toUpperCase() as \"AM\" | \"PM\");\n }\n }\n } else {\n setSelectedHour(null);\n setSelectedMinute(null);\n setSelectedPeriod(\"AM\");\n }\n setIsOpen(false);\n };\n\n // Scroll to selected item when popover opens\n useEffect(() => {\n if (isOpen && selectedHour !== null) {\n setTimeout(() => {\n const hourButton = hourScrollRef.current?.querySelector(\n `[data-value=\"${selectedHour}\"]`,\n );\n hourButton?.scrollIntoView({ block: \"center\" });\n }, 0);\n }\n if (isOpen && selectedMinute !== null) {\n setTimeout(() => {\n const minuteButton = minuteScrollRef.current?.querySelector(\n `[data-value=\"${selectedMinute}\"]`,\n );\n minuteButton?.scrollIntoView({ block: \"center\" });\n }, 0);\n }\n }, [isOpen, selectedHour, selectedMinute]);\n\n return (\n <div ref={ref} className={cn(\"flex flex-col gap-1\", className)}>\n {label && (\n <label className=\"text-sm font-medium text-gray-700\">{label}</label>\n )}\n <PopoverPrimitive.Root\n open={isOpen && !disabled}\n onOpenChange={setIsOpen}\n >\n <PopoverPrimitive.Trigger asChild>\n <div className=\"relative\">\n <input\n type=\"text\"\n readOnly\n value={displayValue}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n \"w-full h-10 px-3 border rounded bg-white text-sm\",\n \"hover:bg-gray-50 hover:border-gray-400\",\n \"focus:outline-none\",\n \"transition-all duration-150\",\n \"cursor-pointer\",\n error ? \"border-red-500\" : \"border-gray-300\",\n disabled &&\n cn(\n \"bg-gray-100 cursor-not-allowed\",\n \"hover:bg-gray-100 hover:border-gray-300\",\n ),\n )}\n />\n {showIcon && (\n <Clock\n className={cn(\n \"absolute right-0 top-1/2 -translate-y-1/2\",\n \"w-4 h-4 text-gray-400\",\n disabled && \"opacity-50\",\n )}\n />\n )}\n </div>\n </PopoverPrimitive.Trigger>\n\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n align=\"start\"\n sideOffset={5}\n className={cn(\n \"z-50 bg-white rounded-lg shadow-xl\",\n \"border border-gray-200\",\n \"data-[state=open]:animate-in\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[state=open]:zoom-in-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n )}\n >\n <div className=\"p-4\">\n {/* Time Picker Columns */}\n <div className=\"flex gap-2\">\n {/* Hour Column */}\n <div className=\"flex flex-col\">\n <div className=\"text-xs text-gray-500 text-center mb-2 font-medium\">\n {format === \"24h\" ? \"시\" : \"Hour\"}\n </div>\n <div\n ref={hourScrollRef}\n className=\"w-16 h-48 overflow-y-auto border border-gray-200 rounded cms-no-scrollbar\"\n >\n {hours.map((hour) => (\n <button\n key={hour}\n data-value={hour}\n onClick={() => setSelectedHour(hour)}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-full h-10 text-sm transition-colors\",\n \"hover:bg-gray-100\",\n selectedHour === hour\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label={`${hour}${format === \"24h\" ? \"시\" : \"\"}`}\n aria-selected={selectedHour === hour}\n >\n {format === \"24h\"\n ? hour.toString().padStart(2, \"0\")\n : hour}\n </button>\n ))}\n </div>\n </div>\n\n {/* Minute Column */}\n <div className=\"flex flex-col\">\n <div className=\"text-xs text-gray-500 text-center mb-2 font-medium\">\n {format === \"24h\" ? \"분\" : \"Min\"}\n </div>\n <div\n ref={minuteScrollRef}\n className=\"w-16 h-48 overflow-y-auto border border-gray-200 rounded cms-no-scrollbar\"\n >\n {minutes.map((minute) => (\n <button\n key={minute}\n data-value={minute}\n onClick={() => setSelectedMinute(minute)}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-full h-10 text-sm transition-colors\",\n \"hover:bg-gray-100\",\n selectedMinute === minute\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label={`${minute}${format === \"24h\" ? \"분\" : \" minutes\"}`}\n aria-selected={selectedMinute === minute}\n >\n {minute.toString().padStart(2, \"0\")}\n </button>\n ))}\n </div>\n </div>\n\n {/* AM/PM Column for 12h format */}\n {format === \"12h\" && (\n <div className=\"flex flex-col\">\n <div className=\"text-xs text-gray-500 text-center mb-2 font-medium\">\n Period\n </div>\n <div className=\"w-16 flex flex-col gap-1\">\n <button\n onClick={() => setSelectedPeriod(\"AM\")}\n className={cn(\n \"border-0 cursor-pointer\",\n \"h-10 text-sm rounded transition-colors\",\n \"hover:bg-gray-100\",\n selectedPeriod === \"AM\"\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label=\"AM\"\n aria-selected={selectedPeriod === \"AM\"}\n >\n AM\n </button>\n <button\n onClick={() => setSelectedPeriod(\"PM\")}\n className={cn(\n \"border-0 cursor-pointer\",\n \"h-10 text-sm rounded transition-colors\",\n \"hover:bg-gray-100\",\n selectedPeriod === \"PM\"\n ? \"bg-blue-100 text-blue-700 font-medium\"\n : \"bg-white text-gray-700\",\n )}\n aria-label=\"PM\"\n aria-selected={selectedPeriod === \"PM\"}\n >\n PM\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Footer */}\n <div\n className={cn(\n \"flex items-end justify-end px-4 pb-4\",\n \"border-t border-gray-200 pt-2\",\n )}\n >\n <div className=\"flex gap-2\">\n <button\n onClick={handleCancel}\n className={cn(\n \"w-15 h-8 rounded cursor-pointer\",\n \"text-xs font-medium text-gray-700\",\n \"border border-gray-300 bg-transparent\",\n \"transition-all duration-150\",\n \"active:scale-95\",\n \"hover:bg-gray-50\",\n )}\n >\n 취소\n </button>\n <button\n onClick={handleApply}\n disabled={selectedHour === null || selectedMinute === null}\n className={cn(\n \"border-0 cursor-pointer\",\n \"w-15 h-8 bg-blue-600 rounded\",\n \"text-xs text-white\",\n \"hover:bg-blue-700\",\n \"active:scale-95\",\n \"disabled:bg-gray-300\",\n \"disabled:cursor-not-allowed\",\n \"disabled:active:scale-100\",\n \"transition-all duration-150\",\n )}\n >\n 적용\n </button>\n </div>\n </div>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n\n {/* Helper/Error Text */}\n {(helperText || errorMessage) && (\n <div>\n {error && errorMessage ? (\n <p className=\"text-xs text-red-500\">{errorMessage}</p>\n ) : (\n helperText && (\n <p className=\"text-xs text-gray-500\">{helperText}</p>\n )\n )}\n </div>\n )}\n </div>\n );\n },\n);\n\nTimePicker.displayName = \"TimePicker\";\n","import React from \"react\";\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nconst switchVariants = cva(\n cn(\n \"peer inline-flex items-center transition-colors \",\n \"rounded-full border-2 border-transparent box-border\",\n \"h-6 w-10 shrink-0 py-0.5 px-[1px]\",\n \"cursor-pointer\",\n \"focus-visible:outline-none\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=unchecked]:bg-cms-gray-300\",\n ),\n\n {\n variants: {\n variant: {\n default: \"data-[state=checked]:bg-cms-primary-200\",\n green: \"data-[state=checked]:bg-cms-green-500\",\n black: \"data-[state=checked]:bg-cms-black\",\n blue: \"data-[state=checked]:bg-cms-blue-700\",\n red: \"data-[state=checked]:bg-cms-red-400\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface SwitchProps\n extends\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>,\n VariantProps<typeof switchVariants> {}\n\n/**\n * 두 가지 상반된 상태(On/Off, 활성/비활성)를 즉각적으로 전환할 때 사용하는 컴포넌트입니다.\n *\n * {@link Switch}는 실제 전등 스위치와 같은 직관적인 시각적 모델을 제공하며,\n * 체크박스보다 더 '즉각적인 반영'의 의미를 가집니다.\n *\n * Radix UI의 Switch 컴포넌트를 기반으로 구현되어 접근성과 애니메이션이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **즉각적 설정 반영**: 클릭 즉시 시스템 설정이 변경되거나 저장되어야 할 때 (예: 다크모드 켜기, 알림 수신 동의)\n * - **상태 전환**: 특정 기능의 사용 여부를 결정할 때\n * - **단순 토글**: 복잡한 입력 없이 켜고 끄는 행위만 필요할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **제출 버튼 필요**: 여러 정보를 입력하고 '확인' 버튼을 눌러야 결과가 반영되는 폼 내에서는 `Checkbox`를 사용하세요.\n * - **다중 선택**: 여러 항목 중 일부를 골라야 할 때도 `Checkbox`가 더 적합합니다.\n *\n * ## Layout behavior\n *\n * - **Inline Component**: 주변 텍스트나 다른 요소와 자연스럽게 어우러지는 인라인 블록 형태입니다.\n * - **Thumb Animation**: 클릭 시 스위치의 '손잡이(Thumb)'가 부드럽게 좌우로 이동하며 상태 변화를 시각화합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 현재 상태 표시**: 색상 변화(회색 vs 색상)를 통해 켜져 있는지 꺼져 있는지 한눈에 알 수 있게 하세요.\n * - **레이블과 함께 사용**: 스위치 옆에 무엇을 제어하는지 설명하는 텍스트를 반드시 배치하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **모호한 의미**: 상태 전환 후에 어떤 변화가 생길지 명확하지 않은 경우에는 사용을 지양하세요.\n * - **긴 대기 시간**: 서버 통신 등으로 인해 상태 반영에 시간이 걸리는 경우, 로딩 인디케이터를 함께 보여주거나 즉시 반응을 우선 처리하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Support**: `Space` 키를 사용하여 상태를 전환할 수 있습니다.\n * - **Roles**: `role=\"switch\"` 속성을 사용하여 스크린 리더에서 토글 상태를 읽어줍니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 레이블과 함께 사용하는 기본적인 스위치:\n *\n * ```tsx\n * <div className=\"flex items-center gap-2\">\n * <Switch id=\"airplane-mode\" />\n * <label htmlFor=\"airplane-mode\">비행기 모드</label>\n * </div>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Checkbox}, 제출 전까지 상태를 유지해야 하는 경우\n * - {@link RadioButton}, 여러 선택지 중 하나를 고르는 경우\n */\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n SwitchProps\n>(({ className, variant, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(switchVariants({ variant }), className)}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n \"pointer-events-none block rounded-full ring-0\",\n \"bg-cms-white shadow-lg\",\n \"h-5 w-5\",\n \"data-[state=unchecked]:translate-x-0 cursor-pointer\",\n \"data-[state=checked]:translate-x-[14px]\",\n \"transition-transform\",\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","import React from \"react\";\nimport * as RadioGroupPrimitives from \"@radix-ui/react-radio-group\";\nimport { cn } from \"@/utils/cn\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\n/**\n * 상호 배타적인 옵션 목록 중 단 하나만을 선택해야 할 때 사용하는 컴포넌트입니다.\n *\n * {@link RadioGroup}은 여러 개의 {@link RadioGroupItem}을 포함하는 컨테이너이며,\n * 한 번에 하나의 아이템만 선택될 수 있도록 상태를 관리합니다.\n *\n * Radix UI의 Radio Group 컴포넌트를 기반으로 구현되어 방향키를 이용한 내비게이션 등\n * 표준 라디오 그룹 동작을 지원합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **단일 선택**: 성별 선택, 배송 방법 선택 등 여러 옵션 중 하나만 골라야 할 때\n * - **옵션 노출**: 모든 선택지가 사용자에게 한눈에 보여야 할 때 (옵션이 5개 이하인 경우 권장)\n *\n * **사용하지 말아야 하는 경우:**\n * - **다중 선택**: 여러 개를 동시에 선택할 수 있어야 하는 경우 `Checkbox`를 사용하세요.\n * - **옵션이 많은 경우**: 선택지가 5-6개를 넘어간다면 화면 공간을 위해 `Dropdown`을 사용하는 것이 좋습니다.\n * - **독립적 On/Off**: 단순히 하나의 항목을 켜고 끄는 것이라면 `Checkbox`나 `Switch`가 더 적절합니다.\n *\n * ## Layout behavior\n *\n * - **asChild**: `asChild` 속성을 사용하면 기본 렌더링 요소 대신 자식 요소를 렌더링하고 속성을 병합합니다.\n * 커스텀 컴포넌트나 다른 라이브러리와 연동할 때 유용합니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Navigation**: `Tab` 키로 그룹에 진입한 후, 화살표 키(`Up`, `Down`, `Left`, `Right`)를 사용하여 옵션 간 이동 및 선택이 가능합니다.\n * - **Roles**: `role=\"radiogroup\"` 및 `role=\"radio\"` 속성이 자동으로 부여됩니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 라디오 그룹 사용 예시:\n *\n * ```tsx\n * <RadioGroup defaultValue=\"apple\" onValueChange={(val) => console.log(val)}>\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"apple\" id=\"apple\" />\n * <label htmlFor=\"apple\">사과</label>\n * </div>\n * <div className=\"flex items-center gap-2\">\n * <RadioGroupItem value=\"banana\" id=\"banana\" />\n * <label htmlFor=\"banana\">바나나</label>\n * </div>\n * </RadioGroup>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * `asChild`를 사용한 커스텀 렌더링 예시:\n *\n * ```tsx\n * <RadioGroup asChild>\n * <section className=\"my-custom-group\">\n * <RadioGroupItem asChild value=\"custom\">\n * <button type=\"button\" className=\"custom-radio-trigger\">\n * 커스텀 라디오\n * </button>\n * </RadioGroupItem>\n * </section>\n * </RadioGroup>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Checkbox}, 다중 선택이 필요한 경우\n * - {@link Dropdown}, 옵션이 많아 리스트로 숨겨야 하는 경우\n * - {@link Switch}, 단순 활성화/비활성화를 토글할 때\n */\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitives.Root>\n>(({ className, ...props }, ref) => {\n return (\n <RadioGroupPrimitives.Root className={className} {...props} ref={ref} />\n );\n});\nRadioGroup.displayName = RadioGroupPrimitives.Root.displayName;\n\nconst radioGroupItemVariants = cva(\n cn(\n \"flex items-center justify-center\",\n \"aspect-square rounded-full border-2 transition-colors\",\n \"focus:outline-none\",\n \"focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"cursor-pointer\",\n ),\n {\n variants: {\n variant: {\n black: cn(\n \"border-cms-gray-300 text-cms-black\",\n \"data-[state=checked]:border-cms-black\",\n ),\n default: cn(\n \"border-cms-gray-300 text-cms-primary-300\",\n \"data-[state=checked]:border-cms-primary-300\",\n ),\n green: cn(\n \"border-cms-gray-300 text-cms-green-500\",\n \"data-[state=checked]:border-cms-green-500\",\n ),\n blue: cn(\n \"border-cms-gray-300 text-cms-blue-700\",\n \"data-[state=checked]:border-cms-blue-700\",\n ),\n red: cn(\n \"border-cms-gray-300 text-cms-red-400\",\n \"data-[state=checked]:border-cms-red-400\",\n ),\n },\n size: {\n sm: \"size-4\",\n md: \"size-5\",\n lg: \"size-6\",\n },\n },\n defaultVariants: {\n variant: \"black\",\n size: \"md\",\n },\n },\n);\n\nconst radioGroupIndicatorVariants = cva(\n \"flex items-center justify-center rounded-full bg-current aspect-square\",\n {\n variants: {\n variant: {\n // bg-current를 쓰면 부모 text color를 따라가므로 색상 정의 줄일 수 있음\n black: \"text-cms-black\",\n default: \"text-cms-primary-300\",\n green: \"text-cms-green-500\",\n blue: \"text-cms-blue-700\",\n red: \"text-cms-red-400\",\n },\n size: {\n sm: \"size-2\",\n md: \"size-2.5\",\n lg: \"size-3\",\n },\n },\n defaultVariants: {\n variant: \"black\",\n size: \"md\",\n },\n },\n);\n\nexport interface RadioGroupItemProps\n extends\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitives.Item>,\n VariantProps<typeof radioGroupItemVariants> {}\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitives.Item>,\n RadioGroupItemProps\n>(({ className, variant, size, ...props }, ref) => {\n return (\n <RadioGroupPrimitives.Item\n ref={ref}\n className={cn(radioGroupItemVariants({ variant, size }), className)}\n {...props}\n >\n <RadioGroupPrimitives.Indicator\n className={cn(radioGroupIndicatorVariants({ variant, size }))}\n />\n </RadioGroupPrimitives.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitives.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n","import React, { useState } from \"react\";\nimport * as Accordion from \"@radix-ui/react-accordion\";\nimport { cn } from \"@/utils/cn\";\nimport { ChevronDown } from \"lucide-react\";\n\nexport interface SubMenuItem {\n url: string;\n title: string;\n}\n\nexport interface MenuItem {\n url: string;\n title: string;\n icon?: React.ReactNode;\n subMenu?: SubMenuItem[];\n}\n\nexport interface SideNavigationProps {\n title?: string;\n menus: MenuItem[];\n selectedUrl: string;\n onMenuClick: (url: string) => void;\n headerSlot?: React.ReactNode;\n className?: string;\n}\n\ninterface NavigationMenuItemProps {\n menu: MenuItem;\n isOpen: boolean;\n isSelected: boolean;\n selectedUrl: string;\n onMenuClick: (url: string) => void;\n}\n\nconst NavigationMenuItem = ({\n menu,\n isOpen,\n isSelected,\n selectedUrl,\n onMenuClick,\n}: NavigationMenuItemProps) => {\n const isSubMenuSelected = menu.subMenu?.some(\n (sub) => sub.url === selectedUrl,\n );\n\n return (\n <Accordion.Item value={menu.url} className=\"border-none\">\n <Accordion.Header className=\"m-0\">\n <Accordion.Trigger\n onClick={(e) => {\n if (!menu.subMenu) {\n e.preventDefault();\n onMenuClick(menu.url);\n }\n }}\n className={cn(\n \"border-0 group flex items-center px-5 bg-cms-gray-850\",\n \"text-white font-bold text-lg\",\n \"w-full h-15\",\n \"transition-colors\",\n \"cursor-pointer\",\n !isSubMenuSelected && \"data-[state=open]:bg-transparent\",\n !menu.subMenu && isSelected && \"bg-cms-primary-400 text-cms-black\",\n isSubMenuSelected && \"bg-cms-primary-200 text-cms-black\",\n )}\n >\n {menu.icon && (\n <div\n className={cn(\n \"mr-3 flex items-center\",\n \"[&>svg]:w-6 [&>svg]:h-6\",\n (!menu.subMenu && isSelected) || isSubMenuSelected\n ? \"text-cms-black\"\n : \"text-white\",\n )}\n >\n {menu.icon}\n </div>\n )}\n <span\n className={cn(\n (!menu.subMenu && isSelected) || isSubMenuSelected\n ? \"text-cms-black\"\n : \"text-white\",\n )}\n >\n {menu.title}\n </span>\n {menu.subMenu && (\n <ChevronDown\n className={cn(\n \"ml-auto transition-transform\",\n (!menu.subMenu && isSelected) || isSubMenuSelected\n ? \"text-cms-black\"\n : \"text-white\",\n isOpen && \"rotate-180\",\n )}\n size={20}\n />\n )}\n </Accordion.Trigger>\n </Accordion.Header>\n {menu.subMenu && (\n <Accordion.Content\n className={cn(\n \"overflow-hidden\",\n \"data-[state=open]:animate-accordion-down\",\n \"data-[state=closed]:animate-accordion-up\",\n )}\n >\n {menu.subMenu.map((subItem) => {\n const subSelected = subItem.url === selectedUrl;\n return (\n <button\n key={subItem.url}\n onClick={() => onMenuClick(subItem.url)}\n className={cn(\n \"border-0 bg-transparent flex items-center\",\n \"w-full h-13 px-5 pl-14\",\n \"cursor-pointer\",\n \"transition-colors\",\n \"hover:bg-cms-gray-900\",\n )}\n >\n <span\n className={cn(\n \"text-base font-bold\",\n \"transition-colors\",\n subSelected\n ? \"text-cms-primary-400 font-bold\"\n : \"text-cms-white\",\n )}\n >\n {subItem.title}\n </span>\n </button>\n );\n })}\n </Accordion.Content>\n )}\n </Accordion.Item>\n );\n};\n\n/**\n * 어플리케이션의 주요 섹션 간 이동을 담당하는 왼쪽 사이드바 메뉴 컴포넌트입니다.\n *\n * {@link SideNavigation}은 계층형 메뉴 구조(1단계 및 서브메뉴)를 지원하며,\n * 현재 사용자의 위치를 시각적으로 강조하여 내비게이션 맥락을 제공합니다.\n * 다크 테마(Dark Theme) 스타일로 고정되어 대시보드 및 CMS 관리 도구에 적합합니다.\n *\n * Radix UI의 Accordion 컴포넌트를 기반으로 구현되어 서브메뉴의 펼침/접힘 동작이\n * 부드럽게 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **메인 내비게이션**: 서비스의 핵심 기능을 상시 노출하고 접근해야 할 때\n * - **계층 구조 관리**: 대메뉴와 그에 속한 소메뉴를 구조적으로 보여줘야 할 때\n * - **관리자 페이지**: 다양한 관리 도구와 설정 항목을 분류하여 제공할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **단순 링크 목록**: 3-4개의 단순한 링크라면 상단 내비게이션(GNB)이 더 적절할 수 있습니다.\n * - **모바일 전용 탭**: 모바일 앱 스타일의 내비게이션이 필요하다면 하단 탭 바를 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Fixed Width**: 기본적으로 `w-70` (280px)의 고정 너비를 가지며, 세로 전체(h-full)를 차지합니다.\n * - **Scrollable**: 메뉴 항목이 많아 화면 높이를 넘어가면 메뉴 영역 내부에 스크롤이 발생합니다.\n * - **Accordion**: 서브메뉴가 있는 항목 클릭 시 아래로 펼쳐지는 애니메이션이 적용됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **아이콘 활용**: 각 대메뉴에 적절한 아이콘을 배치하여 사용자가 메뉴의 성격을 빠르게 파악하게 하세요.\n * - **상태 연동**: 현재 활성화된 페이지의 URL과 `selectedUrl`을 정확히 일치시켜 하이라이트가 올바르게 표시되도록 하세요.\n * - **일관된 그룹화**: 연관된 기능들은 하나의 대메뉴 아래 서브메뉴로 묶어 복잡도를 낮추세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **과도한 계층**: 서브메뉴의 서브메뉴(3단계 이상)는 가급적 피하세요. UI가 복잡해지고 사용성이 떨어집니다.\n * - **긴 메뉴 명칭**: 사이드바 너비가 제한적이므로 메뉴 이름은 짧고 명확하게(가급적 10자 이내) 작성하세요.\n *\n * ## Accessibility\n *\n * - **Accordion Support**: 서브메뉴 상태를 스크린 리더에서 '펼쳐짐/접힘'으로 인식합니다.\n * - **Keyboard Interaction**: `Tab` 키로 메뉴를 이동하고, `Enter`나 `Space`로 메뉴를 열거나 이동할 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 서브메뉴를 포함한 사이드 네비게이션:\n *\n * ```tsx\n * const menus = [\n * { url: '/dashboard', title: '홈', icon: <HomeIcon /> },\n * {\n * url: '/contents',\n * title: '콘텐츠 관리',\n * icon: <FileTextIcon />,\n * subMenu: [\n * { url: '/contents/posts', title: '게시글 목록' },\n * { url: '/contents/comments', title: '댓글 관리' },\n * ]\n * },\n * ];\n *\n * <SideNavigation\n * menus={menus}\n * selectedUrl=\"/contents/posts\"\n * onMenuClick={(url) => navigate(url)}\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Button}, 단순 액션 실행을 위한 요소\n * - {@link Popover}, 클릭 시 일시적으로 나타나는 추가 메뉴가 필요한 경우\n */\nexport const SideNavigation = React.forwardRef<\n HTMLDivElement,\n SideNavigationProps\n>(\n (\n { title, menus, selectedUrl, onMenuClick, headerSlot, className, ...props },\n ref,\n ) => {\n const [openedMenus, setOpenedMenus] = useState<string[]>([]);\n\n return (\n <div\n ref={ref}\n className={cn(\n \"flex flex-col\",\n \"w-70 min-w-70 max-w-70 h-full\",\n \"bg-cms-gray-850 text-white\",\n className,\n )}\n {...props}\n >\n {/* Header Slot */}\n {headerSlot}\n\n {/* Title */}\n {title && !headerSlot && (\n <div className=\"px-5 py-4 border-b border-[#3a3b3e]\">\n <h2 className=\"text-lg font-semibold text-white\">{title}</h2>\n </div>\n )}\n\n {/* Menu Body */}\n <div\n className={cn(\n \"flex-1 overflow-y-auto\",\n \"scrollbar-thin\",\n \"scrollbar-thumb-[#3a3b3e]\",\n \"scrollbar-track-transparent\",\n )}\n >\n <Accordion.Root\n type=\"multiple\"\n value={openedMenus}\n onValueChange={setOpenedMenus}\n >\n {menus.map((menu) => (\n <NavigationMenuItem\n key={menu.url}\n menu={menu}\n isOpen={openedMenus.includes(menu.url)}\n isSelected={selectedUrl === menu.url}\n selectedUrl={selectedUrl}\n onMenuClick={onMenuClick}\n />\n ))}\n </Accordion.Root>\n </div>\n </div>\n );\n },\n);\n\nSideNavigation.displayName = \"SideNavigation\";\n","import React, { useMemo } from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { cva } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n siblingCount?: number;\n showPrevNext?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nconst paginationButtonVariants = cva(\n cn(\n \"inline-flex items-center justify-center\",\n \"h-10 min-w-10 px-2\",\n \"rounded-md\",\n \"text-sm font-medium\",\n \"transition-colors\",\n \"cursor-pointer\",\n \"focus-visible:outline-none focus-visible:ring-2\",\n ),\n {\n variants: {\n variant: {\n default: cn(\n \"border border-cms-gray-400 bg-transparent\",\n \"text-cms-gray-700\",\n \"hover:bg-cms-gray-200\",\n ),\n active: cn(\n \"bg-cms-primary-400 border border-cms-primary-400\",\n \"text-cms-black\",\n \"hover:bg-cms-primary-300\",\n ),\n ellipsis: cn(\n \"border-0 bg-transparent\",\n \"text-cms-gray-700\",\n \"cursor-default pointer-events-none\",\n ),\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\ntype PageItem = number | \"...\";\n\nconst usePagination = ({\n currentPage,\n totalPages,\n siblingCount = 1,\n}: {\n currentPage: number;\n totalPages: number;\n siblingCount?: number;\n}): PageItem[] => {\n return useMemo(() => {\n const range = (start: number, end: number): number[] => {\n return Array.from({ length: end - start + 1 }, (_, i) => start + i);\n };\n\n // 총 표시할 페이지 번호 개수 계산\n const totalPageNumbers = siblingCount * 2 + 5;\n\n // 모든 페이지를 표시할 수 있으면 ellipsis 없이 표시\n if (totalPageNumbers >= totalPages) {\n return range(1, totalPages);\n }\n\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1);\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages);\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2;\n const shouldShowRightEllipsis = rightSiblingIndex < totalPages - 1;\n\n // Case 1: 오른쪽만 ellipsis\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const leftRange = range(1, 3 + 2 * siblingCount);\n return [...leftRange, \"...\", totalPages];\n }\n\n // Case 2: 왼쪽만 ellipsis\n if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n const rightRange = range(totalPages - (2 + 2 * siblingCount), totalPages);\n return [1, \"...\", ...rightRange];\n }\n\n // Case 3: 양쪽 모두 ellipsis\n if (shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const middleRange = range(leftSiblingIndex, rightSiblingIndex);\n return [1, \"...\", ...middleRange, \"...\", totalPages];\n }\n\n return [];\n }, [currentPage, totalPages, siblingCount]);\n};\n\n/**\n * 사용자가 여러 페이지로 나뉜 콘텐츠를 탐색할 수 있게 하는 페이지네이션 컴포넌트입니다.\n *\n * {@link Pagination}은 이전/다음 버튼과 페이지 번호를 제공하며,\n * 많은 페이지가 있을 때 중간 페이지를 생략(ellipsis)하여 UI를 깔끔하게 유지합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **긴 목록**: 많은 항목을 여러 페이지로 나누어 표시할 때\n * - **검색 결과**: 검색 결과가 여러 페이지에 걸쳐 있을 때\n * - **데이터 테이블**: 대량의 데이터를 페이지 단위로 보여줄 때\n * - **명확한 페이지 구분**: 사용자가 특정 페이지로 직접 이동할 필요가 있을 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **무한 스크롤**: 지속적으로 콘텐츠가 로드되는 피드 형태가 더 적절한 경우\n * - **적은 항목**: 한 페이지에 모두 표시할 수 있는 소량의 데이터\n * - **단계별 프로세스**: 순차적인 단계를 나타낼 때는 Stepper 컴포넌트 사용\n *\n * ## Layout behavior\n *\n * - **Responsive**: 모바일에서는 siblingCount를 줄여 더 적은 페이지 번호를 표시하는 것을 권장\n * - **Centered**: 일반적으로 페이지 하단 중앙에 배치\n * - **Ellipsis**: 많은 페이지가 있을 때 자동으로 중간 페이지를 생략 (...으로 표시)\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **적절한 페이지당 항목 수**: 10-50개 사이가 적절 (콘텐츠 유형에 따라 조정)\n * - **현재 페이지 명확히 표시**: 활성 페이지는 시각적으로 구분되어야 함\n * - **충분한 클릭 영역**: 모바일에서도 쉽게 탭할 수 있도록 버튼 크기 유지\n * - **첫/마지막 페이지 비활성화**: 이동할 수 없는 경우 버튼을 비활성화하여 명확히 표시\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **너무 많은 페이지 번호**: siblingCount를 너무 크게 설정하지 마세요\n * - **불명확한 상태**: 로딩 중이거나 에러 상태일 때도 적절한 피드백 제공 필요\n *\n * ## Accessibility\n *\n * - **ARIA Labels**: 각 버튼에 명확한 레이블 제공 (aria-label, aria-current)\n * - **Keyboard Navigation**: Tab 키로 버튼 간 이동, Enter/Space로 페이지 변경\n * - **Screen Reader**: 현재 페이지와 전체 페이지 수를 읽어주도록 설정\n * - **Disabled State**: 비활성화된 버튼은 포커스할 수 없도록 처리\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 페이지네이션 사용:\n *\n * ```tsx\n * const [currentPage, setCurrentPage] = useState(1);\n * const totalPages = 10;\n *\n * <Pagination\n * currentPage={currentPage}\n * totalPages={totalPages}\n * onPageChange={setCurrentPage}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 많은 페이지와 커스텀 siblingCount:\n *\n * ```tsx\n * <Pagination\n * currentPage={25}\n * totalPages={100}\n * siblingCount={2}\n * onPageChange={handlePageChange}\n * />\n * // 결과: 1 ... 23 24 25 26 27 ... 100\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 비활성화 상태:\n *\n * ```tsx\n * <Pagination\n * currentPage={5}\n * totalPages={10}\n * onPageChange={handlePageChange}\n * disabled={isLoading}\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Button}, 단일 버튼 컴포넌트\n */\nexport const Pagination = React.forwardRef<HTMLDivElement, PaginationProps>(\n (\n {\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n showPrevNext = true,\n disabled = false,\n className,\n },\n ref,\n ) => {\n const pages = usePagination({ currentPage, totalPages, siblingCount });\n\n const handlePrevious = () => {\n if (currentPage > 1 && !disabled) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages && !disabled) {\n onPageChange(currentPage + 1);\n }\n };\n\n const handlePageClick = (page: number) => {\n if (!disabled && page !== currentPage) {\n onPageChange(page);\n }\n };\n\n return (\n <nav\n ref={ref}\n role=\"navigation\"\n aria-label=\"페이지네이션\"\n className={cn(\"flex items-center gap-1\", className)}\n >\n {/* Previous Button */}\n {showPrevNext && (\n <button\n onClick={handlePrevious}\n disabled={disabled || currentPage === 1}\n aria-label=\"이전 페이지\"\n className={cn(\n paginationButtonVariants({ variant: \"default\" }),\n (disabled || currentPage === 1) &&\n \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n <ChevronLeft className=\"w-4 h-4\" />\n </button>\n )}\n\n {/* Page Numbers */}\n {pages.map((page, index) => {\n if (page === \"...\") {\n return (\n <span\n key={`ellipsis-${index}`}\n className={cn(\n paginationButtonVariants({ variant: \"ellipsis\" }),\n )}\n aria-hidden=\"true\"\n >\n ...\n </span>\n );\n }\n\n const isActive = page === currentPage;\n\n return (\n <button\n key={page}\n onClick={() => handlePageClick(page)}\n disabled={disabled}\n aria-label={`페이지 ${page}${isActive ? \" (현재 페이지)\" : \"로 이동\"}`}\n aria-current={isActive ? \"page\" : undefined}\n className={cn(\n paginationButtonVariants({\n variant: isActive ? \"active\" : \"default\",\n }),\n disabled && \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n {page}\n </button>\n );\n })}\n\n {/* Next Button */}\n {showPrevNext && (\n <button\n onClick={handleNext}\n disabled={disabled || currentPage === totalPages}\n aria-label=\"다음 페이지\"\n className={cn(\n paginationButtonVariants({ variant: \"default\" }),\n (disabled || currentPage === totalPages) &&\n \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n <ChevronRight className=\"w-4 h-4\" />\n </button>\n )}\n </nav>\n );\n },\n);\n\nPagination.displayName = \"Pagination\";\n","import React from \"react\";\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport { Check } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface CheckboxProps extends React.ComponentPropsWithoutRef<\n typeof CheckboxPrimitive.Root\n> {\n label?: string;\n id?: string;\n}\n\n/**\n * 사용자가 여러 옵션 중 하나 이상을 선택하거나, 특정 항목의 활성화 상태를 제어할 때 사용하는 컴포넌트입니다.\n *\n * {@link Checkbox}는 개별적인 On/Off 상태를 표시하며, 주로 목록에서의 다중 선택이나\n * 설정 화면에서 특정 기능의 사용 여부를 결정할 때 사용됩니다.\n *\n * Radix UI의 Checkbox 컴포넌트를 기반으로 구현되어 접근성과 키보드 내비게이션이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **다중 선택**: 목록에서 여러 항목을 동시에 선택해야 할 때\n * - **단일 승인**: 이용약관 동의와 같이 하나의 항목에 대해 확인이 필요할 때\n * - **설정 제어**: 특정 기능의 활성화/비활성화 상태를 토글할 때\n * - **필터링**: 여러 조건(카테고리, 날짜 등)을 동시에 적용하여 결과를 필터링할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **상호 배타적 선택**: 여러 옵션 중 단 하나만 선택해야 하는 경우 `RadioButton`을 사용하세요.\n * - **즉각적인 상태 반영**: 설정을 바꾸자마자 페이지에 즉시 반영되는 경우 `Switch` 컴포넌트가 더 적절할 수 있습니다.\n *\n * ## Layout behavior\n *\n * - **Inline Alignment**: 레이블과 함께 가로로 나란히 배치되며, 기본적으로 인라인 블록 요소처럼 동작합니다.\n * - **Spacing**: 체크박스와 레이블 사이에는 일정한 간격(8px/0.5rem)이 유지됩니다.\n * - **Touch Area**: 모바일 대응을 위해 레이블 클릭 시에도 체크박스가 선택되도록 `htmlFor` 속성이 연결되어 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 레이블 제공**: 체크박스가 무엇을 제어하는지 명확하게 설명하는 레이블을 함께 사용하세요.\n * - **긍정형 문장 사용**: '알림 받지 않기'보다는 '알림 받기'와 같이 긍정형 문구로 작성하는 것이 혼란을 줄입니다.\n * - **그룹화**: 여러 체크박스가 하나의 주제를 다룬다면 적절한 제목 아래에 그룹화하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **레이블 생략 지양**: 공간이 매우 협소한 경우가 아니라면 항상 레이블을 함께 제공하세요.\n * - **복잡한 텍스트**: 레이블에 너무 많은 정보나 설명을 넣지 마세요. 필요하다면 툴팁이나 별도의 설명 텍스트를 사용하세요.\n *\n * ## Accessibility\n *\n * - **Keyboard Interaction**: `Space` 키를 사용하여 체크 상태를 전환할 수 있습니다.\n * - **Focus Management**: 탭 키를 통해 포커스를 이동할 수 있으며, 포커스 시 시각적인 강조 효과가 나타납니다.\n * - **WAI-ARIA**: `role=\"checkbox\"`를 사용하며, 체크 상태에 따라 `aria-checked` 값이 자동으로 업데이트됩니다.\n * - **Label Connection**: `id`와 `htmlFor`가 자동으로 연결되어 스크린 리더가 레이블을 읽어줍니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 체크박스 사용 예시:\n *\n * ```tsx\n * <Checkbox\n * label=\"이용약관에 동의합니다\"\n * checked={agreed}\n * onCheckedChange={setAgreed}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 비활성화된 체크박스:\n *\n * ```tsx\n * <Checkbox\n * label=\"선택 불가능한 옵션\"\n * disabled\n * checked={true}\n * />\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link RadioButton}, 하나만 선택해야 하는 경우\n * - {@link Switch}, 즉각적인 상태 반영이 필요한 경우\n * - {@link Button}, 단순 액션 실행이 필요한 경우\n */\nexport const Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n CheckboxProps\n>(({ className, label, id, disabled, ...props }, ref) => {\n const checkboxId =\n id || `checkbox-${Math.random().toString(36).substr(2, 9)}`;\n\n return (\n <div className=\"flex items-center\">\n <CheckboxPrimitive.Root\n ref={ref}\n id={checkboxId}\n disabled={disabled}\n className={cn(\n \"peer h-5 w-5 shrink-0 rounded\",\n \"border border-gray-400 bg-white\",\n \"focus-visible:outline-none\",\n \"focus-visible:ring-2\",\n \"focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:bg-black data-[state=checked]:border-black\",\n \"transition-colors\",\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n className={cn(\"flex items-center justify-center\", \"text-white\")}\n >\n <Check className=\"h-[18px] w-[18px]\" strokeWidth={4} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n {label && (\n <label\n htmlFor={checkboxId}\n className={cn(\n \"ml-2 text-base font-normal text-gray-500\",\n \"hover:text-black transition-colors\",\n disabled && \"cursor-not-allowed opacity-50\",\n \"cursor-pointer select-none\"\n )}\n >\n {label}\n </label>\n )}\n </div>\n );\n});\n\nCheckbox.displayName = \"Checkbox\";\n","import React from \"react\";\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport { X } from \"lucide-react\";\nimport { cn } from \"@/utils/cn\";\nimport { Button } from \"../Button\";\n\nexport interface ModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n icon?: React.ReactNode;\n title?: React.ReactNode;\n children: React.ReactNode;\n footer?: React.ReactNode;\n className?: string;\n showCloseButton?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n}\n\nconst sizeClasses = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n};\n\n/**\n * 사용자에게 중요한 정보를 표시하거나 입력을 요구하는 오버레이 대화상자입니다.\n *\n * {@link Modal}은 사용자의 주의를 집중시켜야 하는 상황에서 사용됩니다.\n * 모달이 열리면 배경이 어두워지며, 사용자는 모달과 상호작용하거나 닫기 전까지\n * 페이지의 다른 부분과 상호작용할 수 없습니다.\n *\n * Radix UI의 Dialog 컴포넌트를 기반으로 구현되어 접근성과 키보드 내비게이션이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **중요한 의사 결정**: 삭제, 저장, 제출 등 되돌릴 수 없는 작업 확인\n * - **필수 정보 입력**: 다음 단계로 진행하기 전 반드시 입력해야 하는 정보 수집\n * - **중요 알림**: 사용자가 반드시 확인해야 하는 에러, 경고, 성공 메시지\n * - **간단한 폼**: 페이지 전환 없이 빠르게 정보를 입력받아야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **긴급하지 않은 알림**: Toast 컴포넌트를 사용하세요\n * - **복잡한 다단계 폼**: 별도 페이지로 이동하세요\n * - **많은 정보 표시**: 페이지 내 섹션으로 구현하세요\n * - **비필수 부가 정보**: Popover나 Tooltip을 사용하세요\n *\n * ## Layout behavior\n *\n * 모달은 항상 화면 중앙에 고정되며, 배경 오버레이는 전체 화면을 덮습니다.\n * 크기는 `size` prop에 따라 결정됩니다:\n * - `sm`: 최대 너비 24rem (384px) - 간단한 확인 대화상자\n * - `md`: 최대 너비 28rem (448px) - 기본값, 일반적인 폼이나 메시지\n * - `lg`: 최대 너비 32rem (512px) - 많은 내용이나 복잡한 폼\n *\n * 모달의 높이는 콘텐츠에 따라 자동으로 조절되며, 화면을 넘어가면 스크롤이 발생합니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 제목 사용**: 모달의 목적을 한눈에 알 수 있는 제목을 제공하세요\n * ```tsx\n * <Modal title=\"항목 삭제\">...</Modal> // Good\n * <Modal title=\"확인\">...</Modal> // Bad - 너무 모호함\n * ```\n *\n * - **행동 지향적 버튼**: 버튼 레이블은 수행할 동작을 명확히 표현하세요\n * ```tsx\n * <Button>삭제하기</Button> // Good\n * <Button>확인</Button> // Bad - 무엇을 확인하는지 불명확\n * ```\n *\n * - **적절한 크기 선택**: 콘텐츠 양에 맞는 size를 선택하세요\n * - **명확한 닫기 방법**: X 버튼, 취소 버튼, 배경 클릭 중 최소 하나는 제공하세요\n * - **중요도에 따른 변형**: ConfirmModal, SuccessModal, ErrorModal 등 사용\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **모달 위에 모달을 띄우지 마세요** - UX가 복잡해지고 혼란스러워집니다\n * - **긴 스크롤이 필요한 콘텐츠는 피하세요** - 별도 페이지로 이동하는 것이 좋습니다\n * - **자동으로 모달을 열지 마세요** - 사용자의 명시적 동작(클릭 등) 후에만 열어야 합니다\n * - **모달 없이도 작업 가능한 경우** - 불필요하게 모달을 사용하지 마세요\n * - **모바일에서 큰 모달(lg) 사용 지양** - 화면을 거의 다 차지하므로 페이지 이동 권장\n *\n * ## Accessibility\n *\n * 이 컴포넌트는 WAI-ARIA Dialog 패턴을 따릅니다:\n *\n * - **키보드 내비게이션**:\n * - `Esc`: 모달 닫기\n * - `Tab`: 모달 내부 포커스 순환 (모달 외부로 나가지 않음)\n * - 모달이 열리면 첫 번째 포커스 가능한 요소로 자동 포커스\n *\n * - **스크린 리더**:\n * - `role=\"dialog\"`: 대화상자임을 인식\n * - `aria-labelledby`: title이 모달의 레이블로 연결됨\n * - `aria-describedby`: children 콘텐츠가 설명으로 연결됨\n *\n * - **포커스 트랩**: 모달이 열려있는 동안 포커스가 모달 내부에서만 순환합니다\n * - **배경 스크롤 방지**: 모달이 열리면 body 스크롤이 자동으로 비활성화됩니다\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본적인 확인 모달 예시:\n *\n * ```tsx\n * function DeleteConfirmDialog() {\n * const [open, setOpen] = useState(false);\n *\n * return (\n * <>\n * <Button onClick={() => setOpen(true)}>삭제</Button>\n * <Modal\n * open={open}\n * onOpenChange={setOpen}\n * title=\"항목 삭제\"\n * footer={\n * <div className=\"flex gap-2\">\n * <Button onClick={() => setOpen(false)} variant=\"outline\">\n * 취소\n * </Button>\n * <Button onClick={handleDelete} variant=\"destructive\">\n * 삭제하기\n * </Button>\n * </div>\n * }\n * >\n * 이 항목을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.\n * </Modal>\n * </>\n * );\n * }\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 성공 아이콘이 포함된 모달 예시:\n *\n * ```tsx\n * <Modal\n * open={open}\n * onOpenChange={setOpen}\n * icon={<CheckCircle className=\"w-12 h-12 text-green-500\" />}\n * title=\"저장 완료\"\n * footer={\n * <Button onClick={() => setOpen(false)} className=\"w-full\">\n * 확인\n * </Button>\n * }\n * >\n * 데이터가 성공적으로 저장되었습니다.\n * </Modal>\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 큰 크기의 폼 모달 예시:\n *\n * ```tsx\n * <Modal\n * open={open}\n * onOpenChange={setOpen}\n * title=\"새 사용자 추가\"\n * size=\"lg\"\n * footer={\n * <div className=\"flex justify-end gap-2\">\n * <Button variant=\"outline\" onClick={() => setOpen(false)}>\n * 취소\n * </Button>\n * <Button onClick={handleSubmit}>저장</Button>\n * </div>\n * }\n * >\n * <form className=\"space-y-4\">\n * <TextInput label=\"이름\" required />\n * <TextInput label=\"이메일\" type=\"email\" required />\n * <TextInput label=\"전화번호\" />\n * </form>\n * </Modal>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link ConfirmModal}, 간단한 확인 모달을 위한 사전 구성된 변형\n * - {@link SuccessModal}, 성공 메시지를 표시하는 모달\n * - {@link ErrorModal}, 에러 메시지를 표시하는 모달\n * - {@link WarningModal}, 경고 메시지를 표시하는 모달\n * - {@link DeleteModal}, 삭제 확인을 위한 모달\n * - {@link Toast}, 긴급하지 않은 알림을 위한 컴포넌트\n * - {@link Popover}, 비필수 부가 정보를 표시하는 컴포넌트\n */\nexport const Modal = React.forwardRef<HTMLDivElement, ModalProps>(\n (\n {\n open,\n onOpenChange,\n icon,\n title,\n children,\n footer,\n className,\n showCloseButton = true,\n size = \"md\",\n },\n ref,\n ) => {\n return (\n <DialogPrimitive.Root open={open} onOpenChange={onOpenChange}>\n <DialogPrimitive.Portal>\n <DialogPrimitive.Overlay\n className={cn(\n \"fixed inset-0 z-150 bg-black/50\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n )}\n />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-150\",\n \"translate-x-[-50%] translate-y-[-50%]\",\n \"w-full\",\n sizeClasses[size],\n \"bg-white rounded-lg shadow-lg\",\n \"p-6\",\n \"data-[state=open]:animate-in data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n \"data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n className,\n )}\n >\n {showCloseButton && (\n <DialogPrimitive.Close asChild>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"h-6 w-6\", \"absolute right-4 top-4\")}\n >\n <X />\n <span className=\"sr-only\">Close</span>\n </Button>\n </DialogPrimitive.Close>\n )}\n\n {icon && <div className=\"flex justify-center mb-4\">{icon}</div>}\n\n {title && (\n <DialogPrimitive.Title\n className={cn(\n \"text-lg font-bold text-cms-gray-900 mb-2\",\n \"flex items-center justify-center\",\n )}\n >\n {title}\n </DialogPrimitive.Title>\n )}\n\n <DialogPrimitive.Description className=\"text-sm text-cms-gray-700 text-center\">\n {children}\n </DialogPrimitive.Description>\n\n {footer && <div className=\"mt-6\">{footer}</div>}\n </DialogPrimitive.Content>\n </DialogPrimitive.Portal>\n </DialogPrimitive.Root>\n );\n },\n);\n\nModal.displayName = \"Modal\";\n","import React from \"react\";\nimport { CheckCircle2 } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface ConfirmModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n className?: string;\n}\n\n/**\n * 사용자에게 특정 작업에 대한 최종 확인을 받기 위한 단순화된 모달 컴포넌트입니다.\n *\n * {@link ConfirmModal}은 {@link Modal}을 기반으로 구성되었으며, 상징적인 체크 아이콘과\n * 하나의 '확인' 버튼만을 제공하여 사용자의 빠른 의사결정을 돕습니다.\n * 주로 성공적인 처리 알림이나 단순한 동의가 필요할 때 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **결과 확인**: 설정 변경, 데이터 저장 등 작업이 정상적으로 완료되었음을 알릴 때\n * - **단순 안내**: 사용자에게 중요한 안내 사항을 전달하고 확인을 받아야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **중요한 결정/취소 필요**: '예/아니오'와 같이 선택지가 필요한 경우 일반 `Modal`이나 `DeleteModal`을 사용하세요.\n * - **데이터 입력**: 폼 입력이 필요한 경우 일반 `Modal`을 사용하세요.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **간결한 메시지**: 메시지는 가급적 2-3줄 이내로 짧고 명확하게 작성하세요.\n * - **적절한 타이틀**: \"저장 완료\", \"안내\" 등 문맥에 맞는 타이틀을 사용하세요.\n */\nexport const ConfirmModal = React.forwardRef<HTMLDivElement, ConfirmModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"확인\",\n message,\n confirmText = \"확인\",\n onConfirm,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n footer={\n <Button\n onClick={handleConfirm}\n className=\"w-full h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n icon={<CheckCircle2 className=\"w-15 h-15 text-cms-black\" />}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nConfirmModal.displayName = \"ConfirmModal\";\n","import React from \"react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\nimport { cn } from \"@/utils/cn\";\n\nexport interface DeleteModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message?: React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n onConfirm: () => void;\n onCancel?: () => void;\n className?: string;\n}\n\n/**\n * 데이터를 삭제하거나 영구적인 작업을 수행하기 전, 사용자의 최종 승인을 받기 위한 경고 모달입니다.\n *\n * {@link DeleteModal}은 파괴적인(Destructive) 액션을 강조하기 위해 빨간색 경고 아이콘과\n * 눈에 띄는 삭제 버튼을 제공합니다. 사용자가 실수로 데이터를 삭제하는 것을 방지하는 안전장치 역할을 합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **영구적 데이터 삭제**: 게시글, 사용자 계정, 설정값 등을 삭제할 때\n * - **되돌릴 수 없는 작업**: 초기화, 데이터 덮어쓰기 등 주의가 필요한 작업을 수행할 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **구체적인 정보 포함**: 단순히 \"삭제하시겠습니까?\" 보다는 \"사용자 '홍길동'의 정보를 삭제하시겠습니까?\"와 같이 구체적인 대상을 명시하는 것이 좋습니다.\n * - **위험성 강조**: 해당 작업이 되돌릴 수 없음을 메시지에 포함하세요.\n */\nexport const DeleteModal = React.forwardRef<HTMLDivElement, DeleteModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"삭제\",\n message = \"정말로 삭제하시겠습니까?\",\n confirmText = \"삭제\",\n cancelText = \"취소\",\n onConfirm,\n onCancel,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm();\n onOpenChange(false);\n };\n\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={<AlertTriangle className=\"w-15 h-15 text-cms-red-400\" />}\n title={title}\n footer={\n <div className=\"flex gap-2 w-full\">\n <Button\n onClick={handleCancel}\n variant=\"outline\"\n className=\"flex-1 h-12\"\n >\n {cancelText}\n </Button>\n <Button\n onClick={handleConfirm}\n className={cn(\n \"flex-1 h-12\",\n \"bg-cms-red-400 hover:bg-cms-red-500\",\n )}\n >\n {confirmText}\n </Button>\n </div>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nDeleteModal.displayName = \"DeleteModal\";\n","import React from \"react\";\nimport { XCircle } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface ErrorModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n className?: string;\n}\n\n/**\n * 시스템 오류나 사용자의 잘못된 조작으로 인해 작업이 실패했음을 알리는 모달입니다.\n *\n * {@link ErrorModal}은 빨간색 X 아이콘을 통해 부정적인 결과임을 즉각적으로 전달하며,\n * 사용자가 문제를 인지하고 다음 행동을 취할 수 있도록 돕습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **API 통신 실패**: 서버 오류나 네트워크 문제로 요청을 처리할 수 없을 때\n * - **유효성 검사 실패**: 입력한 정보에 중대한 결함이 있어 처리가 중단되었을 때\n * - **권한 부족**: 특정 기능을 사용할 권한이 없음을 알릴 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **구체적인 원인 안내**: 단순히 \"오류가 발생했습니다\" 보다는 \"이미 존재하는 이메일입니다\"와 같이 해결 가능한 정보를 제공하세요.\n * - **해결 방법 제시**: 가능하다면 \"나중에 다시 시도해 주세요\" 또는 \"고객센터로 문의해 주세요\"와 같은 가이드를 포함하세요.\n */\nexport const ErrorModal = React.forwardRef<HTMLDivElement, ErrorModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"오류\",\n message,\n confirmText = \"확인\",\n onConfirm,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={<XCircle className=\"w-15 h-15 text-cms-red-400\" />}\n title={title}\n footer={\n <Button\n onClick={handleConfirm}\n className=\"w-full h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nErrorModal.displayName = \"ErrorModal\";\n","import React from \"react\";\nimport { AlertTriangle } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface WarningModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n // 추가된 Props\n cancelText?: string;\n onCancel?: () => void;\n className?: string;\n}\n\n/**\n * 잠재적인 문제를 경고하거나 주의가 필요한 작업을 수행하기 전 사용자의 동의를 구하는 모달입니다.\n *\n * {@link WarningModal}은 주황색 경고 아이콘을 통해 주의를 환기시킵니다.\n * 완전한 파괴적 액션(삭제)은 아니지만, 데이터 변경이나 시스템 설정 변경 등\n * 신중함이 필요한 상황에서 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **데이터 변경**: 기존 정보를 대량으로 수정하거나 업데이트할 때\n * - **민감한 설정 변경**: 시스템 동작에 영향을 줄 수 있는 설정을 변경할 때\n * - **동작 확인**: 예기치 않은 부작용이 발생할 수 있는 기능을 실행할 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **위험성 명시**: 이 작업을 실행했을 때 어떤 결과가 초래될 수 있는지 명확히 설명하세요.\n * - **취소 옵션 제공**: 사용자가 마음을 바꿀 수 있도록 명확한 취소 버튼을 함께 배치하세요.\n */\nexport const WarningModal = React.forwardRef<HTMLDivElement, WarningModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"경고\",\n message,\n confirmText = \"확인\",\n onConfirm,\n // 기본값 설정\n cancelText = \"취소\",\n onCancel,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n // 취소 핸들러 추가\n const handleCancel = () => {\n onCancel?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={<AlertTriangle className=\"w-15 h-15 text-cms-orange-500\" />}\n title={title}\n footer={\n // 버튼 두 개를 가로로 배치하기 위해 flex 컨테이너 사용\n <div className=\"flex w-full gap-2\">\n <Button\n onClick={handleCancel}\n className=\"flex-1 h-12 bg-white border border-cms-gray-200 text-cms-gray-700 hover:bg-cms-gray-50\"\n >\n {cancelText}\n </Button>\n <Button\n onClick={handleConfirm}\n className=\"flex-1 h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n </div>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nWarningModal.displayName = \"WarningModal\";\n","import React from \"react\";\nimport { CheckCircle2 } from \"lucide-react\";\nimport { Modal } from \"./Modal\";\nimport { Button } from \"../Button/Button\";\n\nexport interface SuccessModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title?: string;\n message: React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n className?: string;\n}\n\n/**\n * 요청한 작업이 성공적으로 완료되었음을 축하하거나 알리는 모달입니다.\n *\n * {@link SuccessModal}은 초록색 체크 아이콘을 통해 긍정적인 결과를 전달합니다.\n * 단순한 Toast 알림보다 더 강조된 확인이 필요할 때 사용됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **중요 작업 완료**: 회원가입 완료, 대규모 데이터 처리 완료 등\n * - **영구적 저장 완료**: 중요한 설정이나 게시글이 성공적으로 서버에 저장되었을 때\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **긍정적인 피드백**: \"처리가 완료되었습니다\" 보다는 \"성공적으로 저장되었습니다\"와 같이 명확한 피드백을 제공하세요.\n * - **후속 조치 안내**: 필요한 경우 다음 단계로 무엇을 해야 하는지(예: 리스트로 이동 등) 메시지에 포함하세요.\n */\nexport const SuccessModal = React.forwardRef<HTMLDivElement, SuccessModalProps>(\n (\n {\n open,\n onOpenChange,\n title = \"성공\",\n message,\n confirmText = \"확인\",\n onConfirm,\n className,\n },\n ref,\n ) => {\n const handleConfirm = () => {\n onConfirm?.();\n onOpenChange(false);\n };\n\n return (\n <Modal\n ref={ref}\n open={open}\n onOpenChange={onOpenChange}\n icon={\n <CheckCircle2 className=\"w-15 h-15 text-cms-green-500 border-cms-green-500\" />\n }\n title={title}\n footer={\n <Button\n onClick={handleConfirm}\n className=\"w-full h-12 bg-cms-gray-850 hover:bg-cms-gray-800\"\n >\n {confirmText}\n </Button>\n }\n className={className}\n size=\"sm\"\n showCloseButton={false}\n >\n <div className=\"text-sm text-cms-gray-700\">{message}</div>\n </Modal>\n );\n },\n);\n\nSuccessModal.displayName = \"SuccessModal\";\n","import { Toaster as Sonner } from \"sonner\";\nimport { type ComponentProps } from \"react\";\n\ntype ToasterProps = ComponentProps<typeof Sonner>;\n\n/**\n * 사용자의 액션에 대한 가벼운 피드백을 화면 구석에 일시적으로 표시하는 알림 컴포넌트입니다.\n *\n * {@link Toaster}는 시스템의 상태 변화(성공, 실패, 경고 등)를 비침습적인 방식으로 알립니다.\n * `sonner` 라이브러리를 기반으로 하며, CMS 디자인 가이드에 맞춘 스타일링이 적용되어 있습니다.\n * 어플리케이션 최상위 수준(App.tsx 등)에 한 번만 배치하면 어디서든 `toast()` 함수를 통해 알림을 띄울 수 있습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **간단한 결과 알림**: \"저장되었습니다\", \"복사 완료\" 등 짧은 피드백\n * - **비파괴적 액션 확인**: 사용자의 흐름을 방해하지 않고 알림만 주고 싶을 때\n * - **백그라운드 작업 완료**: 서버 요청이 성공적으로 처리되었음을 알릴 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **중요한 의사 결정**: 사용자가 반드시 읽고 확인 버튼을 눌러야 하는 내용은 `Modal`을 사용하세요.\n * - **긴 메시지**: 토스트는 수초 후 사라지므로, 읽는 데 시간이 걸리는 긴 텍스트는 부적절합니다.\n * - **에러 세부 정보**: 복잡한 에러 로그나 해결 방법이 포함된 에러는 `Modal`이나 전용 에러 페이지에서 보여주세요.\n *\n * ## Layout behavior\n *\n * - **Floating**: 화면 최상단 레이어에 고정된 위치(기본값: 하단 중앙)에 나타납니다.\n * - **Stacking**: 여러 개의 토스트가 동시에 발생하면 차례대로 쌓여서 표시됩니다.\n * - **Auto-dismiss**: 일정 시간(기본 4초)이 지나면 자동으로 사라집니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확하고 간결하게**: 핵심만 담은 짧은 문장을 사용하세요. (예: \"이미지가 업로드되었습니다\")\n * - **적절한 타입 사용**: `toast.success`, `toast.error` 등 상황에 맞는 메서드를 사용하여 색상과 아이콘으로 의미를 전달하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **중요 정보 포함**: 토스트는 금방 사라지므로, 계좌번호나 비밀번호 같은 중요 정보를 여기에만 표시해서는 안 됩니다.\n * - **과도한 사용**: 짧은 시간에 너무 많은 토스트가 발생하면 사용자에게 스트레스를 줄 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 최상위 컴포넌트 설정:\n *\n * ```tsx\n * function App() {\n * return (\n * <>\n * <Router />\n * <Toaster />\n * </>\n * );\n * }\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 다양한 토스트 호출 방법:\n *\n * ```tsx\n * // 기본\n * toast(\"환영합니다!\");\n *\n * // 성공\n * toast.success(\"저장에 성공했습니다.\");\n *\n * // 에러\n * toast.error(\"서버와의 연결이 원활하지 않습니다.\");\n *\n * // 상세 설명 포함\n * toast(\"알림\", {\n * description: \"새로운 메시지가 도착했습니다.\"\n * });\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Modal}, 더 중요하거나 명시적 확인이 필요한 알림\n */\nconst Toaster = ({ position = \"bottom-center\", ...props }: ToasterProps) => {\n return (\n <Sonner\n position={position}\n className=\"toaster group\"\n toastOptions={{\n classNames: {\n toast:\n \"group toast w-full flex items-center gap-3 p-4 rounded-cms-lg shadow-lg bg-cms-white text-cms-gray-900 !border !border-cms-blue-600 [&_[data-content]]:!flex-row [&_[data-content]]:!items-baseline\",\n title:\n \"group-[.toast]:text-cms-gray-900 group-[.toast]:font-bold group-[.toast]:text-sm group-[.toast]:mr-2 group-[.toast]:!font-bold\",\n description:\n \"group-[.toast]:text-cms-gray-500 group-[.toast]:text-xs group-[.toast]:font-medium\",\n actionButton:\n \"group-[.toast]:bg-cms-gray-900 group-[.toast]:text-cms-white\",\n cancelButton:\n \"group-[.toast]:bg-cms-gray-100 group-[.toast]:text-cms-gray-500\",\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","\"use client\";\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { cn } from \"@/utils/cn\";\nimport React from \"react\";\n\n/**\n * 마우스 호버나 포커스 시 간단한 힌트나 설명을 제공하는 툴팁 컴포넌트입니다.\n *\n * {@link ToolTip}은 UI 요소에 대한 추가 정보를 간결하게 제공하여\n * 사용자가 인터페이스를 더 쉽게 이해할 수 있도록 돕습니다.\n *\n * Radix UI의 Tooltip 컴포넌트를 기반으로 구현되어 접근성 기능이\n * 자동으로 처리됩니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **아이콘 설명**: 텍스트 레이블이 없는 아이콘 버튼의 기능을 설명할 때\n * - **축약된 텍스트**: 말줄임표(...)로 잘린 텍스트의 전체 내용을 보여줄 때\n * - **간단한 힌트**: 입력 필드나 기능에 대한 짧은 도움말을 제공할 때\n * - **추가 정보**: UI 요소의 상태나 제약사항을 간단히 알려줄 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **필수 정보**: 사용자가 반드시 알아야 하는 정보는 본문에 직접 표시하세요.\n * - **복잡한 내용**: 여러 줄의 긴 텍스트나 인터랙티브 요소는 Popover나 Modal을 사용하세요.\n * - **모바일 전용 UI**: 터치 기기에서는 호버가 없으므로 중요한 정보를 툴팁에만 의존하지 마세요.\n *\n * ## Layout behavior\n *\n * - **Positioning**: 트리거 요소를 기준으로 상하좌우 원하는 위치에 배치됩니다. (기본: top)\n * - **Auto-adjustment**: 화면 경계를 벗어나지 않도록 자동으로 위치를 조정합니다.\n * - **Floating**: 다른 UI 요소들 위에 떠 있으며, 레이아웃에 영향을 주지 않습니다.\n * - **Arrow**: 트리거와의 연결을 시각적으로 나타내는 화살표를 선택적으로 표시할 수 있습니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **간결한 텍스트**: 한두 줄 이내의 짧은 텍스트로 핵심만 전달하세요.\n * - **적절한 지연**: `delayDuration`을 조절하여 우발적인 호버로 인한 깜빡임을 방지하세요. (기본: 200ms)\n * - **명확한 트리거**: 툴팁이 붙는 요소가 호버 가능함을 사용자가 인지할 수 있도록 하세요.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **중요 정보 숨기기**: 필수적인 정보를 툴팁에만 넣지 마세요.\n * - **상호작용 요소**: 툴팁 내부에 클릭 가능한 버튼이나 링크를 넣지 마세요. (Popover 사용 권장)\n * - **과도한 사용**: 모든 요소에 툴팁을 붙이면 오히려 사용성이 떨어집니다.\n *\n * ## Accessibility\n *\n * - **Keyboard Support**: 포커스 가능한 요소에 툴팁이 붙으면 포커스 시 자동으로 표시됩니다.\n * - **ESC Key**: `Esc` 키를 누르면 툴팁이 닫힙니다.\n * - **Screen Readers**: `aria-describedby` 속성이 자동으로 부여되어 스크린 리더가 내용을 읽습니다.\n * - **Touch Devices**: 터치 기기에서는 탭으로 툴팁을 활성화할 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 아이콘 버튼에 툴팁 추가:\n *\n * ```tsx\n * <ToolTip content=\"설정\">\n * <Button variant=\"ghost\" size=\"icon\">\n * <SettingsIcon />\n * </Button>\n * </ToolTip>\n * ```\n *\n * 위치와 지연 시간 커스터마이징:\n *\n * ```tsx\n * <ToolTip\n * content=\"이 기능은 프리미엄 사용자만 이용할 수 있습니다\"\n * side=\"bottom\"\n * delayDuration={300}\n * >\n * <Button disabled>프리미엄 기능</Button>\n * </ToolTip>\n * ```\n * {@end-tool}\n *\n * See also:\n *\n * - {@link Popover}, 클릭으로 열고 상호작용이 필요한 경우\n * - {@link Modal}, 중요한 정보나 복잡한 작업이 필요한 경우\n */\n\nexport interface ToolTipProps\n extends Omit<\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>,\n \"content\"\n > {\n /** 툴팁을 트리거하는 요소 */\n children: React.ReactNode;\n /** 툴팁에 표시할 내용 */\n content: React.ReactNode;\n /** 툴팁이 나타날 위치 (기본: \"top\") */\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n /** 트리거로부터의 거리 (픽셀) (기본: 4) */\n sideOffset?: number;\n /** 트리거와의 정렬 방식 (기본: \"center\") */\n align?: \"start\" | \"center\" | \"end\";\n /** 마우스 호버 후 툴팁이 나타나기까지의 지연 시간 (밀리초) (기본: 200) */\n delayDuration?: number;\n /** 다른 툴팁에서 빠르게 진입 시 지연 건너뛰기 시간 (밀리초) (기본: 300) */\n skipDelayDuration?: number;\n /** 툴팁 위로 마우스를 이동할 수 있는지 여부 (기본: true) */\n disableHoverableContent?: boolean;\n /** 화살표 표시 여부 (기본: true) */\n showArrow?: boolean;\n /** Controlled 모드: 툴팁 열림 상태 */\n open?: boolean;\n /** Uncontrolled 모드: 초기 열림 상태 */\n defaultOpen?: boolean;\n /** 툴팁 열림 상태 변경 시 콜백 */\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const ToolTip = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n ToolTipProps\n>(\n (\n {\n children,\n content,\n side = \"top\",\n sideOffset = 4,\n align = \"center\",\n delayDuration = 200,\n skipDelayDuration = 300,\n disableHoverableContent,\n showArrow = true,\n open,\n defaultOpen,\n onOpenChange,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <TooltipPrimitive.Provider\n delayDuration={delayDuration}\n skipDelayDuration={skipDelayDuration}\n disableHoverableContent={disableHoverableContent}\n >\n <TooltipPrimitive.Root\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n >\n <TooltipPrimitive.Trigger asChild>\n {children}\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n ref={ref}\n side={side}\n sideOffset={sideOffset}\n align={align}\n className={cn(\n \"z-50 px-3 py-1.5\",\n \"rounded-md\",\n \"bg-cms-black text-cms-white\",\n \"text-xs font-medium\",\n \"shadow-md\",\n \"max-w-xs\",\n \"animate-in fade-in-0 zoom-in-95\",\n \"data-[state=closed]:animate-out\",\n \"data-[state=closed]:fade-out-0\",\n \"data-[state=closed]:zoom-out-95\",\n \"data-[side=bottom]:slide-in-from-top-2\",\n \"data-[side=left]:slide-in-from-right-2\",\n \"data-[side=right]:slide-in-from-left-2\",\n \"data-[side=top]:slide-in-from-bottom-2\",\n className,\n )}\n {...props}\n >\n {content}\n {showArrow && (\n <TooltipPrimitive.Arrow className=\"fill-cms-black\" />\n )}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n },\n);\n\nToolTip.displayName = \"ToolTip\";\n","\"use client\";\n\nimport React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/utils/cn\";\nimport { ChevronUp, ChevronDown, ChevronsUpDown } from \"lucide-react\";\n\n/**\n * 데이터를 행과 열로 구조화하여 표시하는 테이블 컴포넌트입니다.\n *\n * {@link Table}은 Compound Component 패턴을 사용하여 구성되며,\n * TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, TableCaption\n * 등의 하위 컴포넌트를 조합하여 유연한 테이블 레이아웃을 만들 수 있습니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **데이터 목록**: 사용자 목록, 주문 내역, 제품 리스트 등 구조화된 데이터를 표시할 때\n * - **비교**: 여러 항목의 속성을 나란히 비교해야 할 때\n * - **정렬 및 필터**: 데이터를 정렬하거나 필터링해서 보여줄 때\n * - **대량 데이터**: 많은 양의 정보를 조직적으로 표시해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **레이아웃 목적**: 단순히 레이아웃을 만들기 위해서는 CSS Grid나 Flexbox를 사용하세요.\n * - **소량 데이터**: 2-3개의 간단한 정보는 리스트나 카드 형태가 더 적합할 수 있습니다.\n * - **복잡한 인터랙션**: 각 행마다 많은 버튼이나 입력이 필요하다면 카드 레이아웃을 고려하세요.\n *\n * ## Layout behavior\n *\n * - **Responsive**: 기본적으로 스크롤 가능한 컨테이너로 래핑되어 모바일에서도 사용 가능합니다.\n * - **Full Width**: 부모 컨테이너의 전체 너비를 차지합니다.\n * - **Auto Height**: 내용에 따라 높이가 자동으로 조정됩니다.\n *\n * ## Usage guidelines\n *\n * ### ✅ Do (권장 사항)\n *\n * - **명확한 헤더**: TableHead를 사용하여 각 열의 의미를 명확히 표시하세요.\n * - **일관된 정렬**: 숫자는 오른쪽, 텍스트는 왼쪽 정렬하는 것이 일반적입니다.\n * - **적절한 variant**: 데이터가 많을 때는 `striped`나 `hoverable`을 사용하여 가독성을 높이세요.\n * - **Caption 활용**: 테이블의 목적을 설명하는 caption을 추가하면 접근성이 향상됩니다.\n *\n * ### 🚫 Don't (주의/금지 사항)\n *\n * - **과도한 열**: 너무 많은 열은 가독성을 해칩니다. 중요한 정보만 표시하세요.\n * - **중첩 테이블**: 테이블 안에 테이블을 넣지 마세요. 복잡도가 급격히 증가합니다.\n * - **빈 셀 남용**: 빈 셀이 많으면 데이터 구조를 다시 검토하세요.\n *\n * ## Accessibility\n *\n * - **Semantic HTML**: 적절한 `<table>`, `<thead>`, `<tbody>`, `<th>`, `<td>` 태그를 사용합니다.\n * - **Scope Attribute**: TableHead는 `scope=\"col\"`을 자동으로 가집니다.\n * - **ARIA Attributes**: 정렬, 선택 등의 상태는 `aria-sort`, `aria-selected`로 표현됩니다.\n * - **Caption**: 테이블의 목적을 설명하는 `<caption>`을 사용할 수 있습니다.\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본 테이블 사용:\n *\n * ```tsx\n * <Table>\n * <TableCaption>사용자 목록</TableCaption>\n * <TableHeader>\n * <TableRow>\n * <TableHead>이름</TableHead>\n * <TableHead>이메일</TableHead>\n * <TableHead align=\"right\">역할</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * <TableRow>\n * <TableCell>홍길동</TableCell>\n * <TableCell>hong@example.com</TableCell>\n * <TableCell align=\"right\">관리자</TableCell>\n * </TableRow>\n * </TableBody>\n * </Table>\n * ```\n *\n * Striped 테이블:\n *\n * ```tsx\n * <Table striped hoverable>\n * <TableHeader>\n * <TableRow>\n * <TableHead>제품명</TableHead>\n * <TableHead align=\"right\">가격</TableHead>\n * </TableRow>\n * </TableHeader>\n * <TableBody>\n * {products.map((product) => (\n * <TableRow key={product.id}>\n * <TableCell>{product.name}</TableCell>\n * <TableCell align=\"right\">{product.price}</TableCell>\n * </TableRow>\n * ))}\n * </TableBody>\n * </Table>\n * ```\n * {@end-tool}\n */\n\nconst tableVariants = cva(cn(\"w-full caption-bottom text-sm [border-spacing:0]\"), {\n variants: {\n bordered: {\n true: \"\",\n false: \"\",\n },\n },\n defaultVariants: {\n bordered: false,\n },\n});\n\nexport interface TableProps\n extends React.TableHTMLAttributes<HTMLTableElement>,\n VariantProps<typeof tableVariants> {\n /** zebra stripe 패턴 적용 여부 */\n striped?: boolean;\n /** row hover 효과 적용 여부 */\n hoverable?: boolean;\n /** 테두리 표시 여부 */\n bordered?: boolean;\n /** 좁은 padding 적용 여부 */\n compact?: boolean;\n}\n\nexport const Table = React.forwardRef<HTMLTableElement, TableProps>(\n ({ className, striped, hoverable, bordered, compact, ...props }, ref) => (\n <div\n className={cn(\n \"relative w-full overflow-auto\",\n bordered && \"border border-cms-gray-300 rounded-lg\"\n )}\n >\n <table\n ref={ref}\n className={cn(tableVariants({ bordered }), className)}\n data-striped={striped}\n data-hoverable={hoverable}\n data-compact={compact}\n {...props}\n />\n </div>\n ),\n);\nTable.displayName = \"Table\";\n\n/* --------------------------------- TableHeader --------------------------------- */\n\nexport interface TableHeaderProps\n extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n TableHeaderProps\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={cn(\n \"[&_tr]:border-0\",\n \"[&_th:first-child]:rounded-tl-lg\",\n \"[&_th:last-child]:rounded-tr-lg\",\n className\n )}\n {...props}\n />\n));\nTableHeader.displayName = \"TableHeader\";\n\n/* --------------------------------- TableBody --------------------------------- */\n\nexport interface TableBodyProps\n extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n TableBodyProps\n>(({ className, ...props }, ref) => (\n <tbody\n ref={ref}\n className={cn(\"[&_tr:last-child]:border-0\", className)}\n {...props}\n />\n));\nTableBody.displayName = \"TableBody\";\n\n/* --------------------------------- TableFooter --------------------------------- */\n\nexport interface TableFooterProps\n extends React.HTMLAttributes<HTMLTableSectionElement> {}\n\nexport const TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n TableFooterProps\n>(({ className, ...props }, ref) => (\n <tfoot\n ref={ref}\n className={cn(\n \"border-t bg-cms-gray-50 font-medium [&>tr]:last:border-b-0\",\n className,\n )}\n {...props}\n />\n));\nTableFooter.displayName = \"TableFooter\";\n\n/* --------------------------------- TableRow --------------------------------- */\n\nconst tableRowVariants = cva(cn(\"border-b border-cms-gray-200\"), {\n variants: {\n hoverable: {\n true: \"hover:bg-cms-gray-100\",\n false: \"\",\n },\n selected: {\n true: \"bg-cms-primary-100\",\n false: \"\",\n },\n },\n defaultVariants: {\n hoverable: false,\n selected: false,\n },\n});\n\nexport interface TableRowProps\n extends React.HTMLAttributes<HTMLTableRowElement>,\n VariantProps<typeof tableRowVariants> {\n /** 선택된 행 표시 여부 */\n selected?: boolean;\n}\n\nexport const TableRow = React.forwardRef<HTMLTableRowElement, TableRowProps>(\n ({ className, selected, ...props }, ref) => {\n const table = (ref as any)?.current?.closest(\"table\");\n const hoverable = table?.dataset?.hoverable === \"true\";\n const striped = table?.dataset?.striped === \"true\";\n\n return (\n <tr\n ref={ref}\n className={cn(\n tableRowVariants({ hoverable, selected }),\n striped && \"even:bg-cms-gray-50\",\n className,\n )}\n aria-selected={selected}\n {...props}\n />\n );\n },\n);\nTableRow.displayName = \"TableRow\";\n\n/* --------------------------------- TableHead --------------------------------- */\n\nexport interface TableHeadProps\n extends React.ThHTMLAttributes<HTMLTableCellElement> {\n /** 정렬 가능 여부 */\n sortable?: boolean;\n /** 정렬 방향 */\n sortDirection?: \"asc\" | \"desc\" | null;\n /** 정렬 클릭 핸들러 */\n onSort?: () => void;\n}\n\nexport const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(\n (\n {\n className,\n children,\n sortable,\n sortDirection,\n onSort,\n scope = \"col\",\n ...props\n },\n ref,\n ) => {\n const getSortIcon = () => {\n if (!sortable) return null;\n if (sortDirection === \"asc\") return <ChevronUp className=\"ml-2 h-4 w-4\" />;\n if (sortDirection === \"desc\")\n return <ChevronDown className=\"ml-2 h-4 w-4\" />;\n return <ChevronsUpDown className=\"ml-2 h-4 w-4 opacity-50\" />;\n };\n\n const content = (\n <>\n {children}\n {getSortIcon()}\n </>\n );\n\n return (\n <th\n ref={ref}\n scope={scope}\n className={cn(\n \"h-12 px-4 text-left align-middle font-semibold text-cms-gray-800\",\n \"bg-amber-50 border-0\",\n \"[&:has([role=checkbox])]:pr-0\",\n sortable && \"cursor-pointer select-none hover:bg-amber-100\",\n className,\n )}\n onClick={sortable ? onSort : undefined}\n aria-sort={\n sortDirection === \"asc\"\n ? \"ascending\"\n : sortDirection === \"desc\"\n ? \"descending\"\n : undefined\n }\n {...props}\n >\n {sortable ? (\n <div className=\"flex items-center\">{content}</div>\n ) : (\n content\n )}\n </th>\n );\n },\n);\nTableHead.displayName = \"TableHead\";\n\n/* --------------------------------- TableCell --------------------------------- */\n\nconst tableCellVariants = cva(cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\"), {\n variants: {\n align: {\n left: \"text-left\",\n center: \"text-center\",\n right: \"text-right\",\n },\n },\n defaultVariants: {\n align: \"left\",\n },\n});\n\nexport interface TableCellProps\n extends React.TdHTMLAttributes<HTMLTableCellElement>,\n VariantProps<typeof tableCellVariants> {\n /** 텍스트 정렬 방식 */\n align?: \"left\" | \"center\" | \"right\";\n}\n\nexport const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(\n ({ className, align, ...props }, ref) => {\n const table = (ref as any)?.current?.closest(\"table\");\n const compact = table?.dataset?.compact === \"true\";\n\n return (\n <td\n ref={ref}\n className={cn(\n tableCellVariants({ align }),\n compact && \"p-2\",\n className,\n )}\n {...props}\n />\n );\n },\n);\nTableCell.displayName = \"TableCell\";\n\n/* --------------------------------- TableCaption --------------------------------- */\n\nexport interface TableCaptionProps\n extends React.HTMLAttributes<HTMLTableCaptionElement> {}\n\nexport const TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n TableCaptionProps\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={cn(\"mt-4 text-sm text-cms-gray-600\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n","import { cn } from \"@/utils/cn\";\nimport { useCallback, useState } from \"react\";\nimport { useDropzone, Accept } from \"react-dropzone\";\nimport { ImageUploadIcon, XIcon as CloseIcon } from \"../icons\";\n\nexport interface ImageMetadata {\n width: number;\n height: number;\n aspectRatio: number;\n size: number;\n}\n\nexport interface ImageUploadProps {\n value?: File[];\n onChange?: (files: File[]) => void;\n maxFiles?: number;\n maxSize?: number;\n accept?: Accept;\n disabled?: boolean;\n className?: string;\n showPreview?: boolean;\n error?: boolean;\n onError?: (error: string) => void;\n validateImage?: (file: File, metadata: ImageMetadata) => string | null | Promise<string | null>;\n placeholder?: string;\n placeholderActive?: string;\n}\n\n/**\n * 드래그 앤 드롭 및 클릭을 통해 이미지를 업로드할 수 있는 컴포넌트입니다.\n *\n * {@link ImageUpload}는 사용자가 이미지 파일을 선택하고 업로드할 수 있게 합니다.\n * 드래그 앤 드롭, 클릭하여 선택, 미리보기 등의 기능을 제공합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **프로필 이미지 업로드**: 사용자 프로필 사진 등록 시\n * - **상품 이미지 등록**: 여러 상품 이미지를 한 번에 업로드해야 할 때\n * - **문서 첨부**: 이미지 형태의 문서나 스크린샷을 첨부할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **일반 파일 업로드**: 이미지가 아닌 다양한 형식의 파일을 업로드할 때는 일반 FileUpload 컴포넌트 사용\n * - **대용량 파일**: 매우 큰 파일의 경우 진행률 표시가 있는 별도 업로드 컴포넌트 고려\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본 이미지 업로드:\n *\n * ```tsx\n * <ImageUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={1}\n * maxSize={5 * 1024 * 1024} // 5MB\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 다중 이미지 업로드:\n *\n * ```tsx\n * <ImageUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={5}\n * showPreview={true}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 최소 이미지 크기 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * if (metadata.width < 800 || metadata.height < 600) {\n * return \"이미지는 최소 800x600 이상이어야 합니다.\";\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 정확한 이미지 크기 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * if (metadata.width !== 1920 || metadata.height !== 1080) {\n * return `이미지는 정확히 1920x1080이어야 합니다. (현재: ${metadata.width}x${metadata.height})`;\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 이미지 비율 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * const targetRatio = 16 / 9;\n * const tolerance = 0.1;\n * if (Math.abs(metadata.aspectRatio - targetRatio) > tolerance) {\n * return \"이미지 비율은 16:9여야 합니다.\";\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 복합 검증:\n *\n * ```tsx\n * <ImageUpload\n * validateImage={(file, metadata) => {\n * if (metadata.width > 4000) {\n * return \"이미지 너비는 4000px를 초과할 수 없습니다.\";\n * }\n * if (metadata.aspectRatio < 1) {\n * return \"세로 이미지는 업로드할 수 없습니다.\";\n * }\n * if (metadata.size > 2 * 1024 * 1024) {\n * return \"파일 크기는 2MB를 초과할 수 없습니다.\";\n * }\n * return null;\n * }}\n * onError={(error) => alert(error)}\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 커스텀 안내 문구:\n *\n * ```tsx\n * <ImageUpload\n * placeholder=\"상품 이미지를 업로드하세요\"\n * placeholderActive=\"이미지를 드롭하세요\"\n * onChange={(files) => console.log(files)}\n * />\n * ```\n * {@end-tool}\n */\nexport const ImageUpload = ({\n value = [],\n onChange,\n maxFiles = 1,\n maxSize = 5 * 1024 * 1024, // 5MB\n accept = { \"image/*\": [\".png\", \".jpg\", \".jpeg\", \".gif\", \".webp\"] },\n disabled = false,\n className,\n showPreview = true,\n error = false,\n onError,\n validateImage,\n placeholder = \"클릭하거나 파일을 드래그하세요\",\n placeholderActive = \"파일을 여기에 놓으세요\",\n}: ImageUploadProps) => {\n const [files, setFiles] = useState<File[]>(value);\n\n const loadImageMetadata = (file: File): Promise<ImageMetadata> => {\n return new Promise((resolve, reject) => {\n const img = new Image();\n const url = URL.createObjectURL(file);\n\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve({\n width: img.width,\n height: img.height,\n aspectRatio: img.width / img.height,\n size: file.size,\n });\n };\n\n img.onerror = () => {\n URL.revokeObjectURL(url);\n reject(new Error(\"이미지를 로드할 수 없습니다.\"));\n };\n\n img.src = url;\n });\n };\n\n const onDrop = useCallback(\n async (acceptedFiles: File[], rejectedFiles: any[]) => {\n if (rejectedFiles.length > 0) {\n const error = rejectedFiles[0].errors[0];\n if (error.code === \"file-too-large\") {\n onError?.(`파일 크기는 ${maxSize / 1024 / 1024}MB를 초과할 수 없습니다.`);\n } else if (error.code === \"file-invalid-type\") {\n onError?.(\"지원하지 않는 파일 형식입니다.\");\n } else if (error.code === \"too-many-files\") {\n onError?.(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`);\n }\n return;\n }\n\n // 커스텀 검증 로직 실행\n if (validateImage) {\n const validatedFiles: File[] = [];\n\n for (const file of acceptedFiles) {\n try {\n const metadata = await loadImageMetadata(file);\n const validationError = await validateImage(file, metadata);\n\n if (validationError) {\n onError?.(validationError);\n continue;\n }\n\n validatedFiles.push(file);\n } catch (error) {\n onError?.((error as Error).message);\n }\n }\n\n if (validatedFiles.length === 0) return;\n\n const newFiles = maxFiles === 1 ? validatedFiles : [...files, ...validatedFiles].slice(0, maxFiles);\n setFiles(newFiles);\n onChange?.(newFiles);\n } else {\n const newFiles = maxFiles === 1 ? acceptedFiles : [...files, ...acceptedFiles].slice(0, maxFiles);\n setFiles(newFiles);\n onChange?.(newFiles);\n }\n },\n [files, maxFiles, maxSize, onChange, onError, validateImage]\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept,\n maxSize,\n maxFiles,\n disabled,\n multiple: maxFiles > 1,\n });\n\n const removeFile = (index: number) => {\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onChange?.(newFiles);\n };\n\n const isSingleMode = maxFiles === 1;\n const hasFile = files.length > 0;\n const isMaxReached = files.length >= maxFiles;\n\n return (\n <div className={cn(\"w-full\", className)}>\n {!(!isSingleMode && isMaxReached) && (\n <div\n {...getRootProps()}\n className={cn(\n \"relative rounded-md border-2 border-solid\",\n \"transition-colors cursor-pointer\",\n \"flex flex-col items-center justify-center\",\n \"min-h-[200px]\",\n error\n ? \"border-red-500\"\n : isDragActive\n ? \"border-cms-black bg-cms-gray-100\"\n : \"border-cms-gray-300 bg-white hover:bg-cms-gray-50\",\n disabled && \"opacity-50 cursor-not-allowed pointer-events-none\",\n isSingleMode && hasFile && \"p-0\"\n )}\n >\n <input {...getInputProps()} />\n\n {isSingleMode && hasFile && showPreview ? (\n <div className=\"relative w-full h-full min-h-[200px] group flex items-center justify-center bg-cms-gray-100 rounded-md overflow-hidden\">\n <img\n src={URL.createObjectURL(files[0])}\n alt={files[0].name}\n className=\"max-w-full max-h-full object-contain\"\n />\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(0);\n }}\n className={cn(\n \"absolute top-2 right-2\",\n \"w-8 h-8 rounded-full\",\n \"flex items-center justify-center\",\n \"bg-white shadow-md\",\n \"hover:bg-cms-gray-100\",\n \"cursor-pointer\",\n \"border-none\"\n )}\n aria-label=\"파일 제거\"\n >\n <CloseIcon className=\"w-4 h-4\" />\n </button>\n </div>\n ) : (\n <div className=\"p-6 flex flex-col items-center\">\n <ImageUploadIcon className=\"text-cms-gray-400\" />\n <p className=\"mt-4 text-sm font-medium text-cms-black text-center\">\n {isDragActive ? placeholderActive : placeholder}\n </p>\n <p className=\"mt-1 text-xs text-cms-gray-400 text-center\">\n {maxFiles > 1 ? `최대 ${maxFiles}개` : \"1개\"} 파일, 최대{\" \"}\n {maxSize / 1024 / 1024}MB\n </p>\n </div>\n )}\n </div>\n )}\n\n {!isSingleMode && showPreview && files.length > 0 && (\n <div className=\"mt-4 grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 justify-items-center\">\n {files.map((file, index) => (\n <div\n key={index}\n className=\"relative group rounded-md overflow-hidden border border-cms-gray-300\"\n >\n <div className=\"aspect-square bg-cms-gray-100\">\n <img\n src={URL.createObjectURL(file)}\n alt={file.name}\n className=\"w-full h-full object-cover\"\n />\n </div>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n removeFile(index);\n }}\n className={cn(\n \"absolute top-2 right-2\",\n \"w-7 h-7 rounded-full\",\n \"flex items-center justify-center\",\n \"bg-white shadow-md\",\n \"hover:bg-cms-gray-100\",\n \"cursor-pointer\",\n \"border-none\"\n )}\n aria-label=\"파일 제거\"\n >\n <CloseIcon className=\"w-3 h-3\" />\n </button>\n <div className=\"px-2 py-1.5 bg-white border-t border-cms-gray-300\">\n <p className=\"text-xs text-cms-gray-600 truncate\">{file.name}</p>\n <p className=\"text-xs text-cms-gray-400\">\n {(file.size / 1024).toFixed(1)} KB\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nImageUpload.displayName = \"ImageUpload\";\n","import { cn } from \"@/utils/cn\";\nimport { useCallback, useState } from \"react\";\nimport { useDropzone, Accept } from \"react-dropzone\";\nimport { FileUploadIcon, FileIcon, XIcon as CloseIcon } from \"../icons\";\n\nexport interface FileUploadProps {\n value?: File[];\n onChange?: (files: File[]) => void;\n maxFiles?: number;\n maxSize?: number;\n accept?: Accept;\n disabled?: boolean;\n className?: string;\n onError?: (error: string) => void;\n}\n\n/**\n * 드래그 앤 드롭 및 클릭을 통해 파일을 업로드할 수 있는 컴포넌트입니다.\n *\n * {@link FileUpload}는 사용자가 다양한 형식의 파일을 선택하고 업로드할 수 있게 합니다.\n * 드래그 앤 드롭, 클릭하여 선택, 파일 목록 표시 등의 기능을 제공합니다.\n *\n * ## When (언제 사용해야 하는가)\n *\n * **사용해야 하는 경우:**\n * - **문서 첨부**: PDF, Word, Excel 등의 문서 파일을 업로드할 때\n * - **다양한 파일 형식**: 이미지뿐만 아니라 여러 종류의 파일을 업로드할 때\n * - **파일 목록 관리**: 업로드된 파일의 이름과 크기를 확인해야 할 때\n *\n * **사용하지 말아야 하는 경우:**\n * - **이미지 전용**: 이미지만 업로드하고 미리보기가 필요한 경우는 {@link ImageUpload} 사용\n *\n * ## Example\n *\n * {@tool snippet}\n * 기본 파일 업로드:\n *\n * ```tsx\n * <FileUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={1}\n * maxSize={10 * 1024 * 1024} // 10MB\n * />\n * ```\n * {@end-tool}\n *\n * {@tool snippet}\n * 다중 파일 업로드 (PDF만):\n *\n * ```tsx\n * <FileUpload\n * onChange={(files) => console.log(files)}\n * maxFiles={5}\n * accept={{ \"application/pdf\": [\".pdf\"] }}\n * />\n * ```\n * {@end-tool}\n */\nexport const FileUpload = ({\n value = [],\n onChange,\n maxFiles = 5,\n maxSize = 10 * 1024 * 1024, // 10MB\n accept,\n disabled = false,\n className,\n onError,\n}: FileUploadProps) => {\n const [files, setFiles] = useState<File[]>(value);\n\n const onDrop = useCallback(\n (acceptedFiles: File[], rejectedFiles: any[]) => {\n if (rejectedFiles.length > 0) {\n const error = rejectedFiles[0].errors[0];\n if (error.code === \"file-too-large\") {\n onError?.(\n `파일 크기는 ${maxSize / 1024 / 1024}MB를 초과할 수 없습니다.`,\n );\n } else if (error.code === \"file-invalid-type\") {\n onError?.(\"지원하지 않는 파일 형식입니다.\");\n } else if (error.code === \"too-many-files\") {\n onError?.(`최대 ${maxFiles}개의 파일만 업로드할 수 있습니다.`);\n }\n return;\n }\n\n const newFiles = [...files, ...acceptedFiles].slice(0, maxFiles);\n setFiles(newFiles);\n onChange?.(newFiles);\n },\n [files, maxFiles, maxSize, onChange, onError],\n );\n\n const { getRootProps, getInputProps, isDragActive } = useDropzone({\n onDrop,\n accept,\n maxSize,\n maxFiles,\n disabled,\n multiple: maxFiles > 1,\n });\n\n const removeFile = (index: number) => {\n const newFiles = files.filter((_, i) => i !== index);\n setFiles(newFiles);\n onChange?.(newFiles);\n };\n\n const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n };\n\n const isMaxReached = files.length >= maxFiles;\n\n return (\n <div className={cn(\"w-full\", className)}>\n {!isMaxReached && (\n <div\n {...getRootProps()}\n className={cn(\n \"relative rounded-md border-2 border-dashed\",\n \"transition-colors cursor-pointer\",\n \"flex flex-col items-center justify-center\",\n \"min-h-[200px] p-6\",\n isDragActive\n ? \"border-cms-black bg-cms-gray-100\"\n : \"border-cms-gray-300 bg-white hover:bg-cms-gray-50\",\n disabled && \"opacity-50 cursor-not-allowed pointer-events-none\",\n )}\n >\n <input {...getInputProps()} />\n <FileUploadIcon className=\"text-cms-gray-400\" />\n <p className=\"mt-4 text-sm font-medium text-cms-black text-center\">\n {isDragActive\n ? \"파일을 여기에 놓으세요\"\n : \"클릭하거나 파일을 드래그하세요\"}\n </p>\n <p className=\"mt-1 text-xs text-cms-gray-400 text-center\">\n 최대 {maxFiles}개 파일, 최대 {maxSize / 1024 / 1024}MB\n </p>\n </div>\n )}\n\n {files.length > 0 && (\n <div className={cn(\"space-y-1.5\", isMaxReached ? \"\" : \"mt-4\")}>\n {files.map((file, index) => (\n <div\n key={index}\n className={cn(\n \"flex items-center gap-2 px-3 py-2\",\n \"rounded-md border border-cms-gray-300\",\n \"bg-white hover:bg-cms-gray-50\",\n \"transition-colors group\",\n )}\n >\n <FileIcon className=\"w-8 h-8\" />\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-cms-black truncate leading-tight\">\n {file.name}\n </p>\n <p className=\"text-xs text-cms-gray-400 leading-tight\">\n {formatFileSize(file.size)}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={() => removeFile(index)}\n className={cn(\n \"w-7 h-7 rounded-full shrink-0\",\n \"flex items-center justify-center\",\n \"text-cms-gray-400\",\n \"hover:bg-cms-gray-100 hover:text-cms-black\",\n \"transition-colors\",\n \"border-none\",\n )}\n aria-label=\"파일 제거\"\n >\n <CloseIcon className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nFileUpload.displayName = \"FileUpload\";\n"],"names":["cn","inputs","twMerge","clsx","buttonVariants","cva","Button","forwardRef","className","variant","size","props","ref","jsx","sizeClasses","LoadingCircle","DEFAULT_SIZE","DEFAULT_STROKE_WIDTH","IconWrapper","React","children","strokeWidth","viewBox","ChevronDownIcon","ChevronDownFillIcon","ChevronUpIcon","ChevronUpFillIcon","ChevronLeftIcon","ChevronLeftFillIcon","ChevronRightIcon","ChevronRightFillIcon","ChevronsLeftIcon","ChevronsRightIcon","ArrowLeftIcon","ArrowRightIcon","MenuIcon","AlignIcon","MessageSquareIcon","MessageSquareTextIcon","MessageCircleIcon","XIcon","CheckIcon","CheckCircleIcon","InfoIcon","ErrorIcon","WarningIcon","HelpIcon","CloseIcon","PlusIcon","PlusCircleIcon","TrashIcon","SaveIcon","SettingsIcon","RefreshIcon","LinkIcon","PinIcon","FileIcon","FileTextIcon","ExcelIcon","FileUploadIcon","ImageUploadIcon","CalendarIcon","MedicashIcon","jsxs","NewBadgeIcon","dropdownTriggerVariants","Dropdown","options","value","placeholder","onValueChange","disabled","dropdownClassName","searchable","clearable","multiple","maxHeight","isOpen","setIsOpen","useState","searchTerm","setSearchTerm","selectedValues","setSelectedValues","dropdownRef","useRef","searchInputRef","selectedOption","option","selectedLabel","filteredOptions","handleToggle","handleOptionClick","newSelectedValues","v","handleClear","e","handleKeyDown","useEffect","handleClickOutside","event","ClearIcon","isSelected","Select","label","helperText","error","required","Combobox","loading","createable","onCreateOption","hasExactMatch","optionsWithCreate","createValue","_a","Popover","PopoverPrimitive","PopoverTrigger","PopoverContent","align","sideOffset","popoverMenuItemVariants","PopoverMenuItem","icon","textVariants","Text","decoration","Component","textInputVariants","labelVariants","errorMessageVariants","helperTextVariants","TextInput","fullWidth","errorMessage","showCharCount","maxLength","defaultValue","onChange","id","labelLayout","labelWidth","internalValue","setInternalValue","inputId","finalVariant","currentValue","charCount","handleChange","hasHeader","isHorizontal","Fragment","buildFormatLongFn","args","width","buildLocalizeFn","context","valuesArray","defaultWidth","index","buildMatchFn","string","matchPattern","matchResult","matchedString","parsePatterns","key","findIndex","pattern","findKey","rest","object","predicate","array","buildMatchPatternFn","parseResult","millisecondsInWeek","millisecondsInDay","constructFromSymbol","constructFrom","date","normalizeDates","dates","normalize","defaultOptions","getDefaultOptions","toDate","argument","startOfWeek","weekStartsOn","_b","_d","_c","_date","day","diff","formatDistanceLocale","formatDistance","token","count","result","tokenValue","formatRelativeLocale","formatRelative","_baseDate","_options","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","localize","dirtyNumber","number","rem100","quarter","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","dateFormats","timeFormats","dateTimeFormats","formatLong","enUS","ko","tzName","timeZone","format","offsetFormatCache","offsetCache","tzOffset","offsetStr","calcOffset","captures","offsetRe","cacheStr","values","hours","minutes","seconds","TZDateMini","adjustToSystemTZ","syncToInternal","tz","offset","time","re","method","utcMethod","syncFromInternal","baseOffset","prevHour","systemOffset","prevHourSystemOffset","systemDSTChange","dstShift","offsetDiff","systemDate","systemSecondsOffset","secondsOffset","postBaseOffset","postOffset","postOffsetDiff","offsetChanged","postDiff","newBaseOffset","newOffset","offsetChange","TZDate","sign","month","year","locales","addDays","amount","addMonths","dayOfMonth","endOfDesiredMonth","daysInMonth","startOfISOWeek","getISOWeekYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","getTimezoneOffsetInMilliseconds","utcDate","startOfDay","differenceInCalendarDays","laterDate","earlierDate","laterDate_","earlierDate_","laterStartOfDay","earlierStartOfDay","laterTimestamp","earlierTimestamp","startOfISOWeekYear","fourthOfJanuary","addWeeks","addYears","max","date_","min","isSameDay","dateLeft_","dateRight_","isDate","isValid","differenceInCalendarMonths","yearsDiff","monthsDiff","endOfMonth","normalizeInterval","interval","start","end","eachMonthOfInterval","reversed","endTime","step","startOfMonth","endOfYear","startOfYear","eachYearOfInterval","endOfWeek","endOfISOWeek","getDayOfYear","getISOWeek","getWeekYear","firstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","startOfWeekYear","firstWeek","getWeek","addLeadingZeros","targetLength","output","lightFormatters","signedYear","dayPeriodEnumValue","numberOfDigits","milliseconds","fractionalSeconds","dayPeriodEnum","formatters","era","signedWeekYear","weekYear","twoDigitYear","isoWeekYear","week","isoWeek","dayOfYear","dayOfWeek","localDayOfWeek","isoDayOfWeek","_localize","timezoneOffset","formatTimezoneWithOptionalMinutes","formatTimezone","formatTimezoneShort","timestamp","delimiter","absOffset","dateLongFormatter","timeLongFormatter","longFormatters","datePattern","timePattern","dateTimeFormat","dayOfYearTokenRE","weekYearTokenRE","throwTokens","isProtectedDayOfYearToken","isProtectedWeekYearToken","warnOrThrowProtectedError","input","_message","message","subject","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","formatStr","locale","defaultLocale","_f","_e","_h","_g","originalDate","parts","substring","firstCharacter","longFormatter","cleanEscapedString","formatterOptions","part","formatter","matched","getDaysInMonth","monthIndex","lastDayOfMonth","getMonth","getYear","isAfter","dateToCompare","isBefore","isSameMonth","isSameYear","setMonth","midMonth","setYear","FIVE_WEEKS","FOUR_WEEKS","getBroadcastWeeksInMonth","dateLib","firstDayOfMonth","firstDayOfWeek","broadcastStartDate","lastDateOfLastWeek","startOfBroadcastWeek","firstOfMonth","endOfBroadcastWeek","startDate","numberOfWeeks","dateFnsEnUS","modifiers","formatDate","d","weekNumber","DateLib","overrides","dateLeft","dateRight","years","uniqueYears","yearsArray","y","formatted","_dateLib","numerals","digitMap","i","digit","code","localeCode","dateFnsKo","DatePicker","internalDate","setInternalDate","dayjs","selected","useMemo","handleDayClick","selectedDate","handleApply","handleCancel","displayValue","disabledDays","DayPicker","getQuickSelectOptions","now","DateRangePicker","startLabel","endLabel","internalRange","setInternalRange","fromDay","toDay","handleQuickSelect","range","from","to","numberOfDays","TimePicker","minuteStep","showIcon","selectedHour","setSelectedHour","selectedMinute","setSelectedMinute","selectedPeriod","setSelectedPeriod","hourScrollRef","minuteScrollRef","timeRegex24h","timeRegex12h","hour","period","_","formattedMinute","hourButton","minuteButton","Clock","minute","switchVariants","Switch","SwitchPrimitives","RadioGroup","RadioGroupPrimitives","radioGroupItemVariants","radioGroupIndicatorVariants","RadioGroupItem","NavigationMenuItem","menu","selectedUrl","onMenuClick","isSubMenuSelected","sub","Accordion","ChevronDown","subItem","subSelected","SideNavigation","title","menus","headerSlot","openedMenus","setOpenedMenus","paginationButtonVariants","usePagination","currentPage","totalPages","siblingCount","leftSiblingIndex","rightSiblingIndex","shouldShowLeftEllipsis","shouldShowRightEllipsis","Pagination","onPageChange","showPrevNext","pages","handlePrevious","handleNext","handlePageClick","page","ChevronLeft","isActive","ChevronRight","Checkbox","checkboxId","CheckboxPrimitive","Check","Modal","open","onOpenChange","footer","showCloseButton","DialogPrimitive","X","ConfirmModal","confirmText","onConfirm","handleConfirm","CheckCircle2","DeleteModal","cancelText","onCancel","AlertTriangle","ErrorModal","XCircle","WarningModal","SuccessModal","Toaster","position","Sonner","ToolTip","content","side","delayDuration","skipDelayDuration","disableHoverableContent","showArrow","defaultOpen","TooltipPrimitive","tableVariants","Table","striped","hoverable","bordered","compact","TableHeader","TableBody","TableFooter","tableRowVariants","TableRow","table","TableHead","sortable","sortDirection","onSort","scope","getSortIcon","ChevronUp","ChevronsUpDown","tableCellVariants","TableCell","TableCaption","ImageUpload","maxFiles","maxSize","accept","showPreview","onError","validateImage","placeholderActive","files","setFiles","loadImageMetadata","file","resolve","reject","img","url","onDrop","useCallback","acceptedFiles","rejectedFiles","validatedFiles","metadata","validationError","newFiles","getRootProps","getInputProps","isDragActive","useDropzone","removeFile","isSingleMode","hasFile","isMaxReached","FileUpload","formatFileSize","bytes"],"mappings":"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","x_google_ignoreList":[11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87]}
|