@krds.ui/vue 0.0.3
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/LICENSE +21 -0
- package/README.md +64 -0
- package/dist/img/component/icon/head_ico_font_sample.svg +3 -0
- package/dist/img/component/icon/head_ico_font_sample_white.svg +3 -0
- package/dist/img/component/icon/ico_all.svg +3 -0
- package/dist/img/component/icon/ico_angle.svg +3 -0
- package/dist/img/component/icon/ico_angle_disabled.svg +3 -0
- package/dist/img/component/icon/ico_angle_disabled_inverse.svg +3 -0
- package/dist/img/component/icon/ico_angle_inverse.svg +3 -0
- package/dist/img/component/icon/ico_arrow_dropdown.svg +3 -0
- package/dist/img/component/icon/ico_blog.svg +6 -0
- package/dist/img/component/icon/ico_bread_home.svg +3 -0
- package/dist/img/component/icon/ico_calendar.svg +3 -0
- package/dist/img/component/icon/ico_call.svg +3 -0
- package/dist/img/component/icon/ico_checkbox.svg +5 -0
- package/dist/img/component/icon/ico_checkbox_checked.svg +5 -0
- package/dist/img/component/icon/ico_close.svg +3 -0
- package/dist/img/component/icon/ico_complete_fill.svg +4 -0
- package/dist/img/component/icon/ico_delete.svg +3 -0
- package/dist/img/component/icon/ico_delete_fill.svg +4 -0
- package/dist/img/component/icon/ico_download.svg +3 -0
- package/dist/img/component/icon/ico_ellipsis.svg +3 -0
- package/dist/img/component/icon/ico_email.svg +3 -0
- package/dist/img/component/icon/ico_error_fill.svg +4 -0
- package/dist/img/component/icon/ico_expand.svg +3 -0
- package/dist/img/component/icon/ico_facebook.svg +3 -0
- package/dist/img/component/icon/ico_faq.svg +3 -0
- package/dist/img/component/icon/ico_file.svg +3 -0
- package/dist/img/component/icon/ico_file_figma.svg +13 -0
- package/dist/img/component/icon/ico_file_html.svg +13 -0
- package/dist/img/component/icon/ico_file_hwp.svg +13 -0
- package/dist/img/component/icon/ico_file_pdf.svg +13 -0
- package/dist/img/component/icon/ico_file_sketch.svg +13 -0
- package/dist/img/component/icon/ico_file_xd.svg +16 -0
- package/dist/img/component/icon/ico_filter.svg +5 -0
- package/dist/img/component/icon/ico_flag.svg +29 -0
- package/dist/img/component/icon/ico_flow_arrow.svg +3 -0
- package/dist/img/component/icon/ico_foldable.svg +3 -0
- package/dist/img/component/icon/ico_global.svg +3 -0
- package/dist/img/component/icon/ico_go.svg +3 -0
- package/dist/img/component/icon/ico_go_top.svg +5 -0
- package/dist/img/component/icon/ico_help.svg +4 -0
- package/dist/img/component/icon/ico_help_fill.svg +4 -0
- package/dist/img/component/icon/ico_information.svg +5 -0
- package/dist/img/component/icon/ico_information_fill.svg +4 -0
- package/dist/img/component/icon/ico_information_fill_high_contrast.svg +5 -0
- package/dist/img/component/icon/ico_instagram.svg +3 -0
- package/dist/img/component/icon/ico_join.svg +3 -0
- package/dist/img/component/icon/ico_like.svg +3 -0
- package/dist/img/component/icon/ico_login.svg +3 -0
- package/dist/img/component/icon/ico_login_certify_go.svg +4 -0
- package/dist/img/component/icon/ico_login_certify_type_01.svg +3 -0
- package/dist/img/component/icon/ico_login_certify_type_02.svg +3 -0
- package/dist/img/component/icon/ico_login_certify_type_03.svg +3 -0
- package/dist/img/component/icon/ico_login_certify_type_04.svg +5 -0
- package/dist/img/component/icon/ico_login_certify_type_05.svg +3 -0
- package/dist/img/component/icon/ico_login_certify_type_06.svg +3 -0
- package/dist/img/component/icon/ico_logo_krds.svg +10 -0
- package/dist/img/component/icon/ico_logo_krds_high_contrast.svg +10 -0
- package/dist/img/component/icon/ico_logout.svg +3 -0
- package/dist/img/component/icon/ico_more.svg +3 -0
- package/dist/img/component/icon/ico_my.svg +3 -0
- package/dist/img/component/icon/ico_notice_fill.svg +5 -0
- package/dist/img/component/icon/ico_notice_fill_blue.svg +5 -0
- package/dist/img/component/icon/ico_notice_fill_high_contrast.svg +5 -0
- package/dist/img/component/icon/ico_plus.svg +3 -0
- package/dist/img/component/icon/ico_print.svg +3 -0
- package/dist/img/component/icon/ico_pw_visible_off.svg +3 -0
- package/dist/img/component/icon/ico_pw_visible_on.svg +5 -0
- package/dist/img/component/icon/ico_reset.svg +3 -0
- package/dist/img/component/icon/ico_sch.svg +3 -0
- package/dist/img/component/icon/ico_sch_plus.svg +3 -0
- package/dist/img/component/icon/ico_scrap.svg +3 -0
- package/dist/img/component/icon/ico_setting.svg +3 -0
- package/dist/img/component/icon/ico_share.svg +3 -0
- package/dist/img/component/icon/ico_sns_x.svg +3 -0
- package/dist/img/component/icon/ico_step_done.svg +3 -0
- package/dist/img/component/icon/ico_success_fill.svg +4 -0
- package/dist/img/component/icon/ico_swiper_play.svg +3 -0
- package/dist/img/component/icon/ico_swiper_stop.svg +3 -0
- package/dist/img/component/icon/ico_switch_off.svg +6 -0
- package/dist/img/component/icon/ico_switch_on.svg +5 -0
- package/dist/img/component/icon/ico_tooltip.svg +3 -0
- package/dist/img/component/icon/ico_upload.svg +3 -0
- package/dist/img/component/icon/ico_urgent_badge_danger.svg +5 -0
- package/dist/img/component/icon/ico_urgent_badge_info.svg +7 -0
- package/dist/img/component/icon/ico_urgent_badge_ok.svg +5 -0
- package/dist/img/component/icon/ico_view_mode.svg +3 -0
- package/dist/img/component/icon/ico_warning_fill.svg +9 -0
- package/dist/img/component/icon/ico_youtube.svg +3 -0
- package/dist/krds-vue.es.js +1417 -0
- package/dist/krds-vue.es.js.map +1 -0
- package/dist/krds-vue.umd.js +2 -0
- package/dist/krds-vue.umd.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/types/index.d.ts +1039 -0
- package/package.json +117 -0
|
@@ -0,0 +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/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/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/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 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 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 // 변형 클래스\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 { defineComponent, computed, h } from 'vue'\nimport type { BaseFormProps, Size, InputType } from '@/types'\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\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 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 (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, 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 * 클래스명을 조합합니다.\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}\n\nexport default defineComponent<KrdsCheckAreaProps>({\n name: 'KrdsCheckArea',\n props: {\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n return () => {\n const classes = ['krds-check-area']\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 (e: 'change', 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', 'change'],\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\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 emit('change', 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","/**\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","KrdsInput","inputClasses","handleInput","target","value","handleChange","handleFocus","handleBlur","handleKeydown","handleKeyup","inputProps","formContsClasses","classList","children","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","id","name","placeholder","modelValue","readonly","disabled","required","autofocus","size","_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","KrdsFileUpload","_emit","currentFileCount","KrdsBadge","KrdsTag","tagClasses","handleDelete","renderDeleteButton","content","slotContent","linkAttrs","KrdsTagGroup","tagGroupClasses","KrdsMasthead","mastheadClasses","idCounter","generateId","prefix","classNames","KrdsToggleSwitch","isChecked","containerClasses","handleToggle","inputId","KrdsCheckArea","KrdsCheckbox","KrdsVue","app","componentsToInstall","components","componentName","component","version"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(h,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(h=typeof globalThis<"u"?globalThis:h||self,e(h.KrdsVue={},h.Vue))})(this,(function(h,e){"use strict";const N=e.defineComponent({name:"KrdsButton",props:{type:{type:String,default:"button"},size:{type:String,default:void 0},variant:{type:String,default:"primary"},icon:{type:Boolean,default:!1},border:{type:Boolean,default:!1},pure:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},class:{type:String,default:void 0}},emits:["click"],setup(t,{emit:o,slots:n}){const l=e.computed(()=>{const a=["krds-btn"];return t.icon&&a.push("icon"),t.border&&a.push("border"),t.pure&&a.push("pure"),t.variant&&!t.icon&&a.push(t.variant),t.size&&a.push(t.size),t.class&&a.push(t.class),a}),r=a=>{t.disabled||o("click",a)};return()=>e.h("button",{type:t.type,class:l.value,disabled:t.disabled,onClick:r},n.default?.())}}),F=e.defineComponent({name:"KrdsButtonGroup",props:{},setup(t,{slots:o}){return()=>e.h("div",{class:"btn-group"},o.default?.())}}),T=e.defineComponent({name:"KrdsIcon",props:{name:{type:String,required:!0},class:{type:String,default:void 0}},setup(t){return()=>e.h("i",{class:["svg-icon",t.name,t.class].filter(Boolean).join(" ")})}}),x=e.defineComponent({name:"KrdsLink",props:{href:{type:String,default:"#!"},target:{type:String,default:void 0},title:{type:String,default:void 0},size:{type:String,default:void 0},link:{type:Boolean,default:!0},basic:{type:Boolean,default:!1},pure:{type:Boolean,default:!1},class:{type:String,default:void 0}},emits:["click"],setup(t,{emit:o,slots:n}){const l=e.computed(()=>{const s=["krds-btn"];return t.size&&s.push(t.size),t.link&&s.push("link"),t.basic&&s.push("basic"),t.pure&&s.push("pure"),t.class&&s.push(t.class),s}),r=e.computed(()=>{const s={href:t.href,class:l.value};return t.target&&(s.target=t.target),t.title&&(s.title=t.title),t.target==="_blank"&&(s.rel="noopener noreferrer"),s}),a=s=>{o("click",s)};return()=>e.h("a",{...r.value,onClick:a},n.default?.())}}),$=e.defineComponent({name:"KrdsInput",props:{modelValue:{type:[String,Number],default:void 0},type:{type:String,default:"text"},size:{type:String,default:void 0},placeholder:{type:String,default:void 0},maxlength:{type:Number,default:void 0},minlength:{type:Number,default:void 0},max:{type:Number,default:void 0},min:{type:Number,default:void 0},step:{type:Number,default:void 0},autocomplete:{type:String,default:void 0},autofocus:{type:Boolean,default:!1},name:{type:String,default:void 0},required:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},error:{type:String,default:void 0},state:{type:String,default:"default"},icon:{type:Boolean,default:!1},class:{type:String,default:void 0},id:{type:String,default:void 0}},emits:["update:modelValue","input","change","focus","blur","keydown","keyup"],setup(t,{emit:o,slots:n}){const l=e.computed(()=>{const i=["krds-input"];return t.size&&i.push(t.size),t.class&&i.push(t.class),i}),r=i=>{const w=i.target,C=t.type==="number"?Number(w.value):w.value;o("update:modelValue",C),o("input",i)},a=i=>{o("change",i)},s=i=>{o("focus",i)},m=i=>{o("blur",i)},g=i=>{o("keydown",i)},p=i=>{o("keyup",i)},k=e.computed(()=>{const i={type:t.type,class:l.value,value:t.modelValue,placeholder:t.placeholder,name:t.name,id:t.id,required:t.required,readonly:t.readonly,disabled:t.disabled,autocomplete:t.autocomplete,autofocus:t.autofocus,onInput:r,onChange:a,onFocus:s,onBlur:m,onKeydown:g,onKeyup:p};return t.maxlength!==void 0&&(i.maxlength=t.maxlength),t.minlength!==void 0&&(i.minlength=t.minlength),t.type==="number"&&(t.max!==void 0&&(i.max=t.max),t.min!==void 0&&(i.min=t.min),t.step!==void 0&&(i.step=t.step)),i}),V=e.computed(()=>{const i=["form-conts"];return t.state!=="default"&&i.push(`is-${t.state}`),t.icon&&i.push("btn-ico-wrap"),i});return()=>{const i=[e.h("input",k.value)];return n.default&&i.push(...n.default()),e.h("div",{class:V.value},i)}}}),O=e.defineComponent({name:"KrdsFormLabel",props:{for:{type:String,default:void 0},class:{type:String,default:void 0},style:{type:[String,Object],default:void 0},id:{type:String,default:void 0}},emits:["click"],setup(t,{emit:o,slots:n}){const l=r=>{o("click",r)};return()=>e.h("div",{class:"form-tit"},[e.h("label",{for:t.for,id:t.id,class:t.class,style:t.style,onClick:l},n.default?.())])}}),L=e.defineComponent({name:"KrdsFormHint",props:{type:{type:String,default:"hint"},class:{type:String,default:void 0},style:{type:[String,Object],default:void 0},id:{type:String,default:void 0}},emits:["click"],setup(t,{emit:o,slots:n}){const l=a=>{o("click",a)},r=()=>{let a;switch(t.type){case"error":a="form-hint-invalid";break;case"success":a="form-hint-success";break;case"information":a="form-hint-information";break;default:a="form-hint";break}return t.class?`${a} ${t.class}`:a};return()=>e.h("p",{id:t.id,class:r(),style:t.style,onClick:l},n.default?.())}}),P=e.defineComponent({name:"KrdsFormGroup",props:{class:{type:String,default:void 0},style:{type:[String,Object],default:void 0},id:{type:String,default:void 0}},setup(t,{slots:o}){const n=e.computed(()=>{const l=["form-group"];return t.class&&l.push(t.class),l});return()=>e.h("div",{id:t.id,class:n.value,style:t.style},o.default?.())}});function ne(t,o){const n=new Date,l=e.ref(t||n.getFullYear()),r=e.ref(o||n.getMonth()+1),a=e.ref(null),s=e.ref(null),m=e.ref(null),g=e.computed(()=>{const y=n.getFullYear(),S=[];for(let B=y-10;B<=y+10;B++)S.push(B);return S}),p=e.computed(()=>Array.from({length:12},(y,S)=>S+1)),k=()=>{a.value=null,s.value=null},V=()=>{r.value===1?(r.value=12,l.value-=1):r.value-=1},i=()=>{r.value===12?(r.value=1,l.value+=1):r.value+=1},w=(y,S=!1)=>{if(S)a.value=y,s.value=y;else if(!a.value||a.value&&s.value)a.value=y,s.value=null;else{const B=new Date(a.value.replace(/\./g,"-"));new Date(y.replace(/\./g,"-"))<B?(a.value=y,s.value=null):s.value=y}};return{currentYear:l,currentMonth:r,selectedStartDate:a,selectedEndDate:s,activeDateSelector:m,yearOptions:g,monthOptions:p,clearDateSelection:k,prevMonth:V,nextMonth:i,handleDateSelection:w,selectToday:()=>{const y=`${n.getFullYear()}.${String(n.getMonth()+1).padStart(2,"0")}.${String(n.getDate()).padStart(2,"0")}`;w(y,!0)},isDateInSelectedRange:y=>{if(!a.value||!s.value)return{isInRange:!1,isStart:!1,isEnd:!1};const S=new Date(y.replace(/\./g,"-")),B=new Date(a.value.replace(/\./g,"-")),D=new Date(s.value.replace(/\./g,"-")),z=y===a.value,I=y===s.value;return{isInRange:S>=B&&S<=D,isStart:z,isEnd:I}}}}function le(t,o,n={}){let l=null;const r=typeof n=="string"?{ignore:n}:n,{ignore:a,event:s="click"}=r,m=()=>{l=p=>{const k=p.target;t.value?.contains(k)||a&&k.closest(a)||o()},document.addEventListener(s,l)},g=()=>{if(l){const p=typeof n=="string"?"click":n.event||"click";document.removeEventListener(p,l),l=null}};return e.onMounted(()=>{m()}),e.onBeforeUnmount(()=>{g()}),{setupGlobalListeners:m,removeGlobalListeners:g}}const se={class:"form-conts"},oe={class:"calendar-input"},de=["id","name","placeholder","value","readonly","disabled","required","autofocus"],re=["disabled","aria-expanded"],ie={class:"calendar-head"},ce={class:"calendar-switch-wrap"},ue={class:"calendar-drop-down"},fe=["aria-expanded"],me={class:"calendar-select calendar-year-wrap"},he={class:"sel year"},ge=["onClick"],ye={class:"calendar-drop-down"},pe=["aria-expanded"],ke={class:"calendar-select calendar-mon-wrap"},be={class:"sel month"},Se=["onClick"],Ce={class:"calendar-body"},Be={class:"calendar-table-wrap"},Ve={class:"calendar-tbl"},we=["data-date"],De=["aria-pressed","onClick"],Ke={class:"calendar-footer"},Ee={class:"calendar-btn-wrap"},R=e.defineComponent({__name:"KrdsDateInput",props:{modelValue:{default:void 0},size:{default:"medium"},placeholder:{default:"YYYY.MM.DD"},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},autofocus:{type:Boolean,default:!1},eventDates:{default:()=>[]},holidays:{default:()=>[]},initialYear:{default:void 0},initialMonth:{default:void 0},name:{default:void 0},required:{type:Boolean,default:!1},class:{default:void 0},style:{},id:{default:void 0}},emits:["update:modelValue","input","change","focus","blur"],setup(t,{emit:o}){const n=t,l=o,r=e.ref(),a=e.ref(),s=e.ref(!1),m=e.ref(null),{currentYear:g,currentMonth:p,selectedStartDate:k,selectedEndDate:V,yearOptions:i,monthOptions:w,prevMonth:C,nextMonth:u,handleDateSelection:y,selectToday:S,isDateInSelectedRange:B}=ne(n.initialYear,n.initialMonth),D=()=>{s.value&&a.value?.focus(),s.value=!1,m.value=null};le(r,D,".calendar-conts");const z=e.computed(()=>{const d=["krds-input","datepicker","cal"];return n.size&&d.push(n.size),n.class&&d.push(n.class),d}),I=e.computed(()=>["form-conts","calendar-conts"]),X=e.computed(()=>({"krds-calendar-area":!0,active:s.value})),ze=e.computed(()=>{const d=g.value,c=p.value,f=new Date(d,c-1,1),E=new Date(f);E.setDate(E.getDate()-f.getDay());const K=[],b=new Date(E);for(let M=0;M<6;M++){const ee=[];for(let te=0;te<7;te++){const je=`${b.getFullYear()}.${String(b.getMonth()+1).padStart(2,"0")}.${String(b.getDate()).padStart(2,"0")}`,ae=b.getDay();ee.push({day:b.getDate(),dateString:je,isCurrentMonth:b.getMonth()===c-1,isToday:b.toDateString()===new Date().toDateString(),isPrevMonth:b.getMonth()<c-1||b.getMonth()===11&&c===1,isNextMonth:b.getMonth()>c-1||b.getMonth()===0&&c===12,isSunday:ae===0,isSaturday:ae===6}),b.setDate(b.getDate()+1)}K.push(ee)}return K}),Ie=d=>{const c=[];if(d.isPrevMonth&&c.push("old"),d.isNextMonth&&c.push("new"),d.isToday&&c.push("today"),d.isSunday&&c.push("day-off"),n.holidays?.includes(d.dateString)&&c.push("day-off"),n.eventDates?.includes(d.dateString)&&c.push("day-event"),d.isCurrentMonth){const f=B(d.dateString);f.isInRange&&(c.push("period"),f.isStart&&c.push("start"),f.isEnd&&c.push("end"))}return c},Me=e.computed(()=>[{id:"get-today",label:"오늘",class:"text",variant:void 0,size:"small",handler:S},{id:"cancel-btn",label:"취소",class:void 0,variant:"tertiary",size:"small",handler:D},{id:"confirm-btn",label:"확인",class:void 0,variant:"primary",size:"small",handler:xe}]),Z=d=>{m.value===d?m.value=null:m.value=d},Fe=d=>{g.value=d,m.value=null},Te=d=>{p.value=d,m.value=null},xe=()=>{if(k.value){if(V.value&&k.value!==V.value){const d=`${k.value} ~ ${V.value}`;l("update:modelValue",d)}else l("update:modelValue",k.value);D()}},$e=()=>{s.value=!0,m.value=null,setTimeout(()=>{r.value?.querySelector(".calendar-wrap")?.focus()},50)},Oe=()=>{s.value?D():$e()},Le=d=>{d.code==="Escape"&&(m.value?m.value=null:s.value&&D())},Pe=d=>{const c=d.target;l("update:modelValue",c.value),l("input",d)},Re=d=>{l("change",d)},qe=d=>{l("focus",d)},Ye=d=>{l("blur",d)};return(d,c)=>(e.openBlock(),e.createElementBlock("div",se,[e.createElementVNode("div",{class:e.normalizeClass(I.value)},[e.createElementVNode("div",oe,[e.createElementVNode("input",{id:d.id,name:d.name,class:e.normalizeClass(z.value),placeholder:d.placeholder,value:d.modelValue,readonly:d.readonly,disabled:d.disabled,required:d.required,autofocus:d.autofocus,type:"text",onInput:Pe,onChange:Re,onFocus:qe,onBlur:Ye},null,42,de),e.createElementVNode("button",{ref_key:"datePickerButtonRef",ref:a,class:e.normalizeClass(`krds-btn ${d.size||"medium"} icon form-btn-datepicker`),disabled:d.disabled,"aria-expanded":s.value,type:"button",onClick:Oe},[...c[4]||(c[4]=[e.createElementVNode("span",{class:"sr-only"},"달력 열기",-1),e.createElementVNode("i",{class:"svg-icon ico-calendar"},null,-1)])],10,re)]),e.createElementVNode("div",{ref_key:"datePickerAreaRef",ref:r,class:e.normalizeClass(X.value)},[e.withDirectives(e.createElementVNode("div",{class:"calendar-wrap bottom","aria-label":"달력",tabindex:"0",onKeydown:Le},[e.createElementVNode("div",ie,[e.createElementVNode("button",{type:"button",class:"btn-cal-move prev",onClick:c[0]||(c[0]=(...f)=>e.unref(C)&&e.unref(C)(...f))},[...c[5]||(c[5]=[e.createElementVNode("span",{class:"sr-only"},"이전 달",-1)])]),e.createElementVNode("div",ce,[e.createElementVNode("div",ue,[e.createElementVNode("button",{type:"button",class:"btn-cal-switch year","aria-label":"연도 선택","aria-expanded":m.value==="year",onClick:c[1]||(c[1]=f=>Z("year"))},e.toDisplayString(e.unref(g))+"년 ",9,fe),e.withDirectives(e.createElementVNode("div",me,[e.createElementVNode("ul",he,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(i),f=>(e.openBlock(),e.createElementBlock("li",{key:f},[e.createElementVNode("button",{type:"button",class:e.normalizeClass({active:f===e.unref(g)}),onClick:E=>Fe(f)},e.toDisplayString(f)+"년",11,ge)]))),128))])],512),[[e.vShow,m.value==="year"]])]),e.createElementVNode("div",ye,[e.createElementVNode("button",{type:"button",class:"btn-cal-switch month","aria-label":"월 선택","aria-expanded":m.value==="month",onClick:c[2]||(c[2]=f=>Z("month"))},e.toDisplayString(e.unref(p).toString().padStart(2,"0"))+"월 ",9,pe),e.withDirectives(e.createElementVNode("div",ke,[e.createElementVNode("ul",be,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(w),f=>(e.openBlock(),e.createElementBlock("li",{key:f},[e.createElementVNode("button",{type:"button",class:e.normalizeClass({active:f===e.unref(p)}),onClick:E=>Te(f)},e.toDisplayString(f.toString().padStart(2,"0"))+"월 ",11,Se)]))),128))])],512),[[e.vShow,m.value==="month"]])])]),e.createElementVNode("button",{type:"button",class:"btn-cal-move next",onClick:c[3]||(c[3]=(...f)=>e.unref(u)&&e.unref(u)(...f))},[...c[6]||(c[6]=[e.createElementVNode("span",{class:"sr-only"},"다음 달",-1)])])]),e.createElementVNode("div",Ce,[e.createElementVNode("div",Be,[e.createElementVNode("table",Ve,[e.createElementVNode("caption",null,e.toDisplayString(e.unref(g))+"년 "+e.toDisplayString(e.unref(p).toString().padStart(2,"0"))+"월",1),c[7]||(c[7]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",null,"일"),e.createElementVNode("th",null,"월"),e.createElementVNode("th",null,"화"),e.createElementVNode("th",null,"수"),e.createElementVNode("th",null,"목"),e.createElementVNode("th",null,"금"),e.createElementVNode("th",null,"토")])],-1)),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(ze.value,(f,E)=>(e.openBlock(),e.createElementBlock("tr",{key:E},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f,(K,b)=>(e.openBlock(),e.createElementBlock("td",{key:b,class:e.normalizeClass(Ie(K)),"data-date":K.dateString},[e.createElementVNode("button",{type:"button",class:"btn-set-date","aria-pressed":e.unref(B)(K.dateString).isInRange?"true":"false",onClick:M=>e.unref(y)(K.dateString)},[e.createElementVNode("span",null,e.toDisplayString(K.day),1)],8,De)],10,we))),128))]))),128))])])])]),e.createElementVNode("div",Ke,[e.createElementVNode("div",Ee,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(Me.value,f=>(e.openBlock(),e.createBlock(e.unref(N),{id:f.id,key:f.id,class:e.normalizeClass(f.class),variant:f.variant,size:f.size,onClick:f.handler},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(f.label),1)]),_:2},1032,["id","class","variant","size","onClick"]))),128))])])],544),[[e.vShow,s.value]])],2)],2)]))}}),q=e.defineComponent({name:"KrdsTextarea",props:{modelValue:{type:String,default:""},size:{type:String,default:void 0},placeholder:{type:String,default:void 0},maxlength:{type:Number,default:void 0},minlength:{type:Number,default:void 0},rows:{type:Number,default:4},cols:{type:Number,default:void 0},autofocus:{type:Boolean,default:!1},name:{type:String,default:void 0},required:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},showCount:{type:Boolean,default:!0},resize:{type:String,default:"vertical"},class:{type:String,default:void 0},style:{type:[String,Object],default:void 0},id:{type:String,default:void 0}},emits:["update:modelValue","input","change","focus","blur","keydown","keyup"],setup(t,{emit:o}){const n=e.ref(0);e.watch(()=>t.modelValue,u=>{n.value=(u||"").length},{immediate:!0});const l=e.computed(()=>{const u=["krds-input"];return t.size&&u.push(t.size),t.class&&u.push(t.class),u}),r=e.computed(()=>{const u={};return t.resize&&(u.resize=t.resize),u}),a=u=>{const S=u.target.value;n.value=S.length,o("update:modelValue",S),o("input",u)},s=u=>{o("change",u)},m=u=>{o("focus",u)},g=u=>{o("blur",u)},p=u=>{o("keydown",u)},k=u=>{o("keyup",u)},V=e.computed(()=>{const u={class:l.value,style:r.value,value:t.modelValue,placeholder:t.placeholder,name:t.name,id:t.id,required:t.required,readonly:t.readonly,disabled:t.disabled,autofocus:t.autofocus,rows:t.rows,cols:t.cols,onInput:a,onChange:s,onFocus:m,onBlur:g,onKeydown:p,onKeyup:k};return t.maxlength!==void 0&&(u.maxlength=t.maxlength),t.minlength!==void 0&&(u.minlength=t.minlength),u}),i=e.computed(()=>["form-conts"]),w=e.computed(()=>["textarea-wrap"]),C=e.computed(()=>{if(!t.showCount)return null;const u=n.value,y=t.maxlength;return{current:u,max:y||""}});return()=>{const u=[e.h("textarea",V.value)];return C.value&&u.push(e.h("p",{class:"textarea-count"},[e.h("span",{class:"count-now"},C.value.current),e.h("span",{class:"count-total"},C.value.max?`/${C.value.max}`:"")])),e.h("div",{class:i.value},[e.h("div",{class:w.value},u)])}}}),Y=e.defineComponent({name:"KrdsFileUpload",props:{modelValue:{type:Array,default:()=>[]},size:{type:String,default:"medium"},accept:{type:String,default:void 0},maxFiles:{type:Number,default:10},maxFileSize:{type:Number,default:20*1024*1024},multiple:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},dragAndDrop:{type:Boolean,default:!0},title:{type:String,default:"타이틀영역"},description:{type:String,default:"컨텐츠 영역"},placeholder:{type:String,default:"첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요."},showPreview:{type:Boolean,default:!0},showDownload:{type:Boolean,default:!0},showPreviewButton:{type:Boolean,default:!0},showClearAll:{type:Boolean,default:!0},name:{type:String,default:void 0},required:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},class:{type:String,default:void 0},style:{type:[String,Object],default:void 0},id:{type:String,default:void 0}},emits:["update:modelValue","file-added","file-removed","file-error","upload-start","upload-progress","upload-complete","upload-error","clear-all","download","preview"],setup(t,{emit:o}){e.ref(!1),e.computed(()=>{const l=["krds-file-upload","line"];return t.class&&l.push(t.class),l});const n=e.computed(()=>t.modelValue?.length||0);return e.computed(()=>!t.disabled&&n.value<t.maxFiles),()=>null}}),j=e.defineComponent({name:"KrdsBadge",props:{type:{type:String,default:"outline"},color:{type:String,default:"primary"},size:{type:String,default:"large"},number:{type:Boolean,default:!1},class:{type:String,default:void 0}},emits:["click"],setup(t,{emit:o,slots:n}){const l=e.computed(()=>{const a=["krds-badge"];return a.push(`${t.type}-${t.color}`),t.size&&a.push(t.size),t.number&&a.push("number"),t.class&&a.push(t.class),a}),r=a=>{o("click",a)};return()=>e.h("span",{type:t.type,color:t.color,size:t.size,number:t.number,class:l.value,onClick:r},n.default?.())}}),A=e.defineComponent({name:"KrdsTag",props:{link:{type:Boolean,default:!1},href:{type:String,default:"#"},target:{type:String,default:void 0},rel:{type:String,default:void 0},class:{type:String,default:void 0}},emits:["remove"],setup(t,{emit:o,slots:n}){const l=e.computed(()=>{const s=["krds-btn-tag"];return t.link&&s.push("link"),t.class&&s.push(t.class),s}),r=s=>{o("remove",s)},a=()=>e.h("button",{type:"button",class:"btn-delete",onClick:r},[e.h("span",{class:"sr-only"},"삭제")]);return()=>{const s=[],m=n.default?.();if(m&&s.push(m),t.link||s.push(a()),t.link){const g={href:t.href,class:l.value};return t.target&&(g.target=t.target),t.rel&&(g.rel=t.rel),e.h("a",g,s)}return e.h("span",{class:l.value},s)}}}),G=e.defineComponent({name:"KrdsTagGroup",props:{size:{type:String,default:"medium"},class:{type:String,default:void 0}},setup(t,{slots:o}){const n=e.computed(()=>{const l=["krds-tag-wrap"];return t.size&&l.push(t.size),t.class&&l.push(t.class),l});return()=>e.h("div",{class:n.value},o.default?.())}}),H=e.defineComponent({name:"KrdsMasthead",props:{class:{type:String,default:void 0}},emits:["click"],setup(t,{emit:o,slots:n}){const l=e.computed(()=>{const a=[""];return t.class&&a.push(t.class),a}),r=a=>{o("click",a)};return()=>e.h("div",{id:"krds-masthead",class:l.value,onClick:r},[e.h("div",{class:"toggle-wrap"},[e.h("div",{class:"toggle-head"},[e.h("div",{class:"inner"},[e.h("span",{class:"nuri-txt"},n.default?.())])])])])}});let Ne=0;function v(t="krds"){return`${t}-${++Ne}`}function _(...t){return t.filter(Boolean).join(" ")}const U=e.defineComponent({name:"KrdsToggleSwitch",props:{modelValue:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},label:{type:String,default:void 0},size:{type:String,default:"medium",validator:t=>["medium","large"].includes(t)},name:{type:String,default:void 0},required:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},class:{type:String,default:void 0},id:{type:String,default:void 0}},emits:["update:modelValue","change"],setup(t,{emit:o,attrs:n}){const l=e.computed(()=>t.modelValue),r=e.computed(()=>_("krds-form-toggle-switch",t.size,t.class)),a=m=>{if(t.disabled)return;const p=m.target.checked;o("update:modelValue",p),o("change",p)},s=e.computed(()=>t.id||v("toggle-switch"));return()=>e.h("div",{class:r.value},[e.h("input",{type:"checkbox",id:s.value,name:t.name,checked:l.value,disabled:t.disabled,onChange:a,...n}),e.h("label",{for:s.value},[e.h("span",{class:"switch-toggle"},[e.h("i")]),t.label||""])])}}),W=e.defineComponent({name:"KrdsCheckArea",props:{class:{type:String,default:void 0}},setup(t,{slots:o}){return()=>{const n=["krds-check-area"];return t.class&&n.push(t.class),e.h("div",{class:n},o.default?.())}}}),J=e.defineComponent({name:"KrdsCheckbox",props:{modelValue:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},size:{type:String,default:"medium",validator:t=>["medium","large"].includes(t)},chip:{type:Boolean,default:!1},class:{type:String,default:void 0},id:{type:String,default:void 0}},emits:["update:modelValue","change"],slots:Object,setup(t,{emit:o,attrs:n,slots:l}){const r=e.computed(()=>t.modelValue),a=e.computed(()=>{const g=t.chip?"krds-form-chip":"krds-form-check";return _(g,t.size,t.class)}),s=g=>{if(t.disabled)return;const k=g.target.checked;o("update:modelValue",k),o("change",k)},m=e.computed(()=>t.id||v("checkbox"));return()=>{const g=[e.h("input",{type:"checkbox",id:m.value,checked:r.value,disabled:t.disabled,onChange:s,...n}),e.h("label",{for:m.value},l.default?.())];return l.description&&!t.chip&&g.push(e.h("div",{class:"krds-form-check-cnt"},e.h("p",{class:"krds-form-check-p"},l.description()))),e.h("div",{class:a.value},g)}}}),Q=Object.freeze(Object.defineProperty({__proto__:null,KrdsBadge:j,KrdsButton:N,KrdsButtonGroup:F,KrdsCheckArea:W,KrdsCheckbox:J,KrdsDateInput:R,KrdsFileUpload:Y,KrdsFormGroup:P,KrdsFormHint:L,KrdsFormLabel:O,KrdsIcon:T,KrdsInput:$,KrdsLink:x,KrdsMasthead:H,KrdsTag:A,KrdsTagGroup:G,KrdsTextarea:q,KrdsToggleSwitch:U},Symbol.toStringTag,{value:"Module"})),ve={install(t,o={}){t.provide("krds:config",o);const n=o.components||Object.keys(Q);n.forEach(l=>{const r=Q[l];r&&t.component(l,r)}),t.config.globalProperties.$krds={version:"__VERSION__"},process.env.NODE_ENV!=="production"&&console.log(`[KRDS Vue] v__VERSION__ 설치 완료 - 컴포넌트: ${n.length}개`)}},_e="__VERSION__";h.KrdsBadge=j,h.KrdsButton=N,h.KrdsButtonGroup=F,h.KrdsCheckArea=W,h.KrdsCheckbox=J,h.KrdsDateInput=R,h.KrdsFileUpload=Y,h.KrdsFormGroup=P,h.KrdsFormHint=L,h.KrdsFormLabel=O,h.KrdsIcon=T,h.KrdsInput=$,h.KrdsLink=x,h.KrdsMasthead=H,h.KrdsTag=A,h.KrdsTagGroup=G,h.KrdsTextarea=q,h.KrdsToggleSwitch=U,h.classNames=_,h.default=ve,h.generateId=v,h.version=_e,Object.defineProperties(h,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|
|
2
|
+
//# sourceMappingURL=krds-vue.umd.js.map
|