@krds.ui/vue 0.0.9 → 0.0.11
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/krds-vue.es.js +1120 -921
- package/dist/krds-vue.es.js.map +1 -1
- package/dist/krds-vue.umd.js +1 -1
- package/dist/krds-vue.umd.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/index.d.ts +132 -0
- package/package.json +22 -23
package/dist/krds-vue.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"krds-vue.es.js","sources":["../src/components/KrdsButton/KrdsButton.ts","../src/components/KrdsButtonGroup/KrdsButtonGroup.ts","../src/components/KrdsIcon/KrdsIcon.ts","../src/components/KrdsLink/KrdsLink.ts","../src/components/KrdsSpinner/KrdsSpinner.ts","../src/components/KrdsInput/KrdsInput.ts","../src/components/KrdsFormLabel/KrdsFormLabel.ts","../src/components/KrdsFormHint/KrdsFormHint.ts","../src/components/KrdsFormGroup/KrdsFormGroup.ts","../src/composables/useDatePicker.ts","../src/composables/useClickOutside.ts","../src/components/KrdsDateInput/KrdsDateInput.vue","../src/components/KrdsTextarea/KrdsTextarea.ts","../src/components/KrdsSelect/KrdsSelect.ts","../src/components/KrdsFileUpload/KrdsFileUpload.ts","../src/components/KrdsBadge/KrdsBadge.ts","../src/components/KrdsTag/KrdsTag.ts","../src/components/KrdsTagGroup/KrdsTagGroup.ts","../src/components/KrdsMasthead/KrdsMasthead.ts","../src/utils/index.ts","../src/components/KrdsToggleSwitch/KrdsToggleSwitch.ts","../src/components/KrdsCheckArea/KrdsCheckArea.ts","../src/components/KrdsCheckbox/KrdsCheckbox.ts","../src/components/KrdsRadio/KrdsRadio.ts","../src/components/KrdsStepIndicator/KrdsStepIndicator.ts","../src/components/KrdsStep/KrdsStep.ts","../src/components/KrdsSkipLink/KrdsSkipLink.ts","../src/components/KrdsBreadcrumb/KrdsBreadcrumb.vue","../src/components/KrdsInPageNavigation/KrdsInPageNavigation.ts","../src/components/KrdsPagination/KrdsPagination.vue","../src/components/KrdsPanel/KrdsPanel.vue","../src/components/KrdsContextualHelp/KrdsContextualHelp.vue","../src/components/KrdsCoachMark/KrdsCoachMark.vue","../src/components/KrdsTooltip/KrdsTooltip.vue","../src/components/KrdsLanguageSwitcher/KrdsLanguageSwitcher.vue","../src/components/KrdsResize/KrdsResize.vue","../src/directives/vSrOnly.ts","../src/directives/index.ts","../src/index.ts"],"sourcesContent":["import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps, Size, Variant } from '@/types'\n\n/**\n * KRDS Button 컴포넌트 속성\n */\nexport interface KrdsButtonProps extends BaseComponentProps {\n /** 버튼 타입 */\n type?: 'button' | 'submit' | 'reset'\n /** 버튼 크기 */\n size?: Size\n /** 버튼 변형 */\n variant?: Variant\n /** 아이콘 전용 버튼 */\n icon?: boolean\n /** 테두리 스타일 (아이콘 버튼용) */\n border?: boolean\n /** Pure 버튼 여부 (가상클래스 상태 시 컬러 유지) */\n pure?: boolean\n /** 텍스트 버튼 스타일 */\n text?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * KRDS Button 컴포넌트 이벤트\n */\nexport interface KrdsButtonEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsButtonProps>({\n name: 'KrdsButton',\n props: {\n type: {\n type: String as () => 'button' | 'submit' | 'reset',\n default: 'button'\n },\n size: {\n type: String as () => Size,\n default: undefined\n },\n variant: {\n type: String as () => Variant,\n default: 'primary'\n },\n icon: {\n type: Boolean,\n default: false\n },\n border: {\n type: Boolean,\n default: false\n },\n pure: {\n type: Boolean,\n default: false\n },\n text: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 버튼 클래스 계산\n */\n const buttonClasses = computed(() => {\n const classes = ['krds-btn']\n\n // 아이콘 전용 클래스\n if (props.icon) {\n classes.push('icon')\n }\n\n // 테두리 클래스\n if (props.border) {\n classes.push('border')\n }\n\n // pure 클래스\n if (props.pure) {\n classes.push('pure')\n }\n\n // text 클래스\n if (props.text) {\n classes.push('text')\n }\n\n // 변형 클래스\n if (props.variant && !props.icon) {\n classes.push(props.variant)\n }\n\n // 크기 클래스 (KRDS 실제 규격: xsmall, small, medium, large, xlarge)\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n }\n\n return () =>\n h(\n 'button',\n {\n type: props.type,\n class: buttonClasses.value,\n disabled: props.disabled,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS ButtonGroup 컴포넌트 속성\n */\nexport type KrdsButtonGroupProps = BaseComponentProps\n\nexport default defineComponent<KrdsButtonGroupProps>({\n name: 'KrdsButtonGroup',\n props: {},\n setup(_, { slots }) {\n return () =>\n h(\n 'div',\n {\n class: 'btn-group'\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Icon 컴포넌트 속성\n */\nexport interface KrdsIconProps extends BaseComponentProps {\n /** 아이콘 이름 */\n name: string\n}\n\nexport default defineComponent<KrdsIconProps>({\n name: 'KrdsIcon',\n props: {\n name: {\n type: String,\n required: true\n },\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props) {\n return () =>\n h('i', {\n class: ['svg-icon', props.name, props.class].filter(Boolean).join(' ')\n })\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Link 크기 타입 (링크는 small, medium, large만 지원)\n */\nexport type KrdsLinkSize = 'small' | 'medium' | 'large'\n\n/**\n * KRDS Link 컴포넌트 속성\n */\nexport interface KrdsLinkProps extends BaseComponentProps {\n /** 링크 URL */\n href?: string\n /** 링크 대상 (_blank, _self 등) */\n target?: '_blank' | '_self' | '_parent' | '_top' | string\n /** 링크 제목 (접근성) */\n title?: string\n /** 링크 크기 */\n size?: KrdsLinkSize\n /** Link 클래스 적용 여부 */\n link?: boolean\n /** Basic 링크 여부 (본문 텍스트 컬러) */\n basic?: boolean\n /** Pure 링크 여부 (가상클래스 상태 시 컬러 유지) */\n pure?: boolean\n}\n\n/**\n * KRDS Link 컴포넌트 이벤트\n */\nexport interface KrdsLinkEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsLinkProps>({\n name: 'KrdsLink',\n props: {\n href: {\n type: String,\n default: '#!'\n },\n target: {\n type: String as () => '_blank' | '_self' | '_parent' | '_top' | string,\n default: undefined\n },\n title: {\n type: String,\n default: undefined\n },\n size: {\n type: String as () => KrdsLinkSize,\n default: undefined\n },\n link: {\n type: Boolean,\n default: true\n },\n basic: {\n type: Boolean,\n default: false\n },\n pure: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 링크 클래스 계산\n */\n const linkClasses = computed(() => {\n const classes = ['krds-btn']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // link prop이 true일 때 'link' 클래스 추가\n if (props.link) {\n classes.push('link')\n }\n\n // basic prop이 true일 때 basic 클래스 추가\n if (props.basic) {\n classes.push('basic')\n }\n\n // pure 링크일 때 pure 클래스 추가\n if (props.pure) {\n classes.push('pure')\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 링크 속성 계산\n */\n const linkAttributes = computed(() => {\n const attrs: Record<string, unknown> = {\n href: props.href,\n class: linkClasses.value\n }\n\n if (props.target) {\n attrs.target = props.target\n }\n\n if (props.title) {\n attrs.title = props.title\n }\n\n if (props.target === '_blank') {\n // 보안상 _blank 링크에는 기본적으로 noopener noreferrer 적용\n attrs.rel = 'noopener noreferrer'\n }\n\n return attrs\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h(\n 'a',\n {\n ...linkAttributes.value,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { h, defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'KrdsSpinner',\n props: {\n label: {\n type: String,\n default: undefined\n }\n },\n render() {\n const children = [h('span', { class: 'sr-only' }, '로딩 중')]\n\n if (this.label) {\n children.push(h('span', this.label))\n }\n\n return h('div', { class: 'krds-spinner', role: 'status' }, children)\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseFormProps, Size, InputType } from '@/types'\nimport KrdsSpinner from '@/components/KrdsSpinner/KrdsSpinner'\n\n/**\n * KRDS Input 컴포넌트 속성\n */\nexport interface KrdsInputProps extends BaseFormProps {\n /** 입력값 */\n modelValue?: string | number\n /** 입력 타입 */\n type?: InputType\n /** 입력 크기 */\n size?: Size\n /** 플레이스홀더 */\n placeholder?: string\n /** 최대 글자 수 */\n maxlength?: number\n /** 최소 글자 수 */\n minlength?: number\n /** 최대값 (number 타입용) */\n max?: number\n /** 최소값 (number 타입용) */\n min?: number\n /** 단계값 (number 타입용) */\n step?: number\n /** 자동완성 */\n autocomplete?: string\n /** 자동 포커스 */\n autofocus?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 입력 상태 */\n state?: 'default' | 'error' | 'success' | 'information'\n /** 아이콘 (있을 때 btn-ico-wrap 클래스 적용) */\n icon?: boolean\n /** 로딩 상태 */\n loading?: boolean\n}\n\n/**\n * KRDS Input 컴포넌트 이벤트\n */\nexport interface KrdsInputEmits {\n (e: 'update:modelValue', value: string | number): void\n (e: 'input', event: Event): void\n (e: 'change', event: Event): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n (e: 'keydown', event: KeyboardEvent): void\n (e: 'keyup', event: KeyboardEvent): void\n}\n\nexport default defineComponent<KrdsInputProps>({\n name: 'KrdsInput',\n props: {\n modelValue: {\n type: [String, Number],\n default: undefined\n },\n type: {\n type: String as () => InputType,\n default: 'text'\n },\n size: {\n type: String as () => Size,\n default: undefined\n },\n placeholder: {\n type: String,\n default: undefined\n },\n maxlength: {\n type: Number,\n default: undefined\n },\n minlength: {\n type: Number,\n default: undefined\n },\n max: {\n type: Number,\n default: undefined\n },\n min: {\n type: Number,\n default: undefined\n },\n step: {\n type: Number,\n default: undefined\n },\n autocomplete: {\n type: String,\n default: undefined\n },\n autofocus: {\n type: Boolean,\n default: false\n },\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n error: {\n type: String,\n default: undefined\n },\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n icon: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'input', 'change', 'focus', 'blur', 'keydown', 'keyup'],\n setup(props, { emit, slots }) {\n /**\n * 입력 필드 클래스 계산\n */\n const inputClasses = computed(() => {\n const classes = ['krds-input']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 입력 이벤트 핸들러\n */\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n const value = props.type === 'number' ? Number(target.value) : target.value\n emit('update:modelValue', value)\n emit('input', event)\n }\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n emit('change', event)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n\n /**\n * 키다운 이벤트 핸들러\n */\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event)\n }\n\n /**\n * 키업 이벤트 핸들러\n */\n const handleKeyup = (event: KeyboardEvent) => {\n emit('keyup', event)\n }\n\n /**\n * 입력 필드 속성 계산\n */\n const inputProps = computed(() => {\n const attrs: Record<string, unknown> = {\n type: props.type,\n class: inputClasses.value,\n value: props.modelValue,\n placeholder: props.placeholder,\n name: props.name,\n id: props.id,\n required: props.required,\n readonly: props.readonly,\n disabled: props.disabled,\n autocomplete: props.autocomplete,\n autofocus: props.autofocus,\n onInput: handleInput,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeydown: handleKeydown,\n onKeyup: handleKeyup\n }\n\n // 문자 길이 제한\n if (props.maxlength !== undefined) {\n attrs.maxlength = props.maxlength\n }\n if (props.minlength !== undefined) {\n attrs.minlength = props.minlength\n }\n\n // 숫자 범위 및 단계\n if (props.type === 'number') {\n if (props.max !== undefined) {\n attrs.max = props.max\n }\n if (props.min !== undefined) {\n attrs.min = props.min\n }\n if (props.step !== undefined) {\n attrs.step = props.step\n }\n }\n\n return attrs\n })\n\n /**\n * form-conts 클래스 계산\n */\n const formContsClasses = computed(() => {\n const classList = ['form-conts']\n\n if (props.state !== 'default') {\n classList.push(`is-${props.state}`)\n }\n\n if (props.icon) {\n classList.push('btn-ico-wrap')\n }\n\n return classList\n })\n\n return () => {\n const children = [h('input', inputProps.value)]\n\n // 로딩 상태일 때 스피너 추가\n if (props.loading) {\n return h('div', { class: formContsClasses.value }, [h('div', { class: 'form-spinner' }, [...children, h(KrdsSpinner)])])\n }\n\n // 디폴트 슬롯이 있으면 추가 (아이콘 버튼들)\n if (slots.default) {\n children.push(...slots.default())\n }\n\n return h('div', { class: formContsClasses.value }, children)\n }\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS FormLabel 컴포넌트 속성\n */\nexport interface KrdsFormLabelProps extends BaseComponentProps {\n /** label의 for 속성 */\n for?: string\n}\n\n/**\n * KRDS FormLabel 컴포넌트 이벤트\n */\nexport interface KrdsFormLabelEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsFormLabelProps>({\n name: 'KrdsFormLabel',\n props: {\n for: {\n type: String,\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h('div', { class: 'form-tit' }, [\n h(\n 'label',\n {\n for: props.for,\n id: props.id,\n class: props.class,\n style: props.style,\n onClick: handleClick\n },\n slots.default?.()\n )\n ])\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS FormHint 컴포넌트 속성\n */\nexport interface KrdsFormHintProps extends BaseComponentProps {\n /** 힌트 타입 */\n type?: 'hint' | 'error' | 'success' | 'information'\n}\n\n/**\n * KRDS FormHint 컴포넌트 이벤트\n */\nexport interface KrdsFormHintEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsFormHintProps>({\n name: 'KrdsFormHint',\n props: {\n type: {\n type: String as () => 'hint' | 'error' | 'success' | 'information',\n default: 'hint'\n },\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n /**\n * 클래스 계산\n */\n const classes = () => {\n let baseClass: string\n\n switch (props.type) {\n case 'error':\n baseClass = 'form-hint-invalid'\n break\n case 'success':\n baseClass = 'form-hint-success'\n break\n case 'information':\n baseClass = 'form-hint-information'\n break\n default:\n baseClass = 'form-hint'\n break\n }\n\n return props.class ? `${baseClass} ${props.class}` : baseClass\n }\n\n return () =>\n h(\n 'p',\n {\n id: props.id,\n class: classes(),\n style: props.style,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS FormGroup 컴포넌트 속성\n */\nexport type KrdsFormGroupProps = BaseComponentProps\n\nexport default defineComponent<KrdsFormGroupProps>({\n name: 'KrdsFormGroup',\n props: {\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n /**\n * 클래스 계산\n */\n const classes = computed(() => {\n const classList = ['form-group']\n\n if (props.class) {\n classList.push(props.class)\n }\n\n return classList\n })\n\n return () =>\n h(\n 'div',\n {\n id: props.id,\n class: classes.value,\n style: props.style\n },\n slots.default?.()\n )\n }\n})\n","import { computed, ref } from 'vue'\n\nexport interface DatePickerState {\n currentYear: number\n currentMonth: number\n selectedStartDate: string | null\n selectedEndDate: string | null\n}\n\nexport function useDatePicker(initialYear?: number, initialMonth?: number) {\n const today = new Date()\n const currentYear = ref(initialYear || today.getFullYear())\n const currentMonth = ref(initialMonth || today.getMonth() + 1)\n const selectedStartDate = ref<string | null>(null)\n const selectedEndDate = ref<string | null>(null)\n const activeDateSelector = ref<HTMLElement | null>(null)\n\n /**\n * 연도 옵션 생성 (현재 년도 기준 ±10년)\n */\n const yearOptions = computed(() => {\n const currentYearValue = today.getFullYear()\n const years = []\n for (let i = currentYearValue - 10; i <= currentYearValue + 10; i++) {\n years.push(i)\n }\n return years\n })\n\n /**\n * 월 옵션 생성 (1~12월)\n */\n const monthOptions = computed(() => {\n return Array.from({ length: 12 }, (_, i) => i + 1)\n })\n\n /**\n * 선택된 날짜 범위 초기화\n */\n const clearDateSelection = () => {\n selectedStartDate.value = null\n selectedEndDate.value = null\n }\n\n /**\n * 이전 달로 이동\n */\n const prevMonth = () => {\n if (currentMonth.value === 1) {\n currentMonth.value = 12\n currentYear.value -= 1\n } else {\n currentMonth.value -= 1\n }\n }\n\n /**\n * 다음 달로 이동\n */\n const nextMonth = () => {\n if (currentMonth.value === 12) {\n currentMonth.value = 1\n currentYear.value += 1\n } else {\n currentMonth.value += 1\n }\n }\n\n /**\n * 날짜 선택 처리\n */\n const handleDateSelection = (dateString: string, isSingle = false) => {\n if (isSingle) {\n selectedStartDate.value = dateString\n selectedEndDate.value = dateString\n } else {\n if (!selectedStartDate.value || (selectedStartDate.value && selectedEndDate.value)) {\n selectedStartDate.value = dateString\n selectedEndDate.value = null\n } else {\n const startDate = new Date(selectedStartDate.value.replace(/\\./g, '-'))\n const endDate = new Date(dateString.replace(/\\./g, '-'))\n\n if (endDate < startDate) {\n selectedStartDate.value = dateString\n selectedEndDate.value = null\n } else {\n selectedEndDate.value = dateString\n }\n }\n }\n }\n\n /**\n * 오늘 날짜 선택\n */\n const selectToday = () => {\n const todayString = `${today.getFullYear()}.${String(today.getMonth() + 1).padStart(2, '0')}.${String(today.getDate()).padStart(2, '0')}`\n handleDateSelection(todayString, true)\n }\n\n /**\n * 날짜가 선택된 범위에 포함되는지 확인\n */\n const isDateInSelectedRange = (dateString: string) => {\n if (!selectedStartDate.value || !selectedEndDate.value) {\n return { isInRange: false, isStart: false, isEnd: false }\n }\n\n const currentDate = new Date(dateString.replace(/\\./g, '-'))\n const startDate = new Date(selectedStartDate.value.replace(/\\./g, '-'))\n const endDate = new Date(selectedEndDate.value.replace(/\\./g, '-'))\n\n const isStart = dateString === selectedStartDate.value\n const isEnd = dateString === selectedEndDate.value\n const isInRange = currentDate >= startDate && currentDate <= endDate\n\n return { isInRange, isStart, isEnd }\n }\n\n return {\n // State\n currentYear,\n currentMonth,\n selectedStartDate,\n selectedEndDate,\n activeDateSelector,\n\n // Computed\n yearOptions,\n monthOptions,\n\n // Methods\n clearDateSelection,\n prevMonth,\n nextMonth,\n handleDateSelection,\n selectToday,\n isDateInSelectedRange\n }\n}\n","import { type Ref, onMounted, onBeforeUnmount } from 'vue'\n\n/**\n * 외부 클릭 감지 컴포저블 옵션\n */\ninterface ClickOutsideOptions {\n /** 클릭을 무시할 선택자 (예: '.modal, .dropdown') */\n ignore?: string\n /** 이벤트 타입 (기본: 'click') */\n event?: 'click' | 'mousedown' | 'mouseup'\n}\n\n/**\n * 외부 클릭 감지 컴포저블\n * @param targetRef 감지 대상 요소 ref\n * @param callback 외부 클릭 시 실행할 콜백\n * @param options 추가 옵션 또는 무시할 선택자 (하위 호환성)\n */\nexport function useClickOutside(targetRef: Ref<HTMLElement | undefined>, callback: () => void, options: ClickOutsideOptions | string = {}) {\n let globalClickHandler: ((event: Event) => void) | null = null\n\n // 하위 호환성을 위해 string을 지원\n const opts = typeof options === 'string' ? { ignore: options } : options\n const { ignore, event = 'click' } = opts\n\n const setupGlobalListeners = () => {\n globalClickHandler = (e: Event) => {\n const target = e.target as HTMLElement\n\n // targetRef 내부 클릭인지 확인\n if (targetRef.value?.contains(target)) {\n return\n }\n\n // ignore 선택자가 있으면 해당 요소 내부 클릭은 무시\n if (ignore && target.closest(ignore)) {\n return\n }\n\n callback()\n }\n document.addEventListener(event, globalClickHandler)\n }\n\n const removeGlobalListeners = () => {\n if (globalClickHandler) {\n const eventType = typeof options === 'string' ? 'click' : options.event || 'click'\n document.removeEventListener(eventType, globalClickHandler)\n globalClickHandler = null\n }\n }\n\n onMounted(() => {\n setupGlobalListeners()\n })\n\n onBeforeUnmount(() => {\n removeGlobalListeners()\n })\n\n return {\n setupGlobalListeners,\n removeGlobalListeners\n }\n}\n","<template>\n <div class=\"form-conts\">\n <div :class=\"formContsClasses\">\n <div class=\"calendar-input\">\n <input\n :id=\"id\"\n :name=\"name\"\n :class=\"inputClasses\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :required=\"required\"\n :autofocus=\"autofocus\"\n type=\"text\"\n @input=\"handleInput\"\n @change=\"handleChange\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n <button\n ref=\"datePickerButtonRef\"\n :class=\"`krds-btn ${size || 'medium'} icon form-btn-datepicker`\"\n :disabled=\"disabled\"\n :aria-expanded=\"isCalendarOpen\"\n type=\"button\"\n @click=\"handleDatePickerToggle\"\n >\n <span class=\"sr-only\">달력 열기</span>\n <i class=\"svg-icon ico-calendar\"></i>\n </button>\n </div>\n <div ref=\"datePickerAreaRef\" :class=\"calendarAreaClasses\">\n <div v-show=\"isCalendarOpen\" class=\"calendar-wrap bottom\" aria-label=\"달력\" tabindex=\"0\" @keydown=\"handleKeydown\">\n <!-- 캘린더 헤더 -->\n <div class=\"calendar-head\">\n <button type=\"button\" class=\"btn-cal-move prev\" @click=\"prevMonth\">\n <span class=\"sr-only\">이전 달</span>\n </button>\n <div class=\"calendar-switch-wrap\">\n <!-- 연도 드롭다운 -->\n <div class=\"calendar-drop-down\">\n <button\n type=\"button\"\n class=\"btn-cal-switch year\"\n aria-label=\"연도 선택\"\n :aria-expanded=\"activeDropdown === 'year'\"\n @click=\"toggleDropdown('year')\"\n >\n {{ currentYear }}년\n </button>\n <div v-show=\"activeDropdown === 'year'\" class=\"calendar-select calendar-year-wrap\">\n <ul class=\"sel year\">\n <li v-for=\"year in yearOptions\" :key=\"year\">\n <button type=\"button\" :class=\"{ active: year === currentYear }\" @click=\"selectYear(year)\">{{ year }}년</button>\n </li>\n </ul>\n </div>\n </div>\n <!-- 월 드롭다운 -->\n <div class=\"calendar-drop-down\">\n <button\n type=\"button\"\n class=\"btn-cal-switch month\"\n aria-label=\"월 선택\"\n :aria-expanded=\"activeDropdown === 'month'\"\n @click=\"toggleDropdown('month')\"\n >\n {{ currentMonth.toString().padStart(2, '0') }}월\n </button>\n <div v-show=\"activeDropdown === 'month'\" class=\"calendar-select calendar-mon-wrap\">\n <ul class=\"sel month\">\n <li v-for=\"month in monthOptions\" :key=\"month\">\n <button type=\"button\" :class=\"{ active: month === currentMonth }\" @click=\"selectMonth(month)\">\n {{ month.toString().padStart(2, '0') }}월\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <button type=\"button\" class=\"btn-cal-move next\" @click=\"nextMonth\">\n <span class=\"sr-only\">다음 달</span>\n </button>\n </div>\n <!-- 캘린더 바디 -->\n <div class=\"calendar-body\">\n <div class=\"calendar-table-wrap\">\n <table class=\"calendar-tbl\">\n <caption>{{ currentYear }}년 {{ currentMonth.toString().padStart(2, '0') }}월</caption>\n <thead>\n <tr>\n <th>일</th>\n <th>월</th>\n <th>화</th>\n <th>수</th>\n <th>목</th>\n <th>금</th>\n <th>토</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(week, weekIndex) in calendarGrid\" :key=\"weekIndex\">\n <td v-for=\"(day, dayIndex) in week\" :key=\"dayIndex\" :class=\"getCellClasses(day)\" :data-date=\"day.dateString\">\n <button\n type=\"button\"\n class=\"btn-set-date\"\n :aria-pressed=\"isDateInSelectedRange(day.dateString).isInRange ? 'true' : 'false'\"\n @click=\"handleDateSelection(day.dateString)\"\n >\n <span>{{ day.day }}</span>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <!-- 캘린더 푸터 -->\n <div class=\"calendar-footer\">\n <div class=\"calendar-btn-wrap\">\n <KrdsButton\n v-for=\"action in actionButtons\"\n :id=\"action.id\"\n :key=\"action.id\"\n :class=\"action.class\"\n :variant=\"action.variant\"\n :size=\"action.size\"\n @click=\"action.handler\"\n >\n {{ action.label }}\n </KrdsButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import type { BaseFormProps, Size } from '@/types'\n import KrdsButton from '@/components/KrdsButton/KrdsButton.ts'\n import { useDatePicker } from '@/composables/useDatePicker'\n import { useClickOutside } from '@/composables/useClickOutside'\n\n // ========================\n // 타입 정의\n // ========================\n\n /**\n * 캘린더 날짜 정보\n */\n interface CalendarDay {\n day: number\n dateString: string\n isCurrentMonth: boolean\n isToday: boolean\n isPrevMonth: boolean\n isNextMonth: boolean\n isSunday: boolean\n isSaturday: boolean\n }\n\n /**\n * 액션 버튼 정보\n */\n interface ActionButton {\n id: string\n label: string\n class: string | undefined\n variant: 'primary' | 'tertiary' | undefined\n size: Size\n handler: () => void\n }\n\n /**\n * KRDS DateInput 컴포넌트 속성\n */\n export interface KrdsDateInputProps extends BaseFormProps {\n /** 선택된 날짜 값 */\n modelValue?: string\n /** 입력 크기 */\n size?: Size\n /** 플레이스홀더 */\n placeholder?: string\n /** 비활성화 여부 */\n disabled?: boolean\n /** 읽기 전용 여부 */\n readonly?: boolean\n /** 자동 포커스 */\n autofocus?: boolean\n /** 일정이 있는 날짜 배열 (YYYY.MM.DD 형식) */\n eventDates?: string[]\n /** 휴일 날짜 배열 (YYYY.MM.DD 형식) */\n holidays?: string[]\n /** 초기 표시 년도 (기본: 현재 년도) */\n initialYear?: number\n /** 초기 표시 월 (기본: 현재 월) */\n initialMonth?: number\n }\n\n /**\n * KRDS DateInput 컴포넌트 이벤트\n */\n export interface KrdsDateInputEmits {\n 'update:modelValue': [value: string]\n input: [event: Event]\n change: [event: Event]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n }\n\n // ========================\n // Props & Emits\n // ========================\n\n const props = withDefaults(defineProps<KrdsDateInputProps>(), {\n modelValue: undefined,\n size: 'medium',\n placeholder: 'YYYY.MM.DD',\n name: undefined,\n required: false,\n readonly: false,\n disabled: false,\n class: undefined,\n id: undefined,\n autofocus: false,\n eventDates: () => [],\n holidays: () => [],\n initialYear: undefined,\n initialMonth: undefined\n })\n\n /**\n * KRDS DateInput 컴포넌트 이벤트\n */\n const emit = defineEmits<KrdsDateInputEmits>()\n\n // ========================\n // 상태 관리\n // ========================\n\n // DOM 참조\n const datePickerAreaRef = ref<HTMLElement>()\n const datePickerButtonRef = ref<HTMLButtonElement>()\n\n // 반응형 상태\n const isCalendarOpen = ref(false)\n const activeDropdown = ref<'year' | 'month' | null>(null)\n\n // ========================\n // Composables\n // ========================\n\n // 날짜 선택기 composable 사용\n const {\n currentYear,\n currentMonth,\n selectedStartDate,\n selectedEndDate,\n yearOptions,\n monthOptions,\n prevMonth,\n nextMonth,\n handleDateSelection,\n selectToday,\n isDateInSelectedRange\n } = useDatePicker(props.initialYear, props.initialMonth)\n\n // 외부 클릭 감지\n const closeAllDatePickers = () => {\n if (isCalendarOpen.value) {\n datePickerButtonRef.value?.focus()\n }\n\n isCalendarOpen.value = false\n activeDropdown.value = null\n }\n\n // 외부 클릭 감지 활성화\n useClickOutside(datePickerAreaRef, closeAllDatePickers, '.calendar-conts')\n\n /**\n * 날짜 입력 클래스\n */\n const inputClasses = computed(() => {\n const classes = ['krds-input', 'datepicker', 'cal']\n\n if (props.size) {\n classes.push(props.size)\n }\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 폼 콘텐츠 클래스\n */\n const formContsClasses = computed(() => {\n const classes = ['form-conts', 'calendar-conts']\n return classes\n })\n\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 캘린더 영역 클래스\n */\n const calendarAreaClasses = computed(() => ({\n 'krds-calendar-area': true,\n active: isCalendarOpen.value\n }))\n\n const calendarGrid = computed<CalendarDay[][]>(() => {\n const year = currentYear.value\n const month = currentMonth.value\n const firstDate = new Date(year, month - 1, 1)\n const startDate = new Date(firstDate)\n\n // 첫 번째 날의 요일만큼 이전 달 날짜 추가 (일요일이 0)\n startDate.setDate(startDate.getDate() - firstDate.getDay())\n\n const weeks: CalendarDay[][] = []\n const currentDate = new Date(startDate)\n\n // 6주 생성\n for (let week = 0; week < 6; week++) {\n const days: CalendarDay[] = []\n\n for (let day = 0; day < 7; day++) {\n const dateString = `${currentDate.getFullYear()}.${String(currentDate.getMonth() + 1).padStart(2, '0')}.${String(currentDate.getDate()).padStart(2, '0')}`\n const dayOfWeek = currentDate.getDay()\n\n days.push({\n day: currentDate.getDate(),\n dateString,\n isCurrentMonth: currentDate.getMonth() === month - 1,\n isToday: currentDate.toDateString() === new Date().toDateString(),\n isPrevMonth: currentDate.getMonth() < month - 1 || (currentDate.getMonth() === 11 && month === 1),\n isNextMonth: currentDate.getMonth() > month - 1 || (currentDate.getMonth() === 0 && month === 12),\n isSunday: dayOfWeek === 0,\n isSaturday: dayOfWeek === 6\n })\n\n currentDate.setDate(currentDate.getDate() + 1)\n }\n\n weeks.push(days)\n }\n\n return weeks\n })\n\n /**\n * 셀 클래스 계산\n */\n const getCellClasses = (day: CalendarDay) => {\n const classes: string[] = []\n\n // 이전/다음 달 날짜\n if (day.isPrevMonth) classes.push('old')\n if (day.isNextMonth) classes.push('new')\n\n // 오늘 날짜\n if (day.isToday) classes.push('today')\n\n // 일요일은 기본적으로 day-off\n if (day.isSunday) classes.push('day-off')\n\n // props로 전달받은 휴일 체크\n if (props.holidays?.includes(day.dateString)) {\n classes.push('day-off')\n }\n\n // props로 전달받은 이벤트 날짜 체크\n if (props.eventDates?.includes(day.dateString)) {\n classes.push('day-event')\n }\n\n // 선택된 날짜 범위 체크 (현재 월의 날짜만)\n if (day.isCurrentMonth) {\n const rangeInfo = isDateInSelectedRange(day.dateString)\n if (rangeInfo.isInRange) {\n classes.push('period')\n if (rangeInfo.isStart) classes.push('start')\n if (rangeInfo.isEnd) classes.push('end')\n }\n }\n\n return classes\n }\n\n /**\n * 액션 버튼 설정\n */\n const actionButtons = computed<ActionButton[]>(() => [\n {\n id: 'get-today',\n label: '오늘',\n class: 'text',\n variant: undefined,\n size: 'small' as const,\n handler: selectToday\n },\n {\n id: 'cancel-btn',\n label: '취소',\n class: undefined,\n variant: 'tertiary' as const,\n size: 'small' as const,\n handler: closeAllDatePickers\n },\n {\n id: 'confirm-btn',\n label: '확인',\n class: undefined,\n variant: 'primary' as const,\n size: 'small' as const,\n handler: confirmSelection\n }\n ])\n\n // ========================\n // Methods\n // ========================\n\n /**\n * 드롭다운 토글\n */\n const toggleDropdown = (type: 'year' | 'month') => {\n if (activeDropdown.value === type) {\n activeDropdown.value = null\n } else {\n activeDropdown.value = type\n }\n }\n\n /**\n * 연도 선택\n */\n const selectYear = (year: number) => {\n currentYear.value = year\n activeDropdown.value = null\n }\n\n /**\n * 월 선택\n */\n const selectMonth = (month: number) => {\n currentMonth.value = month\n activeDropdown.value = null\n }\n\n /**\n * 선택 확인\n */\n const confirmSelection = () => {\n if (selectedStartDate.value) {\n if (selectedEndDate.value && selectedStartDate.value !== selectedEndDate.value) {\n // 범위 선택\n const rangeValue = `${selectedStartDate.value} ~ ${selectedEndDate.value}`\n emit('update:modelValue', rangeValue)\n } else {\n // 단일 선택\n emit('update:modelValue', selectedStartDate.value)\n }\n closeAllDatePickers()\n }\n }\n\n /**\n * 캘린더 열기\n */\n const openDatePicker = () => {\n isCalendarOpen.value = true\n activeDropdown.value = null\n\n // 포커스 이동\n setTimeout(() => {\n const calendarWrap = datePickerAreaRef.value?.querySelector('.calendar-wrap') as HTMLElement\n calendarWrap?.focus()\n }, 50)\n }\n\n /**\n * 날짜 선택기 토글\n */\n const handleDatePickerToggle = () => {\n if (isCalendarOpen.value) {\n closeAllDatePickers()\n } else {\n openDatePicker()\n }\n }\n\n /**\n * 키보드 이벤트 처리\n */\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.code === 'Escape') {\n if (activeDropdown.value) {\n activeDropdown.value = null\n } else if (isCalendarOpen.value) {\n closeAllDatePickers()\n }\n }\n }\n\n // ========================\n // Event Handlers\n // ========================\n\n /**\n * 입력 이벤트 핸들러\n */\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n emit('input', event)\n }\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n emit('change', event)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n</script>\n","import { defineComponent, computed, ref, watch, h } from 'vue'\nimport type { Size, BaseFormProps } from '@/types'\n\n/**\n * KRDS Textarea 컴포넌트 속성\n */\nexport interface KrdsTextareaProps extends BaseFormProps {\n /** 입력값 */\n modelValue?: string\n /** 입력 크기 */\n size?: Size\n /** 플레이스홀더 */\n placeholder?: string\n /** 최대 글자 수 */\n maxlength?: number\n /** 최소 글자 수 */\n minlength?: number\n /** 행 수 */\n rows?: number\n /** 열 수 */\n cols?: number\n /** 자동 포커스 */\n autofocus?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 글자 수 표시 여부 */\n showCount?: boolean\n /** 리사이즈 가능 여부 */\n resize?: 'none' | 'both' | 'horizontal' | 'vertical'\n}\n\n/**\n * KRDS Textarea 컴포넌트 이벤트\n */\nexport interface KrdsTextareaEmits {\n (e: 'update:modelValue', value: string): void\n (e: 'input', event: Event): void\n (e: 'change', event: Event): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n (e: 'keydown', event: KeyboardEvent): void\n (e: 'keyup', event: KeyboardEvent): void\n}\n\nexport default defineComponent({\n name: 'KrdsTextarea',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n size: {\n type: String as () => Size,\n default: undefined\n },\n placeholder: {\n type: String,\n default: undefined\n },\n maxlength: {\n type: Number,\n default: undefined\n },\n minlength: {\n type: Number,\n default: undefined\n },\n rows: {\n type: Number,\n default: 4\n },\n cols: {\n type: Number,\n default: undefined\n },\n autofocus: {\n type: Boolean,\n default: false\n },\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n showCount: {\n type: Boolean,\n default: true\n },\n resize: {\n type: String as () => 'none' | 'both' | 'horizontal' | 'vertical',\n default: 'vertical'\n },\n // BaseFormProps에서 상속\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'input', 'change', 'focus', 'blur', 'keydown', 'keyup'],\n setup(props, { emit }) {\n const currentLength = ref(0)\n\n /**\n * 현재 글자 수 업데이트\n */\n watch(\n () => props.modelValue,\n newValue => {\n currentLength.value = (newValue || '').length\n },\n { immediate: true }\n )\n\n /**\n * textarea 클래스 계산\n */\n const textareaClasses = computed(() => {\n const classes = ['krds-input']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * textarea 스타일 계산\n */\n const textareaStyles = computed(() => {\n const styles: Record<string, string> = {}\n\n if (props.resize) {\n styles.resize = props.resize\n }\n\n return styles\n })\n\n /**\n * 입력 이벤트 핸들러\n */\n const handleInput = (event: Event) => {\n const target = event.target as HTMLTextAreaElement\n const value = target.value\n currentLength.value = value.length\n emit('update:modelValue', value)\n emit('input', event)\n }\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n emit('change', event)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n\n /**\n * 키다운 이벤트 핸들러\n */\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event)\n }\n\n /**\n * 키업 이벤트 핸들러\n */\n const handleKeyup = (event: KeyboardEvent) => {\n emit('keyup', event)\n }\n\n /**\n * textarea 속성 계산\n */\n const textareaProps = computed(() => {\n const attrs: Record<string, unknown> = {\n class: textareaClasses.value,\n style: textareaStyles.value,\n value: props.modelValue,\n placeholder: props.placeholder,\n name: props.name,\n id: props.id,\n required: props.required,\n readonly: props.readonly,\n disabled: props.disabled,\n autofocus: props.autofocus,\n rows: props.rows,\n cols: props.cols,\n onInput: handleInput,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeydown: handleKeydown,\n onKeyup: handleKeyup\n }\n\n // 문자 길이 제한\n if (props.maxlength !== undefined) {\n attrs.maxlength = props.maxlength\n }\n if (props.minlength !== undefined) {\n attrs.minlength = props.minlength\n }\n\n return attrs\n })\n\n /**\n * form-conts 클래스 계산\n */\n const formContsClasses = computed(() => {\n const classList = ['form-conts']\n return classList\n })\n\n /**\n * textarea-wrap 클래스 계산\n */\n const textareaWrapClasses = computed(() => {\n return ['textarea-wrap']\n })\n\n /**\n * 글자 수 표시 계산\n */\n const countDisplay = computed(() => {\n if (!props.showCount) return null\n\n const current = currentLength.value\n const max = props.maxlength\n\n return {\n current,\n max: max || ''\n }\n })\n\n return () => {\n const children = [h('textarea', textareaProps.value)]\n\n // 글자 수 표시 추가\n if (countDisplay.value) {\n children.push(\n h('p', { class: 'textarea-count' }, [\n h('span', { class: 'count-now' }, countDisplay.value.current),\n h('span', { class: 'count-total' }, countDisplay.value.max ? `/${countDisplay.value.max}` : '')\n ])\n )\n }\n\n return h('div', { class: formContsClasses.value }, [h('div', { class: textareaWrapClasses.value }, children)])\n }\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseFormProps, Size } from '@/types'\n\n/**\n * KRDS Select 옵션 타입\n */\nexport interface SelectOption {\n /** 옵션 값 */\n value: string | number\n /** 옵션 레이블 */\n label: string\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * KRDS Select 컴포넌트 속성\n */\nexport interface KrdsSelectProps extends BaseFormProps {\n /** 선택된 값 */\n modelValue?: string | number | null\n /** 선택 크기 */\n size?: Size\n /** 타이틀 */\n title?: string\n /** 옵션 목록 */\n options?: SelectOption[]\n /** 플레이스홀더 */\n placeholder?: string\n /** 비활성화 여부 */\n disabled?: boolean\n /** 입력 상태 */\n state?: 'default' | 'error' | 'success' | 'information'\n /** 정렬 스타일 여부 */\n sort?: boolean\n}\n\n/**\n * KRDS Select 컴포넌트 이벤트\n */\nexport interface KrdsSelectEmits {\n (e: 'update:modelValue', value: string | number | null): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nexport default defineComponent<KrdsSelectProps>({\n name: 'KrdsSelect',\n props: {\n modelValue: {\n type: [String, Number, null] as unknown as () => string | number | null,\n default: null\n },\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n title: {\n type: String,\n default: undefined\n },\n options: {\n type: Array as () => SelectOption[],\n default: () => []\n },\n placeholder: {\n type: String,\n default: '선택'\n },\n name: {\n type: String,\n default: undefined\n },\n disabled: {\n type: Boolean,\n default: false\n },\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n sort: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'focus', 'blur'],\n setup(props, { emit, slots }) {\n /**\n * Select 클래스 계산\n */\n const selectClasses = computed(() => {\n const classes = []\n\n // 정렬 스타일\n if (props.sort) {\n classes.push('krds-form-select-sort')\n } else {\n classes.push('krds-form-select')\n }\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n const target = event.target as HTMLSelectElement\n const value = target.value === '' ? null : target.value\n emit('update:modelValue', value)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n\n /**\n * Select 속성 계산\n */\n const selectProps = computed(() => {\n return {\n class: selectClasses.value,\n value: props.modelValue ?? '',\n title: props.title || props.placeholder,\n name: props.name,\n id: props.id,\n disabled: props.disabled || props.readonly,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur\n }\n })\n\n /**\n * form-conts 클래스 계산\n */\n const formContsClasses = computed(() => {\n const classList = ['form-conts']\n\n if (props.state !== 'default') {\n classList.push(`is-${props.state}`)\n }\n\n return classList\n })\n\n /**\n * 옵션 렌더링\n */\n const renderOptions = () => {\n const optionElements = []\n\n // 플레이스홀더 옵션 (값이 없을 때만)\n if (props.placeholder && !props.modelValue) {\n optionElements.push(h('option', { value: '', disabled: true, selected: true }, props.placeholder))\n }\n\n // 옵션 목록\n if (props.options && props.options.length > 0) {\n props.options.forEach(option => {\n optionElements.push(\n h(\n 'option',\n {\n value: option.value,\n disabled: option.disabled,\n selected: option.value === props.modelValue\n },\n option.label\n )\n )\n })\n }\n\n // 슬롯으로 전달된 옵션들\n if (slots.default) {\n optionElements.push(...slots.default())\n }\n\n return optionElements\n }\n\n return () => {\n const selectElement = h('select', selectProps.value, renderOptions())\n\n if (props.sort) {\n return selectElement\n }\n\n return h('div', { class: formContsClasses.value }, [selectElement])\n }\n }\n})\n","import { defineComponent, computed, ref } from 'vue'\nimport type { Size, BaseFormProps } from '@/types'\n\n/**\n * 파일 정보 인터페이스\n */\nexport interface FileInfo {\n /** 파일 ID */\n id: string\n /** 파일 객체 */\n file: File\n /** 파일명 */\n name: string\n /** 파일 크기 (bytes) */\n size: number\n /** 파일 타입 */\n type: string\n /** 업로드 상태 */\n status: 'pending' | 'uploading' | 'completed' | 'error'\n /** 업로드 진행률 (0-100) */\n progress?: number\n /** 에러 메시지 */\n errorMessage?: string\n /** 다운로드 URL */\n downloadUrl?: string\n}\n\n/**\n * KRDS FileUpload 컴포넌트 속성\n */\nexport interface KrdsFileUploadProps extends BaseFormProps {\n /** 파일 목록 */\n modelValue?: FileInfo[]\n /** 입력 크기 */\n size?: Size\n /** 허용되는 파일 타입 (예: '.jpg,.png,.pdf') */\n accept?: string\n /** 최대 파일 개수 */\n maxFiles?: number\n /** 최대 파일 크기 (bytes) */\n maxFileSize?: number\n /** 다중 파일 선택 여부 */\n multiple?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 드래그 앤 드롭 활성화 여부 */\n dragAndDrop?: boolean\n /** 제목 */\n title?: string\n /** 설명 텍스트 */\n description?: string\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 미리보기 표시 여부 */\n showPreview?: boolean\n /** 다운로드 버튼 표시 여부 */\n showDownload?: boolean\n /** 바로보기 버튼 표시 여부 */\n showPreviewButton?: boolean\n /** 전체 삭제 버튼 표시 여부 */\n showClearAll?: boolean\n}\n\n/**\n * KRDS FileUpload 컴포넌트 이벤트\n */\nexport interface KrdsFileUploadEmits {\n 'update:modelValue': [files: FileInfo[]]\n 'file-added': [file: FileInfo]\n 'file-removed': [fileId: string]\n 'file-error': [file: FileInfo, error: string]\n 'upload-start': [file: FileInfo]\n 'upload-progress': [file: FileInfo, progress: number]\n 'upload-complete': [file: FileInfo]\n 'upload-error': [file: FileInfo, error: string]\n 'clear-all': []\n download: [file: FileInfo]\n preview: [file: FileInfo]\n}\n\nexport default defineComponent({\n name: 'KrdsFileUpload',\n props: {\n modelValue: {\n type: Array as () => FileInfo[],\n default: () => []\n },\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n accept: {\n type: String,\n default: undefined\n },\n maxFiles: {\n type: Number,\n default: 10\n },\n maxFileSize: {\n type: Number,\n default: 20 * 1024 * 1024 // 20MB\n },\n multiple: {\n type: Boolean,\n default: true\n },\n disabled: {\n type: Boolean,\n default: false\n },\n dragAndDrop: {\n type: Boolean,\n default: true\n },\n title: {\n type: String,\n default: '타이틀영역'\n },\n description: {\n type: String,\n default: '컨텐츠 영역'\n },\n placeholder: {\n type: String,\n default: '첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.'\n },\n showPreview: {\n type: Boolean,\n default: true\n },\n showDownload: {\n type: Boolean,\n default: true\n },\n showPreviewButton: {\n type: Boolean,\n default: true\n },\n showClearAll: {\n type: Boolean,\n default: true\n },\n // BaseFormProps에서 상속\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: [\n 'update:modelValue',\n 'file-added',\n 'file-removed',\n 'file-error',\n 'upload-start',\n 'upload-progress',\n 'upload-complete',\n 'upload-error',\n 'clear-all',\n 'download',\n 'preview'\n ],\n setup(props, { emit: _emit }) {\n const _isDragOver = ref(false)\n\n /**\n * 파일 업로드 클래스 계산\n */\n const _fileUploadClasses = computed(() => {\n const classes = ['krds-file-upload', 'line']\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 현재 파일 개수 계산\n */\n const currentFileCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n /**\n * 파일 추가 가능 여부\n */\n const _canAddFiles = computed(() => {\n return !props.disabled && currentFileCount.value < props.maxFiles\n })\n\n // TODO: 실제 구현 로직 추가\n // - 파일 선택 핸들러\n // - 드래그 앤 드롭 핸들러\n // - 파일 업로드 로직\n // - 파일 삭제 로직\n // - 파일 다운로드 로직\n // - 파일 미리보기 로직\n\n return () => {\n // TODO: 실제 렌더 함수 구현\n return null\n }\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps, Size } from '@/types'\n\n/**\n * KRDS Badge 컴포넌트 속성\n */\ntype ColorVariant = 'primary' | 'secondary' | 'gray' | 'point' | 'danger' | 'warning' | 'success' | 'information' | 'disabled'\n\nexport interface KrdsBadgeProps extends BaseComponentProps {\n /** 배지 타입 */\n type?: 'outline' | 'bg' | 'bg-light'\n /** 배지 컬러 */\n color?: ColorVariant\n /** 넘버 여부 */\n number?: boolean\n /** 배지 크기 */\n size?: 'large' | 'medium' | 'small'\n}\n\n/**\n * KRDS Badge 컴포넌트 이벤트\n */\nexport interface KrdsBadgeEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsBadgeProps>({\n name: 'KrdsBadge',\n props: {\n type: {\n type: String as () => 'outline' | 'bg' | 'bg-light',\n default: 'outline'\n },\n color: {\n type: String as () => ColorVariant,\n default: 'primary'\n },\n size: {\n type: String as () => Size,\n default: 'large'\n },\n number: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 배지 클래스 계산\n */\n const buttonClasses = computed(() => {\n const classes = ['krds-badge']\n\n // 타입과 컬러 조합 클래스\n classes.push(`${props.type}-${props.color}`)\n\n // 크기 클래스 (KRDS 실제 규격: small, medium, large)\n if (props.size) {\n classes.push(props.size)\n }\n\n // 넘버 클래스\n if (props.number) {\n classes.push('number')\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h(\n 'span',\n {\n type: props.type,\n color: props.color,\n size: props.size,\n number: props.number,\n class: buttonClasses.value,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Tag 컴포넌트 속성\n */\nexport interface KrdsTagProps extends BaseComponentProps {\n /** 링크 태그 여부 */\n link?: boolean\n /** 링크 URL (link가 true일 때 사용) */\n href?: string\n /** 링크 타겟 (link가 true일 때 사용) */\n target?: string\n /** 링크 관계 (link가 true일 때 사용) */\n rel?: string\n}\n\n/**\n * KRDS Tag 컴포넌트 이벤트\n */\nexport interface KrdsTagEmits {\n (e: 'remove', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsTagProps>({\n name: 'KrdsTag',\n props: {\n link: {\n type: Boolean,\n default: false\n },\n href: {\n type: String,\n default: '#'\n },\n target: {\n type: String,\n default: undefined\n },\n rel: {\n type: String,\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['remove'],\n setup(props, { emit, slots }) {\n /**\n * 태그 클래스 계산\n */\n const tagClasses = computed(() => {\n const classes = ['krds-btn-tag']\n\n // 링크 클래스\n if (props.link) {\n classes.push('link')\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 삭제 버튼 클릭 핸들러\n */\n const handleDelete = (event: MouseEvent) => {\n emit('remove', event)\n }\n\n /**\n * 삭제 버튼 렌더링\n */\n const renderDeleteButton = () => {\n return h(\n 'button',\n {\n type: 'button',\n class: 'btn-delete',\n onClick: handleDelete\n },\n [h('span', { class: 'sr-only' }, '삭제')]\n )\n }\n\n return () => {\n const content = []\n\n // 슬롯 내용 추가\n const slotContent = slots.default?.()\n if (slotContent) {\n content.push(slotContent)\n }\n\n // 링크가 아닌 경우에만 삭제 버튼 추가\n if (!props.link) {\n content.push(renderDeleteButton())\n }\n\n // 링크인 경우 a 태그, 아닌 경우 span 태그\n if (props.link) {\n const linkAttrs: Record<string, unknown> = {\n href: props.href,\n class: tagClasses.value\n }\n\n // 선택적 a 태그 속성들\n if (props.target) linkAttrs.target = props.target\n if (props.rel) linkAttrs.rel = props.rel\n\n return h('a', linkAttrs, content)\n }\n\n return h(\n 'span',\n {\n class: tagClasses.value\n },\n content\n )\n }\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS TagGroup 크기 타입\n */\nexport type KrdsTagGroupSize = 'small' | 'medium' | 'large'\n\n/**\n * KRDS TagGroup 컴포넌트 속성\n */\nexport interface KrdsTagGroupProps extends BaseComponentProps {\n /** 태그 그룹 크기 */\n size?: KrdsTagGroupSize\n}\n\nexport default defineComponent<KrdsTagGroupProps>({\n name: 'KrdsTagGroup',\n props: {\n size: {\n type: String as () => KrdsTagGroupSize,\n default: 'medium'\n },\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n /**\n * 태그 그룹 클래스 계산\n */\n const tagGroupClasses = computed(() => {\n const classes = ['krds-tag-wrap']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n return () =>\n h(\n 'div',\n {\n class: tagGroupClasses.value\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Masthead 컴포넌트 속성\n */\n\nexport type KrdsMastheadProps = BaseComponentProps\n\n/**\n * KRDS Masthead 컴포넌트 이벤트\n */\nexport interface KrdsMastheadEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsMastheadProps>({\n name: 'KrdsMasthead',\n props: {\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 배지 클래스 계산\n */\n const mastheadClasses = computed(() => {\n const classes = ['']\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h(\n 'div',\n {\n id: 'krds-masthead',\n class: mastheadClasses.value,\n onClick: handleClick\n },\n [\n h('div', { class: 'toggle-wrap' }, [\n h('div', { class: 'toggle-head' }, [h('div', { class: 'inner' }, [h('span', { class: 'nuri-txt' }, slots.default?.())])])\n ])\n ]\n )\n }\n})\n","/**\n * KRDS Vue 유틸리티\n */\n\nlet idCounter = 0\n\n/**\n * 고유한 ID를 생성합니다.\n * Math.random()보다 성능이 좋고 예측 가능합니다.\n *\n * @param prefix - ID 접두사\n * @returns 고유한 ID 문자열\n */\nexport function generateId(prefix: string = 'krds'): string {\n return `${prefix}-${++idCounter}`\n}\n\n/**\n * 간단한 고유 ID를 생성합니다.\n * 브라우저와 Node.js 환경에서 모두 작동합니다.\n *\n * @returns 7자리 랜덤 문자열\n */\nexport function generateUid(): string {\n // 암호학적으로 안전한 난수가 필요한 경우가 아니라면\n // UI 컴포넌트 ID 생성에는 Math.random()이 충분합니다.\n // 더 안전한 방법이 필요하다면 crypto.randomUUID() 사용을 고려하세요.\n\n // 타임스탬프와 랜덤값을 조합하여 충돌 가능성을 줄입니다\n const timestamp = Date.now().toString(36).slice(-4)\n const random = Math.random().toString(36).substring(2, 5)\n return `${timestamp}${random}`\n}\n\n/**\n * 클래스명을 조합합니다.\n *\n * @param classes - 클래스명 배열 또는 객체\n * @returns 결합된 클래스명 문자열\n */\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { generateId, classNames } from '@/utils'\n\n/**\n * KRDS ToggleSwitch 컴포넌트 속성\n */\nexport interface KrdsToggleSwitchProps extends BaseFormProps {\n /** 모델 값 */\n modelValue?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 스위치 라벨 */\n label?: string\n /** 크기 */\n size?: 'medium' | 'large'\n}\n\n/**\n * KRDS ToggleSwitch 컴포넌트 이벤트\n */\nexport interface KrdsToggleSwitchEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'change', value: boolean): void\n}\n\nexport default defineComponent<KrdsToggleSwitchProps>({\n name: 'KrdsToggleSwitch',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n label: {\n type: String,\n default: undefined\n },\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'change'],\n setup(props, { emit, attrs }) {\n /**\n * 스위치 상태 계산\n */\n const isChecked = computed(() => props.modelValue)\n\n /**\n * 스위치 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n return classNames('krds-form-toggle-switch', props.size, props.class)\n })\n\n /**\n * 스위치 토글 핸들러\n */\n const handleToggle = (event: Event) => {\n if (props.disabled) {\n return\n }\n\n const target = event.target as HTMLInputElement\n const newValue = target.checked\n\n emit('update:modelValue', newValue)\n emit('change', newValue)\n }\n\n /**\n * input ID 생성\n */\n const inputId = computed(() => {\n return props.id || generateId('toggle-switch')\n })\n\n return () => {\n return h(\n 'div',\n {\n class: containerClasses.value\n },\n [\n h('input', {\n type: 'checkbox',\n id: inputId.value,\n name: props.name,\n checked: isChecked.value,\n disabled: props.disabled,\n onChange: handleToggle,\n ...attrs\n }),\n h(\n 'label',\n {\n for: inputId.value\n },\n [\n h(\n 'span',\n {\n class: 'switch-toggle'\n },\n [h('i')]\n ),\n props.label || ''\n ]\n )\n ]\n )\n }\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS CheckArea 컴포넌트 속성\n */\nexport interface KrdsCheckAreaProps extends BaseComponentProps {\n /** 추가 클래스 */\n class?: string\n column?: boolean\n}\n\nexport default defineComponent<KrdsCheckAreaProps>({\n name: 'KrdsCheckArea',\n props: {\n class: {\n type: String,\n default: undefined\n },\n column: {\n type: Boolean,\n default: false\n }\n },\n setup(props, { slots }) {\n return () => {\n const classes = ['krds-check-area']\n\n if (props.column) {\n classes.push('chk-column')\n }\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return h(\n 'div',\n {\n class: classes\n },\n slots.default?.()\n )\n }\n }\n})\n","import { defineComponent, computed, h, SlotsType } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { generateId, classNames } from '@/utils'\n\n/**\n * KRDS Checkbox 컴포넌트 속성\n */\nexport interface KrdsCheckboxProps extends BaseFormProps {\n /** 모델 값 */\n modelValue?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 크기 */\n size?: 'medium' | 'large'\n /** Chip 스타일 여부 */\n chip?: boolean\n}\n\n/**\n * KRDS Checkbox 컴포넌트 이벤트\n */\nexport interface KrdsCheckboxEmits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nexport default defineComponent<KrdsCheckboxProps>({\n name: 'KrdsCheckbox',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n chip: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n default?: () => unknown // Default slot with props\n description?: () => unknown // Description slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n /**\n * 체크 상태 계산\n */\n const isChecked = computed(() => {\n return props.modelValue\n })\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const baseClass = props.chip ? 'krds-form-chip' : 'krds-form-check'\n return classNames(baseClass, props.size, props.class)\n })\n\n /**\n * 체크박스 변경 핸들러\n */\n const handleChange = (event: Event) => {\n if (props.disabled) {\n return\n }\n\n const target = event.target as HTMLInputElement\n const newValue = target.checked\n\n emit('update:modelValue', newValue)\n }\n\n /**\n * input ID 생성\n */\n const inputId = computed(() => {\n return props.id || generateId('checkbox')\n })\n\n return () => {\n const children = [\n h('input', {\n type: 'checkbox',\n id: inputId.value,\n checked: isChecked.value,\n disabled: props.disabled,\n onChange: handleChange,\n ...attrs\n }),\n h(\n 'label',\n {\n for: inputId.value\n },\n slots.default?.()\n )\n ]\n\n // description 슬롯이 있고 chip이 false일 때만 추가\n if (slots.description && !props.chip) {\n children.push(h('div', { class: 'krds-form-check-cnt' }, h('p', { class: 'krds-form-check-p' }, slots.description())))\n }\n\n return h(\n 'div',\n {\n class: containerClasses.value\n },\n children\n )\n }\n }\n})\n","import { defineComponent, computed, h, SlotsType } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { generateId, classNames } from '@/utils'\n\n/**\n * KRDS Radio 컴포넌트 속성\n */\nexport interface KrdsRadioProps extends BaseFormProps {\n /** 모델 값 */\n modelValue?: string | number | boolean\n /** 라디오 값 */\n value: string | number | boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 크기 */\n size?: 'medium' | 'large'\n /** Chip 스타일 여부 */\n chip?: boolean\n}\n\n/**\n * KRDS Radio 컴포넌트 이벤트\n */\nexport interface KrdsRadioEmits {\n (e: 'update:modelValue', value: string | number | boolean): void\n}\n\nexport default defineComponent<KrdsRadioProps>({\n name: 'KrdsRadio',\n props: {\n modelValue: {\n type: [String, Number, Boolean],\n default: undefined\n },\n value: {\n type: [String, Number, Boolean],\n required: true\n },\n disabled: {\n type: Boolean,\n default: false\n },\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n chip: {\n type: Boolean,\n default: false\n },\n name: {\n type: String,\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n default?: () => unknown // Default slot with props\n description?: () => unknown // Named slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n /**\n * 선택 상태 계산\n */\n const isChecked = computed(() => {\n return props.modelValue === props.value\n })\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const baseClass = props.chip ? 'krds-form-chip' : 'krds-form-check'\n return classNames(baseClass, props.size, props.class)\n })\n\n /**\n * 라디오 변경 핸들러\n */\n const handleChange = (event: Event) => {\n if (props.disabled) {\n return\n }\n\n const target = event.target as HTMLInputElement\n if (target.checked) {\n emit('update:modelValue', props.value)\n }\n }\n\n /**\n * input ID 생성\n */\n const inputId = computed(() => {\n return props.id || generateId('radio')\n })\n\n /**\n * name 속성 계산\n */\n const inputName = computed(() => {\n return props.name\n })\n\n return () => {\n const children = [\n h('input', {\n type: 'radio',\n id: inputId.value,\n name: inputName.value,\n value: String(props.value),\n checked: isChecked.value,\n disabled: props.disabled,\n onChange: handleChange,\n ...attrs\n }),\n h(\n 'label',\n {\n for: inputId.value\n },\n slots.default?.()\n )\n ]\n\n // description 슬롯이 있고 chip이 false일 때만 추가\n if (slots.description && !props.chip) {\n children.push(h('div', { class: 'krds-form-check-cnt' }, h('p', { class: 'krds-form-check-p' }, slots.description())))\n }\n\n return h(\n 'div',\n {\n class: containerClasses.value\n },\n children\n )\n }\n }\n})\n","import { defineComponent, provide, computed, ref, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS StepIndicator 컴포넌트 속성\n */\nexport interface KrdsStepIndicatorProps extends BaseComponentProps {\n /** 현재 활성 단계 인덱스 (0부터 시작) - v-model */\n modelValue?: number\n}\n\n/**\n * KRDS StepIndicator 컴포넌트 이벤트\n */\nexport interface KrdsStepIndicatorEmits {\n (e: 'update:modelValue', value: number): void\n}\n\nexport default defineComponent<KrdsStepIndicatorProps>({\n name: 'KrdsStepIndicator',\n props: {\n modelValue: {\n type: Number,\n default: 0\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue'],\n setup(props, { slots }) {\n /**\n * Stepper 클래스 계산\n */\n const stepperClasses = computed(() => {\n const classes = ['krds-step-wrap']\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 단계별 상태 계산\n */\n const getStepStatus = (index: number): 'done' | 'active' | 'pending' => {\n const currentStep = props.modelValue || 0\n if (index < currentStep) return 'done'\n if (index === currentStep) return 'active'\n return 'pending'\n }\n\n /**\n * 단계 인덱스 추적 (반응형)\n */\n const stepIndex = ref(0)\n const resetStepIndex = () => {\n stepIndex.value = 0\n }\n const getNextStepIndex = () => {\n return stepIndex.value++\n }\n\n /**\n * 컨텍스트 제공\n */\n provide('stepIndicator', {\n activeStep: computed(() => props.modelValue || 0),\n getStepStatus,\n getNextStepIndex,\n resetStepIndex\n })\n\n return () => {\n // 슬롯 기반 렌더링\n resetStepIndex() // 렌더링 시작 전 인덱스 초기화\n return h(\n 'ol',\n {\n class: stepperClasses.value\n },\n slots.default?.()\n )\n }\n }\n})\n","import { defineComponent, inject, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\nimport type { ComputedRef } from 'vue'\n\n/**\n * KRDS Step 컴포넌트 속성\n */\nexport interface KrdsStepProps extends BaseComponentProps {\n /** 단계 번호 */\n step: string | number\n /** 단계 제목 */\n title: string\n /** 단계 상태 강제 설정 (선택적) */\n status?: 'done' | 'active' | 'pending'\n}\n\n/**\n * KRDS Step 컴포넌트 이벤트\n */\nexport interface KrdsStepEmits {\n (e: 'click', event: MouseEvent, step: string | number): void\n}\n\n/**\n * Stepper 컨텍스트 타입\n */\ninterface StepIndicatorContext {\n activeStep: ComputedRef<number>\n getStepStatus: (index: number) => 'done' | 'active' | 'pending'\n getNextStepIndex: () => number\n resetStepIndex: () => void\n}\n\nexport default defineComponent<KrdsStepProps>({\n name: 'KrdsStep',\n props: {\n step: {\n type: [String, Number],\n required: true\n },\n title: {\n type: String,\n required: true\n },\n status: {\n type: String as () => 'done' | 'active' | 'pending',\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * StepIndicator 컨텍스트 주입 (선택적)\n */\n const stepIndicatorContext = inject<StepIndicatorContext | null>('stepIndicator')\n\n /**\n * 현재 단계의 인덱스 계산\n */\n const stepIndex = stepIndicatorContext ? stepIndicatorContext.getNextStepIndex() : -1\n\n /**\n * 단계 상태 계산\n */\n const stepStatus = computed(() => {\n // props로 상태가 직접 지정된 경우 우선 사용\n if (props.status) {\n return props.status\n }\n\n // StepIndicator 컨텍스트가 있으면 인덱스 기반으로 상태 계산\n if (stepIndicatorContext && stepIndex >= 0) {\n return stepIndicatorContext.getStepStatus(stepIndex)\n }\n\n // 기본값\n return 'pending'\n })\n\n /**\n * 단계 클래스 계산\n */\n const stepClasses = computed(() => {\n const classes: string[] = [stepStatus.value]\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event, props.step)\n }\n\n return () => {\n const isActive = stepStatus.value === 'active'\n\n return h(\n 'li',\n {\n class: stepClasses.value,\n onClick: handleClick\n },\n [\n h('span', [\n // 현재 단계 표시 (활성 상태일 때만)\n isActive && h('em', { class: 'sr-only' }, '현재단계'),\n // 단계 번호\n h('i', { class: 'step' }, props.step),\n // 단계 제목\n h('span', { class: 'step-tit' }, props.title),\n // 슬롯 내용 (추가 콘텐츠가 있는 경우)\n slots.default?.()\n ])\n ]\n )\n }\n }\n})\n","import { defineComponent, h, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS SkipLink 컴포넌트 속성\n */\nexport interface KrdsSkipLinkProps extends BaseComponentProps {\n /** 건너뛸 대상 요소의 ID */\n href: string\n}\n\n/**\n * KRDS SkipLink 컴포넌트\n *\n * 건너뛰기 링크는 웹사이트에서 웹 페이지의 주요 콘텐츠 섹션의 탐색을 도와주는 페이지 내부 링크입니다.\n * 키보드나 가상 초점을 이용하여 콘텐츠를 탐색하는 사용자는 건너뛰기 링크를 이용하여\n * 대부분의 페이지에서 반복되는 콘텐츠 영역을 건너뛰고 주요 콘텐츠로 빠르게 이동할 수 있습니다.\n *\n * @example\n * ```vue\n * <KrdsSkipLink href=\"#main-content\">본문 바로가기</KrdsSkipLink>\n * <KrdsSkipLink href=\"#breadcrumb\">본문 바로가기</KrdsSkipLink>\n * <KrdsSkipLink href=\"#gnb\">메인메뉴 바로가기</KrdsSkipLink>\n * ```\n */\nexport default defineComponent({\n name: 'KrdsSkipLink',\n props: {\n /**\n * 건너뛸 대상 요소의 ID\n * @example '#main-content', '#breadcrumb'\n */\n href: {\n type: String,\n required: true,\n validator: (value: string) => value.startsWith('#')\n },\n /**\n * 추가 CSS 클래스\n */\n class: {\n type: [String, Array, Object],\n default: undefined\n },\n /**\n * 요소 ID\n */\n id: {\n type: String,\n default: 'krds-skip-link'\n }\n },\n setup(props, { slots }) {\n return (): VNode => {\n return h(\n 'div',\n {\n id: props.id,\n class: props.class\n },\n [\n h(\n 'a',\n {\n href: props.href\n },\n slots.default?.()\n )\n ]\n )\n }\n }\n})\n","<template>\n <nav :id=\"id\" class=\"krds-breadcrumb-wrap\" :aria-label=\"ariaLabel\">\n <ol class=\"breadcrumb\">\n <li v-for=\"(item, index) in items\" :key=\"`breadcrumb-${index}`\" :class=\"{ home: index === 0 && showHomeIcon }\">\n <a\n :href=\"item.href || '#'\"\n class=\"txt\"\n :aria-current=\"isCurrentPage(index) ? 'page' : undefined\"\n @click=\"handleClick(item, $event)\"\n >\n <span v-if=\"!(index === 0 && showHomeIcon)\">{{ item.text }}</span>\n </a>\n </li>\n </ol>\n </nav>\n</template>\n\n<script setup lang=\"ts\">\n // ========================\n // 타입 정의\n // ========================\n\n /**\n * 브레드크럼 아이템 인터페이스\n */\n export interface BreadcrumbItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n }\n\n /**\n * KRDS Breadcrumb 컴포넌트 속성\n */\n export interface KrdsBreadcrumbProps {\n /** 브레드크럼 아이템 배열 */\n items: BreadcrumbItem[]\n /** 엘리먼트 ID */\n id?: string\n /** 접근성 라벨 */\n ariaLabel?: string\n /** 홈 아이콘 표시 여부 */\n showHomeIcon?: boolean\n }\n\n /**\n * KRDS Breadcrumb 컴포넌트 이벤트\n */\n export interface KrdsBreadcrumbEmits {\n 'item-click': [item: BreadcrumbItem, event: MouseEvent]\n }\n\n // ========================\n // Props & Emits\n // ========================\n\n const props = withDefaults(defineProps<KrdsBreadcrumbProps>(), {\n id: undefined,\n ariaLabel: '현재 경로',\n showHomeIcon: true\n })\n\n const emit = defineEmits<KrdsBreadcrumbEmits>()\n\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 현재 페이지 여부 확인\n */\n const isCurrentPage = (index: number) => index === props.items.length - 1\n\n // ========================\n // Event Handlers\n // ========================\n\n /**\n * 아이템 클릭 핸들러\n */\n const handleClick = (item: BreadcrumbItem, event: MouseEvent) => {\n // 커스텀 onClick 핸들러 실행\n if (item.onClick) {\n item.onClick(event)\n }\n\n // 상위로 이벤트 전달\n emit('item-click', item, event)\n }\n</script>\n","import { defineComponent, computed, h, ref, onMounted, onUnmounted, SlotsType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * 네비게이션 아이템 인터페이스\n */\nexport interface NavigationItem {\n /** 링크 URL (앵커 링크) */\n href: string\n /** 표시될 텍스트 */\n text: string\n /** 활성 상태 여부 */\n active?: boolean\n}\n\n/**\n * KRDS InPageNavigation 컴포넌트 속성\n */\nexport interface KrdsInPageNavigationProps extends BaseComponentProps {\n /** 네비게이션 제목 */\n title?: string\n /** 네비게이션 캡션 */\n caption?: string\n /** 네비게이션 아이템 목록 */\n items?: NavigationItem[]\n /** 스크롤에 따른 자동 활성화 여부 */\n autoActive?: boolean\n /** 헤더 상단 영역 선택자 (기본값: '#krds-masthead') */\n headerTopSelector?: string\n /** 헤더 내부 영역 선택자 (기본값: '#krds-header .header-in') */\n headerInnerSelector?: string\n}\n\n/**\n * KRDS InPageNavigation 컴포넌트 이벤트\n */\nexport interface KrdsInPageNavigationEmits {\n (e: 'itemClick', item: NavigationItem, event: MouseEvent | KeyboardEvent): void\n}\n\nexport default defineComponent<KrdsInPageNavigationProps>({\n name: 'KrdsInPageNavigation',\n props: {\n title: {\n type: String,\n default: undefined\n },\n caption: {\n type: String,\n default: '이 페이지의 구성'\n },\n items: {\n type: Array as () => NavigationItem[],\n default: () => []\n },\n autoActive: {\n type: Boolean,\n default: true\n },\n headerTopSelector: {\n type: String,\n default: '#krds-masthead'\n },\n headerInnerSelector: {\n type: String,\n default: '#krds-header .header-in'\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['itemClick'],\n slots: Object as SlotsType<{\n action?: () => unknown // Named slot without props\n }>,\n setup(props, { emit, slots }) {\n const activeItem = ref<string>('')\n const sectionElements = ref<Map<string, HTMLElement>>(new Map())\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const classes = ['krds-in-page-navigation-type']\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 헤더 높이 계산\n */\n const calculateHeaderHeight = () => {\n const headerTopSelector = props.headerTopSelector as string\n const headerInnerSelector = props.headerInnerSelector as string\n const headerTop = (document.querySelector(headerTopSelector) as HTMLElement)?.clientHeight || 0\n const headerInner = (document.querySelector(headerInnerSelector) as HTMLElement)?.clientHeight || 0\n return headerTop + headerInner\n }\n\n /**\n * 네비게이션 아이템 클릭 핸들러\n */\n const handleItemClick = (item: NavigationItem, event: MouseEvent | KeyboardEvent) => {\n emit('itemClick', item, event)\n\n // href가 앵커 링크인 경우 스크롤 처리\n if (item.href.startsWith('#')) {\n event.preventDefault()\n const targetElement = document.querySelector(item.href)\n if (targetElement) {\n const headerHeight = calculateHeaderHeight()\n\n window.scrollTo({\n left: 0,\n top: targetElement.getBoundingClientRect().top + window.scrollY - headerHeight,\n behavior: 'smooth'\n })\n\n activeItem.value = item.href\n\n // 키보드 네비게이션의 경우 포커스 이동 (접근성)\n if (event instanceof KeyboardEvent) {\n const focusable = targetElement.querySelector('.sec-tit, h1, h2, h3, h4, h5, h6')\n if (focusable && focusable instanceof HTMLElement) {\n focusable.setAttribute('tabindex', '-1')\n focusable.focus({ preventScroll: true })\n }\n }\n }\n }\n }\n\n /**\n * 섹션 요소들을 캐싱\n */\n const cacheSectionElements = () => {\n sectionElements.value.clear()\n\n if (!props.items) return\n\n props.items\n .filter(item => item.href.startsWith('#'))\n .forEach(item => {\n const element = document.querySelector(item.href) as HTMLElement | null\n if (element) {\n sectionElements.value.set(item.href, element)\n }\n })\n }\n\n /**\n * 스크롤에 따른 활성 아이템 업데이트\n */\n const updateActiveItem = () => {\n if (!props.autoActive || !props.items || sectionElements.value.size === 0) return\n\n const winHeight = window.innerHeight\n const topHeight = Math.ceil(winHeight / 5) // 윈도우의 20%\n const scrollBottom = window.scrollY + winHeight\n const scrollHeight = document.body.scrollHeight\n\n // 캐싱된 요소들을 사용\n const sections = props.items\n .filter(item => item.href.startsWith('#') && sectionElements.value.has(item.href))\n .map(item => ({\n href: item.href,\n element: sectionElements.value.get(item.href)!,\n item\n }))\n\n if (sections.length === 0) return\n\n const firstSection = sections[0]\n const lastSection = sections[sections.length - 1]\n const firstSecTop = firstSection.element.offsetTop\n\n let newActiveItem = ''\n\n // 스크롤이 페이지 끝에 도달했을 때\n if (scrollBottom >= scrollHeight) {\n newActiveItem = lastSection.href\n }\n // 스크롤이 첫번째 섹션보다 위에 있을때\n else if (window.scrollY <= firstSecTop) {\n newActiveItem = firstSection.href\n }\n // 현재 섹션 확인\n else {\n for (const section of sections) {\n const sectionHeight = section.element.offsetHeight\n const sectionTop = section.element.offsetTop - topHeight\n\n if (window.scrollY > sectionTop && window.scrollY <= sectionTop + sectionHeight) {\n newActiveItem = section.href\n break\n }\n }\n }\n\n // 활성 아이템 업데이트\n if (newActiveItem && newActiveItem !== activeItem.value) {\n activeItem.value = newActiveItem\n }\n }\n\n /**\n * 초기 활성 아이템 설정\n */\n const initActiveItem = () => {\n if (!props.items) return\n\n const activeFromProps = props.items.find(item => item.active)\n if (activeFromProps) {\n activeItem.value = activeFromProps.href\n } else if (props.items.length > 0) {\n activeItem.value = props.items[0].href\n }\n }\n\n /**\n * 컴포넌트 마운트 시 초기화\n */\n onMounted(() => {\n initActiveItem()\n\n if (props.autoActive) {\n // 섹션 요소들을 미리 캐싱\n cacheSectionElements()\n updateActiveItem()\n window.addEventListener('scroll', updateActiveItem, { passive: true })\n\n // DOM 변경 감지를 위한 MutationObserver 설정 (선택사항)\n const observer = new MutationObserver(() => {\n cacheSectionElements()\n })\n\n // body 태그의 자식 요소 변경을 감지\n observer.observe(document.body, {\n childList: true,\n subtree: true\n })\n\n // cleanup 함수에서 observer도 정리하도록 설정\n onUnmounted(() => {\n observer.disconnect()\n })\n }\n })\n\n /**\n * 컴포넌트 언마운트 시 정리\n */\n onUnmounted(() => {\n if (props.autoActive) {\n window.removeEventListener('scroll', updateActiveItem)\n // 캐싱된 요소들 정리\n sectionElements.value.clear()\n }\n })\n\n /**\n * 네비게이션 헤더 렌더링\n */\n const renderHeader = () => {\n if (!props.caption && !props.title) return null\n\n return h('div', { class: 'in-page-navigation-header' }, [\n props.caption && h('p', { class: 'quick-caption' }, props.caption),\n props.title && h('p', { class: 'quick-title' }, props.title)\n ])\n }\n\n /**\n * 네비게이션 리스트 렌더링\n */\n const renderNavList = () => {\n if (!props.items) return null\n\n const listItems = props.items.map(item => {\n // 활성 상태 결정: autoActive 시 스크롤 기반, 아니면 active 속성 포함\n const isActive = activeItem.value === item.href || (!props.autoActive && item.active)\n\n return h('li', { key: item.href }, [\n h(\n 'a',\n {\n href: item.href,\n class: isActive ? 'active' : '',\n onClick: (event: MouseEvent) => handleItemClick(item, event),\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleItemClick(item, event)\n }\n }\n },\n item.text\n )\n ])\n })\n\n return h('nav', { class: 'in-page-navigation-list' }, [h('ul', {}, listItems)])\n }\n\n /**\n * 액션 영역 렌더링\n */\n const renderAction = () => {\n if (!slots.action) return null\n\n return h('div', { class: 'in-page-navigation-action' }, [slots.action()])\n }\n\n return () =>\n h('div', { class: containerClasses.value }, [\n h('div', { class: 'krds-in-page-navigation-area' }, [renderHeader(), renderNavList(), renderAction()].filter(Boolean))\n ])\n }\n})\n","<template>\n <div :id=\"id\" class=\"krds-pagination\">\n <!-- 이전 버튼 -->\n <component\n :is=\"prevDisabled ? 'span' : 'a'\"\n :href=\"prevDisabled ? undefined : prevHref\"\n :class=\"['page-navi', 'prev', { disabled: prevDisabled }]\"\n @click=\"handlePrevClick\"\n >\n 이전\n </component>\n\n <!-- 페이지 링크 -->\n <div class=\"page-links\">\n <template v-for=\"item in displayedPages\" :key=\"item.key\">\n <!-- 일반 페이지 링크 -->\n <a\n v-if=\"item.type === 'page'\"\n :href=\"item.href || '#'\"\n :class=\"['page-link', { active: item.page === currentPage }]\"\n :aria-current=\"item.page === currentPage ? 'page' : undefined\"\n @click=\"handlePageClick(item.page!, $event)\"\n >\n <span v-if=\"item.page === currentPage\" v-sr-only>현재페이지</span>\n {{ item.page }}\n </a>\n\n <!-- 생략 표시(점점점) -->\n <span v-else-if=\"item.type === 'ellipsis'\" class=\"page-link link-dot\" :aria-label=\"item.ariaLabel\"></span>\n </template>\n </div>\n\n <!-- 다음 버튼 -->\n <component\n :is=\"nextDisabled ? 'span' : 'a'\"\n :href=\"nextDisabled ? undefined : nextHref\"\n :class=\"['page-navi', 'next', { disabled: nextDisabled }]\"\n @click=\"handleNextClick\"\n >\n 다음\n </component>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n\n // ========================\n // 타입 정의\n // ========================\n\n /**\n * 페이지 아이템 타입\n */\n interface PageItem {\n type: 'page' | 'ellipsis'\n key: string\n page?: number\n href?: string\n ariaLabel?: string\n }\n\n /**\n * KRDS Pagination 컴포넌트 속성\n */\n export interface KrdsPaginationProps {\n /** 현재 페이지 번호 (v-model) */\n modelValue?: number\n /** 최소 페이지 번호 (기본값: 1, 최소값: 1) */\n min?: number\n /** 최대 페이지 번호 (전체 페이지 수) */\n max: number\n /** 엘리먼트 ID */\n id?: string\n /** 접근성 라벨 */\n ariaLabel?: string\n /** 표시할 페이지 범위 */\n pageRange?: number\n }\n\n /**\n * KRDS Pagination 컴포넌트 이벤트\n */\n export interface KrdsPaginationEmits {\n /** v-model 업데이트 이벤트 */\n 'update:modelValue': [value: number]\n }\n\n // ========================\n // Props & Emits\n // ========================\n\n const props = withDefaults(defineProps<KrdsPaginationProps>(), {\n modelValue: 1,\n min: 1,\n id: undefined,\n ariaLabel: '페이지 내비게이션',\n pageRange: 8\n })\n\n const emit = defineEmits<KrdsPaginationEmits>()\n\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 최소 페이지 번호 (1보다 작을 수 없음)\n */\n const minPage = computed(() => Math.max(1, props.min))\n\n /**\n * 현재 페이지 값 (v-model 처리)\n */\n const currentPage = computed(() => props.modelValue ?? minPage.value)\n\n /**\n * 이전 페이지 비활성화 여부\n */\n const prevDisabled = computed(() => currentPage.value <= minPage.value)\n\n /**\n * 다음 페이지 비활성화 여부\n */\n const nextDisabled = computed(() => currentPage.value >= props.max)\n\n /**\n * 이전 페이지 URL\n */\n const prevHref = computed(() => {\n if (prevDisabled.value) return undefined\n return '#'\n })\n\n /**\n * 다음 페이지 URL\n */\n const nextHref = computed(() => {\n if (nextDisabled.value) return undefined\n return '#'\n })\n\n /**\n * 표시할 페이지 목록 계산\n */\n const displayedPages = computed((): PageItem[] => {\n const { pageRange, max: totalPages } = props\n const boundaryRange = 1\n const pages: PageItem[] = []\n\n if (totalPages <= pageRange + 2 * boundaryRange) {\n // 모든 페이지를 표시할 수 있는 경우\n for (let i = minPage.value; i <= totalPages; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n } else {\n // 생략이 필요한 경우\n const leftBoundary = Math.min(boundaryRange, totalPages)\n const rightBoundary = Math.max(totalPages - boundaryRange + 1, 1)\n\n const rangeStart = Math.max(minPage.value, currentPage.value - Math.floor(pageRange / 2))\n const rangeEnd = Math.min(totalPages, rangeStart + pageRange - 1)\n const adjustedRangeStart = Math.max(minPage.value, rangeEnd - pageRange + 1)\n\n // 왼쪽 경계 페이지들\n for (let i = minPage.value; i <= leftBoundary; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n\n // 왼쪽 생략\n if (adjustedRangeStart > leftBoundary + 1) {\n pages.push({\n type: 'ellipsis',\n key: 'ellipsis-left',\n ariaLabel: '페이지 생략'\n })\n }\n\n // 중앙 범위 페이지들\n const startPage = Math.max(adjustedRangeStart, leftBoundary + 1)\n const endPage = Math.min(rangeEnd, rightBoundary - 1)\n\n for (let i = startPage; i <= endPage; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n\n // 오른쪽 생략\n if (rangeEnd < rightBoundary - 1) {\n pages.push({\n type: 'ellipsis',\n key: 'ellipsis-right',\n ariaLabel: '페이지 생략'\n })\n }\n\n // 오른쪽 경계 페이지들\n for (let i = rightBoundary; i <= totalPages; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n }\n\n return pages\n })\n\n // ========================\n // Event Handlers\n // ========================\n\n /**\n * 페이지 클릭 핸들러\n */\n const handlePageClick = (page: number, event: MouseEvent) => {\n if (page === currentPage.value) {\n event.preventDefault()\n return\n }\n\n emit('update:modelValue', page)\n }\n\n /**\n * 이전 페이지 클릭 핸들러\n */\n const handlePrevClick = (event: MouseEvent) => {\n if (prevDisabled.value) {\n event.preventDefault()\n return\n }\n\n const prevPage = currentPage.value - 1\n emit('update:modelValue', prevPage)\n }\n\n /**\n * 다음 페이지 클릭 핸들러\n */\n const handleNextClick = (event: MouseEvent) => {\n if (nextDisabled.value) {\n event.preventDefault()\n return\n }\n\n const nextPage = currentPage.value + 1\n emit('update:modelValue', nextPage)\n }\n</script>\n","<template>\n <div class=\"inner help-panel-flexible\">\n <button type=\"button\" class=\"krds-btn small tertiary btn-help-panel expand btn-help-exec\" @click=\"handleOpen\">\n <i class=\"svg-icon ico-fold\"></i>\n 도움말\n </button>\n <div class=\"krds-help-panel\" :class=\"{ expand: open }\">\n <div class=\"help-panel-wrap\">\n <div class=\"help-conts-area\">\n <slot />\n <button type=\"button\" class=\"krds-btn small tertiary btn-help-panel fold\" @click=\"handleClose\">\n <span class=\"sr-only\">도움말</span>\n 접어두기\n <i class=\"svg-icon ico-angle right\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n\n export interface KrdsPanelProps {\n modelValue?: boolean\n }\n\n interface Emits {\n (e: 'update:modelValue', value: boolean): void\n }\n\n const props = withDefaults(defineProps<KrdsPanelProps>(), {\n modelValue: false\n })\n\n const emit = defineEmits<Emits>()\n\n const open = computed({\n get: () => props.modelValue,\n set: value => emit('update:modelValue', value)\n })\n\n const handleOpen = () => {\n open.value = true\n }\n const handleClose = () => {\n open.value = false\n }\n</script>\n\n<style scoped></style>\n","<template>\n <div ref=\"containerRef\" class=\"krds-contextual-help\" :class=\"props.position\">\n <div class=\"tooltip-action\">\n <button ref=\"tooltipBtnRef\" type=\"button\" class=\"krds-btn medium icon tooltip-btn\" @click=\"toggleTooltip\">\n <span class=\"sr-only\">도움말</span>\n <i v-if=\"props.helpIcon\" class=\"svg-icon ico-help\"></i>\n <i v-else class=\"svg-icon ico-tooltip\"></i>\n </button>\n <div ref=\"tooltipPopoverRef\" class=\"tooltip-popover\" role=\"tooltip\">\n <h4 class=\"tooltip-title\">{{ props.tooltipTitle }}</h4>\n <div class=\"tooltip-contents\">\n <slot />\n </div>\n <button ref=\"closeBtnRef\" type=\"button\" class=\"krds-btn xsmall icon tooltip-close\" @click=\"closeTooltip\">\n <span class=\"sr-only\">닫기</span>\n <i class=\"svg-icon ico-modal-close\"></i>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, onMounted, onUnmounted } from 'vue'\n\n export interface KrdsContextualHelpProps {\n tooltipTitle?: string\n helpIcon?: boolean\n position?: 'top left' | 'top center' | 'top right' | 'bottom left' | 'bottom center' | 'bottom right'\n }\n\n const props = withDefaults(defineProps<KrdsContextualHelpProps>(), {\n tooltipTitle: '도움말 제목',\n position: 'top left'\n })\n\n // Template refs\n const containerRef = ref<HTMLElement>()\n const tooltipBtnRef = ref<HTMLElement>()\n const tooltipPopoverRef = ref<HTMLElement>()\n const closeBtnRef = ref<HTMLElement>()\n\n // State\n const isVisible = ref(false)\n\n // Methods\n const toggleTooltip = () => {\n const wasVisible = isVisible.value\n closeAllTooltips()\n\n if (!wasVisible) {\n showTooltip()\n }\n }\n\n const showTooltip = () => {\n if (!tooltipPopoverRef.value || !tooltipBtnRef.value) return\n\n isVisible.value = true\n tooltipPopoverRef.value.style.display = 'block'\n tooltipBtnRef.value.setAttribute('aria-expanded', 'true')\n\n // Focus first focusable element\n const focusables = tooltipPopoverRef.value.querySelector('a, button, [tabindex=\"0\"], input, textarea, select') as HTMLElement\n focusables?.focus()\n\n adjustTooltipPosition()\n }\n\n const closeTooltip = () => {\n if (!tooltipPopoverRef.value || !tooltipBtnRef.value) return\n\n isVisible.value = false\n tooltipPopoverRef.value.style.display = 'none'\n tooltipBtnRef.value.setAttribute('aria-expanded', 'false')\n }\n\n const closeAllTooltips = () => {\n // Close all tooltips in the document\n const allPopovers = document.querySelectorAll('.krds-contextual-help .tooltip-popover') as NodeListOf<HTMLElement>\n const allButtons = document.querySelectorAll('.krds-contextual-help .tooltip-btn') as NodeListOf<HTMLElement>\n\n allPopovers.forEach(popover => {\n popover.style.display = 'none'\n })\n allButtons.forEach(button => {\n button.setAttribute('aria-expanded', 'false')\n })\n\n isVisible.value = false\n }\n\n const adjustTooltipPosition = () => {\n if (!containerRef.value || !tooltipPopoverRef.value) return\n\n const isMobile = window.innerWidth <= 768\n const tooltipAction = containerRef.value.querySelector('.tooltip-action') as HTMLElement\n\n if (isMobile) {\n const rootStyles = getComputedStyle(document.querySelector(':root')!)\n const contentsPaddingX = rootStyles.getPropertyValue('--krds-contents-padding-x').trim().split('px')[0]\n const tooltipActionRect = tooltipAction.getBoundingClientRect()\n const offsetLeft = tooltipActionRect.left - parseInt(contentsPaddingX)\n const width = document.body.clientWidth - parseInt(contentsPaddingX) * 2\n tooltipPopoverRef.value.style.left = `-${offsetLeft}px`\n tooltipPopoverRef.value.style.width = `${width}px`\n } else {\n tooltipPopoverRef.value.style.left = ''\n tooltipPopoverRef.value.style.right = ''\n tooltipPopoverRef.value.style.width = '360px'\n }\n }\n\n // Event handlers\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.key === 'Esc') {\n closeAllTooltips()\n }\n }\n\n const handleOutsideClick = (event: Event) => {\n const target = event.target as Element\n const clickedInsideTooltip = target.closest('.tooltip-action')\n if (!clickedInsideTooltip) {\n closeAllTooltips()\n }\n }\n\n const handleResize = () => {\n if (isVisible.value) {\n adjustTooltipPosition()\n }\n }\n\n // Lifecycle\n onMounted(() => {\n if (!containerRef.value) return\n\n // Setup ARIA attributes\n if (tooltipBtnRef.value) {\n tooltipBtnRef.value.setAttribute('aria-expanded', 'false')\n }\n if (tooltipPopoverRef.value) {\n tooltipPopoverRef.value.setAttribute('role', 'tooltip')\n }\n\n // Add global event listeners\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('click', handleOutsideClick)\n window.addEventListener('resize', handleResize)\n })\n\n onUnmounted(() => {\n // Clean up global event listeners\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleOutsideClick)\n window.removeEventListener('resize', handleResize)\n })\n</script>\n<style scoped></style>\n","<template>\n <!-- coach mark -->\n <div class=\"krds-coach-mark\" :class=\"coachMarkClass\" :style=\"style\">\n <!-- 따라하기 말풍선 -->\n <div v-if=\"modelValue === activeStep && currentStepData\" class=\"coach-balloon\">\n <h5 class=\"sr-only\">따라하기 가이드</h5>\n <h6 class=\"coach-tit\">{{ activeStep }}단계 : {{ currentStepData.title }}</h6>\n <p class=\"desc\">{{ currentStepData.description }}</p>\n <div class=\"coach-controls\">\n <div class=\"num\">\n <span class=\"sr-only\">현재 단계</span>\n <strong>{{ activeStep }}</strong>\n <span class=\"sr-only\">총 단계</span>\n <span>{{ stepsData.length }}</span>\n </div>\n <div class=\"btn-wrap\">\n <button type=\"button\" class=\"krds-btn small text\" @click=\"closeCoachMark\">그만보기</button>\n <button v-if=\"activeStep !== 1\" type=\"button\" class=\"krds-btn small text\" @click=\"prevStep\">이전으로</button>\n <button v-if=\"activeStep !== stepsData.length\" type=\"button\" class=\"krds-btn small tertiary\" @click=\"nextStep\">다음으로</button>\n </div>\n </div>\n </div>\n <!--// 따라하기 말풍선 -->\n\n <!-- 코치 마크 내용 -->\n <slot name=\"coach-mark-content\" />\n <!-- //코치 마크 내용 -->\n </div>\n <!-- coach mark -->\n</template>\n\n<script setup lang=\"ts\">\n import { BaseComponentProps } from '@/types'\n import { computed } from 'vue'\n\n type StepsData = { id: number; title: string; description: string }\n\n export interface KrdsCoachMarkProps extends BaseComponentProps {\n coachMarkClass?: string | string[]\n stepsData: StepsData[]\n activeStep: number\n modelValue?: number | null\n }\n\n const props = withDefaults(defineProps<KrdsCoachMarkProps>(), {\n coachMarkClass: '',\n modelValue: null\n })\n\n const currentStepData = computed(() => {\n const index = props.activeStep - 1\n if (props.stepsData && index >= 0 && index < props.stepsData.length) {\n return props.stepsData[index]\n }\n return null\n })\n\n const emit = defineEmits<{\n 'update:modelValue': [value: number | null]\n close: []\n }>()\n\n const prevStep = () => {\n if (props.activeStep > 1) {\n emit('update:modelValue', props.activeStep - 1)\n }\n }\n\n const nextStep = () => {\n if (props.activeStep < props.stepsData.length) {\n emit('update:modelValue', props.activeStep + 1)\n }\n }\n\n const closeCoachMark = () => {\n emit('close')\n }\n</script>\n\n<style scoped></style>\n","<template>\n <div ref=\"containerRef\">\n <button\n type=\"button\"\n :class=\"tooltipClasses\"\n :disabled=\"disabled\"\n :aria-labelledby=\"popoverId\"\n @mouseover=\"showTooltip\"\n @mouseout=\"hideTooltip\"\n @focusin=\"showTooltip\"\n @focusout=\"hideTooltip\"\n >\n <slot />\n </button>\n <div\n v-show=\"isTooltipVisible\"\n :id=\"popoverId\"\n ref=\"popoverRef\"\n class=\"krds-tooltip-popover\"\n :class=\"popoverClasses\"\n :style=\"popoverStyle\"\n :aria-hidden=\"!isTooltipVisible\"\n role=\"tooltip\"\n >\n <span class=\"sr-only\">{{ buttonText }}</span>\n {{ tooltipContent }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'\n import { BaseComponentProps } from '@/types'\n\n type TooltipType = 'default' | 'icon' | 'button'\n\n export interface KrdsTooltipProps extends BaseComponentProps {\n type?: TooltipType\n tooltipContent: string\n vertical?: boolean\n box?: boolean\n disabled?: boolean\n }\n\n const props = withDefaults(defineProps<KrdsTooltipProps>(), {\n type: 'default',\n disabled: false\n })\n\n const containerRef = ref<HTMLElement | null>(null)\n const popoverRef = ref<HTMLElement | null>(null)\n const isTooltipVisible = ref(false)\n const popoverStyle = ref<Record<string, string>>({})\n const popoverId = ref(`tooltip-popover-${Math.random().toString(36).substring(2, 9)}`)\n const isMobile = ref(false)\n\n const tooltipClasses = computed(() => {\n const classes: string[] = ['krds-btn', 'krds-tooltip']\n\n if (props.type === 'default') {\n classes.push('small', 'text')\n } else if (props.type === 'icon') {\n classes.push('icon')\n } else if (props.type === 'button') {\n classes.push('')\n }\n\n if (!props.box && props.vertical) {\n classes.push('tooltip-vertical')\n }\n\n if (props.box && !props.vertical) {\n classes.push('tooltip-box')\n }\n\n return classes.join(' ')\n })\n\n const popoverClasses = computed(() => {\n const classes: string[] = []\n\n if (props.box) {\n classes.push('tooltip-box')\n }\n\n if (props.vertical) {\n classes.push('tooltip-vertical')\n }\n\n if (isTooltipVisible.value) {\n classes.push('active')\n }\n\n return classes\n })\n\n const buttonText = computed(() => {\n return containerRef.value?.querySelector('button')?.textContent?.trim() || ''\n })\n\n const checkIsMobile = () => {\n return window.innerWidth <= 768\n }\n\n const calculateTooltipPosition = () => {\n if (!containerRef.value || !popoverRef.value) return\n\n const button = containerRef.value.querySelector('button')\n if (!button) return\n\n const tooltipGap = 12\n const { clientHeight: tooltipHeight, clientWidth: tooltipWidth } = popoverRef.value\n const { top: itemTop, left: itemLeft, right: itemRight, height: itemHeight, width: itemWidth } = button.getBoundingClientRect()\n const halfWindowWidth = window.innerWidth / 2\n const halfWindowHeight = window.innerHeight / 2\n\n let tooltipTop: number\n let tooltipLeft: number\n const classes: string[] = []\n\n const isVertical = isMobile.value || props.box || props.vertical\n\n if (isVertical) {\n if (itemTop + itemHeight > halfWindowHeight) {\n tooltipTop = itemTop - tooltipHeight - tooltipGap\n classes.push('top')\n } else {\n tooltipTop = itemTop + itemHeight + tooltipGap\n classes.push('bottom')\n }\n\n if (itemLeft + itemWidth > halfWindowWidth) {\n tooltipLeft = itemRight - tooltipWidth\n classes.push('right')\n if (window.innerWidth - (itemLeft + itemWidth) > tooltipWidth / 2) {\n tooltipLeft = itemLeft + (itemWidth - tooltipWidth) / 2\n classes.splice(classes.indexOf('right'), 1)\n }\n } else {\n tooltipLeft = itemLeft + (itemWidth - tooltipWidth) / 2\n if (tooltipLeft < 0) {\n tooltipLeft = itemLeft\n classes.push('left')\n }\n }\n } else {\n tooltipTop = itemTop + (itemHeight - tooltipHeight) / 2\n if (itemLeft + itemWidth > halfWindowWidth) {\n tooltipLeft = itemLeft - tooltipWidth - tooltipGap\n classes.push('right')\n } else {\n tooltipLeft = itemRight + tooltipGap\n }\n }\n\n const mobileSmall = window.innerWidth <= 420\n popoverStyle.value = {\n top: `${tooltipTop}px`,\n left: mobileSmall ? '50%' : `${tooltipLeft}px`,\n transform: mobileSmall ? 'translateX(-50%)' : 'none'\n }\n\n if (popoverRef.value) {\n popoverRef.value.className = `krds-tooltip-popover ${classes.join(' ')} ${popoverClasses.value.join(' ')}`\n }\n }\n\n const showTooltip = async () => {\n if (props.disabled || !props.tooltipContent) return\n\n isTooltipVisible.value = true\n\n await nextTick()\n calculateTooltipPosition()\n }\n\n const hideTooltip = () => {\n isTooltipVisible.value = false\n popoverStyle.value = {}\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n if ((event.key === 'Escape' || event.key === 'Esc') && isTooltipVisible.value) {\n hideTooltip()\n }\n }\n\n const handleResize = () => {\n isMobile.value = checkIsMobile()\n if (isTooltipVisible.value) {\n hideTooltip()\n }\n }\n\n const handleScroll = () => {\n if (isTooltipVisible.value) {\n hideTooltip()\n }\n }\n\n onMounted(() => {\n isMobile.value = checkIsMobile()\n\n document.addEventListener('keydown', handleKeydown)\n window.addEventListener('scroll', handleScroll)\n window.addEventListener('resize', handleResize)\n })\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown)\n window.removeEventListener('scroll', handleScroll)\n window.removeEventListener('resize', handleResize)\n })\n</script>\n\n<style scoped></style>\n","<template>\n <!-- language switcher -->\n <div\n ref=\"dropdownRef\"\n class=\"krds-drop-wrap krds-language\"\n :class=\"{\n active: isOpen,\n 'drop-left': props.dropPosition === 'left',\n 'drop-right': props.dropPosition === 'right'\n }\"\n @focusout=\"handleFocusOut\"\n >\n <button\n ref=\"buttonRef\"\n type=\"button\"\n class=\"krds-btn small text drop-btn\"\n :class=\"{ active: isOpen }\"\n :aria-expanded=\"isOpen\"\n @click=\"toggleDropdown\"\n >\n <i class=\"svg-icon ico-global\"></i>\n <slot />\n <i class=\"svg-icon ico-toggle\"></i>\n </button>\n <div class=\"drop-menu\" :style=\"{ display: isOpen ? 'block' : 'none' }\">\n <div class=\"drop-in\">\n <div v-if=\"$slots['prev-item']\" class=\"drop-top\">\n <slot name=\"prev-item\" />\n </div>\n <!-- 기본 타입 (언어 선택) -->\n <ul v-if=\"props.type === 'default'\" class=\"drop-list\">\n <li v-for=\"language in languageList\" :key=\"language.code\">\n <a\n href=\"#\"\n class=\"item-link\"\n :class=\"{ active: props.modelValue === language.code }\"\n :lang=\"language.code\"\n :aria-selected=\"props.modelValue === language.code\"\n @click.prevent=\"selectLanguage(language.code)\"\n @focus=\"handleItemFocus\"\n >\n {{ language.name }}\n <span class=\"sr-only\">{{ props.modelValue === language.code ? '선택됨' : '' }}</span>\n </a>\n </li>\n </ul>\n\n <!-- 외부 페이지 이동 타입 -->\n <ul v-else-if=\"props.type === 'external'\" class=\"drop-list\">\n <li v-for=\"language in languageList\" :key=\"language.code\">\n <a\n :href=\"language.url || '#'\"\n class=\"item-link\"\n :lang=\"language.code\"\n target=\"_blank\"\n title=\"새 창 열림\"\n @focus=\"handleItemFocus\"\n >\n {{ language.name }}\n <i class=\"svg-icon ico-go\"></i>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <!-- //language switcher -->\n</template>\n\n<script setup lang=\"ts\">\n import { ref, onUnmounted, watch } from 'vue'\n import { BaseComponentProps } from '@/types'\n\n export type LanguageData = { code: string; name: string; url?: string }\n\n export type DropdownPosition = 'left' | 'center' | 'right'\n\n export interface KrdsLanguageSwitcherProps extends BaseComponentProps {\n languageList: LanguageData[]\n modelValue?: string\n type?: 'default' | 'external'\n dropPosition?: DropdownPosition\n }\n\n const props = withDefaults(defineProps<KrdsLanguageSwitcherProps>(), {\n modelValue: '',\n type: 'default',\n dropPosition: 'center'\n })\n\n const emit = defineEmits<{\n 'update:modelValue': [value: string]\n close: []\n }>()\n\n const isOpen = ref(false)\n const dropdownRef = ref<HTMLElement>()\n const buttonRef = ref<HTMLElement>()\n\n const toggleDropdown = () => {\n isOpen.value = !isOpen.value\n\n if (isOpen.value && dropdownRef.value) {\n positionDropdown()\n }\n }\n\n const closeDropdown = () => {\n isOpen.value = false\n }\n\n const selectLanguage = (languageCode: string) => {\n emit('update:modelValue', languageCode)\n closeDropdown()\n emit('close')\n buttonRef.value?.focus()\n }\n\n const positionDropdown = () => {\n if (!dropdownRef.value) return\n\n const menu = dropdownRef.value.querySelector('.drop-menu') as HTMLElement\n if (!menu) return\n\n const menuRect = menu.getBoundingClientRect()\n const windowWidth = window.innerWidth\n\n dropdownRef.value.classList.remove('drop-left', 'drop-right')\n\n if (menuRect.left < 0) {\n dropdownRef.value.classList.add('drop-left')\n } else if (windowWidth < menuRect.left + menuRect.width) {\n dropdownRef.value.classList.add('drop-right')\n }\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeDropdown()\n buttonRef.value?.focus()\n }\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!dropdownRef.value?.contains(event.target as Node)) {\n closeDropdown()\n }\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n if (!dropdownRef.value?.contains(event.relatedTarget as Node)) {\n closeDropdown()\n }\n }\n\n const handleItemFocus = (event: FocusEvent) => {\n if (!dropdownRef.value) return\n\n const items = dropdownRef.value.querySelectorAll('.drop-list .item-link') as NodeListOf<HTMLElement>\n items.forEach(item => {\n item.style.position = 'relative'\n item.style.zIndex = '0'\n })\n\n const currentItem = event.target as HTMLElement\n currentItem.style.zIndex = '1'\n }\n\n watch(isOpen, isDropdownOpen => {\n if (isDropdownOpen) {\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('click', handleClickOutside)\n } else {\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n }\n })\n\n onUnmounted(() => {\n // 컴포넌트가 제거될 때 리스너가 남아있지 않도록 보장합니다.\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n })\n</script>\n\n<style scoped></style>\n","<template>\n <!-- resize -->\n <div ref=\"dropdownRef\" class=\"krds-drop-wrap krds-resize\" data-adjust=\"scale\" @focusout=\"handleFocusOut\">\n <button ref=\"buttonRef\" type=\"button\" class=\"krds-btn small text drop-btn\" @click=\"toggleDropdown\">\n 화면크기\n <i class=\"svg-icon ico-toggle\"></i>\n </button>\n <div class=\"drop-menu\" :style=\"{ display: isOpen ? 'block' : 'none' }\">\n <div class=\"drop-in\">\n <ul class=\"drop-list\">\n <li v-for=\"scale in scaleList\" :key=\"scale.key\">\n <button\n type=\"button\"\n class=\"item-link\"\n :class=\"[scale.key, scale.key === selectedSize ? 'active' : '']\"\n :data-adjust-scale=\"scale.key\"\n @click.prevent=\"selectSize(scale)\"\n @focus=\"handleItemFocus\"\n >\n {{ scale.label }}\n </button>\n </li>\n </ul>\n <div class=\"drop-bottom\">\n <button type=\"button\" class=\"krds-btn medium text\" data-adjust-scale=\"md\" @click.prevent=\"resetSize\" @focus=\"handleItemFocus\">\n <i class=\"svg-icon ico-reset\"></i>\n 초기화\n </button>\n </div>\n </div>\n </div>\n </div>\n <!-- //resize -->\n</template>\n\n<script setup lang=\"ts\">\n import { onUnmounted, ref, watch } from 'vue'\n\n export interface KrdsResizeEmits {\n 'update:modelValue': [value: string]\n close: []\n }\n\n interface ScaleProps {\n key: 'sm' | 'md' | 'lg' | 'xlg' | 'xxlg'\n label: string\n zoom: string\n }\n\n const emit = defineEmits<KrdsResizeEmits>()\n\n const isOpen = ref(false)\n const dropdownRef = ref<HTMLElement>()\n const buttonRef = ref<HTMLElement>()\n const selectedSize = ref('md')\n\n const scaleList: ScaleProps[] = [\n { key: 'sm', label: '작게', zoom: '0.9' },\n { key: 'md', label: '보통', zoom: '1' },\n { key: 'lg', label: '조금 크게', zoom: '1.1' },\n { key: 'xlg', label: '크게', zoom: '1.3' },\n { key: 'xxlg', label: '가장 크게', zoom: '1.5' }\n ]\n\n const toggleDropdown = () => {\n isOpen.value = !isOpen.value\n\n if (isOpen.value && dropdownRef.value) {\n positionDropdown()\n }\n }\n\n const closeDropdown = () => {\n isOpen.value = false\n }\n\n const selectSize = (scale: ScaleProps) => {\n closeDropdown()\n emit('close')\n buttonRef.value?.focus()\n selectedSize.value = scale.key\n document.body.style.zoom = scale?.zoom\n }\n\n const resetSize = () => {\n const defaultScale = scaleList.find(scale => scale.key === 'md')\n if (defaultScale) {\n selectSize(defaultScale)\n }\n }\n\n const positionDropdown = () => {\n if (!dropdownRef.value) return\n\n const menu = dropdownRef.value.querySelector('.drop-menu') as HTMLElement\n if (!menu) return\n\n const menuRect = menu.getBoundingClientRect()\n const windowWidth = window.innerWidth\n\n dropdownRef.value.classList.remove('drop-left', 'drop-right')\n\n if (menuRect.left < 0) {\n dropdownRef.value.classList.add('drop-left')\n } else if (windowWidth < menuRect.left + menuRect.width) {\n dropdownRef.value.classList.add('drop-right')\n }\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeDropdown()\n buttonRef.value?.focus()\n }\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!dropdownRef.value?.contains(event.target as Node)) {\n closeDropdown()\n }\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n if (!dropdownRef.value?.contains(event.relatedTarget as Node)) {\n closeDropdown()\n }\n }\n\n const handleItemFocus = (event: FocusEvent) => {\n if (!dropdownRef.value) return\n\n const items = dropdownRef.value.querySelectorAll('.drop-list .item-link') as NodeListOf<HTMLElement>\n items.forEach(item => {\n item.style.position = 'relative'\n item.style.zIndex = '0'\n })\n\n const currentItem = event.target as HTMLElement\n currentItem.style.zIndex = '1'\n }\n\n watch(isOpen, isDropdownOpen => {\n if (isDropdownOpen) {\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('click', handleClickOutside)\n } else {\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n }\n })\n\n onUnmounted(() => {\n // 컴포넌트가 제거될 때 리스너가 남아있지 않도록 보장합니다.\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n })\n</script>\n\n<style scoped></style>\n","import type { Directive } from 'vue'\n\n/**\n * v-sr-only 디렉티브\n * 선언하면 .sr-only 클래스 추가, 없으면 제거\n */\nexport const vSrOnly: Directive<HTMLElement, boolean | undefined> = {\n mounted(el, binding) {\n if (binding.value !== false) {\n el.classList.add('sr-only')\n }\n },\n\n updated(el, binding) {\n if (binding.value === false) {\n el.classList.remove('sr-only')\n } else {\n el.classList.add('sr-only')\n }\n },\n\n unmounted(el) {\n el.classList.remove('sr-only')\n }\n}\n\nexport default vSrOnly\n","/**\n * KRDS Vue 디렉티브\n */\n\nimport type { App } from 'vue'\nimport { vSrOnly } from './vSrOnly'\n\n/**\n * 디렉티브 목록\n */\nexport const directives = {\n 'sr-only': vSrOnly\n} as const\n\n/**\n * 디렉티브 설치 함수\n */\nexport const installDirectives = (app: App) => {\n app.directive('sr-only', vSrOnly)\n}\n\nexport { vSrOnly }\nexport default directives\n","/**\n * KRDS Vue 디자인 시스템\n * 대한민국 정부 표준 디자인 시스템 Vue 3 구현체\n *\n * @packageDocumentation\n */\n\nimport type { App, Plugin } from 'vue'\n\n// 컴포넌트 imports\nimport * as components from './components'\n\n// 디렉티브 imports\nimport * as directives from './directives'\n\n// 메인 스타일 (플러그인 사용 시 자동 로드)\nimport './styles/main.scss'\n\n// 컴포저블 exports\nexport * from './composables'\n\n// 유틸리티 exports\nexport * from './utils'\n\n// 타입 exports\nexport * from './types'\n\n// 토큰 exports\nexport * from './tokens'\n\n// 개별 컴포넌트 export (Tree-shaking 지원)\nexport * from './components'\n\n/**\n * KRDS Vue 플러그인 설정 옵션\n */\nexport interface KrdsVueOptions {\n /** 설치할 컴포넌트 목록 (비어있으면 전체 설치) */\n components?: string[]\n}\n\n/**\n * KRDS Vue 플러그인\n */\nconst KrdsVue: Plugin = {\n install(app: App, options: KrdsVueOptions = {}) {\n // 전역 설정 제공\n app.provide('krds:config', options)\n\n // 컴포넌트 등록\n const componentsToInstall = options.components || Object.keys(components)\n\n componentsToInstall.forEach(componentName => {\n const component = (components as Record<string, unknown>)[componentName]\n if (component) {\n app.component(componentName, component)\n }\n })\n\n // 디렉티브 등록\n if (typeof directives === 'object' && directives !== null && 'installDirectives' in directives) {\n ;(directives as { installDirectives: (app: App) => void }).installDirectives(app)\n }\n\n // 전역 속성 추가\n app.config.globalProperties.$krds = {\n version: '__VERSION__'\n }\n\n // 개발 모드에서 설치 로그\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.log(`[KRDS Vue] v__VERSION__ 설치 완료 - 컴포넌트: ${componentsToInstall.length}개`)\n }\n }\n}\n\nexport default KrdsVue\n\n// 버전 정보\nexport const version = '__VERSION__'\n"],"names":["KrdsButton","defineComponent","props","emit","slots","buttonClasses","computed","classes","handleClick","event","h","KrdsButtonGroup","_","KrdsIcon","KrdsLink","linkClasses","linkAttributes","attrs","KrdsSpinner","children","KrdsInput","inputClasses","handleInput","target","value","handleChange","handleFocus","handleBlur","handleKeydown","handleKeyup","inputProps","formContsClasses","classList","KrdsFormLabel","KrdsFormHint","baseClass","KrdsFormGroup","useDatePicker","initialYear","initialMonth","today","currentYear","ref","currentMonth","selectedStartDate","selectedEndDate","activeDateSelector","yearOptions","currentYearValue","years","i","monthOptions","clearDateSelection","prevMonth","nextMonth","handleDateSelection","dateString","isSingle","startDate","todayString","currentDate","endDate","isStart","isEnd","useClickOutside","targetRef","callback","options","globalClickHandler","opts","ignore","setupGlobalListeners","e","removeGlobalListeners","eventType","onMounted","onBeforeUnmount","__props","__emit","datePickerAreaRef","datePickerButtonRef","isCalendarOpen","activeDropdown","selectToday","isDateInSelectedRange","closeAllDatePickers","calendarAreaClasses","calendarGrid","year","month","firstDate","weeks","week","days","day","dayOfWeek","getCellClasses","rangeInfo","actionButtons","confirmSelection","toggleDropdown","type","selectYear","selectMonth","rangeValue","openDatePicker","handleDatePickerToggle","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_5","_cache","_unref","args","_hoisted_6","_hoisted_7","_toDisplayString","_hoisted_8","_withDirectives","_hoisted_9","_hoisted_10","_Fragment","_renderList","_normalizeClass","$event","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","weekIndex","dayIndex","_hoisted_22","_hoisted_23","action","_createBlock","_createTextVNode","KrdsTextarea","currentLength","watch","newValue","textareaClasses","textareaStyles","styles","textareaProps","textareaWrapClasses","countDisplay","current","max","KrdsSelect","selectClasses","selectProps","renderOptions","optionElements","option","selectElement","KrdsFileUpload","_emit","currentFileCount","KrdsBadge","KrdsTag","tagClasses","handleDelete","renderDeleteButton","content","slotContent","linkAttrs","KrdsTagGroup","tagGroupClasses","KrdsMasthead","mastheadClasses","idCounter","generateId","prefix","generateUid","timestamp","random","classNames","KrdsToggleSwitch","isChecked","containerClasses","handleToggle","inputId","KrdsCheckArea","KrdsCheckbox","KrdsRadio","inputName","KrdsStepIndicator","stepperClasses","getStepStatus","index","currentStep","stepIndex","resetStepIndex","getNextStepIndex","provide","KrdsStep","stepIndicatorContext","inject","stepStatus","stepClasses","isActive","KrdsSkipLink","isCurrentPage","item","_hoisted_4","KrdsInPageNavigation","activeItem","sectionElements","calculateHeaderHeight","headerTopSelector","headerInnerSelector","headerTop","headerInner","handleItemClick","targetElement","headerHeight","focusable","cacheSectionElements","element","updateActiveItem","winHeight","topHeight","scrollBottom","scrollHeight","sections","firstSection","lastSection","firstSecTop","newActiveItem","section","sectionHeight","sectionTop","initActiveItem","activeFromProps","observer","onUnmounted","renderHeader","renderNavList","listItems","renderAction","minPage","currentPage","prevDisabled","nextDisabled","prevHref","nextHref","displayedPages","pageRange","totalPages","boundaryRange","pages","leftBoundary","rightBoundary","rangeStart","rangeEnd","adjustedRangeStart","startPage","endPage","handlePageClick","page","handlePrevClick","prevPage","handleNextClick","nextPage","_resolveDynamicComponent","open","handleOpen","handleClose","_hoisted_3","_renderSlot","_ctx","containerRef","tooltipBtnRef","tooltipPopoverRef","closeBtnRef","isVisible","toggleTooltip","wasVisible","closeAllTooltips","showTooltip","adjustTooltipPosition","closeTooltip","allPopovers","allButtons","popover","button","isMobile","tooltipAction","contentsPaddingX","offsetLeft","width","handleOutsideClick","handleResize","currentStepData","prevStep","nextStep","closeCoachMark","popoverRef","isTooltipVisible","popoverStyle","popoverId","tooltipClasses","popoverClasses","buttonText","checkIsMobile","calculateTooltipPosition","tooltipGap","tooltipHeight","tooltipWidth","itemTop","itemLeft","itemRight","itemHeight","itemWidth","halfWindowWidth","halfWindowHeight","tooltipTop","tooltipLeft","mobileSmall","nextTick","hideTooltip","handleScroll","isOpen","dropdownRef","buttonRef","positionDropdown","closeDropdown","selectLanguage","languageCode","menu","menuRect","windowWidth","handleClickOutside","handleFocusOut","handleItemFocus","currentItem","isDropdownOpen","$slots","language","_withModifiers","selectedSize","scaleList","selectSize","scale","resetSize","defaultScale","vSrOnly","el","binding","directives","installDirectives","app","KrdsVue","componentsToInstall","components","componentName","component","directives.installDirectives","version"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"krds-vue.es.js","sources":["../src/components/KrdsButton/KrdsButton.ts","../src/components/KrdsButtonGroup/KrdsButtonGroup.ts","../src/components/KrdsIcon/KrdsIcon.ts","../src/components/KrdsLink/KrdsLink.ts","../src/components/KrdsSpinner/KrdsSpinner.ts","../src/components/KrdsInput/KrdsInput.ts","../src/components/KrdsFormLabel/KrdsFormLabel.ts","../src/components/KrdsFormHint/KrdsFormHint.ts","../src/components/KrdsFormGroup/KrdsFormGroup.ts","../src/composables/useDatePicker.ts","../src/composables/useClickOutside.ts","../src/components/KrdsDateInput/KrdsDateInput.vue","../src/components/KrdsTextarea/KrdsTextarea.ts","../src/components/KrdsSelect/KrdsSelect.ts","../src/components/KrdsFileUpload/KrdsFileUpload.ts","../src/components/KrdsBadge/KrdsBadge.ts","../src/components/KrdsTag/KrdsTag.ts","../src/components/KrdsTagGroup/KrdsTagGroup.ts","../src/components/KrdsMasthead/KrdsMasthead.ts","../src/utils/index.ts","../src/components/KrdsToggleSwitch/KrdsToggleSwitch.ts","../src/components/KrdsCheckArea/KrdsCheckArea.ts","../src/components/KrdsCheckbox/KrdsCheckbox.ts","../src/components/KrdsRadio/KrdsRadio.ts","../src/components/KrdsStepIndicator/KrdsStepIndicator.ts","../src/components/KrdsStep/KrdsStep.ts","../src/components/KrdsSkipLink/KrdsSkipLink.ts","../src/components/KrdsBreadcrumb/KrdsBreadcrumb.vue","../src/components/KrdsInPageNavigation/KrdsInPageNavigation.ts","../src/components/KrdsPagination/KrdsPagination.vue","../src/components/KrdsPanel/KrdsPanel.vue","../src/components/KrdsContextualHelp/KrdsContextualHelp.vue","../src/components/KrdsCoachMark/KrdsCoachMark.vue","../src/components/KrdsTooltip/KrdsTooltip.vue","../src/components/KrdsLanguageSwitcher/KrdsLanguageSwitcher.vue","../src/components/KrdsResize/KrdsResize.vue","../src/components/KrdsModal/KrdsModal.ts","../src/components/KrdsAccordionGroup/KrdsAccordionGroup.ts","../src/components/KrdsAccordionItem/KrdsAccordionItem.vue","../src/directives/vSrOnly.ts","../src/directives/index.ts","../src/index.ts"],"sourcesContent":["import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps, Size, Variant } from '@/types'\n\n/**\n * KRDS Button 컴포넌트 속성\n */\nexport interface KrdsButtonProps extends BaseComponentProps {\n /** 버튼 타입 */\n type?: 'button' | 'submit' | 'reset'\n /** 버튼 크기 */\n size?: Size\n /** 버튼 변형 */\n variant?: Variant\n /** 아이콘 전용 버튼 */\n icon?: boolean\n /** 테두리 스타일 (아이콘 버튼용) */\n border?: boolean\n /** Pure 버튼 여부 (가상클래스 상태 시 컬러 유지) */\n pure?: boolean\n /** 텍스트 버튼 스타일 */\n text?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * KRDS Button 컴포넌트 이벤트\n */\nexport interface KrdsButtonEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsButtonProps>({\n name: 'KrdsButton',\n props: {\n type: {\n type: String as () => 'button' | 'submit' | 'reset',\n default: 'button'\n },\n size: {\n type: String as () => Size,\n default: undefined\n },\n variant: {\n type: String as () => Variant,\n default: 'primary'\n },\n icon: {\n type: Boolean,\n default: false\n },\n border: {\n type: Boolean,\n default: false\n },\n pure: {\n type: Boolean,\n default: false\n },\n text: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 버튼 클래스 계산\n */\n const buttonClasses = computed(() => {\n const classes = ['krds-btn']\n\n // 아이콘 전용 클래스\n if (props.icon) {\n classes.push('icon')\n }\n\n // 테두리 클래스\n if (props.border) {\n classes.push('border')\n }\n\n // pure 클래스\n if (props.pure) {\n classes.push('pure')\n }\n\n // text 클래스\n if (props.text) {\n classes.push('text')\n }\n\n // 변형 클래스\n if (props.variant && !props.icon) {\n classes.push(props.variant)\n }\n\n // 크기 클래스 (KRDS 실제 규격: xsmall, small, medium, large, xlarge)\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n if (!props.disabled) {\n emit('click', event)\n }\n }\n\n return () =>\n h(\n 'button',\n {\n type: props.type,\n class: buttonClasses.value,\n disabled: props.disabled,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS ButtonGroup 컴포넌트 속성\n */\nexport type KrdsButtonGroupProps = BaseComponentProps\n\nexport default defineComponent<KrdsButtonGroupProps>({\n name: 'KrdsButtonGroup',\n props: {},\n setup(_, { slots }) {\n return () =>\n h(\n 'div',\n {\n class: 'btn-group'\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Icon 컴포넌트 속성\n */\nexport interface KrdsIconProps extends BaseComponentProps {\n /** 아이콘 이름 */\n name: string\n}\n\nexport default defineComponent<KrdsIconProps>({\n name: 'KrdsIcon',\n props: {\n name: {\n type: String,\n required: true\n },\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props) {\n return () =>\n h('i', {\n class: ['svg-icon', props.name, props.class].filter(Boolean).join(' ')\n })\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Link 크기 타입 (링크는 small, medium, large만 지원)\n */\nexport type KrdsLinkSize = 'small' | 'medium' | 'large'\n\n/**\n * KRDS Link 컴포넌트 속성\n */\nexport interface KrdsLinkProps extends BaseComponentProps {\n /** 링크 URL */\n href?: string\n /** 링크 대상 (_blank, _self 등) */\n target?: '_blank' | '_self' | '_parent' | '_top' | string\n /** 링크 제목 (접근성) */\n title?: string\n /** 링크 크기 */\n size?: KrdsLinkSize\n /** Link 클래스 적용 여부 */\n link?: boolean\n /** Basic 링크 여부 (본문 텍스트 컬러) */\n basic?: boolean\n /** Pure 링크 여부 (가상클래스 상태 시 컬러 유지) */\n pure?: boolean\n}\n\n/**\n * KRDS Link 컴포넌트 이벤트\n */\nexport interface KrdsLinkEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsLinkProps>({\n name: 'KrdsLink',\n props: {\n href: {\n type: String,\n default: '#!'\n },\n target: {\n type: String as () => '_blank' | '_self' | '_parent' | '_top' | string,\n default: undefined\n },\n title: {\n type: String,\n default: undefined\n },\n size: {\n type: String as () => KrdsLinkSize,\n default: undefined\n },\n link: {\n type: Boolean,\n default: true\n },\n basic: {\n type: Boolean,\n default: false\n },\n pure: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 링크 클래스 계산\n */\n const linkClasses = computed(() => {\n const classes = ['krds-btn']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // link prop이 true일 때 'link' 클래스 추가\n if (props.link) {\n classes.push('link')\n }\n\n // basic prop이 true일 때 basic 클래스 추가\n if (props.basic) {\n classes.push('basic')\n }\n\n // pure 링크일 때 pure 클래스 추가\n if (props.pure) {\n classes.push('pure')\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 링크 속성 계산\n */\n const linkAttributes = computed(() => {\n const attrs: Record<string, unknown> = {\n href: props.href,\n class: linkClasses.value\n }\n\n if (props.target) {\n attrs.target = props.target\n }\n\n if (props.title) {\n attrs.title = props.title\n }\n\n if (props.target === '_blank') {\n // 보안상 _blank 링크에는 기본적으로 noopener noreferrer 적용\n attrs.rel = 'noopener noreferrer'\n }\n\n return attrs\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h(\n 'a',\n {\n ...linkAttributes.value,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { h, defineComponent } from 'vue'\n\nexport default defineComponent({\n name: 'KrdsSpinner',\n props: {\n label: {\n type: String,\n default: undefined\n }\n },\n render() {\n const children = [h('span', { class: 'sr-only' }, '로딩 중')]\n\n if (this.label) {\n children.push(h('span', this.label))\n }\n\n return h('div', { class: 'krds-spinner', role: 'status' }, children)\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseFormProps, Size, InputType } from '@/types'\nimport KrdsSpinner from '@/components/KrdsSpinner/KrdsSpinner'\n\n/**\n * KRDS Input 컴포넌트 속성\n */\nexport interface KrdsInputProps extends BaseFormProps {\n /** 입력값 */\n modelValue?: string | number\n /** 입력 타입 */\n type?: InputType\n /** 입력 크기 */\n size?: Size\n /** 플레이스홀더 */\n placeholder?: string\n /** 최대 글자 수 */\n maxlength?: number\n /** 최소 글자 수 */\n minlength?: number\n /** 최대값 (number 타입용) */\n max?: number\n /** 최소값 (number 타입용) */\n min?: number\n /** 단계값 (number 타입용) */\n step?: number\n /** 자동완성 */\n autocomplete?: string\n /** 자동 포커스 */\n autofocus?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 입력 상태 */\n state?: 'default' | 'error' | 'success' | 'information'\n /** 아이콘 (있을 때 btn-ico-wrap 클래스 적용) */\n icon?: boolean\n /** 로딩 상태 */\n loading?: boolean\n}\n\n/**\n * KRDS Input 컴포넌트 이벤트\n */\nexport interface KrdsInputEmits {\n (e: 'update:modelValue', value: string | number): void\n (e: 'input', event: Event): void\n (e: 'change', event: Event): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n (e: 'keydown', event: KeyboardEvent): void\n (e: 'keyup', event: KeyboardEvent): void\n}\n\nexport default defineComponent<KrdsInputProps>({\n name: 'KrdsInput',\n props: {\n modelValue: {\n type: [String, Number],\n default: undefined\n },\n type: {\n type: String as () => InputType,\n default: 'text'\n },\n size: {\n type: String as () => Size,\n default: undefined\n },\n placeholder: {\n type: String,\n default: undefined\n },\n maxlength: {\n type: Number,\n default: undefined\n },\n minlength: {\n type: Number,\n default: undefined\n },\n max: {\n type: Number,\n default: undefined\n },\n min: {\n type: Number,\n default: undefined\n },\n step: {\n type: Number,\n default: undefined\n },\n autocomplete: {\n type: String,\n default: undefined\n },\n autofocus: {\n type: Boolean,\n default: false\n },\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n error: {\n type: String,\n default: undefined\n },\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n icon: {\n type: Boolean,\n default: false\n },\n loading: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'input', 'change', 'focus', 'blur', 'keydown', 'keyup'],\n setup(props, { emit, slots }) {\n /**\n * 입력 필드 클래스 계산\n */\n const inputClasses = computed(() => {\n const classes = ['krds-input']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 입력 이벤트 핸들러\n */\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n const value = props.type === 'number' ? Number(target.value) : target.value\n emit('update:modelValue', value)\n emit('input', event)\n }\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n emit('change', event)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n\n /**\n * 키다운 이벤트 핸들러\n */\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event)\n }\n\n /**\n * 키업 이벤트 핸들러\n */\n const handleKeyup = (event: KeyboardEvent) => {\n emit('keyup', event)\n }\n\n /**\n * 입력 필드 속성 계산\n */\n const inputProps = computed(() => {\n const attrs: Record<string, unknown> = {\n type: props.type,\n class: inputClasses.value,\n value: props.modelValue,\n placeholder: props.placeholder,\n name: props.name,\n id: props.id,\n required: props.required,\n readonly: props.readonly,\n disabled: props.disabled,\n autocomplete: props.autocomplete,\n autofocus: props.autofocus,\n onInput: handleInput,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeydown: handleKeydown,\n onKeyup: handleKeyup\n }\n\n // 문자 길이 제한\n if (props.maxlength !== undefined) {\n attrs.maxlength = props.maxlength\n }\n if (props.minlength !== undefined) {\n attrs.minlength = props.minlength\n }\n\n // 숫자 범위 및 단계\n if (props.type === 'number') {\n if (props.max !== undefined) {\n attrs.max = props.max\n }\n if (props.min !== undefined) {\n attrs.min = props.min\n }\n if (props.step !== undefined) {\n attrs.step = props.step\n }\n }\n\n return attrs\n })\n\n /**\n * form-conts 클래스 계산\n */\n const formContsClasses = computed(() => {\n const classList = ['form-conts']\n\n if (props.state !== 'default') {\n classList.push(`is-${props.state}`)\n }\n\n if (props.icon) {\n classList.push('btn-ico-wrap')\n }\n\n return classList\n })\n\n return () => {\n const children = [h('input', inputProps.value)]\n\n // 로딩 상태일 때 스피너 추가\n if (props.loading) {\n return h('div', { class: formContsClasses.value }, [h('div', { class: 'form-spinner' }, [...children, h(KrdsSpinner)])])\n }\n\n // 디폴트 슬롯이 있으면 추가 (아이콘 버튼들)\n if (slots.default) {\n children.push(...slots.default())\n }\n\n return h('div', { class: formContsClasses.value }, children)\n }\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS FormLabel 컴포넌트 속성\n */\nexport interface KrdsFormLabelProps extends BaseComponentProps {\n /** label의 for 속성 */\n for?: string\n}\n\n/**\n * KRDS FormLabel 컴포넌트 이벤트\n */\nexport interface KrdsFormLabelEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsFormLabelProps>({\n name: 'KrdsFormLabel',\n props: {\n for: {\n type: String,\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h('div', { class: 'form-tit' }, [\n h(\n 'label',\n {\n for: props.for,\n id: props.id,\n class: props.class,\n style: props.style,\n onClick: handleClick\n },\n slots.default?.()\n )\n ])\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS FormHint 컴포넌트 속성\n */\nexport interface KrdsFormHintProps extends BaseComponentProps {\n /** 힌트 타입 */\n type?: 'hint' | 'error' | 'success' | 'information'\n}\n\n/**\n * KRDS FormHint 컴포넌트 이벤트\n */\nexport interface KrdsFormHintEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsFormHintProps>({\n name: 'KrdsFormHint',\n props: {\n type: {\n type: String as () => 'hint' | 'error' | 'success' | 'information',\n default: 'hint'\n },\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n /**\n * 클래스 계산\n */\n const classes = () => {\n let baseClass: string\n\n switch (props.type) {\n case 'error':\n baseClass = 'form-hint-invalid'\n break\n case 'success':\n baseClass = 'form-hint-success'\n break\n case 'information':\n baseClass = 'form-hint-information'\n break\n default:\n baseClass = 'form-hint'\n break\n }\n\n return props.class ? `${baseClass} ${props.class}` : baseClass\n }\n\n return () =>\n h(\n 'p',\n {\n id: props.id,\n class: classes(),\n style: props.style,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS FormGroup 컴포넌트 속성\n */\nexport type KrdsFormGroupProps = BaseComponentProps\n\nexport default defineComponent<KrdsFormGroupProps>({\n name: 'KrdsFormGroup',\n props: {\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n /**\n * 클래스 계산\n */\n const classes = computed(() => {\n const classList = ['form-group']\n\n if (props.class) {\n classList.push(props.class)\n }\n\n return classList\n })\n\n return () =>\n h(\n 'div',\n {\n id: props.id,\n class: classes.value,\n style: props.style\n },\n slots.default?.()\n )\n }\n})\n","import { computed, ref } from 'vue'\n\nexport interface DatePickerState {\n currentYear: number\n currentMonth: number\n selectedStartDate: string | null\n selectedEndDate: string | null\n}\n\nexport function useDatePicker(initialYear?: number, initialMonth?: number) {\n const today = new Date()\n const currentYear = ref(initialYear || today.getFullYear())\n const currentMonth = ref(initialMonth || today.getMonth() + 1)\n const selectedStartDate = ref<string | null>(null)\n const selectedEndDate = ref<string | null>(null)\n const activeDateSelector = ref<HTMLElement | null>(null)\n\n /**\n * 연도 옵션 생성 (현재 년도 기준 ±10년)\n */\n const yearOptions = computed(() => {\n const currentYearValue = today.getFullYear()\n const years = []\n for (let i = currentYearValue - 10; i <= currentYearValue + 10; i++) {\n years.push(i)\n }\n return years\n })\n\n /**\n * 월 옵션 생성 (1~12월)\n */\n const monthOptions = computed(() => {\n return Array.from({ length: 12 }, (_, i) => i + 1)\n })\n\n /**\n * 선택된 날짜 범위 초기화\n */\n const clearDateSelection = () => {\n selectedStartDate.value = null\n selectedEndDate.value = null\n }\n\n /**\n * 이전 달로 이동\n */\n const prevMonth = () => {\n if (currentMonth.value === 1) {\n currentMonth.value = 12\n currentYear.value -= 1\n } else {\n currentMonth.value -= 1\n }\n }\n\n /**\n * 다음 달로 이동\n */\n const nextMonth = () => {\n if (currentMonth.value === 12) {\n currentMonth.value = 1\n currentYear.value += 1\n } else {\n currentMonth.value += 1\n }\n }\n\n /**\n * 날짜 선택 처리\n */\n const handleDateSelection = (dateString: string, isSingle = false) => {\n if (isSingle) {\n selectedStartDate.value = dateString\n selectedEndDate.value = dateString\n } else {\n if (!selectedStartDate.value || (selectedStartDate.value && selectedEndDate.value)) {\n selectedStartDate.value = dateString\n selectedEndDate.value = null\n } else {\n const startDate = new Date(selectedStartDate.value.replace(/\\./g, '-'))\n const endDate = new Date(dateString.replace(/\\./g, '-'))\n\n if (endDate < startDate) {\n selectedStartDate.value = dateString\n selectedEndDate.value = null\n } else {\n selectedEndDate.value = dateString\n }\n }\n }\n }\n\n /**\n * 오늘 날짜 선택\n */\n const selectToday = () => {\n const todayString = `${today.getFullYear()}.${String(today.getMonth() + 1).padStart(2, '0')}.${String(today.getDate()).padStart(2, '0')}`\n handleDateSelection(todayString, true)\n }\n\n /**\n * 날짜가 선택된 범위에 포함되는지 확인\n */\n const isDateInSelectedRange = (dateString: string) => {\n if (!selectedStartDate.value || !selectedEndDate.value) {\n return { isInRange: false, isStart: false, isEnd: false }\n }\n\n const currentDate = new Date(dateString.replace(/\\./g, '-'))\n const startDate = new Date(selectedStartDate.value.replace(/\\./g, '-'))\n const endDate = new Date(selectedEndDate.value.replace(/\\./g, '-'))\n\n const isStart = dateString === selectedStartDate.value\n const isEnd = dateString === selectedEndDate.value\n const isInRange = currentDate >= startDate && currentDate <= endDate\n\n return { isInRange, isStart, isEnd }\n }\n\n return {\n // State\n currentYear,\n currentMonth,\n selectedStartDate,\n selectedEndDate,\n activeDateSelector,\n\n // Computed\n yearOptions,\n monthOptions,\n\n // Methods\n clearDateSelection,\n prevMonth,\n nextMonth,\n handleDateSelection,\n selectToday,\n isDateInSelectedRange\n }\n}\n","import { type Ref, onMounted, onBeforeUnmount } from 'vue'\n\n/**\n * 외부 클릭 감지 컴포저블 옵션\n */\ninterface ClickOutsideOptions {\n /** 클릭을 무시할 선택자 (예: '.modal, .dropdown') */\n ignore?: string\n /** 이벤트 타입 (기본: 'click') */\n event?: 'click' | 'mousedown' | 'mouseup'\n}\n\n/**\n * 외부 클릭 감지 컴포저블\n * @param targetRef 감지 대상 요소 ref\n * @param callback 외부 클릭 시 실행할 콜백\n * @param options 추가 옵션 또는 무시할 선택자 (하위 호환성)\n */\nexport function useClickOutside(targetRef: Ref<HTMLElement | undefined>, callback: () => void, options: ClickOutsideOptions | string = {}) {\n let globalClickHandler: ((event: Event) => void) | null = null\n\n // 하위 호환성을 위해 string을 지원\n const opts = typeof options === 'string' ? { ignore: options } : options\n const { ignore, event = 'click' } = opts\n\n const setupGlobalListeners = () => {\n globalClickHandler = (e: Event) => {\n const target = e.target as HTMLElement\n\n // targetRef 내부 클릭인지 확인\n if (targetRef.value?.contains(target)) {\n return\n }\n\n // ignore 선택자가 있으면 해당 요소 내부 클릭은 무시\n if (ignore && target.closest(ignore)) {\n return\n }\n\n callback()\n }\n document.addEventListener(event, globalClickHandler)\n }\n\n const removeGlobalListeners = () => {\n if (globalClickHandler) {\n const eventType = typeof options === 'string' ? 'click' : options.event || 'click'\n document.removeEventListener(eventType, globalClickHandler)\n globalClickHandler = null\n }\n }\n\n onMounted(() => {\n setupGlobalListeners()\n })\n\n onBeforeUnmount(() => {\n removeGlobalListeners()\n })\n\n return {\n setupGlobalListeners,\n removeGlobalListeners\n }\n}\n","<template>\n <div class=\"form-conts\">\n <div :class=\"formContsClasses\">\n <div class=\"calendar-input\">\n <input\n :id=\"id\"\n :name=\"name\"\n :class=\"inputClasses\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n :readonly=\"readonly\"\n :disabled=\"disabled\"\n :required=\"required\"\n :autofocus=\"autofocus\"\n type=\"text\"\n @input=\"handleInput\"\n @change=\"handleChange\"\n @focus=\"handleFocus\"\n @blur=\"handleBlur\"\n />\n <button\n ref=\"datePickerButtonRef\"\n :class=\"`krds-btn ${size || 'medium'} icon form-btn-datepicker`\"\n :disabled=\"disabled\"\n :aria-expanded=\"isCalendarOpen\"\n type=\"button\"\n @click=\"handleDatePickerToggle\"\n >\n <span class=\"sr-only\">달력 열기</span>\n <i class=\"svg-icon ico-calendar\"></i>\n </button>\n </div>\n <div ref=\"datePickerAreaRef\" :class=\"calendarAreaClasses\">\n <div v-show=\"isCalendarOpen\" class=\"calendar-wrap bottom\" aria-label=\"달력\" tabindex=\"0\" @keydown=\"handleKeydown\">\n <!-- 캘린더 헤더 -->\n <div class=\"calendar-head\">\n <button type=\"button\" class=\"btn-cal-move prev\" @click=\"prevMonth\">\n <span class=\"sr-only\">이전 달</span>\n </button>\n <div class=\"calendar-switch-wrap\">\n <!-- 연도 드롭다운 -->\n <div class=\"calendar-drop-down\">\n <button\n type=\"button\"\n class=\"btn-cal-switch year\"\n aria-label=\"연도 선택\"\n :aria-expanded=\"activeDropdown === 'year'\"\n @click=\"toggleDropdown('year')\"\n >\n {{ currentYear }}년\n </button>\n <div v-show=\"activeDropdown === 'year'\" class=\"calendar-select calendar-year-wrap\">\n <ul class=\"sel year\">\n <li v-for=\"year in yearOptions\" :key=\"year\">\n <button type=\"button\" :class=\"{ active: year === currentYear }\" @click=\"selectYear(year)\">{{ year }}년</button>\n </li>\n </ul>\n </div>\n </div>\n <!-- 월 드롭다운 -->\n <div class=\"calendar-drop-down\">\n <button\n type=\"button\"\n class=\"btn-cal-switch month\"\n aria-label=\"월 선택\"\n :aria-expanded=\"activeDropdown === 'month'\"\n @click=\"toggleDropdown('month')\"\n >\n {{ currentMonth.toString().padStart(2, '0') }}월\n </button>\n <div v-show=\"activeDropdown === 'month'\" class=\"calendar-select calendar-mon-wrap\">\n <ul class=\"sel month\">\n <li v-for=\"month in monthOptions\" :key=\"month\">\n <button type=\"button\" :class=\"{ active: month === currentMonth }\" @click=\"selectMonth(month)\">\n {{ month.toString().padStart(2, '0') }}월\n </button>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <button type=\"button\" class=\"btn-cal-move next\" @click=\"nextMonth\">\n <span class=\"sr-only\">다음 달</span>\n </button>\n </div>\n <!-- 캘린더 바디 -->\n <div class=\"calendar-body\">\n <div class=\"calendar-table-wrap\">\n <table class=\"calendar-tbl\">\n <caption>{{ currentYear }}년 {{ currentMonth.toString().padStart(2, '0') }}월</caption>\n <thead>\n <tr>\n <th>일</th>\n <th>월</th>\n <th>화</th>\n <th>수</th>\n <th>목</th>\n <th>금</th>\n <th>토</th>\n </tr>\n </thead>\n <tbody>\n <tr v-for=\"(week, weekIndex) in calendarGrid\" :key=\"weekIndex\">\n <td v-for=\"(day, dayIndex) in week\" :key=\"dayIndex\" :class=\"getCellClasses(day)\" :data-date=\"day.dateString\">\n <button\n type=\"button\"\n class=\"btn-set-date\"\n :aria-pressed=\"isDateInSelectedRange(day.dateString).isInRange ? 'true' : 'false'\"\n @click=\"handleDateSelection(day.dateString)\"\n >\n <span>{{ day.day }}</span>\n </button>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n <!-- 캘린더 푸터 -->\n <div class=\"calendar-footer\">\n <div class=\"calendar-btn-wrap\">\n <KrdsButton\n v-for=\"action in actionButtons\"\n :id=\"action.id\"\n :key=\"action.id\"\n :class=\"action.class\"\n :variant=\"action.variant\"\n :size=\"action.size\"\n @click=\"action.handler\"\n >\n {{ action.label }}\n </KrdsButton>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, ref } from 'vue'\n import type { BaseFormProps, Size } from '@/types'\n import KrdsButton from '@/components/KrdsButton/KrdsButton.ts'\n import { useDatePicker } from '@/composables/useDatePicker'\n import { useClickOutside } from '@/composables/useClickOutside'\n\n // ========================\n // 타입 정의\n // ========================\n\n /**\n * 캘린더 날짜 정보\n */\n interface CalendarDay {\n day: number\n dateString: string\n isCurrentMonth: boolean\n isToday: boolean\n isPrevMonth: boolean\n isNextMonth: boolean\n isSunday: boolean\n isSaturday: boolean\n }\n\n /**\n * 액션 버튼 정보\n */\n interface ActionButton {\n id: string\n label: string\n class: string | undefined\n variant: 'primary' | 'tertiary' | undefined\n size: Size\n handler: () => void\n }\n\n /**\n * KRDS DateInput 컴포넌트 속성\n */\n export interface KrdsDateInputProps extends BaseFormProps {\n /** 선택된 날짜 값 */\n modelValue?: string\n /** 입력 크기 */\n size?: Size\n /** 플레이스홀더 */\n placeholder?: string\n /** 비활성화 여부 */\n disabled?: boolean\n /** 읽기 전용 여부 */\n readonly?: boolean\n /** 자동 포커스 */\n autofocus?: boolean\n /** 일정이 있는 날짜 배열 (YYYY.MM.DD 형식) */\n eventDates?: string[]\n /** 휴일 날짜 배열 (YYYY.MM.DD 형식) */\n holidays?: string[]\n /** 초기 표시 년도 (기본: 현재 년도) */\n initialYear?: number\n /** 초기 표시 월 (기본: 현재 월) */\n initialMonth?: number\n }\n\n /**\n * KRDS DateInput 컴포넌트 이벤트\n */\n export interface KrdsDateInputEmits {\n 'update:modelValue': [value: string]\n input: [event: Event]\n change: [event: Event]\n focus: [event: FocusEvent]\n blur: [event: FocusEvent]\n }\n\n // ========================\n // Props & Emits\n // ========================\n\n const props = withDefaults(defineProps<KrdsDateInputProps>(), {\n modelValue: undefined,\n size: 'medium',\n placeholder: 'YYYY.MM.DD',\n name: undefined,\n required: false,\n readonly: false,\n disabled: false,\n class: undefined,\n id: undefined,\n autofocus: false,\n eventDates: () => [],\n holidays: () => [],\n initialYear: undefined,\n initialMonth: undefined\n })\n\n /**\n * KRDS DateInput 컴포넌트 이벤트\n */\n const emit = defineEmits<KrdsDateInputEmits>()\n\n // ========================\n // 상태 관리\n // ========================\n\n // DOM 참조\n const datePickerAreaRef = ref<HTMLElement>()\n const datePickerButtonRef = ref<HTMLButtonElement>()\n\n // 반응형 상태\n const isCalendarOpen = ref(false)\n const activeDropdown = ref<'year' | 'month' | null>(null)\n\n // ========================\n // Composables\n // ========================\n\n // 날짜 선택기 composable 사용\n const {\n currentYear,\n currentMonth,\n selectedStartDate,\n selectedEndDate,\n yearOptions,\n monthOptions,\n prevMonth,\n nextMonth,\n handleDateSelection,\n selectToday,\n isDateInSelectedRange\n } = useDatePicker(props.initialYear, props.initialMonth)\n\n // 외부 클릭 감지\n const closeAllDatePickers = () => {\n if (isCalendarOpen.value) {\n datePickerButtonRef.value?.focus()\n }\n\n isCalendarOpen.value = false\n activeDropdown.value = null\n }\n\n // 외부 클릭 감지 활성화\n useClickOutside(datePickerAreaRef, closeAllDatePickers, '.calendar-conts')\n\n /**\n * 날짜 입력 클래스\n */\n const inputClasses = computed(() => {\n const classes = ['krds-input', 'datepicker', 'cal']\n\n if (props.size) {\n classes.push(props.size)\n }\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 폼 콘텐츠 클래스\n */\n const formContsClasses = computed(() => {\n const classes = ['form-conts', 'calendar-conts']\n return classes\n })\n\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 캘린더 영역 클래스\n */\n const calendarAreaClasses = computed(() => ({\n 'krds-calendar-area': true,\n active: isCalendarOpen.value\n }))\n\n const calendarGrid = computed<CalendarDay[][]>(() => {\n const year = currentYear.value\n const month = currentMonth.value\n const firstDate = new Date(year, month - 1, 1)\n const startDate = new Date(firstDate)\n\n // 첫 번째 날의 요일만큼 이전 달 날짜 추가 (일요일이 0)\n startDate.setDate(startDate.getDate() - firstDate.getDay())\n\n const weeks: CalendarDay[][] = []\n const currentDate = new Date(startDate)\n\n // 6주 생성\n for (let week = 0; week < 6; week++) {\n const days: CalendarDay[] = []\n\n for (let day = 0; day < 7; day++) {\n const dateString = `${currentDate.getFullYear()}.${String(currentDate.getMonth() + 1).padStart(2, '0')}.${String(currentDate.getDate()).padStart(2, '0')}`\n const dayOfWeek = currentDate.getDay()\n\n days.push({\n day: currentDate.getDate(),\n dateString,\n isCurrentMonth: currentDate.getMonth() === month - 1,\n isToday: currentDate.toDateString() === new Date().toDateString(),\n isPrevMonth: currentDate.getMonth() < month - 1 || (currentDate.getMonth() === 11 && month === 1),\n isNextMonth: currentDate.getMonth() > month - 1 || (currentDate.getMonth() === 0 && month === 12),\n isSunday: dayOfWeek === 0,\n isSaturday: dayOfWeek === 6\n })\n\n currentDate.setDate(currentDate.getDate() + 1)\n }\n\n weeks.push(days)\n }\n\n return weeks\n })\n\n /**\n * 셀 클래스 계산\n */\n const getCellClasses = (day: CalendarDay) => {\n const classes: string[] = []\n\n // 이전/다음 달 날짜\n if (day.isPrevMonth) classes.push('old')\n if (day.isNextMonth) classes.push('new')\n\n // 오늘 날짜\n if (day.isToday) classes.push('today')\n\n // 일요일은 기본적으로 day-off\n if (day.isSunday) classes.push('day-off')\n\n // props로 전달받은 휴일 체크\n if (props.holidays?.includes(day.dateString)) {\n classes.push('day-off')\n }\n\n // props로 전달받은 이벤트 날짜 체크\n if (props.eventDates?.includes(day.dateString)) {\n classes.push('day-event')\n }\n\n // 선택된 날짜 범위 체크 (현재 월의 날짜만)\n if (day.isCurrentMonth) {\n const rangeInfo = isDateInSelectedRange(day.dateString)\n if (rangeInfo.isInRange) {\n classes.push('period')\n if (rangeInfo.isStart) classes.push('start')\n if (rangeInfo.isEnd) classes.push('end')\n }\n }\n\n return classes\n }\n\n /**\n * 액션 버튼 설정\n */\n const actionButtons = computed<ActionButton[]>(() => [\n {\n id: 'get-today',\n label: '오늘',\n class: 'text',\n variant: undefined,\n size: 'small' as const,\n handler: selectToday\n },\n {\n id: 'cancel-btn',\n label: '취소',\n class: undefined,\n variant: 'tertiary' as const,\n size: 'small' as const,\n handler: closeAllDatePickers\n },\n {\n id: 'confirm-btn',\n label: '확인',\n class: undefined,\n variant: 'primary' as const,\n size: 'small' as const,\n handler: confirmSelection\n }\n ])\n\n // ========================\n // Methods\n // ========================\n\n /**\n * 드롭다운 토글\n */\n const toggleDropdown = (type: 'year' | 'month') => {\n if (activeDropdown.value === type) {\n activeDropdown.value = null\n } else {\n activeDropdown.value = type\n }\n }\n\n /**\n * 연도 선택\n */\n const selectYear = (year: number) => {\n currentYear.value = year\n activeDropdown.value = null\n }\n\n /**\n * 월 선택\n */\n const selectMonth = (month: number) => {\n currentMonth.value = month\n activeDropdown.value = null\n }\n\n /**\n * 선택 확인\n */\n const confirmSelection = () => {\n if (selectedStartDate.value) {\n if (selectedEndDate.value && selectedStartDate.value !== selectedEndDate.value) {\n // 범위 선택\n const rangeValue = `${selectedStartDate.value} ~ ${selectedEndDate.value}`\n emit('update:modelValue', rangeValue)\n } else {\n // 단일 선택\n emit('update:modelValue', selectedStartDate.value)\n }\n closeAllDatePickers()\n }\n }\n\n /**\n * 캘린더 열기\n */\n const openDatePicker = () => {\n isCalendarOpen.value = true\n activeDropdown.value = null\n\n // 포커스 이동\n setTimeout(() => {\n const calendarWrap = datePickerAreaRef.value?.querySelector('.calendar-wrap') as HTMLElement\n calendarWrap?.focus()\n }, 50)\n }\n\n /**\n * 날짜 선택기 토글\n */\n const handleDatePickerToggle = () => {\n if (isCalendarOpen.value) {\n closeAllDatePickers()\n } else {\n openDatePicker()\n }\n }\n\n /**\n * 키보드 이벤트 처리\n */\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.code === 'Escape') {\n if (activeDropdown.value) {\n activeDropdown.value = null\n } else if (isCalendarOpen.value) {\n closeAllDatePickers()\n }\n }\n }\n\n // ========================\n // Event Handlers\n // ========================\n\n /**\n * 입력 이벤트 핸들러\n */\n const handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n emit('input', event)\n }\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n emit('change', event)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n</script>\n","import { defineComponent, computed, ref, watch, h } from 'vue'\nimport type { Size, BaseFormProps } from '@/types'\n\n/**\n * KRDS Textarea 컴포넌트 속성\n */\nexport interface KrdsTextareaProps extends BaseFormProps {\n /** 입력값 */\n modelValue?: string\n /** 입력 크기 */\n size?: Size\n /** 플레이스홀더 */\n placeholder?: string\n /** 최대 글자 수 */\n maxlength?: number\n /** 최소 글자 수 */\n minlength?: number\n /** 행 수 */\n rows?: number\n /** 열 수 */\n cols?: number\n /** 자동 포커스 */\n autofocus?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 글자 수 표시 여부 */\n showCount?: boolean\n /** 리사이즈 가능 여부 */\n resize?: 'none' | 'both' | 'horizontal' | 'vertical'\n}\n\n/**\n * KRDS Textarea 컴포넌트 이벤트\n */\nexport interface KrdsTextareaEmits {\n (e: 'update:modelValue', value: string): void\n (e: 'input', event: Event): void\n (e: 'change', event: Event): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n (e: 'keydown', event: KeyboardEvent): void\n (e: 'keyup', event: KeyboardEvent): void\n}\n\nexport default defineComponent({\n name: 'KrdsTextarea',\n props: {\n modelValue: {\n type: String,\n default: ''\n },\n size: {\n type: String as () => Size,\n default: undefined\n },\n placeholder: {\n type: String,\n default: undefined\n },\n maxlength: {\n type: Number,\n default: undefined\n },\n minlength: {\n type: Number,\n default: undefined\n },\n rows: {\n type: Number,\n default: 4\n },\n cols: {\n type: Number,\n default: undefined\n },\n autofocus: {\n type: Boolean,\n default: false\n },\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n showCount: {\n type: Boolean,\n default: true\n },\n resize: {\n type: String as () => 'none' | 'both' | 'horizontal' | 'vertical',\n default: 'vertical'\n },\n // BaseFormProps에서 상속\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'input', 'change', 'focus', 'blur', 'keydown', 'keyup'],\n setup(props, { emit }) {\n const currentLength = ref(0)\n\n /**\n * 현재 글자 수 업데이트\n */\n watch(\n () => props.modelValue,\n newValue => {\n currentLength.value = (newValue || '').length\n },\n { immediate: true }\n )\n\n /**\n * textarea 클래스 계산\n */\n const textareaClasses = computed(() => {\n const classes = ['krds-input']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * textarea 스타일 계산\n */\n const textareaStyles = computed(() => {\n const styles: Record<string, string> = {}\n\n if (props.resize) {\n styles.resize = props.resize\n }\n\n return styles\n })\n\n /**\n * 입력 이벤트 핸들러\n */\n const handleInput = (event: Event) => {\n const target = event.target as HTMLTextAreaElement\n const value = target.value\n currentLength.value = value.length\n emit('update:modelValue', value)\n emit('input', event)\n }\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n emit('change', event)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n\n /**\n * 키다운 이벤트 핸들러\n */\n const handleKeydown = (event: KeyboardEvent) => {\n emit('keydown', event)\n }\n\n /**\n * 키업 이벤트 핸들러\n */\n const handleKeyup = (event: KeyboardEvent) => {\n emit('keyup', event)\n }\n\n /**\n * textarea 속성 계산\n */\n const textareaProps = computed(() => {\n const attrs: Record<string, unknown> = {\n class: textareaClasses.value,\n style: textareaStyles.value,\n value: props.modelValue,\n placeholder: props.placeholder,\n name: props.name,\n id: props.id,\n required: props.required,\n readonly: props.readonly,\n disabled: props.disabled,\n autofocus: props.autofocus,\n rows: props.rows,\n cols: props.cols,\n onInput: handleInput,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur,\n onKeydown: handleKeydown,\n onKeyup: handleKeyup\n }\n\n // 문자 길이 제한\n if (props.maxlength !== undefined) {\n attrs.maxlength = props.maxlength\n }\n if (props.minlength !== undefined) {\n attrs.minlength = props.minlength\n }\n\n return attrs\n })\n\n /**\n * form-conts 클래스 계산\n */\n const formContsClasses = computed(() => {\n const classList = ['form-conts']\n return classList\n })\n\n /**\n * textarea-wrap 클래스 계산\n */\n const textareaWrapClasses = computed(() => {\n return ['textarea-wrap']\n })\n\n /**\n * 글자 수 표시 계산\n */\n const countDisplay = computed(() => {\n if (!props.showCount) return null\n\n const current = currentLength.value\n const max = props.maxlength\n\n return {\n current,\n max: max || ''\n }\n })\n\n return () => {\n const children = [h('textarea', textareaProps.value)]\n\n // 글자 수 표시 추가\n if (countDisplay.value) {\n children.push(\n h('p', { class: 'textarea-count' }, [\n h('span', { class: 'count-now' }, countDisplay.value.current),\n h('span', { class: 'count-total' }, countDisplay.value.max ? `/${countDisplay.value.max}` : '')\n ])\n )\n }\n\n return h('div', { class: formContsClasses.value }, [h('div', { class: textareaWrapClasses.value }, children)])\n }\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseFormProps, Size } from '@/types'\n\n/**\n * KRDS Select 옵션 타입\n */\nexport interface SelectOption {\n /** 옵션 값 */\n value: string | number\n /** 옵션 레이블 */\n label: string\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * KRDS Select 컴포넌트 속성\n */\nexport interface KrdsSelectProps extends BaseFormProps {\n /** 선택된 값 */\n modelValue?: string | number | null\n /** 선택 크기 */\n size?: Size\n /** 타이틀 */\n title?: string\n /** 옵션 목록 */\n options?: SelectOption[]\n /** 플레이스홀더 */\n placeholder?: string\n /** 비활성화 여부 */\n disabled?: boolean\n /** 입력 상태 */\n state?: 'default' | 'error' | 'success' | 'information'\n /** 정렬 스타일 여부 */\n sort?: boolean\n}\n\n/**\n * KRDS Select 컴포넌트 이벤트\n */\nexport interface KrdsSelectEmits {\n (e: 'update:modelValue', value: string | number | null): void\n (e: 'focus', event: FocusEvent): void\n (e: 'blur', event: FocusEvent): void\n}\n\nexport default defineComponent<KrdsSelectProps>({\n name: 'KrdsSelect',\n props: {\n modelValue: {\n type: [String, Number, null] as unknown as () => string | number | null,\n default: null\n },\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n title: {\n type: String,\n default: undefined\n },\n options: {\n type: Array as () => SelectOption[],\n default: () => []\n },\n placeholder: {\n type: String,\n default: '선택'\n },\n name: {\n type: String,\n default: undefined\n },\n disabled: {\n type: Boolean,\n default: false\n },\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n sort: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'focus', 'blur'],\n setup(props, { emit, slots }) {\n /**\n * Select 클래스 계산\n */\n const selectClasses = computed(() => {\n const classes = []\n\n // 정렬 스타일\n if (props.sort) {\n classes.push('krds-form-select-sort')\n } else {\n classes.push('krds-form-select')\n }\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 변경 이벤트 핸들러\n */\n const handleChange = (event: Event) => {\n const target = event.target as HTMLSelectElement\n const value = target.value === '' ? null : target.value\n emit('update:modelValue', value)\n }\n\n /**\n * 포커스 이벤트 핸들러\n */\n const handleFocus = (event: FocusEvent) => {\n emit('focus', event)\n }\n\n /**\n * 블러 이벤트 핸들러\n */\n const handleBlur = (event: FocusEvent) => {\n emit('blur', event)\n }\n\n /**\n * Select 속성 계산\n */\n const selectProps = computed(() => {\n return {\n class: selectClasses.value,\n value: props.modelValue ?? '',\n title: props.title || props.placeholder,\n name: props.name,\n id: props.id,\n disabled: props.disabled || props.readonly,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur\n }\n })\n\n /**\n * form-conts 클래스 계산\n */\n const formContsClasses = computed(() => {\n const classList = ['form-conts']\n\n if (props.state !== 'default') {\n classList.push(`is-${props.state}`)\n }\n\n return classList\n })\n\n /**\n * 옵션 렌더링\n */\n const renderOptions = () => {\n const optionElements = []\n\n // 플레이스홀더 옵션 (값이 없을 때만)\n if (props.placeholder && !props.modelValue) {\n optionElements.push(h('option', { value: '', disabled: true, selected: true }, props.placeholder))\n }\n\n // 옵션 목록\n if (props.options && props.options.length > 0) {\n props.options.forEach(option => {\n optionElements.push(\n h(\n 'option',\n {\n value: option.value,\n disabled: option.disabled,\n selected: option.value === props.modelValue\n },\n option.label\n )\n )\n })\n }\n\n // 슬롯으로 전달된 옵션들\n if (slots.default) {\n optionElements.push(...slots.default())\n }\n\n return optionElements\n }\n\n return () => {\n const selectElement = h('select', selectProps.value, renderOptions())\n\n if (props.sort) {\n return selectElement\n }\n\n return h('div', { class: formContsClasses.value }, [selectElement])\n }\n }\n})\n","import { defineComponent, computed, ref } from 'vue'\nimport type { Size, BaseFormProps } from '@/types'\n\n/**\n * 파일 정보 인터페이스\n */\nexport interface FileInfo {\n /** 파일 ID */\n id: string\n /** 파일 객체 */\n file: File\n /** 파일명 */\n name: string\n /** 파일 크기 (bytes) */\n size: number\n /** 파일 타입 */\n type: string\n /** 업로드 상태 */\n status: 'pending' | 'uploading' | 'completed' | 'error'\n /** 업로드 진행률 (0-100) */\n progress?: number\n /** 에러 메시지 */\n errorMessage?: string\n /** 다운로드 URL */\n downloadUrl?: string\n}\n\n/**\n * KRDS FileUpload 컴포넌트 속성\n */\nexport interface KrdsFileUploadProps extends BaseFormProps {\n /** 파일 목록 */\n modelValue?: FileInfo[]\n /** 입력 크기 */\n size?: Size\n /** 허용되는 파일 타입 (예: '.jpg,.png,.pdf') */\n accept?: string\n /** 최대 파일 개수 */\n maxFiles?: number\n /** 최대 파일 크기 (bytes) */\n maxFileSize?: number\n /** 다중 파일 선택 여부 */\n multiple?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 드래그 앤 드롭 활성화 여부 */\n dragAndDrop?: boolean\n /** 제목 */\n title?: string\n /** 설명 텍스트 */\n description?: string\n /** 플레이스홀더 텍스트 */\n placeholder?: string\n /** 미리보기 표시 여부 */\n showPreview?: boolean\n /** 다운로드 버튼 표시 여부 */\n showDownload?: boolean\n /** 바로보기 버튼 표시 여부 */\n showPreviewButton?: boolean\n /** 전체 삭제 버튼 표시 여부 */\n showClearAll?: boolean\n}\n\n/**\n * KRDS FileUpload 컴포넌트 이벤트\n */\nexport interface KrdsFileUploadEmits {\n 'update:modelValue': [files: FileInfo[]]\n 'file-added': [file: FileInfo]\n 'file-removed': [fileId: string]\n 'file-error': [file: FileInfo, error: string]\n 'upload-start': [file: FileInfo]\n 'upload-progress': [file: FileInfo, progress: number]\n 'upload-complete': [file: FileInfo]\n 'upload-error': [file: FileInfo, error: string]\n 'clear-all': []\n download: [file: FileInfo]\n preview: [file: FileInfo]\n}\n\nexport default defineComponent({\n name: 'KrdsFileUpload',\n props: {\n modelValue: {\n type: Array as () => FileInfo[],\n default: () => []\n },\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n accept: {\n type: String,\n default: undefined\n },\n maxFiles: {\n type: Number,\n default: 10\n },\n maxFileSize: {\n type: Number,\n default: 20 * 1024 * 1024 // 20MB\n },\n multiple: {\n type: Boolean,\n default: true\n },\n disabled: {\n type: Boolean,\n default: false\n },\n dragAndDrop: {\n type: Boolean,\n default: true\n },\n title: {\n type: String,\n default: '타이틀영역'\n },\n description: {\n type: String,\n default: '컨텐츠 영역'\n },\n placeholder: {\n type: String,\n default: '첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.'\n },\n showPreview: {\n type: Boolean,\n default: true\n },\n showDownload: {\n type: Boolean,\n default: true\n },\n showPreviewButton: {\n type: Boolean,\n default: true\n },\n showClearAll: {\n type: Boolean,\n default: true\n },\n // BaseFormProps에서 상속\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n style: {\n type: [String, Object],\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: [\n 'update:modelValue',\n 'file-added',\n 'file-removed',\n 'file-error',\n 'upload-start',\n 'upload-progress',\n 'upload-complete',\n 'upload-error',\n 'clear-all',\n 'download',\n 'preview'\n ],\n setup(props, { emit: _emit }) {\n const _isDragOver = ref(false)\n\n /**\n * 파일 업로드 클래스 계산\n */\n const _fileUploadClasses = computed(() => {\n const classes = ['krds-file-upload', 'line']\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 현재 파일 개수 계산\n */\n const currentFileCount = computed(() => {\n return props.modelValue?.length || 0\n })\n\n /**\n * 파일 추가 가능 여부\n */\n const _canAddFiles = computed(() => {\n return !props.disabled && currentFileCount.value < props.maxFiles\n })\n\n // TODO: 실제 구현 로직 추가\n // - 파일 선택 핸들러\n // - 드래그 앤 드롭 핸들러\n // - 파일 업로드 로직\n // - 파일 삭제 로직\n // - 파일 다운로드 로직\n // - 파일 미리보기 로직\n\n return () => {\n // TODO: 실제 렌더 함수 구현\n return null\n }\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps, Size } from '@/types'\n\n/**\n * KRDS Badge 컴포넌트 속성\n */\ntype ColorVariant = 'primary' | 'secondary' | 'gray' | 'point' | 'danger' | 'warning' | 'success' | 'information' | 'disabled'\n\nexport interface KrdsBadgeProps extends BaseComponentProps {\n /** 배지 타입 */\n type?: 'outline' | 'bg' | 'bg-light'\n /** 배지 컬러 */\n color?: ColorVariant\n /** 넘버 여부 */\n number?: boolean\n /** 배지 크기 */\n size?: 'large' | 'medium' | 'small'\n}\n\n/**\n * KRDS Badge 컴포넌트 이벤트\n */\nexport interface KrdsBadgeEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsBadgeProps>({\n name: 'KrdsBadge',\n props: {\n type: {\n type: String as () => 'outline' | 'bg' | 'bg-light',\n default: 'outline'\n },\n color: {\n type: String as () => ColorVariant,\n default: 'primary'\n },\n size: {\n type: String as () => Size,\n default: 'large'\n },\n number: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 배지 클래스 계산\n */\n const buttonClasses = computed(() => {\n const classes = ['krds-badge']\n\n // 타입과 컬러 조합 클래스\n classes.push(`${props.type}-${props.color}`)\n\n // 크기 클래스 (KRDS 실제 규격: small, medium, large)\n if (props.size) {\n classes.push(props.size)\n }\n\n // 넘버 클래스\n if (props.number) {\n classes.push('number')\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h(\n 'span',\n {\n type: props.type,\n color: props.color,\n size: props.size,\n number: props.number,\n class: buttonClasses.value,\n onClick: handleClick\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Tag 컴포넌트 속성\n */\nexport interface KrdsTagProps extends BaseComponentProps {\n /** 링크 태그 여부 */\n link?: boolean\n /** 링크 URL (link가 true일 때 사용) */\n href?: string\n /** 링크 타겟 (link가 true일 때 사용) */\n target?: string\n /** 링크 관계 (link가 true일 때 사용) */\n rel?: string\n}\n\n/**\n * KRDS Tag 컴포넌트 이벤트\n */\nexport interface KrdsTagEmits {\n (e: 'remove', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsTagProps>({\n name: 'KrdsTag',\n props: {\n link: {\n type: Boolean,\n default: false\n },\n href: {\n type: String,\n default: '#'\n },\n target: {\n type: String,\n default: undefined\n },\n rel: {\n type: String,\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['remove'],\n setup(props, { emit, slots }) {\n /**\n * 태그 클래스 계산\n */\n const tagClasses = computed(() => {\n const classes = ['krds-btn-tag']\n\n // 링크 클래스\n if (props.link) {\n classes.push('link')\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 삭제 버튼 클릭 핸들러\n */\n const handleDelete = (event: MouseEvent) => {\n emit('remove', event)\n }\n\n /**\n * 삭제 버튼 렌더링\n */\n const renderDeleteButton = () => {\n return h(\n 'button',\n {\n type: 'button',\n class: 'btn-delete',\n onClick: handleDelete\n },\n [h('span', { class: 'sr-only' }, '삭제')]\n )\n }\n\n return () => {\n const content = []\n\n // 슬롯 내용 추가\n const slotContent = slots.default?.()\n if (slotContent) {\n content.push(slotContent)\n }\n\n // 링크가 아닌 경우에만 삭제 버튼 추가\n if (!props.link) {\n content.push(renderDeleteButton())\n }\n\n // 링크인 경우 a 태그, 아닌 경우 span 태그\n if (props.link) {\n const linkAttrs: Record<string, unknown> = {\n href: props.href,\n class: tagClasses.value\n }\n\n // 선택적 a 태그 속성들\n if (props.target) linkAttrs.target = props.target\n if (props.rel) linkAttrs.rel = props.rel\n\n return h('a', linkAttrs, content)\n }\n\n return h(\n 'span',\n {\n class: tagClasses.value\n },\n content\n )\n }\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS TagGroup 크기 타입\n */\nexport type KrdsTagGroupSize = 'small' | 'medium' | 'large'\n\n/**\n * KRDS TagGroup 컴포넌트 속성\n */\nexport interface KrdsTagGroupProps extends BaseComponentProps {\n /** 태그 그룹 크기 */\n size?: KrdsTagGroupSize\n}\n\nexport default defineComponent<KrdsTagGroupProps>({\n name: 'KrdsTagGroup',\n props: {\n size: {\n type: String as () => KrdsTagGroupSize,\n default: 'medium'\n },\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n /**\n * 태그 그룹 클래스 계산\n */\n const tagGroupClasses = computed(() => {\n const classes = ['krds-tag-wrap']\n\n // 크기 클래스\n if (props.size) {\n classes.push(props.size)\n }\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n return () =>\n h(\n 'div',\n {\n class: tagGroupClasses.value\n },\n slots.default?.()\n )\n }\n})\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Masthead 컴포넌트 속성\n */\n\nexport type KrdsMastheadProps = BaseComponentProps\n\n/**\n * KRDS Masthead 컴포넌트 이벤트\n */\nexport interface KrdsMastheadEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent<KrdsMastheadProps>({\n name: 'KrdsMasthead',\n props: {\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * 배지 클래스 계산\n */\n const mastheadClasses = computed(() => {\n const classes = ['']\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event)\n }\n\n return () =>\n h(\n 'div',\n {\n id: 'krds-masthead',\n class: mastheadClasses.value,\n onClick: handleClick\n },\n [\n h('div', { class: 'toggle-wrap' }, [\n h('div', { class: 'toggle-head' }, [h('div', { class: 'inner' }, [h('span', { class: 'nuri-txt' }, slots.default?.())])])\n ])\n ]\n )\n }\n})\n","/**\n * KRDS Vue 유틸리티\n */\n\nlet idCounter = 0\n\n/**\n * 고유한 ID를 생성합니다.\n * Math.random()보다 성능이 좋고 예측 가능합니다.\n *\n * @param prefix - ID 접두사\n * @returns 고유한 ID 문자열\n */\nexport function generateId(prefix: string = 'krds'): string {\n return `${prefix}-${++idCounter}`\n}\n\n/**\n * 간단한 고유 ID를 생성합니다.\n * 브라우저와 Node.js 환경에서 모두 작동합니다.\n *\n * @returns 7자리 랜덤 문자열\n */\nexport function generateUid(): string {\n // 암호학적으로 안전한 난수가 필요한 경우가 아니라면\n // UI 컴포넌트 ID 생성에는 Math.random()이 충분합니다.\n // 더 안전한 방법이 필요하다면 crypto.randomUUID() 사용을 고려하세요.\n\n // 타임스탬프와 랜덤값을 조합하여 충돌 가능성을 줄입니다\n const timestamp = Date.now().toString(36).slice(-4)\n const random = Math.random().toString(36).substring(2, 5)\n return `${timestamp}${random}`\n}\n\n/**\n * 클래스명을 조합합니다.\n *\n * @param classes - 클래스명 배열 또는 객체\n * @returns 결합된 클래스명 문자열\n */\nexport function classNames(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { generateId, classNames } from '@/utils'\n\n/**\n * KRDS ToggleSwitch 컴포넌트 속성\n */\nexport interface KrdsToggleSwitchProps extends BaseFormProps {\n /** 모델 값 */\n modelValue?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 스위치 라벨 */\n label?: string\n /** 크기 */\n size?: 'medium' | 'large'\n}\n\n/**\n * KRDS ToggleSwitch 컴포넌트 이벤트\n */\nexport interface KrdsToggleSwitchEmits {\n (e: 'update:modelValue', value: boolean): void\n (e: 'change', value: boolean): void\n}\n\nexport default defineComponent<KrdsToggleSwitchProps>({\n name: 'KrdsToggleSwitch',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n label: {\n type: String,\n default: undefined\n },\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n name: {\n type: String,\n default: undefined\n },\n required: {\n type: Boolean,\n default: false\n },\n readonly: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue', 'change'],\n setup(props, { emit, attrs }) {\n /**\n * 스위치 상태 계산\n */\n const isChecked = computed(() => props.modelValue)\n\n /**\n * 스위치 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n return classNames('krds-form-toggle-switch', props.size, props.class)\n })\n\n /**\n * 스위치 토글 핸들러\n */\n const handleToggle = (event: Event) => {\n if (props.disabled) {\n return\n }\n\n const target = event.target as HTMLInputElement\n const newValue = target.checked\n\n emit('update:modelValue', newValue)\n emit('change', newValue)\n }\n\n /**\n * input ID 생성\n */\n const inputId = computed(() => {\n return props.id || generateId('toggle-switch')\n })\n\n return () => {\n return h(\n 'div',\n {\n class: containerClasses.value\n },\n [\n h('input', {\n type: 'checkbox',\n id: inputId.value,\n name: props.name,\n checked: isChecked.value,\n disabled: props.disabled,\n onChange: handleToggle,\n ...attrs\n }),\n h(\n 'label',\n {\n for: inputId.value\n },\n [\n h(\n 'span',\n {\n class: 'switch-toggle'\n },\n [h('i')]\n ),\n props.label || ''\n ]\n )\n ]\n )\n }\n }\n})\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS CheckArea 컴포넌트 속성\n */\nexport interface KrdsCheckAreaProps extends BaseComponentProps {\n /** 추가 클래스 */\n class?: string\n column?: boolean\n}\n\nexport default defineComponent<KrdsCheckAreaProps>({\n name: 'KrdsCheckArea',\n props: {\n class: {\n type: String,\n default: undefined\n },\n column: {\n type: Boolean,\n default: false\n }\n },\n setup(props, { slots }) {\n return () => {\n const classes = ['krds-check-area']\n\n if (props.column) {\n classes.push('chk-column')\n }\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return h(\n 'div',\n {\n class: classes\n },\n slots.default?.()\n )\n }\n }\n})\n","import { defineComponent, computed, h, SlotsType } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { generateId, classNames } from '@/utils'\n\n/**\n * KRDS Checkbox 컴포넌트 속성\n */\nexport interface KrdsCheckboxProps extends BaseFormProps {\n /** 모델 값 */\n modelValue?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 크기 */\n size?: 'medium' | 'large'\n /** Chip 스타일 여부 */\n chip?: boolean\n}\n\n/**\n * KRDS Checkbox 컴포넌트 이벤트\n */\nexport interface KrdsCheckboxEmits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nexport default defineComponent<KrdsCheckboxProps>({\n name: 'KrdsCheckbox',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n disabled: {\n type: Boolean,\n default: false\n },\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n chip: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n default?: () => unknown // Default slot with props\n description?: () => unknown // Description slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n /**\n * 체크 상태 계산\n */\n const isChecked = computed(() => {\n return props.modelValue\n })\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const baseClass = props.chip ? 'krds-form-chip' : 'krds-form-check'\n return classNames(baseClass, props.size, props.class)\n })\n\n /**\n * 체크박스 변경 핸들러\n */\n const handleChange = (event: Event) => {\n if (props.disabled) {\n return\n }\n\n const target = event.target as HTMLInputElement\n const newValue = target.checked\n\n emit('update:modelValue', newValue)\n }\n\n /**\n * input ID 생성\n */\n const inputId = computed(() => {\n return props.id || generateId('checkbox')\n })\n\n return () => {\n const children = [\n h('input', {\n type: 'checkbox',\n id: inputId.value,\n checked: isChecked.value,\n disabled: props.disabled,\n onChange: handleChange,\n ...attrs\n }),\n h(\n 'label',\n {\n for: inputId.value\n },\n slots.default?.()\n )\n ]\n\n // description 슬롯이 있고 chip이 false일 때만 추가\n if (slots.description && !props.chip) {\n children.push(h('div', { class: 'krds-form-check-cnt' }, h('p', { class: 'krds-form-check-p' }, slots.description())))\n }\n\n return h(\n 'div',\n {\n class: containerClasses.value\n },\n children\n )\n }\n }\n})\n","import { defineComponent, computed, h, SlotsType } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { generateId, classNames } from '@/utils'\n\n/**\n * KRDS Radio 컴포넌트 속성\n */\nexport interface KrdsRadioProps extends BaseFormProps {\n /** 모델 값 */\n modelValue?: string | number | boolean\n /** 라디오 값 */\n value: string | number | boolean\n /** 비활성화 여부 */\n disabled?: boolean\n /** 크기 */\n size?: 'medium' | 'large'\n /** Chip 스타일 여부 */\n chip?: boolean\n}\n\n/**\n * KRDS Radio 컴포넌트 이벤트\n */\nexport interface KrdsRadioEmits {\n (e: 'update:modelValue', value: string | number | boolean): void\n}\n\nexport default defineComponent<KrdsRadioProps>({\n name: 'KrdsRadio',\n props: {\n modelValue: {\n type: [String, Number, Boolean],\n default: undefined\n },\n value: {\n type: [String, Number, Boolean],\n required: true\n },\n disabled: {\n type: Boolean,\n default: false\n },\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n chip: {\n type: Boolean,\n default: false\n },\n name: {\n type: String,\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n },\n id: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n default?: () => unknown // Default slot with props\n description?: () => unknown // Named slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n /**\n * 선택 상태 계산\n */\n const isChecked = computed(() => {\n return props.modelValue === props.value\n })\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const baseClass = props.chip ? 'krds-form-chip' : 'krds-form-check'\n return classNames(baseClass, props.size, props.class)\n })\n\n /**\n * 라디오 변경 핸들러\n */\n const handleChange = (event: Event) => {\n if (props.disabled) {\n return\n }\n\n const target = event.target as HTMLInputElement\n if (target.checked) {\n emit('update:modelValue', props.value)\n }\n }\n\n /**\n * input ID 생성\n */\n const inputId = computed(() => {\n return props.id || generateId('radio')\n })\n\n /**\n * name 속성 계산\n */\n const inputName = computed(() => {\n return props.name\n })\n\n return () => {\n const children = [\n h('input', {\n type: 'radio',\n id: inputId.value,\n name: inputName.value,\n value: String(props.value),\n checked: isChecked.value,\n disabled: props.disabled,\n onChange: handleChange,\n ...attrs\n }),\n h(\n 'label',\n {\n for: inputId.value\n },\n slots.default?.()\n )\n ]\n\n // description 슬롯이 있고 chip이 false일 때만 추가\n if (slots.description && !props.chip) {\n children.push(h('div', { class: 'krds-form-check-cnt' }, h('p', { class: 'krds-form-check-p' }, slots.description())))\n }\n\n return h(\n 'div',\n {\n class: containerClasses.value\n },\n children\n )\n }\n }\n})\n","import { defineComponent, provide, computed, ref, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS StepIndicator 컴포넌트 속성\n */\nexport interface KrdsStepIndicatorProps extends BaseComponentProps {\n /** 현재 활성 단계 인덱스 (0부터 시작) - v-model */\n modelValue?: number\n}\n\n/**\n * KRDS StepIndicator 컴포넌트 이벤트\n */\nexport interface KrdsStepIndicatorEmits {\n (e: 'update:modelValue', value: number): void\n}\n\nexport default defineComponent<KrdsStepIndicatorProps>({\n name: 'KrdsStepIndicator',\n props: {\n modelValue: {\n type: Number,\n default: 0\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['update:modelValue'],\n setup(props, { slots }) {\n /**\n * Stepper 클래스 계산\n */\n const stepperClasses = computed(() => {\n const classes = ['krds-step-wrap']\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 단계별 상태 계산\n */\n const getStepStatus = (index: number): 'done' | 'active' | 'pending' => {\n const currentStep = props.modelValue || 0\n if (index < currentStep) return 'done'\n if (index === currentStep) return 'active'\n return 'pending'\n }\n\n /**\n * 단계 인덱스 추적 (반응형)\n */\n const stepIndex = ref(0)\n const resetStepIndex = () => {\n stepIndex.value = 0\n }\n const getNextStepIndex = () => {\n return stepIndex.value++\n }\n\n /**\n * 컨텍스트 제공\n */\n provide('stepIndicator', {\n activeStep: computed(() => props.modelValue || 0),\n getStepStatus,\n getNextStepIndex,\n resetStepIndex\n })\n\n return () => {\n // 슬롯 기반 렌더링\n resetStepIndex() // 렌더링 시작 전 인덱스 초기화\n return h(\n 'ol',\n {\n class: stepperClasses.value\n },\n slots.default?.()\n )\n }\n }\n})\n","import { defineComponent, inject, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\nimport type { ComputedRef } from 'vue'\n\n/**\n * KRDS Step 컴포넌트 속성\n */\nexport interface KrdsStepProps extends BaseComponentProps {\n /** 단계 번호 */\n step: string | number\n /** 단계 제목 */\n title: string\n /** 단계 상태 강제 설정 (선택적) */\n status?: 'done' | 'active' | 'pending'\n}\n\n/**\n * KRDS Step 컴포넌트 이벤트\n */\nexport interface KrdsStepEmits {\n (e: 'click', event: MouseEvent, step: string | number): void\n}\n\n/**\n * Stepper 컨텍스트 타입\n */\ninterface StepIndicatorContext {\n activeStep: ComputedRef<number>\n getStepStatus: (index: number) => 'done' | 'active' | 'pending'\n getNextStepIndex: () => number\n resetStepIndex: () => void\n}\n\nexport default defineComponent<KrdsStepProps>({\n name: 'KrdsStep',\n props: {\n step: {\n type: [String, Number],\n required: true\n },\n title: {\n type: String,\n required: true\n },\n status: {\n type: String as () => 'done' | 'active' | 'pending',\n default: undefined\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['click'],\n setup(props, { emit, slots }) {\n /**\n * StepIndicator 컨텍스트 주입 (선택적)\n */\n const stepIndicatorContext = inject<StepIndicatorContext | null>('stepIndicator')\n\n /**\n * 현재 단계의 인덱스 계산\n */\n const stepIndex = stepIndicatorContext ? stepIndicatorContext.getNextStepIndex() : -1\n\n /**\n * 단계 상태 계산\n */\n const stepStatus = computed(() => {\n // props로 상태가 직접 지정된 경우 우선 사용\n if (props.status) {\n return props.status\n }\n\n // StepIndicator 컨텍스트가 있으면 인덱스 기반으로 상태 계산\n if (stepIndicatorContext && stepIndex >= 0) {\n return stepIndicatorContext.getStepStatus(stepIndex)\n }\n\n // 기본값\n return 'pending'\n })\n\n /**\n * 단계 클래스 계산\n */\n const stepClasses = computed(() => {\n const classes: string[] = [stepStatus.value]\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 클릭 핸들러\n */\n const handleClick = (event: MouseEvent) => {\n emit('click', event, props.step)\n }\n\n return () => {\n const isActive = stepStatus.value === 'active'\n\n return h(\n 'li',\n {\n class: stepClasses.value,\n onClick: handleClick\n },\n [\n h('span', [\n // 현재 단계 표시 (활성 상태일 때만)\n isActive && h('em', { class: 'sr-only' }, '현재단계'),\n // 단계 번호\n h('i', { class: 'step' }, props.step),\n // 단계 제목\n h('span', { class: 'step-tit' }, props.title),\n // 슬롯 내용 (추가 콘텐츠가 있는 경우)\n slots.default?.()\n ])\n ]\n )\n }\n }\n})\n","import { defineComponent, h, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS SkipLink 컴포넌트 속성\n */\nexport interface KrdsSkipLinkProps extends BaseComponentProps {\n /** 건너뛸 대상 요소의 ID */\n href: string\n}\n\n/**\n * KRDS SkipLink 컴포넌트\n *\n * 건너뛰기 링크는 웹사이트에서 웹 페이지의 주요 콘텐츠 섹션의 탐색을 도와주는 페이지 내부 링크입니다.\n * 키보드나 가상 초점을 이용하여 콘텐츠를 탐색하는 사용자는 건너뛰기 링크를 이용하여\n * 대부분의 페이지에서 반복되는 콘텐츠 영역을 건너뛰고 주요 콘텐츠로 빠르게 이동할 수 있습니다.\n *\n * @example\n * ```vue\n * <KrdsSkipLink href=\"#main-content\">본문 바로가기</KrdsSkipLink>\n * <KrdsSkipLink href=\"#breadcrumb\">본문 바로가기</KrdsSkipLink>\n * <KrdsSkipLink href=\"#gnb\">메인메뉴 바로가기</KrdsSkipLink>\n * ```\n */\nexport default defineComponent({\n name: 'KrdsSkipLink',\n props: {\n /**\n * 건너뛸 대상 요소의 ID\n * @example '#main-content', '#breadcrumb'\n */\n href: {\n type: String,\n required: true,\n validator: (value: string) => value.startsWith('#')\n },\n /**\n * 추가 CSS 클래스\n */\n class: {\n type: [String, Array, Object],\n default: undefined\n },\n /**\n * 요소 ID\n */\n id: {\n type: String,\n default: 'krds-skip-link'\n }\n },\n setup(props, { slots }) {\n return (): VNode => {\n return h(\n 'div',\n {\n id: props.id,\n class: props.class\n },\n [\n h(\n 'a',\n {\n href: props.href\n },\n slots.default?.()\n )\n ]\n )\n }\n }\n})\n","<template>\n <nav :id=\"id\" class=\"krds-breadcrumb-wrap\" :aria-label=\"ariaLabel\">\n <ol class=\"breadcrumb\">\n <li v-for=\"(item, index) in items\" :key=\"`breadcrumb-${index}`\" :class=\"{ home: index === 0 && showHomeIcon }\">\n <a\n :href=\"item.href || '#'\"\n class=\"txt\"\n :aria-current=\"isCurrentPage(index) ? 'page' : undefined\"\n @click=\"handleClick(item, $event)\"\n >\n <span v-if=\"!(index === 0 && showHomeIcon)\">{{ item.text }}</span>\n </a>\n </li>\n </ol>\n </nav>\n</template>\n\n<script setup lang=\"ts\">\n // ========================\n // 타입 정의\n // ========================\n\n /**\n * 브레드크럼 아이템 인터페이스\n */\n export interface BreadcrumbItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n }\n\n /**\n * KRDS Breadcrumb 컴포넌트 속성\n */\n export interface KrdsBreadcrumbProps {\n /** 브레드크럼 아이템 배열 */\n items: BreadcrumbItem[]\n /** 엘리먼트 ID */\n id?: string\n /** 접근성 라벨 */\n ariaLabel?: string\n /** 홈 아이콘 표시 여부 */\n showHomeIcon?: boolean\n }\n\n /**\n * KRDS Breadcrumb 컴포넌트 이벤트\n */\n export interface KrdsBreadcrumbEmits {\n 'item-click': [item: BreadcrumbItem, event: MouseEvent]\n }\n\n // ========================\n // Props & Emits\n // ========================\n\n const props = withDefaults(defineProps<KrdsBreadcrumbProps>(), {\n id: undefined,\n ariaLabel: '현재 경로',\n showHomeIcon: true\n })\n\n const emit = defineEmits<KrdsBreadcrumbEmits>()\n\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 현재 페이지 여부 확인\n */\n const isCurrentPage = (index: number) => index === props.items.length - 1\n\n // ========================\n // Event Handlers\n // ========================\n\n /**\n * 아이템 클릭 핸들러\n */\n const handleClick = (item: BreadcrumbItem, event: MouseEvent) => {\n // 커스텀 onClick 핸들러 실행\n if (item.onClick) {\n item.onClick(event)\n }\n\n // 상위로 이벤트 전달\n emit('item-click', item, event)\n }\n</script>\n","import { defineComponent, computed, h, ref, onMounted, onUnmounted, SlotsType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * 네비게이션 아이템 인터페이스\n */\nexport interface NavigationItem {\n /** 링크 URL (앵커 링크) */\n href: string\n /** 표시될 텍스트 */\n text: string\n /** 활성 상태 여부 */\n active?: boolean\n}\n\n/**\n * KRDS InPageNavigation 컴포넌트 속성\n */\nexport interface KrdsInPageNavigationProps extends BaseComponentProps {\n /** 네비게이션 제목 */\n title?: string\n /** 네비게이션 캡션 */\n caption?: string\n /** 네비게이션 아이템 목록 */\n items?: NavigationItem[]\n /** 스크롤에 따른 자동 활성화 여부 */\n autoActive?: boolean\n /** 헤더 상단 영역 선택자 (기본값: '#krds-masthead') */\n headerTopSelector?: string\n /** 헤더 내부 영역 선택자 (기본값: '#krds-header .header-in') */\n headerInnerSelector?: string\n}\n\n/**\n * KRDS InPageNavigation 컴포넌트 이벤트\n */\nexport interface KrdsInPageNavigationEmits {\n (e: 'itemClick', item: NavigationItem, event: MouseEvent | KeyboardEvent): void\n}\n\nexport default defineComponent<KrdsInPageNavigationProps>({\n name: 'KrdsInPageNavigation',\n props: {\n title: {\n type: String,\n default: undefined\n },\n caption: {\n type: String,\n default: '이 페이지의 구성'\n },\n items: {\n type: Array as () => NavigationItem[],\n default: () => []\n },\n autoActive: {\n type: Boolean,\n default: true\n },\n headerTopSelector: {\n type: String,\n default: '#krds-masthead'\n },\n headerInnerSelector: {\n type: String,\n default: '#krds-header .header-in'\n },\n class: {\n type: String,\n default: undefined\n }\n },\n emits: ['itemClick'],\n slots: Object as SlotsType<{\n action?: () => unknown // Named slot without props\n }>,\n setup(props, { emit, slots }) {\n const activeItem = ref<string>('')\n const sectionElements = ref<Map<string, HTMLElement>>(new Map())\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const classes = ['krds-in-page-navigation-type']\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 헤더 높이 계산\n */\n const calculateHeaderHeight = () => {\n const headerTopSelector = props.headerTopSelector as string\n const headerInnerSelector = props.headerInnerSelector as string\n const headerTop = (document.querySelector(headerTopSelector) as HTMLElement)?.clientHeight || 0\n const headerInner = (document.querySelector(headerInnerSelector) as HTMLElement)?.clientHeight || 0\n return headerTop + headerInner\n }\n\n /**\n * 네비게이션 아이템 클릭 핸들러\n */\n const handleItemClick = (item: NavigationItem, event: MouseEvent | KeyboardEvent) => {\n emit('itemClick', item, event)\n\n // href가 앵커 링크인 경우 스크롤 처리\n if (item.href.startsWith('#')) {\n event.preventDefault()\n const targetElement = document.querySelector(item.href)\n if (targetElement) {\n const headerHeight = calculateHeaderHeight()\n\n window.scrollTo({\n left: 0,\n top: targetElement.getBoundingClientRect().top + window.scrollY - headerHeight,\n behavior: 'smooth'\n })\n\n activeItem.value = item.href\n\n // 키보드 네비게이션의 경우 포커스 이동 (접근성)\n if (event instanceof KeyboardEvent) {\n const focusable = targetElement.querySelector('.sec-tit, h1, h2, h3, h4, h5, h6')\n if (focusable && focusable instanceof HTMLElement) {\n focusable.setAttribute('tabindex', '-1')\n focusable.focus({ preventScroll: true })\n }\n }\n }\n }\n }\n\n /**\n * 섹션 요소들을 캐싱\n */\n const cacheSectionElements = () => {\n sectionElements.value.clear()\n\n if (!props.items) return\n\n props.items\n .filter(item => item.href.startsWith('#'))\n .forEach(item => {\n const element = document.querySelector(item.href) as HTMLElement | null\n if (element) {\n sectionElements.value.set(item.href, element)\n }\n })\n }\n\n /**\n * 스크롤에 따른 활성 아이템 업데이트\n */\n const updateActiveItem = () => {\n if (!props.autoActive || !props.items || sectionElements.value.size === 0) return\n\n const winHeight = window.innerHeight\n const topHeight = Math.ceil(winHeight / 5) // 윈도우의 20%\n const scrollBottom = window.scrollY + winHeight\n const scrollHeight = document.body.scrollHeight\n\n // 캐싱된 요소들을 사용\n const sections = props.items\n .filter(item => item.href.startsWith('#') && sectionElements.value.has(item.href))\n .map(item => ({\n href: item.href,\n element: sectionElements.value.get(item.href)!,\n item\n }))\n\n if (sections.length === 0) return\n\n const firstSection = sections[0]\n const lastSection = sections[sections.length - 1]\n const firstSecTop = firstSection.element.offsetTop\n\n let newActiveItem = ''\n\n // 스크롤이 페이지 끝에 도달했을 때\n if (scrollBottom >= scrollHeight) {\n newActiveItem = lastSection.href\n }\n // 스크롤이 첫번째 섹션보다 위에 있을때\n else if (window.scrollY <= firstSecTop) {\n newActiveItem = firstSection.href\n }\n // 현재 섹션 확인\n else {\n for (const section of sections) {\n const sectionHeight = section.element.offsetHeight\n const sectionTop = section.element.offsetTop - topHeight\n\n if (window.scrollY > sectionTop && window.scrollY <= sectionTop + sectionHeight) {\n newActiveItem = section.href\n break\n }\n }\n }\n\n // 활성 아이템 업데이트\n if (newActiveItem && newActiveItem !== activeItem.value) {\n activeItem.value = newActiveItem\n }\n }\n\n /**\n * 초기 활성 아이템 설정\n */\n const initActiveItem = () => {\n if (!props.items) return\n\n const activeFromProps = props.items.find(item => item.active)\n if (activeFromProps) {\n activeItem.value = activeFromProps.href\n } else if (props.items.length > 0) {\n activeItem.value = props.items[0].href\n }\n }\n\n /**\n * 컴포넌트 마운트 시 초기화\n */\n onMounted(() => {\n initActiveItem()\n\n if (props.autoActive) {\n // 섹션 요소들을 미리 캐싱\n cacheSectionElements()\n updateActiveItem()\n window.addEventListener('scroll', updateActiveItem, { passive: true })\n\n // DOM 변경 감지를 위한 MutationObserver 설정 (선택사항)\n const observer = new MutationObserver(() => {\n cacheSectionElements()\n })\n\n // body 태그의 자식 요소 변경을 감지\n observer.observe(document.body, {\n childList: true,\n subtree: true\n })\n\n // cleanup 함수에서 observer도 정리하도록 설정\n onUnmounted(() => {\n observer.disconnect()\n })\n }\n })\n\n /**\n * 컴포넌트 언마운트 시 정리\n */\n onUnmounted(() => {\n if (props.autoActive) {\n window.removeEventListener('scroll', updateActiveItem)\n // 캐싱된 요소들 정리\n sectionElements.value.clear()\n }\n })\n\n /**\n * 네비게이션 헤더 렌더링\n */\n const renderHeader = () => {\n if (!props.caption && !props.title) return null\n\n return h('div', { class: 'in-page-navigation-header' }, [\n props.caption && h('p', { class: 'quick-caption' }, props.caption),\n props.title && h('p', { class: 'quick-title' }, props.title)\n ])\n }\n\n /**\n * 네비게이션 리스트 렌더링\n */\n const renderNavList = () => {\n if (!props.items) return null\n\n const listItems = props.items.map(item => {\n // 활성 상태 결정: autoActive 시 스크롤 기반, 아니면 active 속성 포함\n const isActive = activeItem.value === item.href || (!props.autoActive && item.active)\n\n return h('li', { key: item.href }, [\n h(\n 'a',\n {\n href: item.href,\n class: isActive ? 'active' : '',\n onClick: (event: MouseEvent) => handleItemClick(item, event),\n onKeydown: (event: KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n handleItemClick(item, event)\n }\n }\n },\n item.text\n )\n ])\n })\n\n return h('nav', { class: 'in-page-navigation-list' }, [h('ul', {}, listItems)])\n }\n\n /**\n * 액션 영역 렌더링\n */\n const renderAction = () => {\n if (!slots.action) return null\n\n return h('div', { class: 'in-page-navigation-action' }, [slots.action()])\n }\n\n return () =>\n h('div', { class: containerClasses.value }, [\n h('div', { class: 'krds-in-page-navigation-area' }, [renderHeader(), renderNavList(), renderAction()].filter(Boolean))\n ])\n }\n})\n","<template>\n <div :id=\"id\" class=\"krds-pagination\">\n <!-- 이전 버튼 -->\n <component\n :is=\"prevDisabled ? 'span' : 'a'\"\n :href=\"prevDisabled ? undefined : prevHref\"\n :class=\"['page-navi', 'prev', { disabled: prevDisabled }]\"\n @click=\"handlePrevClick\"\n >\n 이전\n </component>\n\n <!-- 페이지 링크 -->\n <div class=\"page-links\">\n <template v-for=\"item in displayedPages\" :key=\"item.key\">\n <!-- 일반 페이지 링크 -->\n <a\n v-if=\"item.type === 'page'\"\n :href=\"item.href || '#'\"\n :class=\"['page-link', { active: item.page === currentPage }]\"\n :aria-current=\"item.page === currentPage ? 'page' : undefined\"\n @click=\"handlePageClick(item.page!, $event)\"\n >\n <span v-if=\"item.page === currentPage\" v-sr-only>현재페이지</span>\n {{ item.page }}\n </a>\n\n <!-- 생략 표시(점점점) -->\n <span v-else-if=\"item.type === 'ellipsis'\" class=\"page-link link-dot\" :aria-label=\"item.ariaLabel\"></span>\n </template>\n </div>\n\n <!-- 다음 버튼 -->\n <component\n :is=\"nextDisabled ? 'span' : 'a'\"\n :href=\"nextDisabled ? undefined : nextHref\"\n :class=\"['page-navi', 'next', { disabled: nextDisabled }]\"\n @click=\"handleNextClick\"\n >\n 다음\n </component>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n\n // ========================\n // 타입 정의\n // ========================\n\n /**\n * 페이지 아이템 타입\n */\n interface PageItem {\n type: 'page' | 'ellipsis'\n key: string\n page?: number\n href?: string\n ariaLabel?: string\n }\n\n /**\n * KRDS Pagination 컴포넌트 속성\n */\n export interface KrdsPaginationProps {\n /** 현재 페이지 번호 (v-model) */\n modelValue?: number\n /** 최소 페이지 번호 (기본값: 1, 최소값: 1) */\n min?: number\n /** 최대 페이지 번호 (전체 페이지 수) */\n max: number\n /** 엘리먼트 ID */\n id?: string\n /** 접근성 라벨 */\n ariaLabel?: string\n /** 표시할 페이지 범위 */\n pageRange?: number\n }\n\n /**\n * KRDS Pagination 컴포넌트 이벤트\n */\n export interface KrdsPaginationEmits {\n /** v-model 업데이트 이벤트 */\n 'update:modelValue': [value: number]\n }\n\n // ========================\n // Props & Emits\n // ========================\n\n const props = withDefaults(defineProps<KrdsPaginationProps>(), {\n modelValue: 1,\n min: 1,\n id: undefined,\n ariaLabel: '페이지 내비게이션',\n pageRange: 8\n })\n\n const emit = defineEmits<KrdsPaginationEmits>()\n\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 최소 페이지 번호 (1보다 작을 수 없음)\n */\n const minPage = computed(() => Math.max(1, props.min))\n\n /**\n * 현재 페이지 값 (v-model 처리)\n */\n const currentPage = computed(() => props.modelValue ?? minPage.value)\n\n /**\n * 이전 페이지 비활성화 여부\n */\n const prevDisabled = computed(() => currentPage.value <= minPage.value)\n\n /**\n * 다음 페이지 비활성화 여부\n */\n const nextDisabled = computed(() => currentPage.value >= props.max)\n\n /**\n * 이전 페이지 URL\n */\n const prevHref = computed(() => {\n if (prevDisabled.value) return undefined\n return '#'\n })\n\n /**\n * 다음 페이지 URL\n */\n const nextHref = computed(() => {\n if (nextDisabled.value) return undefined\n return '#'\n })\n\n /**\n * 표시할 페이지 목록 계산\n */\n const displayedPages = computed((): PageItem[] => {\n const { pageRange, max: totalPages } = props\n const boundaryRange = 1\n const pages: PageItem[] = []\n\n if (totalPages <= pageRange + 2 * boundaryRange) {\n // 모든 페이지를 표시할 수 있는 경우\n for (let i = minPage.value; i <= totalPages; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n } else {\n // 생략이 필요한 경우\n const leftBoundary = Math.min(boundaryRange, totalPages)\n const rightBoundary = Math.max(totalPages - boundaryRange + 1, 1)\n\n const rangeStart = Math.max(minPage.value, currentPage.value - Math.floor(pageRange / 2))\n const rangeEnd = Math.min(totalPages, rangeStart + pageRange - 1)\n const adjustedRangeStart = Math.max(minPage.value, rangeEnd - pageRange + 1)\n\n // 왼쪽 경계 페이지들\n for (let i = minPage.value; i <= leftBoundary; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n\n // 왼쪽 생략\n if (adjustedRangeStart > leftBoundary + 1) {\n pages.push({\n type: 'ellipsis',\n key: 'ellipsis-left',\n ariaLabel: '페이지 생략'\n })\n }\n\n // 중앙 범위 페이지들\n const startPage = Math.max(adjustedRangeStart, leftBoundary + 1)\n const endPage = Math.min(rangeEnd, rightBoundary - 1)\n\n for (let i = startPage; i <= endPage; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n\n // 오른쪽 생략\n if (rangeEnd < rightBoundary - 1) {\n pages.push({\n type: 'ellipsis',\n key: 'ellipsis-right',\n ariaLabel: '페이지 생략'\n })\n }\n\n // 오른쪽 경계 페이지들\n for (let i = rightBoundary; i <= totalPages; i++) {\n pages.push({\n type: 'page',\n key: `page-${i}`,\n page: i,\n href: '#'\n })\n }\n }\n\n return pages\n })\n\n // ========================\n // Event Handlers\n // ========================\n\n /**\n * 페이지 클릭 핸들러\n */\n const handlePageClick = (page: number, event: MouseEvent) => {\n if (page === currentPage.value) {\n event.preventDefault()\n return\n }\n\n emit('update:modelValue', page)\n }\n\n /**\n * 이전 페이지 클릭 핸들러\n */\n const handlePrevClick = (event: MouseEvent) => {\n if (prevDisabled.value) {\n event.preventDefault()\n return\n }\n\n const prevPage = currentPage.value - 1\n emit('update:modelValue', prevPage)\n }\n\n /**\n * 다음 페이지 클릭 핸들러\n */\n const handleNextClick = (event: MouseEvent) => {\n if (nextDisabled.value) {\n event.preventDefault()\n return\n }\n\n const nextPage = currentPage.value + 1\n emit('update:modelValue', nextPage)\n }\n</script>\n","<template>\n <div class=\"inner help-panel-flexible\">\n <button type=\"button\" class=\"krds-btn small tertiary btn-help-panel expand btn-help-exec\" @click=\"handleOpen\">\n <i class=\"svg-icon ico-fold\"></i>\n 도움말\n </button>\n <div class=\"krds-help-panel\" :class=\"{ expand: open }\">\n <div class=\"help-panel-wrap\">\n <div class=\"help-conts-area\">\n <slot />\n <button type=\"button\" class=\"krds-btn small tertiary btn-help-panel fold\" @click=\"handleClose\">\n <span class=\"sr-only\">도움말</span>\n 접어두기\n <i class=\"svg-icon ico-angle right\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n\n export interface KrdsPanelProps {\n modelValue?: boolean\n }\n\n interface Emits {\n (e: 'update:modelValue', value: boolean): void\n }\n\n const props = withDefaults(defineProps<KrdsPanelProps>(), {\n modelValue: false\n })\n\n const emit = defineEmits<Emits>()\n\n const open = computed({\n get: () => props.modelValue,\n set: value => emit('update:modelValue', value)\n })\n\n const handleOpen = () => {\n open.value = true\n }\n const handleClose = () => {\n open.value = false\n }\n</script>\n\n<style scoped></style>\n","<template>\n <div ref=\"containerRef\" class=\"krds-contextual-help\" :class=\"props.position\">\n <div class=\"tooltip-action\">\n <button ref=\"tooltipBtnRef\" type=\"button\" class=\"krds-btn medium icon tooltip-btn\" @click=\"toggleTooltip\">\n <span class=\"sr-only\">도움말</span>\n <i v-if=\"props.helpIcon\" class=\"svg-icon ico-help\"></i>\n <i v-else class=\"svg-icon ico-tooltip\"></i>\n </button>\n <div ref=\"tooltipPopoverRef\" class=\"tooltip-popover\" role=\"tooltip\">\n <h4 class=\"tooltip-title\">{{ props.tooltipTitle }}</h4>\n <div class=\"tooltip-contents\">\n <slot />\n </div>\n <button ref=\"closeBtnRef\" type=\"button\" class=\"krds-btn xsmall icon tooltip-close\" @click=\"closeTooltip\">\n <span class=\"sr-only\">닫기</span>\n <i class=\"svg-icon ico-modal-close\"></i>\n </button>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { ref, onMounted, onUnmounted } from 'vue'\n\n export interface KrdsContextualHelpProps {\n tooltipTitle?: string\n helpIcon?: boolean\n position?: 'top left' | 'top center' | 'top right' | 'bottom left' | 'bottom center' | 'bottom right'\n }\n\n const props = withDefaults(defineProps<KrdsContextualHelpProps>(), {\n tooltipTitle: '도움말 제목',\n position: 'top left'\n })\n\n // Template refs\n const containerRef = ref<HTMLElement>()\n const tooltipBtnRef = ref<HTMLElement>()\n const tooltipPopoverRef = ref<HTMLElement>()\n const closeBtnRef = ref<HTMLElement>()\n\n // State\n const isVisible = ref(false)\n\n // Methods\n const toggleTooltip = () => {\n const wasVisible = isVisible.value\n closeAllTooltips()\n\n if (!wasVisible) {\n showTooltip()\n }\n }\n\n const showTooltip = () => {\n if (!tooltipPopoverRef.value || !tooltipBtnRef.value) return\n\n isVisible.value = true\n tooltipPopoverRef.value.style.display = 'block'\n tooltipBtnRef.value.setAttribute('aria-expanded', 'true')\n\n // Focus first focusable element\n const focusables = tooltipPopoverRef.value.querySelector('a, button, [tabindex=\"0\"], input, textarea, select') as HTMLElement\n focusables?.focus()\n\n adjustTooltipPosition()\n }\n\n const closeTooltip = () => {\n if (!tooltipPopoverRef.value || !tooltipBtnRef.value) return\n\n isVisible.value = false\n tooltipPopoverRef.value.style.display = 'none'\n tooltipBtnRef.value.setAttribute('aria-expanded', 'false')\n }\n\n const closeAllTooltips = () => {\n // Close all tooltips in the document\n const allPopovers = document.querySelectorAll('.krds-contextual-help .tooltip-popover') as NodeListOf<HTMLElement>\n const allButtons = document.querySelectorAll('.krds-contextual-help .tooltip-btn') as NodeListOf<HTMLElement>\n\n allPopovers.forEach(popover => {\n popover.style.display = 'none'\n })\n allButtons.forEach(button => {\n button.setAttribute('aria-expanded', 'false')\n })\n\n isVisible.value = false\n }\n\n const adjustTooltipPosition = () => {\n if (!containerRef.value || !tooltipPopoverRef.value) return\n\n const isMobile = window.innerWidth <= 768\n const tooltipAction = containerRef.value.querySelector('.tooltip-action') as HTMLElement\n\n if (isMobile) {\n const rootStyles = getComputedStyle(document.querySelector(':root')!)\n const contentsPaddingX = rootStyles.getPropertyValue('--krds-contents-padding-x').trim().split('px')[0]\n const tooltipActionRect = tooltipAction.getBoundingClientRect()\n const offsetLeft = tooltipActionRect.left - parseInt(contentsPaddingX)\n const width = document.body.clientWidth - parseInt(contentsPaddingX) * 2\n tooltipPopoverRef.value.style.left = `-${offsetLeft}px`\n tooltipPopoverRef.value.style.width = `${width}px`\n } else {\n tooltipPopoverRef.value.style.left = ''\n tooltipPopoverRef.value.style.right = ''\n tooltipPopoverRef.value.style.width = '360px'\n }\n }\n\n // Event handlers\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' || event.key === 'Esc') {\n closeAllTooltips()\n }\n }\n\n const handleOutsideClick = (event: Event) => {\n const target = event.target as Element\n const clickedInsideTooltip = target.closest('.tooltip-action')\n if (!clickedInsideTooltip) {\n closeAllTooltips()\n }\n }\n\n const handleResize = () => {\n if (isVisible.value) {\n adjustTooltipPosition()\n }\n }\n\n // Lifecycle\n onMounted(() => {\n if (!containerRef.value) return\n\n // Setup ARIA attributes\n if (tooltipBtnRef.value) {\n tooltipBtnRef.value.setAttribute('aria-expanded', 'false')\n }\n if (tooltipPopoverRef.value) {\n tooltipPopoverRef.value.setAttribute('role', 'tooltip')\n }\n\n // Add global event listeners\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('click', handleOutsideClick)\n window.addEventListener('resize', handleResize)\n })\n\n onUnmounted(() => {\n // Clean up global event listeners\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleOutsideClick)\n window.removeEventListener('resize', handleResize)\n })\n</script>\n<style scoped></style>\n","<template>\n <!-- coach mark -->\n <div class=\"krds-coach-mark\" :class=\"coachMarkClass\" :style=\"style\">\n <!-- 따라하기 말풍선 -->\n <div v-if=\"modelValue === activeStep && currentStepData\" class=\"coach-balloon\">\n <h5 class=\"sr-only\">따라하기 가이드</h5>\n <h6 class=\"coach-tit\">{{ activeStep }}단계 : {{ currentStepData.title }}</h6>\n <p class=\"desc\">{{ currentStepData.description }}</p>\n <div class=\"coach-controls\">\n <div class=\"num\">\n <span class=\"sr-only\">현재 단계</span>\n <strong>{{ activeStep }}</strong>\n <span class=\"sr-only\">총 단계</span>\n <span>{{ stepsData.length }}</span>\n </div>\n <div class=\"btn-wrap\">\n <button type=\"button\" class=\"krds-btn small text\" @click=\"closeCoachMark\">그만보기</button>\n <button v-if=\"activeStep !== 1\" type=\"button\" class=\"krds-btn small text\" @click=\"prevStep\">이전으로</button>\n <button v-if=\"activeStep !== stepsData.length\" type=\"button\" class=\"krds-btn small tertiary\" @click=\"nextStep\">다음으로</button>\n </div>\n </div>\n </div>\n <!--// 따라하기 말풍선 -->\n\n <!-- 코치 마크 내용 -->\n <slot name=\"coach-mark-content\" />\n <!-- //코치 마크 내용 -->\n </div>\n <!-- coach mark -->\n</template>\n\n<script setup lang=\"ts\">\n import { BaseComponentProps } from '@/types'\n import { computed } from 'vue'\n\n type StepsData = { id: number; title: string; description: string }\n\n export interface KrdsCoachMarkProps extends BaseComponentProps {\n coachMarkClass?: string | string[]\n stepsData: StepsData[]\n activeStep: number\n modelValue?: number | null\n }\n\n const props = withDefaults(defineProps<KrdsCoachMarkProps>(), {\n coachMarkClass: '',\n modelValue: null\n })\n\n const currentStepData = computed(() => {\n const index = props.activeStep - 1\n if (props.stepsData && index >= 0 && index < props.stepsData.length) {\n return props.stepsData[index]\n }\n return null\n })\n\n const emit = defineEmits<{\n 'update:modelValue': [value: number | null]\n close: []\n }>()\n\n const prevStep = () => {\n if (props.activeStep > 1) {\n emit('update:modelValue', props.activeStep - 1)\n }\n }\n\n const nextStep = () => {\n if (props.activeStep < props.stepsData.length) {\n emit('update:modelValue', props.activeStep + 1)\n }\n }\n\n const closeCoachMark = () => {\n emit('close')\n }\n</script>\n\n<style scoped></style>\n","<template>\n <div ref=\"containerRef\">\n <button\n type=\"button\"\n :class=\"tooltipClasses\"\n :disabled=\"disabled\"\n :aria-labelledby=\"popoverId\"\n @mouseover=\"showTooltip\"\n @mouseout=\"hideTooltip\"\n @focusin=\"showTooltip\"\n @focusout=\"hideTooltip\"\n >\n <slot />\n </button>\n <div\n v-show=\"isTooltipVisible\"\n :id=\"popoverId\"\n ref=\"popoverRef\"\n class=\"krds-tooltip-popover\"\n :class=\"popoverClasses\"\n :style=\"popoverStyle\"\n :aria-hidden=\"!isTooltipVisible\"\n role=\"tooltip\"\n >\n <span class=\"sr-only\">{{ buttonText }}</span>\n {{ tooltipContent }}\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed, nextTick, onMounted, onUnmounted, ref } from 'vue'\n import { BaseComponentProps } from '@/types'\n\n type TooltipType = 'default' | 'icon' | 'button'\n\n export interface KrdsTooltipProps extends BaseComponentProps {\n type?: TooltipType\n tooltipContent: string\n vertical?: boolean\n box?: boolean\n disabled?: boolean\n }\n\n const props = withDefaults(defineProps<KrdsTooltipProps>(), {\n type: 'default',\n disabled: false\n })\n\n const containerRef = ref<HTMLElement | null>(null)\n const popoverRef = ref<HTMLElement | null>(null)\n const isTooltipVisible = ref(false)\n const popoverStyle = ref<Record<string, string>>({})\n const popoverId = ref(`tooltip-popover-${Math.random().toString(36).substring(2, 9)}`)\n const isMobile = ref(false)\n\n const tooltipClasses = computed(() => {\n const classes: string[] = ['krds-btn', 'krds-tooltip']\n\n if (props.type === 'default') {\n classes.push('small', 'text')\n } else if (props.type === 'icon') {\n classes.push('icon')\n } else if (props.type === 'button') {\n classes.push('')\n }\n\n if (!props.box && props.vertical) {\n classes.push('tooltip-vertical')\n }\n\n if (props.box && !props.vertical) {\n classes.push('tooltip-box')\n }\n\n return classes.join(' ')\n })\n\n const popoverClasses = computed(() => {\n const classes: string[] = []\n\n if (props.box) {\n classes.push('tooltip-box')\n }\n\n if (props.vertical) {\n classes.push('tooltip-vertical')\n }\n\n if (isTooltipVisible.value) {\n classes.push('active')\n }\n\n return classes\n })\n\n const buttonText = computed(() => {\n return containerRef.value?.querySelector('button')?.textContent?.trim() || ''\n })\n\n const checkIsMobile = () => {\n return window.innerWidth <= 768\n }\n\n const calculateTooltipPosition = () => {\n if (!containerRef.value || !popoverRef.value) return\n\n const button = containerRef.value.querySelector('button')\n if (!button) return\n\n const tooltipGap = 12\n const { clientHeight: tooltipHeight, clientWidth: tooltipWidth } = popoverRef.value\n const { top: itemTop, left: itemLeft, right: itemRight, height: itemHeight, width: itemWidth } = button.getBoundingClientRect()\n const halfWindowWidth = window.innerWidth / 2\n const halfWindowHeight = window.innerHeight / 2\n\n let tooltipTop: number\n let tooltipLeft: number\n const classes: string[] = []\n\n const isVertical = isMobile.value || props.box || props.vertical\n\n if (isVertical) {\n if (itemTop + itemHeight > halfWindowHeight) {\n tooltipTop = itemTop - tooltipHeight - tooltipGap\n classes.push('top')\n } else {\n tooltipTop = itemTop + itemHeight + tooltipGap\n classes.push('bottom')\n }\n\n if (itemLeft + itemWidth > halfWindowWidth) {\n tooltipLeft = itemRight - tooltipWidth\n classes.push('right')\n if (window.innerWidth - (itemLeft + itemWidth) > tooltipWidth / 2) {\n tooltipLeft = itemLeft + (itemWidth - tooltipWidth) / 2\n classes.splice(classes.indexOf('right'), 1)\n }\n } else {\n tooltipLeft = itemLeft + (itemWidth - tooltipWidth) / 2\n if (tooltipLeft < 0) {\n tooltipLeft = itemLeft\n classes.push('left')\n }\n }\n } else {\n tooltipTop = itemTop + (itemHeight - tooltipHeight) / 2\n if (itemLeft + itemWidth > halfWindowWidth) {\n tooltipLeft = itemLeft - tooltipWidth - tooltipGap\n classes.push('right')\n } else {\n tooltipLeft = itemRight + tooltipGap\n }\n }\n\n const mobileSmall = window.innerWidth <= 420\n popoverStyle.value = {\n top: `${tooltipTop}px`,\n left: mobileSmall ? '50%' : `${tooltipLeft}px`,\n transform: mobileSmall ? 'translateX(-50%)' : 'none'\n }\n\n if (popoverRef.value) {\n popoverRef.value.className = `krds-tooltip-popover ${classes.join(' ')} ${popoverClasses.value.join(' ')}`\n }\n }\n\n const showTooltip = async () => {\n if (props.disabled || !props.tooltipContent) return\n\n isTooltipVisible.value = true\n\n await nextTick()\n calculateTooltipPosition()\n }\n\n const hideTooltip = () => {\n isTooltipVisible.value = false\n popoverStyle.value = {}\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n if ((event.key === 'Escape' || event.key === 'Esc') && isTooltipVisible.value) {\n hideTooltip()\n }\n }\n\n const handleResize = () => {\n isMobile.value = checkIsMobile()\n if (isTooltipVisible.value) {\n hideTooltip()\n }\n }\n\n const handleScroll = () => {\n if (isTooltipVisible.value) {\n hideTooltip()\n }\n }\n\n onMounted(() => {\n isMobile.value = checkIsMobile()\n\n document.addEventListener('keydown', handleKeydown)\n window.addEventListener('scroll', handleScroll)\n window.addEventListener('resize', handleResize)\n })\n\n onUnmounted(() => {\n document.removeEventListener('keydown', handleKeydown)\n window.removeEventListener('scroll', handleScroll)\n window.removeEventListener('resize', handleResize)\n })\n</script>\n\n<style scoped></style>\n","<template>\n <!-- language switcher -->\n <div\n ref=\"dropdownRef\"\n class=\"krds-drop-wrap krds-language\"\n :class=\"{\n active: isOpen,\n 'drop-left': props.dropPosition === 'left',\n 'drop-right': props.dropPosition === 'right'\n }\"\n @focusout=\"handleFocusOut\"\n >\n <button\n ref=\"buttonRef\"\n type=\"button\"\n class=\"krds-btn small text drop-btn\"\n :class=\"{ active: isOpen }\"\n :aria-expanded=\"isOpen\"\n @click=\"toggleDropdown\"\n >\n <i class=\"svg-icon ico-global\"></i>\n <slot />\n <i class=\"svg-icon ico-toggle\"></i>\n </button>\n <div class=\"drop-menu\" :style=\"{ display: isOpen ? 'block' : 'none' }\">\n <div class=\"drop-in\">\n <div v-if=\"$slots['prev-item']\" class=\"drop-top\">\n <slot name=\"prev-item\" />\n </div>\n <!-- 기본 타입 (언어 선택) -->\n <ul v-if=\"props.type === 'default'\" class=\"drop-list\">\n <li v-for=\"language in languageList\" :key=\"language.code\">\n <a\n href=\"#\"\n class=\"item-link\"\n :class=\"{ active: props.modelValue === language.code }\"\n :lang=\"language.code\"\n :aria-selected=\"props.modelValue === language.code\"\n @click.prevent=\"selectLanguage(language.code)\"\n @focus=\"handleItemFocus\"\n >\n {{ language.name }}\n <span class=\"sr-only\">{{ props.modelValue === language.code ? '선택됨' : '' }}</span>\n </a>\n </li>\n </ul>\n\n <!-- 외부 페이지 이동 타입 -->\n <ul v-else-if=\"props.type === 'external'\" class=\"drop-list\">\n <li v-for=\"language in languageList\" :key=\"language.code\">\n <a\n :href=\"language.url || '#'\"\n class=\"item-link\"\n :lang=\"language.code\"\n target=\"_blank\"\n title=\"새 창 열림\"\n @focus=\"handleItemFocus\"\n >\n {{ language.name }}\n <i class=\"svg-icon ico-go\"></i>\n </a>\n </li>\n </ul>\n </div>\n </div>\n </div>\n <!-- //language switcher -->\n</template>\n\n<script setup lang=\"ts\">\n import { ref, onUnmounted, watch } from 'vue'\n import { BaseComponentProps } from '@/types'\n\n export type LanguageData = { code: string; name: string; url?: string }\n\n export type DropdownPosition = 'left' | 'center' | 'right'\n\n export interface KrdsLanguageSwitcherProps extends BaseComponentProps {\n languageList: LanguageData[]\n modelValue?: string\n type?: 'default' | 'external'\n dropPosition?: DropdownPosition\n }\n\n const props = withDefaults(defineProps<KrdsLanguageSwitcherProps>(), {\n modelValue: '',\n type: 'default',\n dropPosition: 'center'\n })\n\n const emit = defineEmits<{\n 'update:modelValue': [value: string]\n close: []\n }>()\n\n const isOpen = ref(false)\n const dropdownRef = ref<HTMLElement>()\n const buttonRef = ref<HTMLElement>()\n\n const toggleDropdown = () => {\n isOpen.value = !isOpen.value\n\n if (isOpen.value && dropdownRef.value) {\n positionDropdown()\n }\n }\n\n const closeDropdown = () => {\n isOpen.value = false\n }\n\n const selectLanguage = (languageCode: string) => {\n emit('update:modelValue', languageCode)\n closeDropdown()\n emit('close')\n buttonRef.value?.focus()\n }\n\n const positionDropdown = () => {\n if (!dropdownRef.value) return\n\n const menu = dropdownRef.value.querySelector('.drop-menu') as HTMLElement\n if (!menu) return\n\n const menuRect = menu.getBoundingClientRect()\n const windowWidth = window.innerWidth\n\n dropdownRef.value.classList.remove('drop-left', 'drop-right')\n\n if (menuRect.left < 0) {\n dropdownRef.value.classList.add('drop-left')\n } else if (windowWidth < menuRect.left + menuRect.width) {\n dropdownRef.value.classList.add('drop-right')\n }\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeDropdown()\n buttonRef.value?.focus()\n }\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!dropdownRef.value?.contains(event.target as Node)) {\n closeDropdown()\n }\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n if (!dropdownRef.value?.contains(event.relatedTarget as Node)) {\n closeDropdown()\n }\n }\n\n const handleItemFocus = (event: FocusEvent) => {\n if (!dropdownRef.value) return\n\n const items = dropdownRef.value.querySelectorAll('.drop-list .item-link') as NodeListOf<HTMLElement>\n items.forEach(item => {\n item.style.position = 'relative'\n item.style.zIndex = '0'\n })\n\n const currentItem = event.target as HTMLElement\n currentItem.style.zIndex = '1'\n }\n\n watch(isOpen, isDropdownOpen => {\n if (isDropdownOpen) {\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('click', handleClickOutside)\n } else {\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n }\n })\n\n onUnmounted(() => {\n // 컴포넌트가 제거될 때 리스너가 남아있지 않도록 보장합니다.\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n })\n</script>\n\n<style scoped></style>\n","<template>\n <!-- resize -->\n <div ref=\"dropdownRef\" class=\"krds-drop-wrap krds-resize\" data-adjust=\"scale\" @focusout=\"handleFocusOut\">\n <button ref=\"buttonRef\" type=\"button\" class=\"krds-btn small text drop-btn\" @click=\"toggleDropdown\">\n 화면크기\n <i class=\"svg-icon ico-toggle\"></i>\n </button>\n <div class=\"drop-menu\" :style=\"{ display: isOpen ? 'block' : 'none' }\">\n <div class=\"drop-in\">\n <ul class=\"drop-list\">\n <li v-for=\"scale in scaleList\" :key=\"scale.key\">\n <button\n type=\"button\"\n class=\"item-link\"\n :class=\"[scale.key, scale.key === selectedSize ? 'active' : '']\"\n :data-adjust-scale=\"scale.key\"\n @click.prevent=\"selectSize(scale)\"\n @focus=\"handleItemFocus\"\n >\n {{ scale.label }}\n </button>\n </li>\n </ul>\n <div class=\"drop-bottom\">\n <button type=\"button\" class=\"krds-btn medium text\" data-adjust-scale=\"md\" @click.prevent=\"resetSize\" @focus=\"handleItemFocus\">\n <i class=\"svg-icon ico-reset\"></i>\n 초기화\n </button>\n </div>\n </div>\n </div>\n </div>\n <!-- //resize -->\n</template>\n\n<script setup lang=\"ts\">\n import { onUnmounted, ref, watch } from 'vue'\n\n export interface KrdsResizeEmits {\n 'update:modelValue': [value: string]\n close: []\n }\n\n interface ScaleProps {\n key: 'sm' | 'md' | 'lg' | 'xlg' | 'xxlg'\n label: string\n zoom: string\n }\n\n const emit = defineEmits<KrdsResizeEmits>()\n\n const isOpen = ref(false)\n const dropdownRef = ref<HTMLElement>()\n const buttonRef = ref<HTMLElement>()\n const selectedSize = ref('md')\n\n const scaleList: ScaleProps[] = [\n { key: 'sm', label: '작게', zoom: '0.9' },\n { key: 'md', label: '보통', zoom: '1' },\n { key: 'lg', label: '조금 크게', zoom: '1.1' },\n { key: 'xlg', label: '크게', zoom: '1.3' },\n { key: 'xxlg', label: '가장 크게', zoom: '1.5' }\n ]\n\n const toggleDropdown = () => {\n isOpen.value = !isOpen.value\n\n if (isOpen.value && dropdownRef.value) {\n positionDropdown()\n }\n }\n\n const closeDropdown = () => {\n isOpen.value = false\n }\n\n const selectSize = (scale: ScaleProps) => {\n closeDropdown()\n emit('close')\n buttonRef.value?.focus()\n selectedSize.value = scale.key\n document.body.style.zoom = scale?.zoom\n }\n\n const resetSize = () => {\n const defaultScale = scaleList.find(scale => scale.key === 'md')\n if (defaultScale) {\n selectSize(defaultScale)\n }\n }\n\n const positionDropdown = () => {\n if (!dropdownRef.value) return\n\n const menu = dropdownRef.value.querySelector('.drop-menu') as HTMLElement\n if (!menu) return\n\n const menuRect = menu.getBoundingClientRect()\n const windowWidth = window.innerWidth\n\n dropdownRef.value.classList.remove('drop-left', 'drop-right')\n\n if (menuRect.left < 0) {\n dropdownRef.value.classList.add('drop-left')\n } else if (windowWidth < menuRect.left + menuRect.width) {\n dropdownRef.value.classList.add('drop-right')\n }\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeDropdown()\n buttonRef.value?.focus()\n }\n }\n\n const handleClickOutside = (event: MouseEvent) => {\n if (!dropdownRef.value?.contains(event.target as Node)) {\n closeDropdown()\n }\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n if (!dropdownRef.value?.contains(event.relatedTarget as Node)) {\n closeDropdown()\n }\n }\n\n const handleItemFocus = (event: FocusEvent) => {\n if (!dropdownRef.value) return\n\n const items = dropdownRef.value.querySelectorAll('.drop-list .item-link') as NodeListOf<HTMLElement>\n items.forEach(item => {\n item.style.position = 'relative'\n item.style.zIndex = '0'\n })\n\n const currentItem = event.target as HTMLElement\n currentItem.style.zIndex = '1'\n }\n\n watch(isOpen, isDropdownOpen => {\n if (isDropdownOpen) {\n document.addEventListener('keydown', handleKeydown)\n document.addEventListener('click', handleClickOutside)\n } else {\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n }\n })\n\n onUnmounted(() => {\n // 컴포넌트가 제거될 때 리스너가 남아있지 않도록 보장합니다.\n document.removeEventListener('keydown', handleKeydown)\n document.removeEventListener('click', handleClickOutside)\n })\n</script>\n\n<style scoped></style>\n","import { computed, defineComponent, h, Teleport, watch, onBeforeUnmount, nextTick, ref, getCurrentInstance, type SlotsType } from 'vue'\n\nexport type KrdsModalSize = 'small' | 'medium' | 'large'\n\nexport interface KrdsModalProps {\n modelValue?: boolean\n modalId?: string\n backdrop?: boolean\n size?: KrdsModalSize\n full?: boolean\n bottomSheet?: boolean\n persistent?: boolean\n}\n\nexport default defineComponent({\n name: 'KrdsModal',\n props: {\n modelValue: {\n type: Boolean,\n default: false\n },\n modalId: {\n type: String,\n default: undefined\n },\n backdrop: {\n type: Boolean,\n default: true\n },\n size: {\n type: String as () => KrdsModalSize,\n default: 'medium'\n },\n full: {\n type: Boolean,\n default: false\n },\n bottomSheet: {\n type: Boolean,\n default: false\n },\n persistent: {\n type: Boolean,\n default: false\n }\n },\n emits: ['update:modelValue'],\n slots: Object as SlotsType<{\n title?: () => any\n default?: () => any\n footer?: () => any\n }>,\n setup(props, { slots, emit }) {\n const uid = getCurrentInstance()?.uid\n const computedModalId = computed(() => props.modalId ?? `krds-modal-${uid}`)\n\n const open = computed({\n get: () => props.modelValue,\n set: value => emit('update:modelValue', value)\n })\n\n const titleId = computed(() => `tit_${computedModalId.value}`)\n\n const sizeClass = computed(() => {\n const sizeMap = {\n small: 'modal-sm',\n medium: 'modal-md',\n large: 'modal-lg'\n }\n return sizeMap[props.size]\n })\n\n const handleClose = () => {\n open.value = false\n }\n\n // 배경 스크롤 방지 및 포커스 트래핑\n let originalOverflow = ''\n let previousActiveElement: HTMLElement | null = null\n const modalRef = ref<HTMLElement | null>(null)\n\n const getFocusableElements = (element: HTMLElement): HTMLElement[] => {\n const selector = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n return Array.from(element.querySelectorAll(selector)).filter(\n el => !el.hasAttribute('disabled') && el.getAttribute('tabindex') !== '-1'\n ) as HTMLElement[]\n }\n\n const trapFocus = (event: KeyboardEvent) => {\n if (!modalRef.value || event.key !== 'Tab') return\n\n const focusableElements = getFocusableElements(modalRef.value)\n if (focusableElements.length === 0) {\n event.preventDefault()\n return\n }\n\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n if (event.shiftKey && document.activeElement === firstElement) {\n event.preventDefault()\n lastElement.focus()\n } else if (!event.shiftKey && document.activeElement === lastElement) {\n event.preventDefault()\n firstElement.focus()\n }\n }\n\n const handleKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && !props.persistent) {\n handleClose()\n }\n }\n\n const cleanupEffects = () => {\n document.body.style.overflow = originalOverflow\n document.removeEventListener('keydown', trapFocus)\n document.removeEventListener('keydown', handleKeydown)\n if (previousActiveElement) {\n previousActiveElement.focus()\n previousActiveElement = null\n }\n modalRef.value = null\n }\n\n watch(\n () => props.modelValue,\n async newValue => {\n if (newValue) {\n originalOverflow = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n previousActiveElement = document.activeElement as HTMLElement\n\n await nextTick()\n\n const modalElement = document.getElementById(computedModalId.value)\n if (modalElement) {\n modalRef.value = modalElement\n\n const modalConts = modalElement.querySelector('.modal-conts') as HTMLElement\n if (modalConts) {\n modalConts.setAttribute('tabindex', '-1')\n modalConts.focus()\n }\n\n document.addEventListener('keydown', trapFocus)\n document.addEventListener('keydown', handleKeydown)\n }\n } else {\n cleanupEffects()\n }\n },\n { immediate: true }\n )\n\n onBeforeUnmount(() => {\n if (props.modelValue) {\n cleanupEffects()\n }\n })\n\n return () => {\n if (!open.value) return null\n\n const modalAttrs: Record<string, any> = {\n id: computedModalId.value,\n class: 'krds-modal fade in shown',\n role: 'dialog',\n 'aria-modal': true,\n 'aria-labelledby': titleId.value\n }\n\n if (props.full) {\n modalAttrs['data-type'] = 'full'\n } else if (props.bottomSheet) {\n modalAttrs['data-type'] = 'bottom-sheet'\n }\n\n return h(\n Teleport,\n { to: 'body' },\n h('section', modalAttrs, [\n h('div', { class: `modal-dialog ${sizeClass.value}` }, [\n h(\n 'div',\n { class: 'modal-content' },\n [\n // modal title\n slots.title\n ? h('div', { class: 'modal-header' }, [h('h2', { id: titleId.value, class: 'modal-title' }, slots.title())])\n : null,\n // modal contents\n h('div', { class: 'modal-conts' }, [h('div', { class: 'conts-area' }, slots.default?.())]),\n // modal btn\n slots.footer ? h('div', { class: 'modal-btn btn-wrap' }, slots.footer()) : null,\n // close button\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium icon btn-close close-modal',\n onClick: handleClose\n },\n [h('span', { class: 'sr-only' }, '닫기'), h('i', { class: 'svg-icon ico-popup-close' })]\n )\n ].filter(Boolean)\n )\n ]),\n h('div', {\n class: props.backdrop ? 'modal-back in' : 'modal-back',\n onClick: props.persistent ? undefined : handleClose\n })\n ])\n )\n }\n }\n})\n","import { computed, defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\nexport interface KrdsAccordionGroupProps extends BaseComponentProps {\n typeLine?: boolean\n}\n\nexport default defineComponent<KrdsAccordionGroupProps>({\n name: 'KrdsAccordionGroup',\n props: {\n typeLine: {\n type: Boolean,\n default: false\n },\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n const accordionGroupClasses = computed(() => {\n const classes = ['krds-accordion']\n\n if (props.typeLine) {\n classes.push(`type-line`)\n }\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n return () =>\n h(\n 'div',\n {\n class: accordionGroupClasses.value\n },\n slots.default?.()\n )\n }\n})\n","<template>\n <div :id=\"id\" class=\"accordion-item\" :class=\"{ active: isOpen }\">\n <h5 class=\"accordion-header\">\n <button\n :id=\"`accordion-header-${id}`\"\n type=\"button\"\n class=\"btn-accordion\"\n :aria-expanded=\"isOpen\"\n :aria-controls=\"`accordion-collapse-${id}`\"\n @click=\"openToggle()\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </button>\n </h5>\n <div :id=\"`accordion-collapse-${id}`\" class=\"accordion-collapse collapse\" :aria-labelledby=\"`accordion-header-${id}`\">\n <div class=\"accordion-body\">\n <slot name=\"content\">{{ content }}</slot>\n </div>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\n import { computed } from 'vue'\n\n export interface KrdsAccordionItemProps {\n id: string\n openItem?: string\n title?: string\n content?: string\n }\n\n export interface KrdsAccordionItemEmits {\n (e: 'toggle', id: string): void\n }\n\n const props = defineProps<KrdsAccordionItemProps>()\n const emit = defineEmits<KrdsAccordionItemEmits>()\n\n const isOpen = computed(() => props.openItem === props.id)\n\n const openToggle = (): void => {\n emit('toggle', props.id)\n }\n</script>\n<style scoped></style>\n","import type { Directive } from 'vue'\n\n/**\n * v-sr-only 디렉티브\n * 선언하면 .sr-only 클래스 추가, 없으면 제거\n */\nexport const vSrOnly: Directive<HTMLElement, boolean | undefined> = {\n mounted(el, binding) {\n if (binding.value !== false) {\n el.classList.add('sr-only')\n }\n },\n\n updated(el, binding) {\n if (binding.value === false) {\n el.classList.remove('sr-only')\n } else {\n el.classList.add('sr-only')\n }\n },\n\n unmounted(el) {\n el.classList.remove('sr-only')\n }\n}\n\nexport default vSrOnly\n","/**\n * KRDS Vue 디렉티브\n */\n\nimport type { App } from 'vue'\nimport { vSrOnly } from './vSrOnly'\n\n/**\n * 디렉티브 목록\n */\nexport const directives = {\n 'sr-only': vSrOnly\n} as const\n\n/**\n * 디렉티브 설치 함수\n */\nexport const installDirectives = (app: App) => {\n app.directive('sr-only', vSrOnly)\n}\n\nexport { vSrOnly }\nexport default directives\n","/**\n * KRDS Vue 디자인 시스템\n * 대한민국 정부 표준 디자인 시스템 Vue 3 구현체\n *\n * @packageDocumentation\n */\n\nimport type { App, Plugin } from 'vue'\n\n// 컴포넌트 imports\nimport * as components from './components'\n\n// 디렉티브 imports\nimport * as directives from './directives'\n\n// 메인 스타일 (플러그인 사용 시 자동 로드)\nimport './styles/main.scss'\n\n// 컴포저블 exports\nexport * from './composables'\n\n// 유틸리티 exports\nexport * from './utils'\n\n// 타입 exports\nexport * from './types'\n\n// 토큰 exports\nexport * from './tokens'\n\n// 개별 컴포넌트 export (Tree-shaking 지원)\nexport * from './components'\n\n/**\n * KRDS Vue 플러그인 설정 옵션\n */\nexport interface KrdsVueOptions {\n /** 설치할 컴포넌트 목록 (비어있으면 전체 설치) */\n components?: string[]\n}\n\n/**\n * KRDS Vue 플러그인\n */\nconst KrdsVue: Plugin = {\n install(app: App, options: KrdsVueOptions = {}) {\n // 전역 설정 제공\n app.provide('krds:config', options)\n\n // 컴포넌트 등록\n const componentsToInstall = options.components || Object.keys(components)\n\n componentsToInstall.forEach(componentName => {\n const component = (components as Record<string, unknown>)[componentName]\n if (component) {\n app.component(componentName, component)\n }\n })\n\n // 디렉티브 등록\n if (typeof directives === 'object' && directives !== null && 'installDirectives' in directives) {\n ;(directives as { installDirectives: (app: App) => void }).installDirectives(app)\n }\n\n // 전역 속성 추가\n app.config.globalProperties.$krds = {\n version: '__VERSION__'\n }\n\n // 개발 모드에서 설치 로그\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.log(`[KRDS Vue] v__VERSION__ 설치 완료 - 컴포넌트: ${componentsToInstall.length}개`)\n }\n }\n}\n\nexport default KrdsVue\n\n// 버전 정보\nexport const version = '__VERSION__'\n"],"names":["KrdsButton","defineComponent","props","emit","slots","buttonClasses","computed","classes","handleClick","event","h","KrdsButtonGroup","_","KrdsIcon","KrdsLink","linkClasses","linkAttributes","attrs","KrdsSpinner","children","KrdsInput","inputClasses","handleInput","target","value","handleChange","handleFocus","handleBlur","handleKeydown","handleKeyup","inputProps","formContsClasses","classList","KrdsFormLabel","KrdsFormHint","baseClass","KrdsFormGroup","useDatePicker","initialYear","initialMonth","today","currentYear","ref","currentMonth","selectedStartDate","selectedEndDate","activeDateSelector","yearOptions","currentYearValue","years","i","monthOptions","clearDateSelection","prevMonth","nextMonth","handleDateSelection","dateString","isSingle","startDate","todayString","currentDate","endDate","isStart","isEnd","useClickOutside","targetRef","callback","options","globalClickHandler","opts","ignore","setupGlobalListeners","e","removeGlobalListeners","eventType","onMounted","onBeforeUnmount","__props","__emit","datePickerAreaRef","datePickerButtonRef","isCalendarOpen","activeDropdown","selectToday","isDateInSelectedRange","closeAllDatePickers","calendarAreaClasses","calendarGrid","year","month","firstDate","weeks","week","days","day","dayOfWeek","getCellClasses","rangeInfo","actionButtons","confirmSelection","toggleDropdown","type","selectYear","selectMonth","rangeValue","openDatePicker","handleDatePickerToggle","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_hoisted_5","_cache","_unref","args","_hoisted_6","_hoisted_7","_toDisplayString","_hoisted_8","_withDirectives","_hoisted_9","_hoisted_10","_Fragment","_renderList","_normalizeClass","$event","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","weekIndex","dayIndex","_hoisted_22","_hoisted_23","action","_createBlock","_createTextVNode","KrdsTextarea","currentLength","watch","newValue","textareaClasses","textareaStyles","styles","textareaProps","textareaWrapClasses","countDisplay","current","max","KrdsSelect","selectClasses","selectProps","renderOptions","optionElements","option","selectElement","KrdsFileUpload","_emit","currentFileCount","KrdsBadge","KrdsTag","tagClasses","handleDelete","renderDeleteButton","content","slotContent","linkAttrs","KrdsTagGroup","tagGroupClasses","KrdsMasthead","mastheadClasses","idCounter","generateId","prefix","generateUid","timestamp","random","classNames","KrdsToggleSwitch","isChecked","containerClasses","handleToggle","inputId","KrdsCheckArea","KrdsCheckbox","KrdsRadio","inputName","KrdsStepIndicator","stepperClasses","getStepStatus","index","currentStep","stepIndex","resetStepIndex","getNextStepIndex","provide","KrdsStep","stepIndicatorContext","inject","stepStatus","stepClasses","isActive","KrdsSkipLink","isCurrentPage","item","_hoisted_4","KrdsInPageNavigation","activeItem","sectionElements","calculateHeaderHeight","headerTopSelector","headerInnerSelector","headerTop","headerInner","handleItemClick","targetElement","headerHeight","focusable","cacheSectionElements","element","updateActiveItem","winHeight","topHeight","scrollBottom","scrollHeight","sections","firstSection","lastSection","firstSecTop","newActiveItem","section","sectionHeight","sectionTop","initActiveItem","activeFromProps","observer","onUnmounted","renderHeader","renderNavList","listItems","renderAction","minPage","currentPage","prevDisabled","nextDisabled","prevHref","nextHref","displayedPages","pageRange","totalPages","boundaryRange","pages","leftBoundary","rightBoundary","rangeStart","rangeEnd","adjustedRangeStart","startPage","endPage","handlePageClick","page","handlePrevClick","prevPage","handleNextClick","nextPage","_resolveDynamicComponent","open","handleOpen","handleClose","_hoisted_3","_renderSlot","_ctx","containerRef","tooltipBtnRef","tooltipPopoverRef","closeBtnRef","isVisible","toggleTooltip","wasVisible","closeAllTooltips","showTooltip","adjustTooltipPosition","closeTooltip","allPopovers","allButtons","popover","button","isMobile","tooltipAction","contentsPaddingX","offsetLeft","width","handleOutsideClick","handleResize","currentStepData","prevStep","nextStep","closeCoachMark","popoverRef","isTooltipVisible","popoverStyle","popoverId","tooltipClasses","popoverClasses","buttonText","checkIsMobile","calculateTooltipPosition","tooltipGap","tooltipHeight","tooltipWidth","itemTop","itemLeft","itemRight","itemHeight","itemWidth","halfWindowWidth","halfWindowHeight","tooltipTop","tooltipLeft","mobileSmall","nextTick","hideTooltip","handleScroll","isOpen","dropdownRef","buttonRef","positionDropdown","closeDropdown","selectLanguage","languageCode","menu","menuRect","windowWidth","handleClickOutside","handleFocusOut","handleItemFocus","currentItem","isDropdownOpen","$slots","language","_withModifiers","selectedSize","scaleList","selectSize","scale","resetSize","defaultScale","KrdsModal","uid","getCurrentInstance","computedModalId","titleId","sizeClass","originalOverflow","previousActiveElement","modalRef","getFocusableElements","el","trapFocus","focusableElements","firstElement","lastElement","cleanupEffects","modalElement","modalConts","modalAttrs","Teleport","KrdsAccordionGroup","accordionGroupClasses","openToggle","vSrOnly","binding","directives","installDirectives","app","KrdsVue","componentsToInstall","components","componentName","component","directives.installDirectives","version"],"mappings":"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"}
|