@krds.ui/vue 0.0.18 → 0.0.20

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.
@@ -1 +1 @@
1
- {"version":3,"file":"krds-vue.es.js","names":["KrdsButton","KrdsSpinner","KrdsInput","KrdsFormLabel","KrdsFormHint","KrdsFormGroup","KrdsButton","KrdsDateInput","KrdsTextarea","KrdsSelect","KrdsFileUpload","KrdsBadge","KrdsTag","KrdsTagGroup","KrdsMasthead","KrdsToggleSwitch","KrdsCheckArea","KrdsCheckbox","KrdsRadio","KrdsSpinner","KrdsStepIndicator","KrdsStep","KrdsSkipLink","KrdsBreadcrumb","KrdsInPageNavigation","KrdsPagination","KrdsPanel","KrdsContextualHelp","KrdsCoachMark","KrdsTooltip","KrdsLanguageSwitcher","KrdsResize","KrdsModal","KrdsAccordionGroup","KrdsAccordionItem","KrdsTts","KrdsTable","KrdsHeader","KrdsFooter","KrdsDisclosure","KrdsIdentifier","KrdsLayout","KrdsSideNavigation","KrdsStructuredList","KrdsTextList","KrdsCriticalAlerts","KrdsMainMenu","KrdsCarousel","KrdsTabs","components","Comment","Fragment","Teleport","Text","computed","defineComponent","getCurrentInstance","h","inject","nextTick","onBeforeUnmount","onMounted","onUnmounted","provide","ref","useId","vShow","watch","withDirectives","withModifiers","__defProp","__exportAll","all","no_symbols","target","name","KrdsButton_default$1","event","props","emit","slots","buttonClasses","classes","handleClick","KrdsButton_default","KrdsButtonGroup_default","_","KrdsIcon_default","KrdsLink_default","linkClasses","linkAttributes","attrs","KrdsSpinner_default$1","children","KrdsInput_default$1","value","inputClasses","handleInput","handleChange","handleFocus","handleBlur","handleKeydown","handleKeyup","inputProps","formContsClasses","classList","KrdsInput_default","KrdsFormLabel_default$1","KrdsFormLabel_default","KrdsFormHint_default$1","baseClass","KrdsFormHint_default","KrdsFormGroup_default$1","KrdsFormGroup_default","useDatePicker","initialYear","initialMonth","today","currentYear","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","ignore","setupGlobalListeners","e","removeGlobalListeners","eventType","WEEKDAY_LABELS","KrdsDateInput_default$1","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","openDatePicker","handleDatePickerToggle","renderSwitchDropdown","isYear","currentValue","format","option","renderCalendarTable","label","weekIndex","dayIndex","action","KrdsDateInput_default","KrdsTextarea_default$1","currentLength","newValue","textareaClasses","textareaStyles","styles","textareaProps","textareaWrapClasses","countDisplay","KrdsTextarea_default","KrdsSelect_default$1","selectClasses","selectProps","renderOptions","optionElements","selectElement","KrdsSelect_default","uid","KrdsFileUpload_default$1","files","file","fileId","error","progress","isDragOver","inputRef","inputId","formatFileSize","bytes","getFileExtension","parts","formatFileName","ext","nameWithoutExt","generateId","validateFile","accepted","t","mime","addFiles","fileList","currentFiles","newFiles","fileInfo","onFileChange","input","onDragOver","onDragLeave","onDrop","triggerFileSelect","removeFile","f","clearAll","rootClasses","renderFileHead","renderUploadArea","renderBtnWrap","renderFileItem","liChildren","hintContent","part","renderFileList","validCount","KrdsFileUpload_default","KrdsBadge_default$1","KrdsBadge_default","KrdsTag_default$1","tagClasses","handleDelete","renderDeleteButton","content","slotContent","linkAttrs","KrdsTag_default","KrdsTagGroup_default$1","tagGroupClasses","KrdsTagGroup_default","KrdsMasthead_default$1","mastheadClasses","KrdsMasthead_default","idCounter","prefix","generateUid","classNames","KrdsToggleSwitch_default$1","generatedInputId","isChecked","containerClasses","handleToggle","KrdsToggleSwitch_default","KrdsCheckArea_default$1","KrdsCheckArea_default","KrdsCheckbox_default$1","KrdsCheckbox_default","KrdsRadio_default$1","inputName","KrdsRadio_default","KrdsSpinner_default","KrdsStepIndicator_default$1","stepperClasses","getStepStatus","index","currentStep","stepIndex","resetStepIndex","getNextStepIndex","KrdsStepIndicator_default","KrdsStep_default$1","step","stepIndicatorContext","stepStatus","stepClasses","isActive","KrdsStep_default","KrdsSkipLink_default$1","KrdsSkipLink_default","KrdsBreadcrumb_default$1","item","isCurrentPage","isHome","KrdsBreadcrumb_default","KrdsInPageNavigation_default$1","activeItem","sectionElements","calculateHeaderHeight","headerTopSelector","headerInnerSelector","handleItemClick","targetElement","headerHeight","focusable","cacheSectionElements","element","updateActiveItem","winHeight","topHeight","scrollBottom","scrollHeight","sections","firstSection","lastSection","firstSecTop","newActiveItem","section","sectionHeight","sectionTop","initActiveItem","activeFromProps","observer","renderHeader","renderNavList","listItems","renderAction","KrdsInPageNavigation_default","vSrOnly","el","binding","installDirectives","app","DEFAULT_MIN","DEFAULT_PAGE_RANGE","KrdsPagination_default$1","minPage","currentPage","prevDisabled","nextDisabled","prevHref","nextHref","displayedPages","totalPages","pageRange","boundaryRange","pages","leftBoundary","rightBoundary","rangeStart","rangeEnd","adjustedRangeStart","startPage","endPage","handlePageClick","page","handlePrevClick","handleNextClick","renderPageItem","isCurrent","KrdsPagination_default","KrdsPanel_default$1","open","handleOpen","handleClose","KrdsPanel_default","KrdsContextualHelp_default$1","containerRef","tooltipBtnRef","tooltipPopoverRef","closeBtnRef","isVisible","toggleTooltip","wasVisible","closeAllTooltips","showTooltip","adjustTooltipPosition","closeTooltip","allPopovers","allButtons","popover","button","isMobile","tooltipAction","contentsPaddingX","offsetLeft","width","handleOutsideClick","handleResize","KrdsContextualHelp_default","KrdsCoachMark_default$1","currentStepData","prevStep","nextStep","closeCoachMark","renderBalloon","KrdsCoachMark_default","KrdsTooltip_default$1","popoverRef","isTooltipVisible","popoverStyle","popoverId","tooltipClasses","popoverClasses","buttonText","checkIsMobile","calculateTooltipPosition","tooltipGap","tooltipHeight","tooltipWidth","itemTop","itemLeft","itemRight","itemHeight","itemWidth","halfWindowWidth","halfWindowHeight","tooltipTop","tooltipLeft","mobileSmall","hideTooltip","handleScroll","KrdsTooltip_default","KrdsLanguageSwitcher_default$1","isOpen","dropdownRef","buttonRef","positionDropdown","closeDropdown","selectLanguage","languageCode","menu","menuRect","windowWidth","handleClickOutside","handleFocusOut","handleItemFocus","currentItem","isDropdownOpen","renderDefaultList","language","renderExternalList","KrdsLanguageSwitcher_default","KrdsResize_default$1","_props","selectedSize","scaleList","selectSize","scale","resetSize","defaultScale","KrdsResize_default","KrdsModal_default$1","computedModalId","titleId","sizeClass","originalOverflow","previousActiveElement","modalRef","getFocusableElements","trapFocus","focusableElements","firstElement","lastElement","cleanupEffects","modalElement","modalConts","modalAttrs","KrdsModal_default","KrdsAccordionGroup_default$1","accordionGroupClasses","KrdsAccordionGroup_default","KrdsAccordionItem_default$1","id","openToggle","KrdsAccordionItem_default","KrdsTts_default$1","text","isPlaying","utterance","stopSpeech","toggleTts","currentIcon","KrdsTts_default","KrdsTable_default$1","row","tableClasses","wrapperClasses","getHeaderStyle","column","getHeaderClasses","getCellStyle","columnClasses","renderColgroup","widthMatch","headerCells","headerStyle","headerClasses","getCellValue","renderBody","bodyRows","cells","colIndex","cellValue","cellContent","cellStyle","cellClasses","handleRowClick","KrdsTable_default","KrdsHeader_default$1","headerInChildren","innerChildren","KrdsHeader_default","KrdsFooter_default$1","footerClasses","renderTop","renderLogo","renderContent","renderBottom","top","logo","bottom","KrdsFooter_default","KrdsDisclosure_default$1","contentId","isExpanded","KrdsDisclosure_default","KrdsIdentifier_default$1","identifierClasses","KrdsIdentifier_default","SCROLL_OFFSET_THRESHOLD","KrdsLayout_default$1","_size","_details","_height","scrollY","scrollH","lastScrollY","scrollDirection","wrapElement","resizeObserver","updateScrollValues","prevScrollHeight","handleScrollDirection","container","containerOffsetTop","currentScrollY","isScrollingDown","isScrollingUp","entries","entry","height","KrdsLayout_default","KrdsSideNavigation_default$1","modelValue","popupTriggerRefs","popupRefs","popupTitleRefs","lastClickedPopupButton","setPopupTriggerRef","parentIndex","subIndex","key","setPopupRef","setPopupTitleRef","toggleSubmenu","idx","wasExpanded","updatedItem","subItem","togglePopup","subIdx","updatedSubItem","popupElement","titleButton","closePopup","buttonToFocus","handlePopupFocusOut","handlePopupTitleClick","renderPopupItems","items","popupItem","popupIndex","renderSubItems","subItems","renderMenuItems","KrdsSideNavigation_default","KrdsStructuredList_default$1","cardTop","cardBody","cardBtm","cardBtn","structuredItem","KrdsStructuredList_default","KrdsTextList_default$1","KrdsTextList_default","KrdsCriticalAlerts_default$1","getBadgeText","handleLinkClick","KrdsCriticalAlerts_default","NEW_WINDOW_TITLE","DRAWER_OPEN_DELAY","DRAWER_CLOSE_DELAY","FOCUSABLE_SELECTOR","KrdsMainMenu_default$1","expanded","mouseEvent","rootRef","wrapRef","bodyRef","isPc","panelId","subPanelId","tabId","depth3Id","hasSubColumns","hasSingleList","hasPanel","isSubLink","externalAttrs","external","openIndex","subOverrides","panelMinHeight","mainListEls","mainTriggerEls","setElRef","map","defaultSubIndex","activeSubIndex","override","setPcBodyState","needsScroll","adjustPanelHeight","activeSubList","closeMainMenu","restoreFocus","closedIndex","toggleMainMenu","selectSubMenu","handleDocumentClick","root","handlePcFocusout","nextTarget","handlePcKeydown","focusSibling","direction","listItem","activeTab","depth3Expanded","depth4Displayed","depth4Opened","drawerDisplayed","drawerOpened","panelEls","depth3TriggerEls","depth4Els","depth4PrevEls","setKeyedRef","openTimer","closeTimer","setMobileBodyState","openDrawer","closeDrawer","handleTabClick","body","panel","handleBodyScroll","scrollTop","clientHeight","nextActive","toggleDepth3","openDepth4","closeDepth4","first","last","active","handleMobileKeydown","initialExpanded","renderPcLinkList","linkItems","isDescription","linkItem","linkIndex","icon","tag","renderPcSubList","titleChildren","renderPcSubItems","banner","renderPcPanel","withColumns","mainListChildren","renderPc","menuItems","withPanel","trigger","backdrop","renderDepth4","closeDepth4Panel","depth4Item","depth4Index","renderDepth3","withDepth4","renderMobilePanel","withDepth3","renderMobile","tabs","bodyChildren","KrdsMainMenu_default","DEFAULT_SPEED","DEFAULT_AUTOPLAY_DELAY","VISUAL_SPACE_BETWEEN","BANNER_SPACE_BETWEEN","flattenSlides","nodes","node","KrdsCarousel_default$1","wrapperId","slideCount","internalIndex","spaceBetween","paginationType","hoverPaused","focusPaused","isPaused","autoplayTimer","clearAutoplayTimer","goTo","next","goPrev","goNext","startAutoplay","stopAutoplay","reducedMotion","motionQuery","handleMotionChange","transitionDuration","handlePointerEnter","handlePointerLeave","handleFocusIn","handleMoreClick","swiperStyle","slideStyle","buildWrapperStyle","current","buildOverlayNavStyle","isPrev","renderSlides","slides","slide","renderNavigationButton","overlay","disabled","renderMoreLink","renderPagination","total","renderController","renderIndicator","isBanner","showPagination","showMore","navigationChildren","KrdsCarousel_default","KrdsTabs_default$1","internalActiveId","tab","activeId","selectTab","currentTab","KrdsTabs_default","components_exports","krdsVersion","KrdsVue","componentName","component","version"],"sources":["../src/components/KrdsButton/KrdsButton.ts","../src/components/KrdsButton/index.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/KrdsInput/index.ts","../src/components/KrdsFormLabel/KrdsFormLabel.ts","../src/components/KrdsFormLabel/index.ts","../src/components/KrdsFormHint/KrdsFormHint.ts","../src/components/KrdsFormHint/index.ts","../src/components/KrdsFormGroup/KrdsFormGroup.ts","../src/components/KrdsFormGroup/index.ts","../src/composables/useDatePicker.ts","../src/composables/useClickOutside.ts","../src/components/KrdsDateInput/KrdsDateInput.ts","../src/components/KrdsDateInput/index.ts","../src/components/KrdsTextarea/KrdsTextarea.ts","../src/components/KrdsTextarea/index.ts","../src/components/KrdsSelect/KrdsSelect.ts","../src/components/KrdsSelect/index.ts","../src/components/KrdsFileUpload/KrdsFileUpload.ts","../src/components/KrdsFileUpload/index.ts","../src/components/KrdsBadge/KrdsBadge.ts","../src/components/KrdsBadge/index.ts","../src/components/KrdsTag/KrdsTag.ts","../src/components/KrdsTag/index.ts","../src/components/KrdsTagGroup/KrdsTagGroup.ts","../src/components/KrdsTagGroup/index.ts","../src/components/KrdsMasthead/KrdsMasthead.ts","../src/components/KrdsMasthead/index.ts","../src/utils/index.ts","../src/components/KrdsToggleSwitch/KrdsToggleSwitch.ts","../src/components/KrdsToggleSwitch/index.ts","../src/components/KrdsCheckArea/KrdsCheckArea.ts","../src/components/KrdsCheckArea/index.ts","../src/components/KrdsCheckbox/KrdsCheckbox.ts","../src/components/KrdsCheckbox/index.ts","../src/components/KrdsRadio/KrdsRadio.ts","../src/components/KrdsRadio/index.ts","../src/components/KrdsSpinner/index.ts","../src/components/KrdsStepIndicator/KrdsStepIndicator.ts","../src/components/KrdsStepIndicator/index.ts","../src/components/KrdsStep/KrdsStep.ts","../src/components/KrdsStep/index.ts","../src/components/KrdsSkipLink/KrdsSkipLink.ts","../src/components/KrdsSkipLink/index.ts","../src/components/KrdsBreadcrumb/KrdsBreadcrumb.ts","../src/components/KrdsBreadcrumb/index.ts","../src/components/KrdsInPageNavigation/KrdsInPageNavigation.ts","../src/components/KrdsInPageNavigation/index.ts","../src/directives/vSrOnly.ts","../src/directives/index.ts","../src/components/KrdsPagination/KrdsPagination.ts","../src/components/KrdsPagination/index.ts","../src/components/KrdsPanel/KrdsPanel.ts","../src/components/KrdsPanel/index.ts","../src/components/KrdsContextualHelp/KrdsContextualHelp.ts","../src/components/KrdsContextualHelp/index.ts","../src/components/KrdsCoachMark/KrdsCoachMark.ts","../src/components/KrdsCoachMark/index.ts","../src/components/KrdsTooltip/KrdsTooltip.ts","../src/components/KrdsTooltip/index.ts","../src/components/KrdsLanguageSwitcher/KrdsLanguageSwitcher.ts","../src/components/KrdsLanguageSwitcher/index.ts","../src/components/KrdsResize/KrdsResize.ts","../src/components/KrdsResize/index.ts","../src/components/KrdsModal/KrdsModal.ts","../src/components/KrdsModal/index.ts","../src/components/KrdsAccordionGroup/KrdsAccordionGroup.ts","../src/components/KrdsAccordionGroup/index.ts","../src/components/KrdsAccordionItem/KrdsAccordionItem.ts","../src/components/KrdsAccordionItem/index.ts","../src/components/KrdsTts/KrdsTts.ts","../src/components/KrdsTts/index.ts","../src/components/KrdsTable/KrdsTable.ts","../src/components/KrdsTable/index.ts","../src/components/KrdsHeader/KrdsHeader.ts","../src/components/KrdsHeader/index.ts","../src/components/KrdsFooter/KrdsFooter.ts","../src/components/KrdsFooter/index.ts","../src/components/KrdsDisclosure/KrdsDisclosure.ts","../src/components/KrdsDisclosure/index.ts","../src/components/KrdsIdentifier/KrdsIdentifier.ts","../src/components/KrdsIdentifier/index.ts","../src/components/KrdsLayout/KrdsLayout.ts","../src/components/KrdsLayout/index.ts","../src/components/KrdsSideNavigation/KrdsSideNavigation.ts","../src/components/KrdsSideNavigation/index.ts","../src/components/KrdsStructuredList/KrdsStructuredList.ts","../src/components/KrdsStructuredList/index.ts","../src/components/KrdsTextList/KrdsTextList.ts","../src/components/KrdsTextList/index.ts","../src/components/KrdsCriticalAlerts/KrdsCriticalAlerts.ts","../src/components/KrdsCriticalAlerts/index.ts","../src/components/KrdsMainMenu/KrdsMainMenu.ts","../src/components/KrdsMainMenu/index.ts","../src/components/KrdsCarousel/KrdsCarousel.ts","../src/components/KrdsCarousel/index.ts","../src/components/KrdsTabs/KrdsTabs.ts","../src/components/KrdsTabs/index.ts","../src/components/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({\n name: 'KrdsButton',\n props: {\n /** 버튼 타입 */\n type: {\n type: String as () => 'button' | 'submit' | 'reset',\n default: 'button'\n },\n /** 버튼 크기 */\n size: {\n type: String as () => Size,\n default: undefined\n },\n /** 버튼 변형 */\n variant: {\n type: String as () => Variant,\n default: 'primary'\n },\n /** 아이콘 전용 버튼 */\n icon: {\n type: Boolean,\n default: false\n },\n /** 테두리 스타일 (아이콘 버튼용) */\n border: {\n type: Boolean,\n default: false\n },\n /** Pure 버튼 여부 (가상클래스 상태 시 컬러 유지) */\n pure: {\n type: Boolean,\n default: false\n },\n /** 텍스트 버튼 스타일 */\n text: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Button 컴포넌트\n */\n\nimport KrdsButton from './KrdsButton'\nimport type { KrdsButtonProps, KrdsButtonEmits } from './KrdsButton'\n\nexport { KrdsButton }\nexport type { KrdsButtonProps, KrdsButtonEmits }\nexport default KrdsButton\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({\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({\n name: 'KrdsIcon',\n props: {\n /** 아이콘 이름 */\n name: {\n type: String,\n required: true\n },\n /** CSS 클래스 */\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({\n name: 'KrdsLink',\n props: {\n /** 링크 URL */\n href: {\n type: String,\n default: '#!'\n },\n /** 링크 대상 (_blank, _self 등) */\n target: {\n type: String as () => '_blank' | '_self' | '_parent' | '_top' | string,\n default: undefined\n },\n /** 링크 제목 (접근성) */\n title: {\n type: String,\n default: undefined\n },\n /** 링크 크기 */\n size: {\n type: String as () => KrdsLinkSize,\n default: undefined\n },\n /** Link 클래스 적용 여부 */\n link: {\n type: Boolean,\n default: true\n },\n /** Basic 링크 여부 (본문 텍스트 컬러) */\n basic: {\n type: Boolean,\n default: false\n },\n /** Pure 링크 여부 (가상클래스 상태 시 컬러 유지) */\n pure: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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 /** 로딩 안내 텍스트 */\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({\n name: 'KrdsInput',\n props: {\n /** 입력값 */\n modelValue: {\n type: [String, Number],\n default: undefined\n },\n /** 입력 타입 */\n type: {\n type: String as () => InputType,\n default: 'text'\n },\n /** 입력 크기 */\n size: {\n type: String as () => Size,\n default: undefined\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: undefined\n },\n /** 최대 글자 수 */\n maxlength: {\n type: Number,\n default: undefined\n },\n /** 최소 글자 수 */\n minlength: {\n type: Number,\n default: undefined\n },\n /** 최대값 (number 타입용) */\n max: {\n type: Number,\n default: undefined\n },\n /** 최소값 (number 타입용) */\n min: {\n type: Number,\n default: undefined\n },\n /** 단계값 (number 타입용) */\n step: {\n type: Number,\n default: undefined\n },\n /** 자동완성 */\n autocomplete: {\n type: String,\n default: undefined\n },\n /** 자동 포커스 */\n autofocus: {\n type: Boolean,\n default: false\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 입력 상태 */\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n /** 아이콘 (있을 때 btn-ico-wrap 클래스 적용) */\n icon: {\n type: Boolean,\n default: false\n },\n /** 로딩 상태 */\n loading: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string | number) => true,\n input: (event: Event) => true,\n change: (event: Event) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true,\n keydown: (event: KeyboardEvent) => true,\n keyup: (event: KeyboardEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Input 컴포넌트\n */\n\nimport KrdsInput from './KrdsInput'\nimport type { KrdsInputProps, KrdsInputEmits } from './KrdsInput'\n\nexport { KrdsInput }\nexport type { KrdsInputProps, KrdsInputEmits }\nexport default KrdsInput\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({\n name: 'KrdsFormLabel',\n props: {\n /** label의 for 속성 */\n for: {\n type: String,\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS FormLabel 컴포넌트\n */\n\nimport KrdsFormLabel from './KrdsFormLabel'\nimport type { KrdsFormLabelProps, KrdsFormLabelEmits } from './KrdsFormLabel'\n\nexport { KrdsFormLabel }\nexport type { KrdsFormLabelProps, KrdsFormLabelEmits }\nexport default KrdsFormLabel\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({\n name: 'KrdsFormHint',\n props: {\n /** 힌트 타입 */\n type: {\n type: String as () => 'hint' | 'error' | 'success' | 'information',\n default: 'hint'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS FormHint 컴포넌트\n */\n\nimport KrdsFormHint from './KrdsFormHint'\nimport type { KrdsFormHintProps, KrdsFormHintEmits } from './KrdsFormHint'\n\nexport { KrdsFormHint }\nexport type { KrdsFormHintProps, KrdsFormHintEmits }\nexport default KrdsFormHint\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({\n name: 'KrdsFormGroup',\n props: {\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\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","/**\n * KRDS FormGroup 컴포넌트\n */\n\nimport KrdsFormGroup from './KrdsFormGroup'\nimport type { KrdsFormGroupProps } from './KrdsFormGroup'\n\nexport { KrdsFormGroup }\nexport type { KrdsFormGroupProps }\nexport default KrdsFormGroup\n","import { computed, ref } from 'vue'\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","import { computed, defineComponent, h, ref, vShow, withDirectives } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseFormProps, Size } from '@/types'\nimport KrdsButton from '@/components/KrdsButton/KrdsButton'\nimport { useDatePicker } from '@/composables/useDatePicker'\nimport { useClickOutside } from '@/composables/useClickOutside'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 캘린더 날짜 정보\n */\ninterface 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 */\ninterface 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 */\nexport 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 */\nexport interface KrdsDateInputEmits {\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}\n\n/** 요일 헤더 */\nconst WEEKDAY_LABELS = ['일', '월', '화', '수', '목', '금', '토']\n\nexport default defineComponent({\n name: 'KrdsDateInput',\n props: {\n /** 선택된 날짜 값 */\n modelValue: {\n type: String,\n default: undefined\n },\n /** 입력 크기 */\n size: {\n type: String as PropType<Size>,\n default: 'medium'\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: 'YYYY.MM.DD'\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 자동 포커스 */\n autofocus: {\n type: Boolean,\n default: false\n },\n /** 일정이 있는 날짜 배열 (YYYY.MM.DD 형식) */\n eventDates: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /** 휴일 날짜 배열 (YYYY.MM.DD 형식) */\n holidays: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /** 초기 표시 년도 (기본: 현재 년도) */\n initialYear: {\n type: Number,\n default: undefined\n },\n /** 초기 표시 월 (기본: 현재 월) */\n initialMonth: {\n type: Number,\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n input: (event: Event) => true,\n change: (event: Event) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\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\n // ========================\n // Render\n // ========================\n\n /**\n * 연/월 드롭다운\n */\n const renderSwitchDropdown = (type: 'year' | 'month') => {\n const isYear = type === 'year'\n const options = isYear ? yearOptions.value : monthOptions.value\n const currentValue = isYear ? currentYear.value : currentMonth.value\n const format = (value: number) => (isYear ? `${value}년` : `${value.toString().padStart(2, '0')}월`)\n\n return h('div', { class: 'calendar-drop-down' }, [\n h(\n 'button',\n {\n type: 'button',\n class: `btn-cal-switch ${type}`,\n 'aria-label': isYear ? '연도 선택' : '월 선택',\n 'aria-expanded': activeDropdown.value === type,\n onClick: () => toggleDropdown(type)\n },\n format(currentValue)\n ),\n withDirectives(\n h('div', { class: `calendar-select ${isYear ? 'calendar-year-wrap' : 'calendar-mon-wrap'}` }, [\n h(\n 'ul',\n { class: `sel ${type}` },\n options.map(option =>\n h('li', { key: option }, [\n h(\n 'button',\n {\n type: 'button',\n class: { active: option === currentValue },\n onClick: () => (isYear ? selectYear(option) : selectMonth(option))\n },\n format(option)\n )\n ])\n )\n )\n ]),\n [[vShow, activeDropdown.value === type]]\n )\n ])\n }\n\n /**\n * 캘린더 표\n */\n const renderCalendarTable = () =>\n h('table', { class: 'calendar-tbl' }, [\n h('caption', null, `${currentYear.value}년 ${currentMonth.value.toString().padStart(2, '0')}월`),\n h('thead', null, [\n h(\n 'tr',\n null,\n WEEKDAY_LABELS.map(label => h('th', null, label))\n )\n ]),\n h(\n 'tbody',\n null,\n calendarGrid.value.map((week, weekIndex) =>\n h(\n 'tr',\n { key: weekIndex },\n week.map((day, dayIndex) =>\n h('td', { key: dayIndex, class: getCellClasses(day), 'data-date': day.dateString }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'btn-set-date',\n 'aria-pressed': isDateInSelectedRange(day.dateString).isInRange ? 'true' : 'false',\n onClick: () => handleDateSelection(day.dateString)\n },\n [h('span', null, String(day.day))]\n )\n ])\n )\n )\n )\n )\n ])\n\n return () =>\n h('div', { class: 'form-conts' }, [\n h('div', { class: formContsClasses.value }, [\n h('div', { class: 'calendar-input' }, [\n h('input', {\n id: props.id,\n name: props.name,\n class: inputClasses.value,\n placeholder: props.placeholder,\n value: props.modelValue,\n readonly: props.readonly,\n disabled: props.disabled,\n required: props.required,\n autofocus: props.autofocus,\n type: 'text',\n onInput: handleInput,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur\n }),\n h(\n 'button',\n {\n ref: datePickerButtonRef,\n class: `krds-btn ${props.size || 'medium'} icon form-btn-datepicker`,\n disabled: props.disabled,\n 'aria-expanded': isCalendarOpen.value,\n type: 'button',\n onClick: handleDatePickerToggle\n },\n [h('span', { class: 'sr-only' }, '달력 열기'), h('i', { class: 'svg-icon ico-calendar' })]\n )\n ]),\n h('div', { ref: datePickerAreaRef, class: calendarAreaClasses.value }, [\n withDirectives(\n h(\n 'div',\n {\n class: 'calendar-wrap bottom',\n 'aria-label': '달력',\n tabindex: '0',\n onKeydown: handleKeydown\n },\n [\n // 캘린더 헤더\n h('div', { class: 'calendar-head' }, [\n h('button', { type: 'button', class: 'btn-cal-move prev', onClick: prevMonth }, [\n h('span', { class: 'sr-only' }, '이전 달')\n ]),\n h('div', { class: 'calendar-switch-wrap' }, [renderSwitchDropdown('year'), renderSwitchDropdown('month')]),\n h('button', { type: 'button', class: 'btn-cal-move next', onClick: nextMonth }, [\n h('span', { class: 'sr-only' }, '다음 달')\n ])\n ]),\n // 캘린더 바디\n h('div', { class: 'calendar-body' }, [h('div', { class: 'calendar-table-wrap' }, [renderCalendarTable()])]),\n // 캘린더 푸터\n h('div', { class: 'calendar-footer' }, [\n h(\n 'div',\n { class: 'calendar-btn-wrap' },\n actionButtons.value.map(action =>\n h(\n KrdsButton,\n {\n id: action.id,\n key: action.id,\n class: action.class,\n variant: action.variant,\n size: action.size,\n onClick: action.handler\n },\n { default: () => action.label }\n )\n )\n )\n ])\n ]\n ),\n [[vShow, isCalendarOpen.value]]\n )\n ])\n ])\n ])\n }\n})\n","import KrdsDateInput from './KrdsDateInput'\nimport type { KrdsDateInputProps, KrdsDateInputEmits } from './KrdsDateInput'\n\nexport { KrdsDateInput }\nexport type { KrdsDateInputProps, KrdsDateInputEmits }\nexport default KrdsDateInput\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 /** 입력값 */\n modelValue: {\n type: String,\n default: ''\n },\n /** 입력 크기 */\n size: {\n type: String as () => Size,\n default: undefined\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: undefined\n },\n /** 최대 글자 수 */\n maxlength: {\n type: Number,\n default: undefined\n },\n /** 최소 글자 수 */\n minlength: {\n type: Number,\n default: undefined\n },\n /** 행 수 */\n rows: {\n type: Number,\n default: 4\n },\n /** 열 수 */\n cols: {\n type: Number,\n default: undefined\n },\n /** 자동 포커스 */\n autofocus: {\n type: Boolean,\n default: false\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 글자 수 표시 여부 */\n showCount: {\n type: Boolean,\n default: true\n },\n /** 리사이즈 가능 여부 */\n resize: {\n type: String as () => 'none' | 'both' | 'horizontal' | 'vertical',\n default: 'vertical'\n },\n // BaseFormProps에서 상속\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n input: (event: Event) => true,\n change: (event: Event) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true,\n keydown: (event: KeyboardEvent) => true,\n keyup: (event: KeyboardEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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 KrdsTextarea from './KrdsTextarea'\nimport type { KrdsTextareaProps, KrdsTextareaEmits } from './KrdsTextarea'\n\nexport { KrdsTextarea }\nexport type { KrdsTextareaProps, KrdsTextareaEmits }\nexport default KrdsTextarea\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({\n name: 'KrdsSelect',\n props: {\n /** 선택된 값 */\n modelValue: {\n type: [String, Number, null] as unknown as () => string | number | null,\n default: null\n },\n /** 선택 크기 */\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n /** 타이틀 */\n title: {\n type: String,\n default: undefined\n },\n /** 옵션 목록 */\n options: {\n type: Array as () => SelectOption[],\n default: () => []\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: '선택'\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 입력 상태 */\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n /** 정렬 스타일 여부 */\n sort: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string | number | null) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Select 컴포넌트\n */\n\nimport KrdsSelect from './KrdsSelect'\nimport type { KrdsSelectProps, KrdsSelectEmits, SelectOption } from './KrdsSelect'\n\nexport { KrdsSelect }\nexport type { KrdsSelectProps, KrdsSelectEmits, SelectOption }\nexport default KrdsSelect\n","import { defineComponent, computed, ref, h, type VNode } 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\nlet uid = 0\n\nexport default defineComponent({\n name: 'KrdsFileUpload',\n props: {\n /** 파일 목록 */\n modelValue: {\n type: Array as () => FileInfo[],\n default: () => []\n },\n /** 입력 크기 */\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n /** 허용되는 파일 타입 (예: '.jpg,.png,.pdf') */\n accept: {\n type: String,\n default: undefined\n },\n /** 최대 파일 개수 */\n maxFiles: {\n type: Number,\n default: 10\n },\n /** 최대 파일 크기 (bytes) */\n maxFileSize: {\n type: Number,\n default: 20 * 1024 * 1024 // 20MB\n },\n /** 다중 파일 선택 여부 */\n multiple: {\n type: Boolean,\n default: true\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 드래그 앤 드롭 활성화 여부 */\n dragAndDrop: {\n type: Boolean,\n default: true\n },\n /** 제목 */\n title: {\n type: String,\n default: '타이틀영역'\n },\n /** 설명 텍스트 */\n description: {\n type: String,\n default: '컨텐츠 영역'\n },\n /** 플레이스홀더 텍스트 */\n placeholder: {\n type: String,\n default: '첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.'\n },\n /** 미리보기 표시 여부 */\n showPreview: {\n type: Boolean,\n default: true\n },\n /** 다운로드 버튼 표시 여부 */\n showDownload: {\n type: Boolean,\n default: true\n },\n /** 바로보기 버튼 표시 여부 */\n showPreviewButton: {\n type: Boolean,\n default: true\n },\n /** 전체 삭제 버튼 표시 여부 */\n showClearAll: {\n type: Boolean,\n default: true\n },\n // BaseFormProps에서 상속\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (files: FileInfo[]) => true,\n 'file-added': (file: FileInfo) => true,\n 'file-removed': (fileId: string) => true,\n 'file-error': (file: FileInfo, error: string) => true,\n 'upload-start': (file: FileInfo) => true,\n 'upload-progress': (file: FileInfo, progress: number) => true,\n 'upload-complete': (file: FileInfo) => true,\n 'upload-error': (file: FileInfo, error: string) => true,\n 'clear-all': () => true,\n download: (file: FileInfo) => true,\n preview: (file: FileInfo) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n const isDragOver = ref(false)\n const inputRef = ref<HTMLInputElement | null>(null)\n const inputId = props.id ? `${props.id}-input` : `krds-file-upload-${++uid}`\n\n // --- helpers ---\n\n const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)}KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)}MB`\n }\n\n const getFileExtension = (name: string): string => {\n const parts = name.split('.')\n return parts.length > 1 ? parts.pop()!.toLowerCase() : ''\n }\n\n const formatFileName = (file: FileInfo): string => {\n const ext = getFileExtension(file.name)\n const nameWithoutExt = ext ? file.name.slice(0, -(ext.length + 1)) : file.name\n return ext ? `${nameWithoutExt} [${ext}, ${formatFileSize(file.size)}]` : `${file.name} [${formatFileSize(file.size)}]`\n }\n\n const generateId = (): string => {\n return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`\n }\n\n const validateFile = (file: File): string | null => {\n if (props.maxFileSize && file.size > props.maxFileSize) {\n return `등록 가능한 파일 용량을 초과하였습니다.\\n${formatFileSize(props.maxFileSize)} 미만의 파일만 등록할 수 있습니다.`\n }\n if (props.accept) {\n const accepted = props.accept.split(',').map(t => t.trim().toLowerCase())\n const ext = `.${getFileExtension(file.name)}`\n const mime = file.type\n if (\n !accepted.some(t => {\n if (t.startsWith('.')) return ext === t\n if (t.endsWith('/*')) return mime.startsWith(t.replace('/*', '/'))\n return mime === t\n })\n ) {\n return '허용되지 않는 파일 형식입니다.'\n }\n }\n return null\n }\n\n // --- event handlers ---\n\n const addFiles = (fileList: FileList) => {\n if (props.disabled || props.readonly) return\n\n // 단일 파일 모드: 기존 파일 교체\n let currentFiles = [...(props.modelValue || [])]\n if (!props.multiple && currentFiles.length > 0) {\n currentFiles = []\n }\n\n const newFiles: FileInfo[] = []\n\n for (let i = 0; i < fileList.length; i++) {\n if (currentFiles.length + newFiles.length >= props.maxFiles) break\n\n const file = fileList[i]\n const error = validateFile(file)\n const fileInfo: FileInfo = {\n id: generateId(),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: error ? 'error' : 'pending',\n errorMessage: error || undefined\n }\n newFiles.push(fileInfo)\n\n if (error) {\n emit('file-error', fileInfo, error)\n } else {\n emit('file-added', fileInfo)\n }\n }\n\n if (newFiles.length > 0) {\n emit('update:modelValue', [...currentFiles, ...newFiles])\n }\n }\n\n const onFileChange = (event: Event) => {\n const input = event.target as HTMLInputElement\n if (input.files?.length) {\n addFiles(input.files)\n input.value = ''\n }\n }\n\n const onDragOver = (event: DragEvent) => {\n if (props.disabled || props.readonly || !props.dragAndDrop) return\n event.preventDefault()\n isDragOver.value = true\n }\n\n const onDragLeave = () => {\n isDragOver.value = false\n }\n\n const onDrop = (event: DragEvent) => {\n event.preventDefault()\n isDragOver.value = false\n if (props.disabled || props.readonly || !props.dragAndDrop) return\n if (event.dataTransfer?.files) {\n addFiles(event.dataTransfer.files)\n }\n }\n\n const triggerFileSelect = () => {\n if (props.disabled || props.readonly) return\n inputRef.value?.click()\n }\n\n const removeFile = (fileId: string) => {\n if (props.disabled || props.readonly) return\n emit(\n 'update:modelValue',\n (props.modelValue || []).filter(f => f.id !== fileId)\n )\n emit('file-removed', fileId)\n }\n\n const clearAll = () => {\n if (props.disabled || props.readonly) return\n emit('update:modelValue', [])\n emit('clear-all')\n }\n\n // --- computed ---\n\n const rootClasses = computed(() => {\n const classes = ['krds-file-upload', 'line']\n if (props.class) classes.push(props.class)\n return classes\n })\n\n // --- render helpers ---\n\n const renderFileHead = (): VNode =>\n h('div', { class: 'file-head' }, [h('h3', { class: 'tit' }, props.title), h('div', null, [h('p', null, props.description)])])\n\n const renderUploadArea = (): VNode =>\n h(\n 'div',\n {\n class: 'file-upload',\n onDragover: onDragOver,\n onDragleave: onDragLeave,\n onDrop: onDrop\n },\n [\n h('p', { class: 'txt' }, props.placeholder),\n h('div', { class: 'file-upload-btn-wrap' }, [\n h('input', {\n ref: inputRef,\n type: 'file',\n name: props.name || 'myFile',\n id: inputId,\n hidden: true,\n accept: props.accept || undefined,\n multiple: props.multiple,\n onChange: onFileChange\n }),\n h('label', { for: inputId }, [\n h(\n 'button',\n {\n type: 'button',\n class: ['krds-btn', props.size],\n disabled: props.disabled || undefined,\n onClick: triggerFileSelect\n },\n [h('i', { class: 'svg-icon ico-upload' }), '파일선택']\n )\n ])\n ])\n ]\n )\n\n const renderBtnWrap = (file: FileInfo): VNode[] => {\n const children: VNode[] = []\n\n if (file.status === 'uploading') {\n children.push(h('span', { class: 'krds-spinner', role: 'status' }, [h('span', { class: 'sr-only' }, '업로드 중')]))\n } else if (file.downloadUrl) {\n if (props.showDownload) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n onClick: () => emit('download', file)\n },\n ['다운로드 ', h('i', { class: 'svg-icon ico-down' })]\n )\n )\n }\n if (props.showPreviewButton) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n onClick: () => emit('preview', file)\n },\n ['바로보기 ', h('i', { class: 'svg-icon ico-angle right' })]\n )\n )\n }\n } else if (file.status === 'completed') {\n children.push(h('span', { class: 'ico-invalid complete' }, [h('em', { class: 'sr-only' }, '업로드 완료')]))\n } else if (!props.readonly) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n disabled: props.disabled || undefined,\n onClick: () => removeFile(file.id)\n },\n ['삭제 ', h('i', { class: 'svg-icon ico-delete-fill' })]\n )\n )\n }\n\n return children\n }\n\n const renderFileItem = (file: FileInfo): VNode => {\n const liChildren: VNode[] = [\n h(\n 'div',\n {\n class: file.downloadUrl ? 'file-info m-column' : 'file-info'\n },\n [h('div', { class: 'file-name' }, formatFileName(file)), h('div', { class: 'btn-wrap' }, renderBtnWrap(file))]\n )\n ]\n\n if (file.status === 'error' && file.errorMessage) {\n const parts = file.errorMessage.split('\\n')\n const hintContent: (string | VNode)[] = []\n parts.forEach((part, i) => {\n if (i > 0) hintContent.push(h('br'))\n hintContent.push(part)\n })\n liChildren.push(h('p', { class: 'file-hint-invalid' }, hintContent))\n }\n\n return h(\n 'li',\n {\n key: file.id,\n class: file.status === 'error' ? 'is-error' : undefined\n },\n liChildren\n )\n }\n\n const renderFileList = (files: FileInfo[]): VNode => {\n const validCount = files.filter(f => f.status !== 'error').length\n const children: VNode[] = [\n h('div', { class: 'total' }, [h('span', { class: 'current' }, `${validCount}개`), ` / ${props.maxFiles}개`]),\n h('ul', { class: 'upload-list' }, files.map(renderFileItem))\n ]\n\n if (props.showClearAll && !props.readonly) {\n children.push(\n h('div', { class: 'upload-delete-btn' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn xsmall tertiary',\n disabled: props.disabled || undefined,\n onClick: clearAll\n },\n ['전체 파일 삭제', h('i', { class: 'svg-icon ico-angle right' })]\n )\n ])\n )\n }\n\n return h('div', { class: 'file-list' }, children)\n }\n\n // --- main render ---\n\n return () => {\n const children: VNode[] = [renderFileHead()]\n\n if (!props.readonly) {\n children.push(renderUploadArea())\n }\n\n const files = props.modelValue || []\n if (files.length > 0) {\n children.push(renderFileList(files))\n }\n\n return h(\n 'div',\n {\n class: rootClasses.value,\n style: props.style || undefined\n },\n children\n )\n }\n }\n})\n","import KrdsFileUpload from './KrdsFileUpload'\nimport type { KrdsFileUploadProps, KrdsFileUploadEmits, FileInfo } from './KrdsFileUpload'\n\nexport { KrdsFileUpload }\nexport type { KrdsFileUploadProps, KrdsFileUploadEmits, FileInfo }\nexport default KrdsFileUpload\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({\n name: 'KrdsBadge',\n props: {\n /** 배지 타입 */\n type: {\n type: String as () => 'outline' | 'bg' | 'bg-light',\n default: 'outline'\n },\n /** 배지 컬러 */\n color: {\n type: String as () => ColorVariant,\n default: 'primary'\n },\n /** 배지 크기 */\n size: {\n type: String as () => Size,\n default: 'large'\n },\n /** 넘버 여부 */\n number: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Badge 컴포넌트\n */\n\nimport KrdsBadge from './KrdsBadge'\nimport type { KrdsBadgeProps, KrdsBadgeEmits } from './KrdsBadge'\n\nexport { KrdsBadge }\nexport type { KrdsBadgeProps, KrdsBadgeEmits }\nexport default KrdsBadge\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({\n name: 'KrdsTag',\n props: {\n /** 링크 태그 여부 */\n link: {\n type: Boolean,\n default: false\n },\n /** 링크 URL (link가 true일 때 사용) */\n href: {\n type: String,\n default: '#'\n },\n /** 링크 타겟 (link가 true일 때 사용) */\n target: {\n type: String,\n default: undefined\n },\n /** 링크 관계 (link가 true일 때 사용) */\n rel: {\n type: String,\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n remove: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Tag 컴포넌트\n */\n\nimport KrdsTag from './KrdsTag'\nimport type { KrdsTagProps, KrdsTagEmits } from './KrdsTag'\n\nexport { KrdsTag }\nexport type { KrdsTagProps, KrdsTagEmits }\nexport default KrdsTag\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({\n name: 'KrdsTagGroup',\n props: {\n /** 태그 그룹 크기 */\n size: {\n type: String as () => KrdsTagGroupSize,\n default: 'medium'\n },\n /** CSS 클래스 */\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","/**\n * KRDS TagGroup 컴포넌트\n */\n\nimport KrdsTagGroup from './KrdsTagGroup'\nimport type { KrdsTagGroupProps, KrdsTagGroupSize } from './KrdsTagGroup'\n\nexport { KrdsTagGroup }\nexport type { KrdsTagGroupProps, KrdsTagGroupSize }\nexport default KrdsTagGroup\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({\n name: 'KrdsMasthead',\n props: {\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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 Masthead 컴포넌트\n */\n\nimport KrdsMasthead from './KrdsMasthead'\nimport type { KrdsMastheadProps, KrdsMastheadEmits } from './KrdsMasthead'\n\nexport { KrdsMasthead }\nexport type { KrdsMastheadProps, KrdsMastheadEmits }\nexport default KrdsMasthead\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, useId } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { 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({\n name: 'KrdsToggleSwitch',\n props: {\n /** 모델 값 */\n modelValue: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 스위치 라벨 */\n label: {\n type: String,\n default: undefined\n },\n /** 크기 */\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true,\n change: (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, attrs }) {\n const generatedInputId = `toggle-switch-${useId()}`\n\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 || generatedInputId\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","/**\n * KRDS ToggleSwitch 컴포넌트\n */\n\nimport KrdsToggleSwitch from './KrdsToggleSwitch'\nimport type { KrdsToggleSwitchProps, KrdsToggleSwitchEmits } from './KrdsToggleSwitch'\n\nexport { KrdsToggleSwitch }\nexport type { KrdsToggleSwitchProps, KrdsToggleSwitchEmits }\nexport default KrdsToggleSwitch\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({\n name: 'KrdsCheckArea',\n props: {\n /** 추가 클래스 */\n class: {\n type: String,\n default: undefined\n },\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","/**\n * KRDS CheckArea 컴포넌트\n */\n\nimport KrdsCheckArea from './KrdsCheckArea'\nimport type { KrdsCheckAreaProps } from './KrdsCheckArea'\n\nexport { KrdsCheckArea }\nexport type { KrdsCheckAreaProps }\nexport default KrdsCheckArea\n","import { defineComponent, computed, h, SlotsType, useId, type VNode } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { 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({\n name: 'KrdsCheckbox',\n props: {\n /** 모델 값 */\n modelValue: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 크기 */\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n /** Chip 스타일 여부 */\n chip: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n default?: () => VNode[] // Default slot with props\n description?: () => VNode[] // Description slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n const generatedInputId = `checkbox-${useId()}`\n\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 || generatedInputId\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 Checkbox 컴포넌트\n */\n\nimport KrdsCheckbox from './KrdsCheckbox'\nimport type { KrdsCheckboxProps, KrdsCheckboxEmits } from './KrdsCheckbox'\n\nexport { KrdsCheckbox }\nexport type { KrdsCheckboxProps, KrdsCheckboxEmits }\nexport default KrdsCheckbox\n","import { defineComponent, computed, h, SlotsType, useId, type VNode } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { 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({\n name: 'KrdsRadio',\n props: {\n /** 모델 값 */\n modelValue: {\n type: [String, Number, Boolean],\n default: undefined\n },\n /** 라디오 값 */\n value: {\n type: [String, Number, Boolean],\n required: true\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 크기 */\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n /** Chip 스타일 여부 */\n chip: {\n type: Boolean,\n default: false\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string | number | boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n default?: () => VNode[] // Default slot with props\n description?: () => VNode[] // Named slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n const generatedInputId = `radio-${useId()}`\n\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 || generatedInputId\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 KrdsRadio from './KrdsRadio'\nimport type { KrdsRadioProps, KrdsRadioEmits } from './KrdsRadio'\n\nexport { KrdsRadio }\nexport type { KrdsRadioProps, KrdsRadioEmits }\nexport default KrdsRadio\n","/**\n * KRDS Spinner 컴포넌트\n */\n\nimport KrdsSpinner from './KrdsSpinner'\n\nexport { KrdsSpinner }\nexport default KrdsSpinner\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({\n name: 'KrdsStepIndicator',\n props: {\n /** 현재 활성 단계 인덱스 (0부터 시작) - v-model */\n modelValue: {\n type: Number,\n default: 0\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS StepIndicator 컴포넌트\n */\n\nimport KrdsStepIndicator from './KrdsStepIndicator'\nimport type { KrdsStepIndicatorProps, KrdsStepIndicatorEmits } from './KrdsStepIndicator'\n\nexport { KrdsStepIndicator }\nexport type { KrdsStepIndicatorProps, KrdsStepIndicatorEmits }\nexport default KrdsStepIndicator\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({\n name: 'KrdsStep',\n props: {\n /** 단계 번호 */\n step: {\n type: [String, Number],\n required: true\n },\n /** 단계 제목 */\n title: {\n type: String,\n required: true\n },\n /** 단계 상태 강제 설정 (선택적) */\n status: {\n type: String as () => 'done' | 'active' | 'pending',\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent, step: string | number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Step 컴포넌트\n */\n\nimport KrdsStep from './KrdsStep'\nimport type { KrdsStepProps, KrdsStepEmits } from './KrdsStep'\n\nexport { KrdsStep }\nexport type { KrdsStepProps, KrdsStepEmits }\nexport default KrdsStep\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","/**\n * KRDS SkipLink 컴포넌트\n */\n\nimport KrdsSkipLink from './KrdsSkipLink'\nimport type { KrdsSkipLinkProps } from './KrdsSkipLink'\n\nexport { KrdsSkipLink }\nexport type { KrdsSkipLinkProps }\nexport default KrdsSkipLink\n","import { defineComponent, h } from 'vue'\nimport type { PropType } from 'vue'\n\n/**\n * 브레드크럼 아이템 인터페이스\n */\nexport interface BreadcrumbItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * KRDS Breadcrumb 컴포넌트 속성\n */\nexport 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 */\nexport interface KrdsBreadcrumbEmits {\n (e: 'item-click', item: BreadcrumbItem, event: MouseEvent): void\n}\n\nexport default defineComponent({\n name: 'KrdsBreadcrumb',\n props: {\n /** 브레드크럼 아이템 배열 */\n items: {\n type: Array as PropType<BreadcrumbItem[]>,\n required: true\n },\n /** 엘리먼트 ID */\n id: {\n type: String,\n default: undefined\n },\n /** 접근성 라벨 */\n ariaLabel: {\n type: String,\n default: '현재 경로'\n },\n /** 홈 아이콘 표시 여부 */\n showHomeIcon: {\n type: Boolean,\n default: true\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'item-click': (item: BreadcrumbItem, event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n /**\n * 현재 페이지 여부 확인\n */\n const isCurrentPage = (index: number) => index === props.items.length - 1\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\n return () =>\n h('nav', { id: props.id, class: 'krds-breadcrumb-wrap', 'aria-label': props.ariaLabel }, [\n h(\n 'ol',\n { class: 'breadcrumb' },\n props.items.map((item, index) => {\n const isHome = index === 0 && props.showHomeIcon\n\n return h('li', { key: `breadcrumb-${index}`, class: { home: isHome } }, [\n h(\n 'a',\n {\n href: item.href || '#',\n class: 'txt',\n 'aria-current': isCurrentPage(index) ? 'page' : undefined,\n onClick: (event: MouseEvent) => handleClick(item, event)\n },\n [h('span', null, item.text)]\n )\n ])\n })\n )\n ])\n }\n})\n","/**\n * KRDS Breadcrumb 컴포넌트\n */\n\nimport KrdsBreadcrumb from './KrdsBreadcrumb'\nimport type { KrdsBreadcrumbProps, KrdsBreadcrumbEmits, BreadcrumbItem } from './KrdsBreadcrumb'\n\nexport { KrdsBreadcrumb }\nexport type { KrdsBreadcrumbProps, KrdsBreadcrumbEmits, BreadcrumbItem }\nexport default KrdsBreadcrumb\n","import { defineComponent, computed, h, ref, onMounted, onUnmounted, SlotsType, type VNode } 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({\n name: 'KrdsInPageNavigation',\n props: {\n /** 네비게이션 제목 */\n title: {\n type: String,\n default: undefined\n },\n /** 네비게이션 캡션 */\n caption: {\n type: String,\n default: '이 페이지의 구성'\n },\n /** 네비게이션 아이템 목록 */\n items: {\n type: Array as () => NavigationItem[],\n default: () => []\n },\n /** 스크롤에 따른 자동 활성화 여부 */\n autoActive: {\n type: Boolean,\n default: true\n },\n /** 헤더 상단 영역 선택자 (기본값: '#krds-masthead') */\n headerTopSelector: {\n type: String,\n default: '#krds-masthead'\n },\n /** 헤더 내부 영역 선택자 (기본값: '#krds-header .header-in') */\n headerInnerSelector: {\n type: String,\n default: '#krds-header .header-in'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n itemClick: (item: NavigationItem, event: MouseEvent | KeyboardEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n action?: () => VNode[] // 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","/**\n * KRDS InPageNavigation 컴포넌트\n */\n\nimport KrdsInPageNavigation from './KrdsInPageNavigation'\nimport type { KrdsInPageNavigationProps, KrdsInPageNavigationEmits, NavigationItem } from './KrdsInPageNavigation'\n\nexport { KrdsInPageNavigation }\nexport type { KrdsInPageNavigationProps, KrdsInPageNavigationEmits, NavigationItem }\nexport default KrdsInPageNavigation\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","/**\n * KRDS Vue 디렉티브\n */\n\nimport type { App } from 'vue'\nimport { vSrOnly } from './vSrOnly'\n\n/**\n * 디렉티브 설치 함수\n */\nexport const installDirectives = (app: App) => {\n app.directive('sr-only', vSrOnly)\n}\n\nexport { vSrOnly }\n","import { computed, defineComponent, h, withDirectives } from 'vue'\nimport { vSrOnly } from '@/directives'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 페이지 아이템 타입\n */\ninterface PageItem {\n type: 'page' | 'ellipsis'\n key: string\n page?: number\n href?: string\n}\n\n/** 프롭 기본값 — props 선언과 setup 양쪽에서 공유한다 */\nconst DEFAULT_MIN = 1\nconst DEFAULT_PAGE_RANGE = 8\n\n/**\n * KRDS Pagination 컴포넌트 속성\n */\nexport 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 */\nexport interface KrdsPaginationEmits {\n /** v-model 업데이트 이벤트 */\n (e: 'update:modelValue', value: number): void\n}\n\nexport default defineComponent({\n name: 'KrdsPagination',\n props: {\n /** 현재 페이지 번호 (v-model) */\n modelValue: {\n type: Number,\n default: 1\n },\n /** 최소 페이지 번호 (기본값: 1, 최소값: 1) */\n min: {\n type: Number,\n default: DEFAULT_MIN\n },\n /** 최대 페이지 번호 (전체 페이지 수) */\n max: {\n type: Number,\n required: true\n },\n /** 엘리먼트 ID */\n id: {\n type: String,\n default: undefined\n },\n /** 접근성 라벨 */\n ariaLabel: {\n type: String,\n default: '페이지 내비게이션'\n },\n /** 표시할 페이지 범위 */\n pageRange: {\n type: Number,\n default: DEFAULT_PAGE_RANGE\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 최소 페이지 번호 (1보다 작을 수 없음)\n */\n const minPage = computed(() => Math.max(1, props.min ?? DEFAULT_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 { max: totalPages } = props\n const pageRange = props.pageRange ?? DEFAULT_PAGE_RANGE\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 })\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 })\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\n /**\n * 페이지 링크 / 생략 표시 렌더링\n */\n const renderPageItem = (item: PageItem) => {\n if (item.type === 'page') {\n const isCurrent = item.page === currentPage.value\n\n return h(\n 'a',\n {\n key: item.key,\n href: item.href || '#',\n class: ['page-link', { active: isCurrent }],\n 'aria-current': isCurrent ? 'page' : undefined,\n onClick: (event: MouseEvent) => handlePageClick(item.page!, event)\n },\n [isCurrent ? withDirectives(h('span', null, '현재페이지'), [[vSrOnly]]) : null, ` ${item.page} `]\n )\n }\n\n return h('span', {\n key: item.key,\n class: 'page-link link-dot'\n })\n }\n\n return () =>\n h('div', { id: props.id, class: 'krds-pagination' }, [\n // 이전 버튼\n h(\n prevDisabled.value ? 'span' : 'a',\n {\n href: prevDisabled.value ? undefined : prevHref.value,\n class: ['page-navi', 'prev', { disabled: prevDisabled.value }],\n onClick: handlePrevClick\n },\n '이전'\n ),\n\n // 페이지 링크\n h('div', { class: 'page-links' }, displayedPages.value.map(renderPageItem)),\n\n // 다음 버튼\n h(\n nextDisabled.value ? 'span' : 'a',\n {\n href: nextDisabled.value ? undefined : nextHref.value,\n class: ['page-navi', 'next', { disabled: nextDisabled.value }],\n onClick: handleNextClick\n },\n '다음'\n )\n ])\n }\n})\n","/**\n * KRDS Pagination 컴포넌트\n */\n\nimport KrdsPagination from './KrdsPagination'\nimport type { KrdsPaginationProps, KrdsPaginationEmits } from './KrdsPagination'\n\nexport { KrdsPagination }\nexport type { KrdsPaginationProps, KrdsPaginationEmits }\nexport default KrdsPagination\n","import { computed, defineComponent, h } from 'vue'\n\n/**\n * KRDS Panel 컴포넌트 속성\n */\nexport interface KrdsPanelProps {\n /** 도움말 패널 펼침 상태 (v-model) */\n modelValue?: boolean\n}\n\n/**\n * KRDS Panel 컴포넌트 이벤트\n */\nexport interface KrdsPanelEmits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nexport default defineComponent({\n name: 'KrdsPanel',\n props: {\n /** 도움말 패널 펼침 상태 (v-model) */\n modelValue: {\n type: Boolean,\n default: false\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\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\n return () =>\n h('div', { class: 'inner help-panel-flexible' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn small tertiary btn-help-panel expand btn-help-exec',\n onClick: handleOpen\n },\n [h('i', { class: 'svg-icon ico-fold' }), ' 도움말']\n ),\n h('div', { class: ['krds-help-panel', { expand: open.value }] }, [\n h('div', { class: 'help-panel-wrap' }, [\n h('div', { class: 'help-conts-area' }, [\n slots.default?.(),\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn small tertiary btn-help-panel fold',\n onClick: handleClose\n },\n [h('span', { class: 'sr-only' }, '도움말'), ' 접어두기 ', h('i', { class: 'svg-icon ico-angle right' })]\n )\n ])\n ])\n ])\n ])\n }\n})\n","/**\n * KRDS Panel 컴포넌트\n */\n\nimport KrdsPanel from './KrdsPanel'\nimport type { KrdsPanelProps, KrdsPanelEmits } from './KrdsPanel'\n\nexport { KrdsPanel }\nexport type { KrdsPanelProps, KrdsPanelEmits }\nexport default KrdsPanel\n","import { defineComponent, h, onMounted, onUnmounted, ref } from 'vue'\nimport type { PropType } from 'vue'\n\ntype ContextualHelpPosition = 'top left' | 'top center' | 'top right' | 'bottom left' | 'bottom center' | 'bottom right'\n\n/**\n * KRDS ContextualHelp 컴포넌트 속성\n */\nexport interface KrdsContextualHelpProps {\n /** 툴팁 제목 */\n tooltipTitle?: string\n /** 도움말 아이콘 사용 여부 (false 면 툴팁 아이콘) */\n helpIcon?: boolean\n /** 툴팁 노출 위치 */\n position?: ContextualHelpPosition\n}\n\nexport default defineComponent({\n name: 'KrdsContextualHelp',\n props: {\n /** 툴팁 제목 */\n tooltipTitle: {\n type: String,\n default: '도움말 제목'\n },\n /** 도움말 아이콘 사용 여부 (false 면 툴팁 아이콘) */\n helpIcon: {\n type: Boolean,\n default: false\n },\n /** 툴팁 노출 위치 */\n position: {\n type: String as PropType<ContextualHelpPosition>,\n default: 'top left'\n }\n },\n setup(props, { slots }) {\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\n return () =>\n h('div', { ref: containerRef, class: ['krds-contextual-help', props.position] }, [\n h('div', { class: 'tooltip-action' }, [\n h(\n 'button',\n {\n ref: tooltipBtnRef,\n type: 'button',\n class: 'krds-btn medium icon tooltip-btn',\n onClick: toggleTooltip\n },\n [\n h('span', { class: 'sr-only' }, '도움말'),\n props.helpIcon ? h('i', { class: 'svg-icon ico-help' }) : h('i', { class: 'svg-icon ico-tooltip' })\n ]\n ),\n h('div', { ref: tooltipPopoverRef, class: 'tooltip-popover', role: 'tooltip' }, [\n h('h4', { class: 'tooltip-title' }, props.tooltipTitle),\n h('div', { class: 'tooltip-contents' }, slots.default?.()),\n h(\n 'button',\n {\n ref: closeBtnRef,\n type: 'button',\n class: 'krds-btn xsmall icon tooltip-close',\n onClick: closeTooltip\n },\n [h('span', { class: 'sr-only' }, '닫기'), h('i', { class: 'svg-icon ico-modal-close' })]\n )\n ])\n ])\n ])\n }\n})\n","/**\n * KRDS ContextualHelp 컴포넌트\n */\n\nimport KrdsContextualHelp from './KrdsContextualHelp'\nimport type { KrdsContextualHelpProps } from './KrdsContextualHelp'\n\nexport { KrdsContextualHelp }\nexport type { KrdsContextualHelpProps }\nexport default KrdsContextualHelp\n","import { computed, defineComponent, h } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\ntype StepsData = { id: number; title: string; description: string }\n\n/**\n * KRDS CoachMark 컴포넌트 속성\n */\nexport interface KrdsCoachMarkProps extends BaseComponentProps {\n /** 코치마크 래퍼에 추가할 클래스 */\n coachMarkClass?: string | string[]\n /** 전체 단계 데이터 */\n stepsData: StepsData[]\n /** 이 코치마크가 담당하는 단계 번호 */\n activeStep: number\n /** 현재 노출 중인 단계 (v-model) */\n modelValue?: number | null\n}\n\n/**\n * KRDS CoachMark 컴포넌트 이벤트\n */\nexport interface KrdsCoachMarkEmits {\n (e: 'update:modelValue', value: number | null): void\n (e: 'close'): void\n}\n\nexport default defineComponent({\n name: 'KrdsCoachMark',\n props: {\n /** 코치마크 래퍼에 추가할 클래스 */\n coachMarkClass: {\n type: [String, Array] as PropType<string | string[]>,\n default: ''\n },\n /** 전체 단계 데이터 */\n stepsData: {\n type: Array as () => StepsData[],\n required: true\n },\n /** 이 코치마크가 담당하는 단계 번호 */\n activeStep: {\n type: Number,\n required: true\n },\n /** 현재 노출 중인 단계 (v-model) */\n modelValue: {\n type: Number,\n default: null\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object] as PropType<string | Record<string, string | number>>,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: number | null) => true,\n close: () => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\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 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\n const renderBalloon = () => {\n const step = currentStepData.value\n if (props.modelValue !== props.activeStep || !step) {\n return null\n }\n\n return h('div', { class: 'coach-balloon' }, [\n h('h5', { class: 'sr-only' }, '따라하기 가이드'),\n h('h6', { class: 'coach-tit' }, `${props.activeStep}단계 : ${step.title}`),\n h('p', { class: 'desc' }, step.description),\n h('div', { class: 'coach-controls' }, [\n h('div', { class: 'num' }, [\n h('span', { class: 'sr-only' }, '현재 단계'),\n h('strong', null, String(props.activeStep)),\n h('span', { class: 'sr-only' }, '총 단계'),\n h('span', null, String(props.stepsData.length))\n ]),\n h('div', { class: 'btn-wrap' }, [\n h('button', { type: 'button', class: 'krds-btn small text', onClick: closeCoachMark }, '그만보기'),\n props.activeStep !== 1 ? h('button', { type: 'button', class: 'krds-btn small text', onClick: prevStep }, '이전으로') : null,\n props.activeStep !== props.stepsData.length\n ? h('button', { type: 'button', class: 'krds-btn small tertiary', onClick: nextStep }, '다음으로')\n : null\n ])\n ])\n ])\n }\n\n return () =>\n h('div', { class: ['krds-coach-mark', props.coachMarkClass], style: props.style }, [renderBalloon(), slots['coach-mark-content']?.()])\n }\n})\n","/**\n * KRDS KrdsCoachMark 컴포넌트\n */\n\nimport KrdsCoachMark from './KrdsCoachMark'\nimport type { KrdsCoachMarkProps, KrdsCoachMarkEmits } from './KrdsCoachMark'\n\nexport { KrdsCoachMark }\nexport type { KrdsCoachMarkProps, KrdsCoachMarkEmits }\nexport default KrdsCoachMark\n","import { computed, defineComponent, h, nextTick, onMounted, onUnmounted, ref, useId, vShow, withDirectives } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\ntype TooltipType = 'default' | 'icon' | 'button'\n\n/**\n * KRDS Tooltip 컴포넌트 속성\n */\nexport interface KrdsTooltipProps extends BaseComponentProps {\n /** 트리거 버튼 타입 */\n type?: TooltipType\n /** 툴팁 본문 */\n tooltipContent: string\n /** 세로 방향 배치 여부 */\n vertical?: boolean\n /** 박스형 여부 */\n box?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\nexport default defineComponent({\n name: 'KrdsTooltip',\n props: {\n /** 트리거 버튼 타입 */\n type: {\n type: String as PropType<TooltipType>,\n default: 'default'\n },\n /** 툴팁 본문 */\n tooltipContent: {\n type: String,\n required: true\n },\n /** 세로 방향 배치 여부 */\n vertical: {\n type: Boolean,\n default: false\n },\n /** 박스형 여부 */\n box: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n }\n },\n setup(props, { slots }) {\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 = `tooltip-popover-${useId()}`\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\n return () =>\n h('div', { ref: containerRef }, [\n h(\n 'button',\n {\n type: 'button',\n class: tooltipClasses.value,\n disabled: props.disabled,\n 'aria-labelledby': popoverId,\n onMouseover: showTooltip,\n onMouseout: hideTooltip,\n onFocusin: showTooltip,\n onFocusout: hideTooltip\n },\n slots.default?.()\n ),\n withDirectives(\n h(\n 'div',\n {\n id: popoverId,\n ref: popoverRef,\n class: ['krds-tooltip-popover', popoverClasses.value],\n style: popoverStyle.value,\n 'aria-hidden': !isTooltipVisible.value,\n role: 'tooltip'\n },\n [h('span', { class: 'sr-only' }, buttonText.value), ' ', props.tooltipContent]\n ),\n [[vShow, isTooltipVisible.value]]\n )\n ])\n }\n})\n","/**\n * KRDS Tooltip 컴포넌트\n */\n\nimport KrdsTooltip from './KrdsTooltip'\nimport type { KrdsTooltipProps } from './KrdsTooltip'\n\nexport { KrdsTooltip }\nexport type { KrdsTooltipProps }\nexport default KrdsTooltip\n","import { defineComponent, h, onUnmounted, ref, watch, withModifiers } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\nexport type LanguageData = { code: string; name: string; url?: string }\n\nexport type DropdownPosition = 'left' | 'center' | 'right'\n\n/**\n * KRDS LanguageSwitcher 컴포넌트 속성\n */\nexport interface KrdsLanguageSwitcherProps extends BaseComponentProps {\n /** 언어 목록 */\n languageList: LanguageData[]\n /** 선택된 언어 코드 (v-model) */\n modelValue?: string\n /** 동작 타입 (default: 언어 선택, external: 외부 페이지 이동) */\n type?: 'default' | 'external'\n /** 드롭다운 정렬 위치 */\n dropPosition?: DropdownPosition\n}\n\n/**\n * KRDS LanguageSwitcher 컴포넌트 이벤트\n */\nexport interface KrdsLanguageSwitcherEmits {\n (e: 'update:modelValue', value: string): void\n (e: 'close'): void\n}\n\nexport default defineComponent({\n name: 'KrdsLanguageSwitcher',\n props: {\n /** 언어 목록 */\n languageList: {\n type: Array as PropType<LanguageData[]>,\n required: true\n },\n /** 선택된 언어 코드 (v-model) */\n modelValue: {\n type: String,\n default: ''\n },\n /** 동작 타입 (default: 언어 선택, external: 외부 페이지 이동) */\n type: {\n type: String as PropType<'default' | 'external'>,\n default: 'default'\n },\n /** 드롭다운 정렬 위치 */\n dropPosition: {\n type: String as PropType<DropdownPosition>,\n default: 'center'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n close: () => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\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\n /**\n * 기본 타입 (언어 선택)\n */\n const renderDefaultList = () =>\n h(\n 'ul',\n { class: 'drop-list' },\n props.languageList.map(language =>\n h('li', { key: language.code }, [\n h(\n 'a',\n {\n href: '#',\n class: ['item-link', { active: props.modelValue === language.code }],\n lang: language.code,\n 'aria-selected': props.modelValue === language.code,\n onClick: withModifiers(() => selectLanguage(language.code), ['prevent']),\n onFocus: handleItemFocus\n },\n [language.name, ' ', h('span', { class: 'sr-only' }, props.modelValue === language.code ? '선택됨' : '')]\n )\n ])\n )\n )\n\n /**\n * 외부 페이지 이동 타입\n */\n const renderExternalList = () =>\n h(\n 'ul',\n { class: 'drop-list' },\n props.languageList.map(language =>\n h('li', { key: language.code }, [\n h(\n 'a',\n {\n href: language.url || '#',\n class: 'item-link',\n lang: language.code,\n target: '_blank',\n title: '새 창 열림',\n onFocus: handleItemFocus\n },\n [language.name, ' ', h('i', { class: 'svg-icon ico-go' })]\n )\n ])\n )\n )\n\n return () =>\n h(\n 'div',\n {\n ref: dropdownRef,\n class: [\n 'krds-drop-wrap',\n 'krds-language',\n {\n active: isOpen.value,\n 'drop-left': props.dropPosition === 'left',\n 'drop-right': props.dropPosition === 'right'\n }\n ],\n onFocusout: handleFocusOut\n },\n [\n h(\n 'button',\n {\n ref: buttonRef,\n type: 'button',\n class: ['krds-btn small text drop-btn', { active: isOpen.value }],\n 'aria-expanded': isOpen.value,\n onClick: toggleDropdown\n },\n [h('i', { class: 'svg-icon ico-global' }), slots.default?.(), h('i', { class: 'svg-icon ico-toggle' })]\n ),\n h('div', { class: 'drop-menu', style: { display: isOpen.value ? 'block' : 'none' } }, [\n h('div', { class: 'drop-in' }, [\n slots['prev-item'] ? h('div', { class: 'drop-top' }, slots['prev-item']()) : null,\n props.type === 'default' ? renderDefaultList() : props.type === 'external' ? renderExternalList() : null\n ])\n ])\n ]\n )\n }\n})\n","/**\n * KRDS LanguageSwitcher 컴포넌트\n */\n\nimport KrdsLanguageSwitcher from './KrdsLanguageSwitcher'\nimport type { KrdsLanguageSwitcherProps, KrdsLanguageSwitcherEmits, DropdownPosition } from './KrdsLanguageSwitcher'\n\nexport { KrdsLanguageSwitcher }\nexport type { KrdsLanguageSwitcherProps, KrdsLanguageSwitcherEmits, DropdownPosition }\nexport default KrdsLanguageSwitcher\n","import { defineComponent, h, onUnmounted, ref, watch, withModifiers } from 'vue'\n\n/**\n * KRDS Resize 컴포넌트 이벤트\n */\nexport interface KrdsResizeEmits {\n (e: 'update:modelValue', value: string): void\n (e: 'close'): void\n}\n\ninterface ScaleProps {\n key: 'sm' | 'md' | 'lg' | 'xlg' | 'xxlg'\n label: string\n zoom: string\n}\n\nexport default defineComponent({\n name: 'KrdsResize',\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n close: () => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(_props, { emit }) {\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\n return () =>\n h(\n 'div',\n {\n ref: dropdownRef,\n class: 'krds-drop-wrap krds-resize',\n 'data-adjust': 'scale',\n onFocusout: handleFocusOut\n },\n [\n h(\n 'button',\n {\n ref: buttonRef,\n type: 'button',\n class: 'krds-btn small text drop-btn',\n onClick: toggleDropdown\n },\n ['화면크기 ', h('i', { class: 'svg-icon ico-toggle' })]\n ),\n h('div', { class: 'drop-menu', style: { display: isOpen.value ? 'block' : 'none' } }, [\n h('div', { class: 'drop-in' }, [\n h(\n 'ul',\n { class: 'drop-list' },\n scaleList.map(scale =>\n h('li', { key: scale.key }, [\n h(\n 'button',\n {\n type: 'button',\n class: ['item-link', scale.key, scale.key === selectedSize.value ? 'active' : ''],\n 'data-adjust-scale': scale.key,\n onClick: withModifiers(() => selectSize(scale), ['prevent']),\n onFocus: handleItemFocus\n },\n scale.label\n )\n ])\n )\n ),\n h('div', { class: 'drop-bottom' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n 'data-adjust-scale': 'md',\n onClick: withModifiers(resetSize, ['prevent']),\n onFocus: handleItemFocus\n },\n [h('i', { class: 'svg-icon ico-reset' }), ' 초기화']\n )\n ])\n ])\n ])\n ]\n )\n }\n})\n","/**\n * KRDS Resize 컴포넌트\n */\n\nimport KrdsResize from './KrdsResize'\nimport type { KrdsResizeEmits } from './KrdsResize'\n\nexport { KrdsResize }\nexport type { KrdsResizeEmits }\nexport default KrdsResize\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 /** 모달 표시 여부 (v-model) */\n modelValue: {\n type: Boolean,\n default: false\n },\n /** 모달 엘리먼트 ID */\n modalId: {\n type: String,\n default: undefined\n },\n /** 배경 딤(backdrop) 표시 여부 */\n backdrop: {\n type: Boolean,\n default: true\n },\n /** 모달 크기 */\n size: {\n type: String as () => KrdsModalSize,\n default: 'medium'\n },\n /** 전체 화면 모달 여부 */\n full: {\n type: Boolean,\n default: false\n },\n /** 하단 시트형 모달 여부 */\n bottomSheet: {\n type: Boolean,\n default: false\n },\n /** 배경 클릭·Esc 키로 닫히지 않는 지속형 모달 여부 */\n persistent: {\n type: Boolean,\n default: false\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n /* eslint-disable @typescript-eslint/no-explicit-any -- Vue SlotsType requires `any` for h() children compatibility */\n slots: Object as SlotsType<{\n title?: () => any\n default?: () => any\n footer?: () => any\n }>,\n /* eslint-enable @typescript-eslint/no-explicit-any */\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, string | boolean | undefined> = {\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 KrdsModal from './KrdsModal'\nexport { KrdsModal }\nexport default KrdsModal\nexport type { KrdsModalProps, KrdsModalSize } from './KrdsModal'\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({\n name: 'KrdsAccordionGroup',\n props: {\n /** 라인 타입 아코디언 여부 */\n typeLine: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\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","/**\n * KRDS AccordionGroup 컴포넌트\n */\n\nimport KrdsAccordionGroup from './KrdsAccordionGroup'\nimport type { KrdsAccordionGroupProps } from './KrdsAccordionGroup'\n\nexport { KrdsAccordionGroup }\nexport type { KrdsAccordionGroupProps }\nexport default KrdsAccordionGroup\n","import { computed, defineComponent, h } from 'vue'\n\n/**\n * KRDS AccordionItem 컴포넌트 속성\n */\nexport interface KrdsAccordionItemProps {\n /** 아이템 고유 식별자 */\n id: string\n /** 현재 열려 있는 아이템의 id */\n openItem?: string\n /** 헤더 텍스트 (title 슬롯으로 대체 가능) */\n title?: string\n /** 본문 텍스트 (content 슬롯으로 대체 가능) */\n content?: string\n}\n\n/**\n * KRDS AccordionItem 컴포넌트 이벤트\n */\nexport interface KrdsAccordionItemEmits {\n (e: 'toggle', id: string): void\n}\n\nexport default defineComponent({\n name: 'KrdsAccordionItem',\n props: {\n /** 아이템 고유 식별자 */\n id: {\n type: String,\n required: true\n },\n /** 현재 열려 있는 아이템의 id */\n openItem: {\n type: String,\n default: undefined\n },\n /** 헤더 텍스트 (title 슬롯으로 대체 가능) */\n title: {\n type: String,\n default: undefined\n },\n /** 본문 텍스트 (content 슬롯으로 대체 가능) */\n content: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n toggle: (id: string) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n const isOpen = computed(() => props.openItem === props.id)\n\n const openToggle = (): void => {\n emit('toggle', props.id)\n }\n\n return () =>\n h('div', { id: props.id, class: ['accordion-item', { active: isOpen.value }] }, [\n h('h5', { class: 'accordion-header' }, [\n h(\n 'button',\n {\n id: `accordion-header-${props.id}`,\n type: 'button',\n class: ['btn-accordion', { active: isOpen.value }],\n 'aria-expanded': isOpen.value,\n 'aria-controls': `accordion-collapse-${props.id}`,\n onClick: openToggle\n },\n slots.title?.() ?? props.title\n )\n ]),\n h(\n 'div',\n {\n id: `accordion-collapse-${props.id}`,\n class: 'accordion-collapse collapse',\n role: 'region',\n 'aria-labelledby': `accordion-header-${props.id}`\n },\n [h('div', { class: 'accordion-body' }, slots.content?.() ?? props.content)]\n )\n ])\n }\n})\n","/**\n * KRDS AccordionItem 컴포넌트\n */\n\nimport KrdsAccordionItem from './KrdsAccordionItem'\nimport type { KrdsAccordionItemProps, KrdsAccordionItemEmits } from './KrdsAccordionItem'\n\nexport { KrdsAccordionItem }\nexport type { KrdsAccordionItemProps, KrdsAccordionItemEmits }\nexport default KrdsAccordionItem\n","import { defineComponent, ref, computed, h, onBeforeUnmount } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * TTS 사이즈 타입\n */\nexport type TtsSize = 'xsmall' | 'small' | 'medium'\n\n/**\n * TTS 아이콘 타입\n */\nexport type TtsIcon = 'volume' | 'play'\n\n/**\n * KRDS TTS 컴포넌트 속성\n */\nexport interface KrdsTtsProps extends BaseComponentProps {\n /** 읽어줄 텍스트 */\n text: string\n /** 레이블 텍스트 (미지정 시 아이콘만 표시) */\n label?: string\n /** 버튼 크기 */\n size?: TtsSize\n /** 아이콘 타입 */\n icon?: TtsIcon\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * KRDS TTS 컴포넌트 이벤트\n */\nexport interface KrdsTtsEmits {\n (e: 'play', text: string): void\n (e: 'pause'): void\n (e: 'end'): void\n (e: 'error', error: Error): void\n}\n\nexport default defineComponent({\n name: 'KrdsTts',\n props: {\n /** 읽어줄 텍스트 */\n text: {\n type: String,\n required: true\n },\n /** 레이블 텍스트 (미지정 시 아이콘만 표시) */\n label: {\n type: String,\n default: undefined\n },\n /** 버튼 크기 */\n size: {\n type: String as () => TtsSize,\n default: 'medium'\n },\n /** 아이콘 타입 */\n icon: {\n type: String as () => TtsIcon,\n default: 'volume'\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n play: (text: string) => true,\n pause: () => true,\n end: () => true,\n error: (error: Error) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n const isPlaying = ref(false)\n let utterance: SpeechSynthesisUtterance | null = null\n\n const stopSpeech = () => {\n if (typeof window !== 'undefined' && window.speechSynthesis) {\n window.speechSynthesis.cancel()\n }\n isPlaying.value = false\n utterance = null\n }\n\n const toggleTts = () => {\n if (props.disabled) return\n\n if (isPlaying.value) {\n stopSpeech()\n emit('pause')\n return\n }\n\n if (typeof window === 'undefined' || !window.speechSynthesis) {\n emit('error', new Error('SpeechSynthesis API is not supported'))\n return\n }\n\n // 기존 재생 중지\n window.speechSynthesis.cancel()\n\n utterance = new SpeechSynthesisUtterance(props.text)\n utterance.lang = 'ko-KR'\n\n utterance.onstart = () => {\n isPlaying.value = true\n }\n\n utterance.onend = () => {\n isPlaying.value = false\n utterance = null\n emit('end')\n }\n\n utterance.onerror = event => {\n isPlaying.value = false\n utterance = null\n if (event.error !== 'canceled') {\n emit('error', new Error(event.error))\n }\n }\n\n window.speechSynthesis.speak(utterance)\n emit('play', props.text)\n }\n\n const buttonClasses = computed(() => {\n const classes = ['krds-tts']\n\n if (props.size) {\n classes.push(props.size)\n }\n\n if (isPlaying.value) {\n classes.push('pause')\n } else if (props.icon === 'play') {\n classes.push('play')\n }\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n const currentIcon = computed(() => {\n if (isPlaying.value) return 'ico-stop'\n return props.icon === 'play' ? 'ico-play' : 'ico-volume'\n })\n\n onBeforeUnmount(() => {\n stopSpeech()\n })\n\n return () => {\n const children = [h('span', { class: 'krds-tts-icon', 'aria-hidden': 'true' }, [h('i', { class: `svg-icon ${currentIcon.value}` })])]\n\n if (props.label) {\n children.push(h('span', { class: 'krds-tts-text' }, props.label))\n }\n\n return h(\n 'button',\n {\n type: 'button',\n class: buttonClasses.value,\n disabled: props.disabled || undefined,\n onClick: toggleTts\n },\n children\n )\n }\n }\n})\n","/**\n * KRDS TTS 컴포넌트\n */\n\nimport KrdsTts from './KrdsTts'\nimport type { KrdsTtsProps, KrdsTtsEmits, TtsSize, TtsIcon } from './KrdsTts'\n\nexport { KrdsTts }\nexport type { KrdsTtsProps, KrdsTtsEmits, TtsSize, TtsIcon }\nexport default KrdsTts\n","import { defineComponent, h, computed, SlotsType, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * 테이블 행 데이터\n */\nexport type TableRow = Record<string, unknown>\n\n/**\n * 테이블 열 정의\n */\nexport interface TableColumn {\n /** 고유 ID - 컬럼 식별자 */\n name: string\n /** 헤더 라벨 */\n label: string\n /** 행 객체 속성명 또는 함수 */\n field: string | ((row: TableRow) => unknown)\n /** 필수 컬럼 여부 (visible-columns 사용시 항상 표시) */\n required?: boolean\n /** 정렬 */\n align?: 'left' | 'center' | 'right'\n /** body td 스타일 */\n style?: string | ((row: TableRow) => string)\n /** body td 클래스 */\n classes?: string | ((row: TableRow) => string)\n /** header th 스타일 */\n headerStyle?: string\n /** header th 클래스 */\n headerClasses?: string\n}\n\n/**\n * KRDS Table 컴포넌트 속성\n */\nexport interface KrdsTableProps extends BaseComponentProps {\n /** 테이블 캡션 */\n caption?: string\n /** 테이블 열 정의 */\n columns: TableColumn[]\n /** 테이블 행 데이터 */\n rows: TableRow[]\n}\n\n/**\n * KRDS Table 컴포넌트 이벤트\n */\nexport interface KrdsTableEmits {\n (e: 'row-click', row: TableRow, index: number): void\n}\n\nexport default defineComponent({\n name: 'KrdsTable',\n props: {\n /** 테이블 캡션 */\n caption: {\n type: String,\n default: undefined\n },\n /** 테이블 열 정의 */\n columns: {\n type: Array as () => TableColumn[],\n required: true\n },\n /** 테이블 행 데이터 */\n rows: {\n type: Array as () => TableRow[],\n required: true\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'row-click': (row: TableRow, index: number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n 'no-data'?: () => VNode[]\n }>,\n setup(props, { emit, slots }) {\n /**\n * 테이블 클래스 계산\n */\n const tableClasses = computed(() => {\n const classes = ['tbl']\n\n // 사용자 정의 클래스 (원본 HTML: \"tbl col data\")\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 컨테이너 클래스 계산\n */\n const wrapperClasses = computed(() => {\n return ['krds-table-wrap']\n })\n\n /**\n * 헤더 스타일 반환\n */\n const getHeaderStyle = (column: TableColumn) => {\n return column.headerStyle || undefined\n }\n\n /**\n * 헤더 클래스 계산\n */\n const getHeaderClasses = (column: TableColumn) => {\n const classes: string[] = []\n\n if (column.align) {\n classes.push(`text-${column.align}`)\n }\n\n if (column.headerClasses) {\n classes.push(column.headerClasses)\n }\n\n return classes.length > 0 ? classes : undefined\n }\n\n /**\n * 바디 셀 스타일 반환\n */\n const getCellStyle = (row: TableRow, column: TableColumn) => {\n if (!column.style) return undefined\n\n if (typeof column.style === 'function') {\n return column.style(row)\n }\n\n return column.style\n }\n\n /**\n * 바디 셀 클래스 계산\n */\n const getCellClasses = (row: TableRow, column: TableColumn) => {\n const classes: string[] = []\n\n if (column.align) {\n classes.push(`text-${column.align}`)\n }\n\n if (column.classes) {\n const columnClasses = typeof column.classes === 'function' ? column.classes(row) : column.classes\n classes.push(columnClasses)\n }\n\n return classes.length > 0 ? classes : undefined\n }\n\n /**\n * colgroup 생성\n */\n const renderColgroup = () => {\n if (!props.columns.length) return null\n\n // headerStyle에서 width 추출\n const hasWidthStyles = props.columns.some(column => column.headerStyle && column.headerStyle.includes('width'))\n\n if (!hasWidthStyles) return null\n\n return h(\n 'colgroup',\n props.columns.map(column => {\n if (!column.headerStyle) return h('col')\n\n // width 값 추출 (예: \"width: 100px;\" 또는 \"width:100px\")\n const widthMatch = column.headerStyle.match(/width\\s*:\\s*([^;]+)/i)\n return h('col', {\n style: widthMatch ? { width: widthMatch[1].trim() } : undefined\n })\n })\n )\n }\n\n /**\n * 테이블 헤더 생성\n */\n const renderHeader = () => {\n if (!props.columns.length) return null\n\n const headerCells = props.columns.map(column => {\n const headerStyle = getHeaderStyle(column)\n const headerClasses = getHeaderClasses(column)\n\n return h(\n 'th',\n {\n scope: 'col',\n class: headerClasses,\n style: headerStyle\n },\n column.label\n )\n })\n\n return h('thead', [h('tr', headerCells)])\n }\n\n /**\n * 셀 값 추출\n */\n const getCellValue = (row: TableRow, column: TableColumn) => {\n if (typeof column.field === 'function') {\n return column.field(row)\n }\n return row[column.field]\n }\n\n /**\n * 테이블 바디 생성\n */\n const renderBody = () => {\n if (!props.rows.length) {\n return h('tbody', [\n h('tr', [\n h(\n 'td',\n {\n colspan: props.columns.length || 1,\n class: 'text-center'\n },\n // no-data 슬롯이 있으면 슬롯 사용, 없으면 기본 텍스트\n slots['no-data'] ? slots['no-data']() : '데이터가 없습니다.'\n )\n ])\n ])\n }\n\n const bodyRows = props.rows.map((row, index) => {\n const cells = props.columns.map((column, colIndex) => {\n const cellValue = getCellValue(row, column)\n const cellContent = typeof cellValue === 'function' ? cellValue() : cellValue\n const cellStyle = getCellStyle(row, column)\n const cellClasses = getCellClasses(row, column)\n\n return h(\n colIndex === 0 ? 'th' : 'td',\n {\n scope: colIndex === 0 ? 'row' : undefined,\n class: cellClasses,\n style: cellStyle\n },\n cellContent\n )\n })\n\n return h(\n 'tr',\n {\n onClick: () => handleRowClick(row, index)\n },\n cells\n )\n })\n\n return h('tbody', bodyRows)\n }\n\n /**\n * 행 클릭 핸들러\n */\n const handleRowClick = (row: TableRow, index: number) => {\n emit('row-click', row, index)\n }\n\n return () => {\n return h('div', { class: wrapperClasses.value }, [\n h('table', { class: tableClasses.value }, [\n props.caption && h('caption', props.caption),\n renderColgroup(),\n renderHeader(),\n renderBody()\n ])\n ])\n }\n }\n})\n","/**\n * KRDS Table 컴포넌트\n */\n\nimport KrdsTable from './KrdsTable'\nimport type { KrdsTableProps, KrdsTableEmits, TableColumn, TableRow } from './KrdsTable'\n\nexport { KrdsTable }\nexport type { KrdsTableProps, KrdsTableEmits, TableColumn, TableRow }\nexport default KrdsTable\n","import { computed, defineComponent, h, VNode } from 'vue'\nimport type { SlotsType } from 'vue'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * KRDS Header 컴포넌트 속성\n */\nexport interface KrdsHeaderProps {\n /** 헤더 ID */\n id?: string\n /** 추가 CSS 클래스 */\n class?: string\n}\n\nexport default defineComponent({\n name: 'KrdsHeader',\n props: {\n /** 헤더 ID */\n id: {\n type: String,\n default: 'krds-header'\n },\n /** 추가 CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n slots: Object as SlotsType<{\n /** 유틸리티 메뉴 슬롯 */\n utility?(): VNode[]\n /** 브랜딩 영역 슬롯 (로고, 액션 버튼) */\n branding?(): VNode[]\n /** 데스크탑 네비게이션 슬롯 — KrdsMainMenu 등 완성된 메뉴 요소를 그대로 전달 */\n navigation?(): VNode[]\n /** 모바일 네비게이션 슬롯 — KrdsMainMenu(variant=\"mobile\") 등 완성된 드로어 요소를 그대로 전달 */\n mobileNavigation?(): VNode[]\n }>,\n setup(props, { slots }) {\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 헤더 클래스 계산\n */\n const headerClasses = computed(() => {\n const classes = []\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n // ========================\n // 렌더 함수\n // ========================\n\n return () => {\n const headerInChildren = []\n\n // 헤더 컨테이너 (utility + branding)\n if (slots.utility || slots.branding) {\n const innerChildren = []\n\n if (slots.utility) {\n innerChildren.push(h('div', { class: 'header-utility' }, slots.utility()))\n }\n\n if (slots.branding) {\n innerChildren.push(h('div', { class: 'header-branding' }, slots.branding()))\n }\n\n headerInChildren.push(h('div', { class: 'header-container' }, [h('div', { class: 'inner' }, innerChildren)]))\n }\n\n // 네비게이션 (슬롯이 .krds-main-menu 루트를 포함한 완성된 메뉴를 렌더링)\n if (slots.navigation) {\n headerInChildren.push(...slots.navigation())\n }\n\n const children = [h('div', { class: 'header-in' }, headerInChildren)]\n\n // 모바일 네비게이션 (슬롯이 .krds-main-menu-mobile 루트를 포함한 완성된 드로어를 렌더링)\n if (slots.mobileNavigation) {\n children.push(...slots.mobileNavigation())\n }\n\n return h(\n 'header',\n {\n id: props.id,\n class: headerClasses.value\n },\n children\n )\n }\n }\n})\n","/**\n * KRDS Header 컴포넌트\n */\n\nimport KrdsHeader from './KrdsHeader'\nimport type { KrdsHeaderProps } from './KrdsHeader'\n\nexport { KrdsHeader }\nexport type { KrdsHeaderProps }\nexport default KrdsHeader\n","import { computed, defineComponent, h, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Footer 컴포넌트 속성\n */\nexport interface KrdsFooterProps extends BaseComponentProps {\n /** Footer ID */\n id?: string\n}\n\nexport default defineComponent({\n name: 'KrdsFooter',\n props: {\n /** Footer ID */\n id: {\n type: String,\n default: 'krds-footer'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n /**\n * Footer 클래스 계산\n */\n const footerClasses = computed(() => {\n const classes = []\n if (props.class) {\n classes.push(props.class)\n }\n return classes\n })\n\n /**\n * Top 섹션 렌더링\n */\n const renderTop = (): VNode | null => {\n if (!slots.top) return null\n\n return h('div', { class: 'foot-quick' }, [h('div', { class: 'inner' }, slots.top())])\n }\n\n /**\n * 로고 섹션 렌더링\n */\n const renderLogo = (): VNode | null => {\n if (!slots.logo) return null\n return h('div', { class: 'f-logo' }, slots.logo())\n }\n\n /**\n * Footer 콘텐츠 렌더링\n */\n const renderContent = (): VNode | null => {\n if (!slots.content) return null\n return h('div', { class: 'f-cnt' }, slots.content())\n }\n\n /**\n * Footer 하단 렌더링\n */\n const renderBottom = (): VNode | null => {\n if (!slots.bottom) return null\n return h('div', { class: 'f-btm' }, slots.bottom())\n }\n\n return () => {\n const top = renderTop()\n const logo = renderLogo()\n const content = renderContent()\n const bottom = renderBottom()\n\n const innerChildren: VNode[] = []\n if (logo) innerChildren.push(logo)\n if (content) innerChildren.push(content)\n if (bottom) innerChildren.push(bottom)\n\n const children: VNode[] = []\n if (top) children.push(top)\n if (innerChildren.length > 0) {\n children.push(h('div', { class: 'inner' }, innerChildren))\n }\n\n return h(\n 'footer',\n {\n id: props.id,\n class: footerClasses.value\n },\n children\n )\n }\n }\n})\n","/**\n * KRDS Footer 컴포넌트\n */\n\nimport KrdsFooter from './KrdsFooter'\nimport type { KrdsFooterProps } from './KrdsFooter'\n\nexport { KrdsFooter }\nexport type { KrdsFooterProps }\nexport default KrdsFooter\n","import { defineComponent, h, computed, useId } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Disclosure 컴포넌트 속성\n */\nexport interface KrdsDisclosureProps extends BaseComponentProps {\n /** 디스클로저 제목 */\n title: string\n /** 확장 상태 (v-model) */\n modelValue?: boolean\n}\n\n/**\n * KRDS Disclosure 컴포넌트 이벤트\n */\nexport interface KrdsDisclosureEmits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nexport default defineComponent({\n name: 'KrdsDisclosure',\n props: {\n /** 디스클로저 제목 */\n title: {\n type: String,\n required: true\n },\n /** 확장 상태 (v-model) */\n modelValue: {\n type: Boolean,\n default: false\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n /**\n * 컴포넌트 고유 ID\n */\n const contentId = `disclosure-${useId()}`\n\n /**\n * 확장 상태 (computed로 props와 동기화)\n */\n const isExpanded = computed(() => props.modelValue)\n\n /**\n * 토글 핸들러\n */\n const handleToggle = () => {\n emit('update:modelValue', !props.modelValue)\n }\n\n return () =>\n h(\n 'div',\n {\n class: ['krds-disclosure', 'conts-expand-area', isExpanded.value && 'active']\n },\n [\n // 토글 버튼\n h(\n 'button',\n {\n type: 'button',\n class: 'btn-conts-expand',\n onClick: handleToggle,\n 'aria-expanded': isExpanded.value,\n 'aria-controls': contentId\n },\n props.title\n ),\n // 확장 콘텐츠 영역\n h(\n 'div',\n {\n id: contentId,\n class: 'expand-wrap',\n inert: !isExpanded.value\n },\n [h('div', { class: 'expand-in' }, slots.default?.())]\n )\n ]\n )\n }\n})\n","/**\n * KRDS Disclosure 컴포넌트\n */\n\nimport KrdsDisclosure from './KrdsDisclosure'\nimport type { KrdsDisclosureProps, KrdsDisclosureEmits } from './KrdsDisclosure'\n\nexport { KrdsDisclosure }\nexport type { KrdsDisclosureProps, KrdsDisclosureEmits }\nexport default KrdsDisclosure\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Identifier 컴포넌트 속성\n */\n\nexport interface KrdsIdentifierProps extends BaseComponentProps {\n logoLabel?: string\n}\n\n/**\n * KRDS Identifier 컴포넌트 이벤트\n */\nexport interface KrdsIdentifierEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default defineComponent({\n name: 'KrdsIdentifier',\n props: {\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 로고 스크린리더 텍스트 */\n logoLabel: {\n type: String,\n default: 'KRDS - Korea Design System'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n /**\n * 배지 클래스 계산\n */\n const identifierClasses = computed(() => {\n const classes = ['krds-identifier']\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 class: identifierClasses.value,\n onClick: handleClick\n },\n [\n h('span', { class: 'logo' }, [h('span', { class: 'sr-only' }, props.logoLabel)]),\n h('span', { class: 'ban-txt' }, slots.default?.())\n ]\n )\n }\n})\n","/**\n * KRDS Identifier 컴포넌트\n */\n\nimport KrdsIdentifier from './KrdsIdentifier'\nimport type { KrdsIdentifierProps, KrdsIdentifierEmits } from './KrdsIdentifier'\n\nexport { KrdsIdentifier }\nexport type { KrdsIdentifierProps, KrdsIdentifierEmits }\nexport default KrdsIdentifier\n","import { computed, defineComponent, h, onMounted, onUnmounted, ref } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Layout 컴포넌트 속성\n */\nexport interface KrdsLayoutProps extends BaseComponentProps {\n /** 레이아웃 ID */\n id?: string\n /** 스크롤 감지 활성화 여부 */\n enableScrollDetection?: boolean\n}\n/**\n * 스크롤 상세 정보\n */\nexport interface ScrollDetails {\n scrollY: number\n scrollHeight: number\n direction: 'up' | 'down' | null\n timestamp: number\n}\n\n/**\n * 레이아웃 크기 정보\n */\nexport interface LayoutSize {\n width: number\n height: number\n}\n\n/**\n * KRDS Layout 컴포넌트 이벤트\n */\nexport interface KrdsLayoutEmits {\n resize: [size: LayoutSize]\n scroll: [details: ScrollDetails]\n 'scroll-height': [height: number]\n}\n\n/**\n * 스크롤 감지 시작 오프셋 (px)\n */\nconst SCROLL_OFFSET_THRESHOLD = 50\n\nexport default defineComponent({\n name: 'KrdsLayout',\n props: {\n /** 레이아웃 ID */\n id: {\n type: String,\n default: 'wrap'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 스크롤 감지 활성화 여부 */\n enableScrollDetection: {\n type: Boolean,\n default: true\n }\n },\n emits: {\n resize: (_size: LayoutSize) => true,\n scroll: (_details: ScrollDetails) => true,\n 'scroll-height': (_height: number) => true\n },\n setup(props, { slots, emit }) {\n const scrollY = ref(0)\n const scrollH = ref(0)\n const lastScrollY = ref(0)\n const scrollDirection = ref<'up' | 'down' | null>(null)\n const wrapElement = ref<HTMLElement | null>(null)\n const resizeObserver = ref<ResizeObserver | null>(null)\n\n /**\n * 스크롤 값 업데이트\n */\n const updateScrollValues = () => {\n const prevScrollHeight = scrollH.value\n scrollY.value = window.scrollY\n scrollH.value = document.body.scrollHeight\n\n // scroll-height 이벤트 발생 (높이가 변경된 경우)\n if (prevScrollHeight !== scrollH.value && prevScrollHeight > 0) {\n emit('scroll-height', scrollH.value)\n }\n }\n\n /**\n * 스크롤 방향 처리\n */\n const handleScrollDirection = () => {\n if (!wrapElement.value || !props.enableScrollDetection) return\n\n const container = document.querySelector('#container')\n if (!container) return\n\n const containerOffsetTop = (container as HTMLElement).offsetTop\n const currentScrollY = window.scrollY\n const isScrollingDown = currentScrollY > lastScrollY.value\n const isScrollingUp = currentScrollY < lastScrollY.value\n\n if (currentScrollY > containerOffsetTop + SCROLL_OFFSET_THRESHOLD) {\n if (isScrollingDown) {\n wrapElement.value.classList.add('scroll-down')\n wrapElement.value.classList.remove('scroll-up')\n scrollDirection.value = 'down'\n } else if (isScrollingUp) {\n wrapElement.value.classList.add('scroll-up')\n wrapElement.value.classList.remove('scroll-down')\n scrollDirection.value = 'up'\n }\n } else {\n wrapElement.value.classList.remove('scroll-down', 'scroll-up')\n scrollDirection.value = null\n }\n\n lastScrollY.value = currentScrollY\n }\n\n /**\n * 스크롤 이벤트 핸들러\n */\n const handleScroll = () => {\n updateScrollValues()\n handleScrollDirection()\n\n // scroll 이벤트 발생\n const scrollDetails: ScrollDetails = {\n scrollY: scrollY.value,\n scrollHeight: scrollH.value,\n direction: scrollDirection.value,\n timestamp: Date.now()\n }\n emit('scroll', scrollDetails)\n }\n\n /**\n * 리사이즈 핸들러\n */\n const handleResize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n const size: LayoutSize = { width, height }\n emit('resize', size)\n }\n }\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const classes = ['g-wrap']\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n onMounted(() => {\n if (props.enableScrollDetection) {\n updateScrollValues()\n window.addEventListener('scroll', handleScroll, { passive: true })\n }\n\n // ResizeObserver 설정\n if (wrapElement.value && typeof ResizeObserver !== 'undefined') {\n resizeObserver.value = new ResizeObserver(handleResize)\n resizeObserver.value.observe(wrapElement.value)\n }\n })\n\n onUnmounted(() => {\n if (props.enableScrollDetection) {\n window.removeEventListener('scroll', handleScroll)\n }\n\n // ResizeObserver 정리\n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n resizeObserver.value = null\n }\n })\n\n return () => {\n return h(\n 'div',\n {\n id: props.id,\n class: containerClasses.value,\n ref: wrapElement\n },\n slots.default?.()\n )\n }\n }\n})\n","import KrdsLayout from './KrdsLayout'\nimport type { KrdsLayoutProps, KrdsLayoutEmits, ScrollDetails, LayoutSize } from './KrdsLayout'\n\nexport { KrdsLayout }\nexport type { KrdsLayoutProps, KrdsLayoutEmits, ScrollDetails, LayoutSize }\nexport default KrdsLayout\n","import { defineComponent, ref, computed, h, type VNode, type ComponentPublicInstance } from 'vue'\n\n/**\n * 사이드 네비게이션 아이템 인터페이스\n */\nexport interface SideNavItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 확장 상태 */\n expanded?: boolean\n /** 하위 아이템 */\n subItems?: SideNavSubItem[]\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 사이드 네비게이션 하위 아이템 인터페이스\n */\nexport interface SideNavSubItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 확장 상태 (3depth popup용) */\n expanded?: boolean\n /** 팝업 제목 (3depth popup용) */\n popupTitle?: string\n /** 하위 아이템 (4depth용) */\n subItems?: SideNavPopupItem[]\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 사이드 네비게이션 팝업 아이템 인터페이스 (4depth)\n */\nexport interface SideNavPopupItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * KRDS SideNavigation 컴포넌트 속성\n */\nexport interface KrdsSideNavigationProps {\n /** 네비게이션 제목 */\n title: string\n /** 메뉴 아이템 배열 */\n modelValue?: SideNavItem[]\n}\n\n/**\n * KRDS SideNavigation 컴포넌트 이벤트\n */\nexport interface KrdsSideNavigationEmits {\n (event: 'update:modelValue', value: SideNavItem[]): void\n}\n\nexport default defineComponent({\n name: 'KrdsSideNavigation',\n props: {\n /** 네비게이션 제목 */\n title: {\n type: String,\n required: true\n },\n /** 메뉴 아이템 배열 */\n modelValue: {\n type: Array as () => SideNavItem[],\n default: () => []\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: SideNavItem[]) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props: KrdsSideNavigationProps, { emit }: { emit: KrdsSideNavigationEmits }) {\n const modelValue = computed(() => props.modelValue || [])\n\n // Template refs를 위한 Map들\n const popupTriggerRefs = ref(new Map<string, HTMLButtonElement>())\n const popupRefs = ref(new Map<string, HTMLDivElement>())\n const popupTitleRefs = ref(new Map<string, HTMLButtonElement>())\n const lastClickedPopupButton = ref<HTMLButtonElement | null>(null)\n\n // Template ref 설정 함수들\n const setPopupTriggerRef = (el: HTMLButtonElement | null, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n if (el) {\n popupTriggerRefs.value.set(key, el)\n } else {\n popupTriggerRefs.value.delete(key)\n }\n }\n\n const setPopupRef = (el: HTMLDivElement | null, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n if (el) {\n popupRefs.value.set(key, el)\n } else {\n popupRefs.value.delete(key)\n }\n }\n\n const setPopupTitleRef = (el: HTMLButtonElement | null, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n if (el) {\n popupTitleRefs.value.set(key, el)\n } else {\n popupTitleRefs.value.delete(key)\n }\n }\n\n /**\n * 서브메뉴 토글\n */\n const toggleSubmenu = (index: number) => {\n const newMenuItems = modelValue.value.map((item, idx) => {\n if (idx === index && item.subItems) {\n const wasExpanded = item.expanded\n const updatedItem = {\n ...item,\n expanded: !item.expanded\n }\n\n // 2뎁스가 닫힐 때 모든 3뎁스 팝업들을 닫기\n if (wasExpanded && !updatedItem.expanded) {\n updatedItem.subItems = item.subItems.map(subItem => ({\n ...subItem,\n expanded: false\n }))\n // 마지막 클릭된 팝업 버튼 참조 초기화\n lastClickedPopupButton.value = null\n }\n\n return updatedItem\n }\n return item\n })\n\n emit('update:modelValue', newMenuItems)\n }\n\n /**\n * 팝업 토글\n */\n const togglePopup = (parentIndex: number, subIndex: number) => {\n const newMenuItems = modelValue.value.map((item, idx) => {\n if (idx === parentIndex && item.subItems) {\n return {\n ...item,\n subItems: item.subItems.map((subItem, subIdx) => {\n if (subIdx === subIndex && subItem.subItems) {\n const updatedSubItem = {\n ...subItem,\n expanded: !subItem.expanded\n }\n\n if (updatedSubItem.expanded) {\n // 현재 클릭된 버튼 저장 - template ref 사용\n const key = `${parentIndex}-${subIndex}`\n lastClickedPopupButton.value = popupTriggerRefs.value.get(key) || null\n\n // 팝업이 열릴 때 포커스 관리 - template ref 사용\n const popupElement = popupRefs.value.get(key)\n const titleButton = popupTitleRefs.value.get(key)\n\n if (popupElement && titleButton) {\n popupElement.addEventListener(\n 'transitionend',\n () => {\n titleButton.focus()\n },\n { once: true }\n )\n }\n }\n\n return updatedSubItem\n }\n return subItem\n })\n }\n }\n return item\n })\n\n emit('update:modelValue', newMenuItems)\n }\n\n /**\n * 팝업 닫기\n */\n const closePopup = (parentIndex: number, subIndex: number) => {\n const newMenuItems = modelValue.value.map((item, idx) => {\n if (idx === parentIndex && item.subItems) {\n return {\n ...item,\n subItems: item.subItems.map((subItem, subIdx) => {\n if (subIdx === subIndex && subItem.subItems && subItem.expanded) {\n // 포커스를 원래 버튼으로 돌리기\n if (lastClickedPopupButton.value) {\n const buttonToFocus = lastClickedPopupButton.value\n requestAnimationFrame(() => {\n buttonToFocus.focus()\n })\n lastClickedPopupButton.value = null\n }\n\n return {\n ...subItem,\n expanded: false\n }\n }\n return subItem\n })\n }\n }\n return item\n })\n\n emit('update:modelValue', newMenuItems)\n }\n\n /**\n * 팝업 외부 클릭 시 닫기\n */\n const handlePopupFocusOut = (event: FocusEvent, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n const popupElement = popupRefs.value.get(key)\n if (popupElement && !popupElement.contains(event.relatedTarget as Node)) {\n closePopup(parentIndex, subIndex)\n }\n }\n\n /**\n * 팝업 제목 클릭 시 닫기\n */\n const handlePopupTitleClick = (parentIndex: number, subIndex: number) => {\n closePopup(parentIndex, subIndex)\n }\n\n /**\n * 아이템 클릭 핸들러\n */\n const handleItemClick = (item: SideNavItem | SideNavSubItem | SideNavPopupItem, event: MouseEvent) => {\n if (item.onClick) {\n item.onClick(event)\n }\n }\n\n /**\n * 4depth 아이템 렌더링\n */\n const renderPopupItems = (items: SideNavPopupItem[], parentIndex: number, subIndex: number): VNode[] => {\n return items.map((popupItem, popupIndex) =>\n h(\n 'li',\n {\n key: `popup-item-${parentIndex}-${subIndex}-${popupIndex}`,\n role: 'none'\n },\n h(\n 'a',\n {\n href: popupItem.href || '#',\n class: 'lnb-btn',\n role: 'menuitem',\n onClick: (event: MouseEvent) => handleItemClick(popupItem, event)\n },\n popupItem.text\n )\n )\n )\n }\n\n /**\n * 3depth 서브메뉴 렌더링\n */\n const renderSubItems = (subItems: SideNavSubItem[], parentIndex: number): VNode[] => {\n return subItems.map((subItem, subIndex) => {\n const key = `lnb-subitem-${parentIndex}-${subIndex}`\n\n return h(\n 'li',\n {\n key,\n class: ['lnb-subitem', { active: subItem.expanded }],\n role: 'none'\n },\n [\n // 3depth 링크 또는 팝업 버튼\n !subItem.subItems\n ? h(\n 'a',\n {\n href: subItem.href || '#',\n class: ['lnb-btn', 'lnb-link'],\n role: 'menuitem',\n onClick: (event: MouseEvent) => handleItemClick(subItem, event)\n },\n subItem.text\n )\n : [\n // 3depth 팝업 버튼\n h(\n 'button',\n {\n ref: (el: Element | ComponentPublicInstance | null) =>\n setPopupTriggerRef(el as HTMLButtonElement | null, parentIndex, subIndex),\n type: 'button',\n class: 'lnb-btn lnb-toggle-popup',\n role: 'menuitem',\n 'aria-controls': `lnbmenu-${parentIndex}-${subIndex}`,\n 'aria-expanded': subItem.expanded ? 'true' : 'false',\n 'aria-haspopup': 'true',\n onClick: () => togglePopup(parentIndex, subIndex)\n },\n subItem.text\n ),\n\n // 3depth 팝업 서브메뉴\n h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) =>\n setPopupRef(el as HTMLDivElement | null, parentIndex, subIndex),\n id: `lnbmenu-${parentIndex}-${subIndex}`,\n class: ['lnb-submenu-lv2', { active: subItem.expanded }],\n role: 'menu',\n onFocusout: (event: FocusEvent) => handlePopupFocusOut(event, parentIndex, subIndex)\n },\n [\n // 팝업 제목 버튼\n h(\n 'button',\n {\n ref: (el: Element | ComponentPublicInstance | null) =>\n setPopupTitleRef(el as HTMLButtonElement | null, parentIndex, subIndex),\n type: 'button',\n class: 'lnb-btn-tit',\n onClick: () => handlePopupTitleClick(parentIndex, subIndex)\n },\n subItem.popupTitle || subItem.text\n ),\n\n // 4depth 아이템 목록\n h('ul', {}, renderPopupItems(subItem.subItems || [], parentIndex, subIndex))\n ]\n )\n ]\n ]\n )\n })\n }\n\n /**\n * 2depth 메뉴 아이템 렌더링\n */\n const renderMenuItems = (): VNode[] => {\n return modelValue.value.map((item: SideNavItem, index: number) =>\n h(\n 'li',\n {\n key: `lnb-item-${index}`,\n class: ['lnb-item', { active: item.expanded }],\n role: 'none'\n },\n [\n // 2depth 토글 버튼\n h(\n 'button',\n {\n type: 'button',\n class: ['lnb-btn', 'lnb-toggle', { active: item.expanded }],\n role: 'menuitem',\n 'aria-controls': `lnbmenu-${index}`,\n 'aria-expanded': item.expanded ? 'true' : 'false',\n onClick: () => toggleSubmenu(index)\n },\n item.text\n ),\n\n // 2depth 서브메뉴\n item.subItems\n ? h(\n 'div',\n {\n class: 'lnb-submenu'\n },\n [\n h(\n 'ul',\n {\n id: `lnbmenu-${index}`,\n role: 'menu'\n },\n renderSubItems(item.subItems, index)\n )\n ]\n )\n : null\n ]\n )\n )\n }\n\n return () =>\n h('nav', { class: 'krds-side-navigation' }, [\n h('h2', { class: 'lnb-tit' }, props.title),\n h(\n 'ul',\n {\n class: 'lnb-list',\n role: 'menubar'\n },\n renderMenuItems()\n )\n ])\n }\n})\n","/**\n * KRDS SideNavigation 컴포넌트\n */\n\nimport KrdsSideNavigation from './KrdsSideNavigation'\nimport type { KrdsSideNavigationProps, KrdsSideNavigationEmits, SideNavItem, SideNavSubItem, SideNavPopupItem } from './KrdsSideNavigation'\n\nexport { KrdsSideNavigation }\nexport type { KrdsSideNavigationProps, KrdsSideNavigationEmits, SideNavItem, SideNavSubItem, SideNavPopupItem }\nexport default KrdsSideNavigation\n","import { defineComponent, h, SlotsType, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS StructuredList 컴포넌트 속성\n */\nexport interface KrdsStructuredListProps extends BaseComponentProps {\n /** 전체 타입 여부 */\n full?: boolean\n}\n\nexport default defineComponent({\n name: 'KrdsStructuredList',\n props: {\n /** 전체 타입 여부 */\n full: {\n type: Boolean,\n default: true\n }\n },\n slots: Object as SlotsType<{\n cardTop?: () => VNode[]\n cardBody?: () => VNode[]\n cardBtm?: () => VNode[]\n cardBtn?: () => VNode[]\n }>,\n setup(props, { slots }) {\n return () => {\n const cardTop = slots.cardTop?.()\n const cardBody = slots.cardBody?.()\n const cardBtm = slots.cardBtm?.()\n const cardBtn = slots.cardBtn?.()\n\n // 구조화된 슬롯들로 단일 아이템 생성\n const structuredItem = h('li', { class: 'structured-item' }, [\n h(\n 'div',\n { class: 'in' },\n [\n cardTop && h('div', { class: 'card-top' }, cardTop),\n cardBody && h('div', { class: 'card-body' }, cardBody),\n cardBtm && h('div', { class: 'card-btm' }, cardBtm),\n cardBtn && h('div', { class: 'card-btn' }, cardBtn)\n ].filter(Boolean)\n )\n ])\n\n return h(\n 'ul',\n {\n class: ['krds-structured-list', props.full ? 'type-full' : '']\n },\n [structuredItem]\n )\n }\n }\n})\n","/**\n * KRDS StructuredList 컴포넌트\n */\n\nimport KrdsStructuredList from './KrdsStructuredList'\nimport type { KrdsStructuredListProps } from './KrdsStructuredList'\n\nexport { KrdsStructuredList }\nexport type { KrdsStructuredListProps }\nexport default KrdsStructuredList\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS TextList 컴포넌트 속성\n */\nexport interface KrdsTextListProps extends BaseComponentProps {\n /** 리스트 타입 */\n type?: 'ul' | 'ol'\n /** 스타일 변형 */\n variant?: 'decimal' | 'dash' | 'hollow' | 'ordered'\n}\n\nexport default defineComponent({\n name: 'KrdsTextList',\n props: {\n /** 리스트 타입 */\n type: {\n type: String as () => 'ul' | 'ol',\n default: 'ul'\n },\n /** 스타일 변형 */\n variant: {\n type: String as () => 'decimal' | 'dash' | 'hollow' | 'ordered',\n default: 'dash'\n }\n },\n setup(props, { slots }) {\n return () =>\n h(\n props.type as 'ul' | 'ol',\n {\n class: ['krds-info-list', props.variant]\n },\n slots.default?.()\n )\n }\n})\n","/**\n * KRDS TextList 컴포넌트\n */\n\nimport KrdsTextList from './KrdsTextList'\nimport type { KrdsTextListProps } from './KrdsTextList'\n\nexport { KrdsTextList }\nexport type { KrdsTextListProps }\nexport default KrdsTextList\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * 알림 타입\n */\nexport type AlertType = 'danger' | 'ok' | 'info'\n\n/**\n * KRDS Critical Alerts 컴포넌트 속성\n */\nexport interface KrdsCriticalAlertsProps extends BaseComponentProps {\n /** 알림 타입 */\n type: AlertType\n /** 알림 메시지 */\n message: string\n /** 링크 URL */\n linkHref?: string\n /** 링크 텍스트 */\n linkText?: string\n}\n\n/**\n * KRDS Critical Alerts 컴포넌트 이벤트\n */\nexport interface KrdsCriticalAlertsEmits {\n (e: 'link-click', event: MouseEvent): void\n}\n\nexport default defineComponent({\n name: 'KrdsCriticalAlerts',\n props: {\n /** 알림 타입 */\n type: {\n type: String as () => AlertType,\n default: 'info'\n },\n /** 알림 메시지 */\n message: {\n type: String,\n required: true\n },\n /** 링크 URL */\n linkHref: {\n type: String,\n default: undefined\n },\n /** 링크 텍스트 */\n linkText: {\n type: String,\n default: '자세히 보기'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'link-click': (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n /**\n * 알림 타입에 따른 배지 텍스트 반환\n */\n const getBadgeText = (type: AlertType): string => {\n const badgeTextMap: Record<AlertType, string> = {\n danger: '긴급',\n ok: '안전',\n info: '안내'\n }\n return badgeTextMap[type]\n }\n\n /**\n * 링크 클릭 핸들러\n */\n const handleLinkClick = (event: MouseEvent) => {\n // 상위로 이벤트 전달\n emit('link-click', event)\n }\n\n return () =>\n h('ul', { class: 'krds-critical-alerts' }, [\n h('li', [\n h('div', { class: 'critical-ban' }, [\n // 배지\n h('span', { class: ['critical-badge', props.type] }, getBadgeText(props.type)),\n\n // 메시지\n h('p', { class: 'critical-txt' }, props.message),\n\n // 링크 (옵션)\n props.linkHref &&\n h(\n 'a',\n {\n href: props.linkHref,\n class: 'krds-btn medium link basic',\n onClick: handleLinkClick\n },\n [h('span', { class: 'm-hide' }, props.linkText), h('i', { class: 'svg-icon ico-angle right' })]\n )\n ])\n ])\n ])\n }\n})\n","/**\n * KRDS Critical Alerts 컴포넌트\n */\n\nimport KrdsCriticalAlerts from './KrdsCriticalAlerts'\nimport type { KrdsCriticalAlertsProps, KrdsCriticalAlertsEmits, AlertType } from './KrdsCriticalAlerts'\n\nexport { KrdsCriticalAlerts }\nexport type { KrdsCriticalAlertsProps, KrdsCriticalAlertsEmits, AlertType }\nexport default KrdsCriticalAlerts\n","import {\n computed,\n defineComponent,\n h,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n Teleport,\n useId,\n watch,\n type ComponentPublicInstance,\n type PropType,\n type SlotsType,\n type VNode\n} from 'vue'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 메인 메뉴 렌더링 방식\n * - `pc`: 데스크탑 메가 메뉴 (`.krds-main-menu`)\n * - `mobile`: 모바일 드로어 메뉴 (`.krds-main-menu-mobile`)\n */\nexport type MainMenuVariant = 'pc' | 'mobile'\n\n/**\n * 서브 패널 레이아웃\n * - `default`: 배너 영역이 하단에 위치\n * - `between`: 배너 영역이 우측에 위치\n */\nexport type MainMenuLayout = 'default' | 'between'\n\n/**\n * 모바일 4depth 아이템 인터페이스\n */\nexport interface MainMenuDepth4Item {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 링크 아이템 인터페이스\n *\n * PC에서는 서브 패널의 마지막 뎁스, 모바일에서는 3depth로 렌더링된다.\n */\nexport interface MainMenuLinkItem {\n /** 텍스트 */\n text: string\n /** 링크 URL (없으면 button으로 렌더링) */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 메뉴 설명 (PC에서 `type-description` 스타일로 렌더링) */\n description?: string\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 4depth 패널 제목 (모바일 전용, 기본값은 `text`) */\n panelTitle?: string\n /** 하위 아이템 (모바일 4depth 전용) */\n items?: MainMenuDepth4Item[]\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 2depth 아이템 인터페이스\n *\n * `items`가 있으면 서브 패널을 여는 트리거로, 없으면 바로가기 링크로 렌더링된다.\n */\nexport interface MainMenuSubItem {\n /** 텍스트 */\n text: string\n /** 링크 URL (`items`가 없을 때 바로가기 링크로 사용) */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 서브 패널 제목 (기본값은 `text`) */\n title?: string\n /** 서브 패널 제목 옆 바로가기 링크 (PC 전용) */\n titleLink?: { text?: string; href: string }\n /** 하위 아이템 (PC 마지막 뎁스 / 모바일 3depth) */\n items?: MainMenuLinkItem[]\n /** 배너 영역 표시 여부 (`banner` 슬롯 필요, PC 전용) */\n banner?: boolean\n /** 서브 패널 레이아웃 (PC 전용) */\n layout?: MainMenuLayout\n /** 모바일 3depth 초기 확장 상태 */\n expanded?: boolean\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 1depth 메인 메뉴 아이템 인터페이스\n *\n * `subItems`가 있으면 2depth 목록을 가진 메가 패널을, `items`만 있으면\n * 2depth 목록 없이 링크만 나열하는 `single-list` 패널을 렌더링한다.\n * 둘 다 없으면 단순 링크(`is-link`)로 렌더링된다.\n */\nexport interface MainMenuItem {\n /** 텍스트 */\n text: string\n /** 링크 URL (하위 메뉴가 없을 때 단순 링크로 사용) */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 2depth 아이템 목록 */\n subItems?: MainMenuSubItem[]\n /** 2depth 없이 바로 나열되는 링크 목록 (`single-list`) */\n items?: MainMenuLinkItem[]\n /** `single-list` 패널 제목 */\n title?: string\n /** `single-list` 배너 영역 표시 여부 (`banner` 슬롯 필요) */\n banner?: boolean\n /** `single-list` 패널 레이아웃 */\n layout?: MainMenuLayout\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/** 클릭 이벤트로 전달되는 아이템 타입 */\nexport type MainMenuAnyItem = MainMenuItem | MainMenuSubItem | MainMenuLinkItem | MainMenuDepth4Item\n\n/**\n * KRDS MainMenu 컴포넌트 속성\n */\nexport interface KrdsMainMenuProps {\n /** 메뉴 아이템 배열 */\n items?: MainMenuItem[]\n /** 렌더링 방식 */\n variant?: MainMenuVariant\n /** 메뉴 영역 레이블 */\n ariaLabel?: string\n /** 모바일 드로어 열림 상태 (v-model:open) */\n open?: boolean\n /** 모바일 드로어 요소 id (외부 트리거의 `aria-controls` 대상) */\n mobileId?: string\n /** PC 메가 패널 배경 딤(backdrop) 사용 여부 */\n backdrop?: boolean\n /** 모바일 드로어 닫기 버튼 레이블 */\n closeLabel?: string\n}\n\n/**\n * KRDS MainMenu 컴포넌트 이벤트\n */\nexport interface KrdsMainMenuEmits {\n /** 모바일 드로어 열림 상태 변경 */\n (event: 'update:open', value: boolean): void\n /** PC 메가 패널 열림/닫힘 */\n (event: 'menu-toggle', index: number, expanded: boolean): void\n /** 메뉴 아이템 클릭 */\n (event: 'item-click', item: MainMenuAnyItem, mouseEvent: MouseEvent): void\n}\n\n// ========================\n// 상수\n// ========================\n\n/** 새 창으로 열리는 링크의 title 값 */\nconst NEW_WINDOW_TITLE = '새 창 열림'\n\n/** 드로어 전환(transition) 시간과 맞춘 지연 시간 (ms) */\nconst DRAWER_OPEN_DELAY = 100\nconst DRAWER_CLOSE_DELAY = 400\n\n/** 포커스 트랩 대상 셀렉터 */\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n\nexport default defineComponent({\n name: 'KrdsMainMenu',\n props: {\n /** 메뉴 아이템 배열 */\n items: {\n type: Array as PropType<MainMenuItem[]>,\n default: () => []\n },\n /** 렌더링 방식 */\n variant: {\n type: String as PropType<MainMenuVariant>,\n default: 'pc'\n },\n /** 메뉴 영역 레이블 */\n ariaLabel: {\n type: String,\n default: '메인 메뉴'\n },\n /** 모바일 드로어 열림 상태 (v-model:open) */\n open: {\n type: Boolean,\n default: false\n },\n /** 모바일 드로어 요소 id (외부 트리거의 `aria-controls` 대상) */\n mobileId: {\n type: String,\n default: 'mobile-nav'\n },\n /** PC 메가 패널 배경 딤(backdrop) 사용 여부 */\n backdrop: {\n type: Boolean,\n default: true\n },\n /** 모바일 드로어 닫기 버튼 레이블 */\n closeLabel: {\n type: String,\n default: '전체메뉴 닫기'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:open': (value: boolean) => true,\n 'menu-toggle': (index: number, expanded: boolean) => true,\n 'item-click': (item: MainMenuAnyItem, mouseEvent: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n /** PC 서브 패널 배너 영역 */\n banner?(props: { item: MainMenuItem; subItem?: MainMenuSubItem; index: number; subIndex: number }): VNode[]\n /** 모바일 드로어 헤더 영역 (유틸리티, 로그인, 검색 등) */\n header?(): VNode[]\n /** 모바일 드로어 하단 영역 */\n bottom?(): VNode[]\n }>,\n setup(props, { emit, slots }) {\n const uid = useId()\n\n const rootRef = ref<HTMLElement | null>(null)\n const wrapRef = ref<HTMLElement | null>(null)\n const bodyRef = ref<HTMLElement | null>(null)\n\n const isPc = computed(() => props.variant === 'pc')\n\n // ========================\n // 고유 id 생성 (SSR 안전)\n // ========================\n\n const panelId = (index: number) => `${uid}-gnb-panel-${index}`\n const subPanelId = (index: number, subIndex: number) => `${uid}-gnb-sub-${index}-${subIndex}`\n const tabId = (index: number) => `${uid}-gnb-tab-${index}`\n const depth3Id = (index: number, subIndex: number) => `${uid}-gnb-depth3-${index}-${subIndex}`\n\n // ========================\n // 구조 판별 헬퍼\n // ========================\n\n /** 2depth 목록을 가진 메가 패널인지 */\n const hasSubColumns = (item?: MainMenuItem) => !!item?.subItems?.length\n /** 2depth 없이 링크만 나열하는 패널인지 */\n const hasSingleList = (item?: MainMenuItem) => !hasSubColumns(item) && !!item?.items?.length\n /** 펼칠 패널을 가지고 있는지 */\n const hasPanel = (item?: MainMenuItem) => hasSubColumns(item) || hasSingleList(item)\n /** 2depth가 서브 패널 없이 바로가기 링크로만 동작하는지 */\n const isSubLink = (subItem: MainMenuSubItem) => !subItem.items?.length\n\n /** 새 창 링크 속성 */\n const externalAttrs = (external?: boolean) =>\n external ? { target: '_blank', rel: 'noopener noreferrer', title: NEW_WINDOW_TITLE } : {}\n\n /**\n * 아이템 클릭 처리\n */\n const handleItemClick = (item: MainMenuAnyItem, event: MouseEvent) => {\n item.onClick?.(event)\n emit('item-click', item, event)\n }\n\n // ========================\n // PC 상태\n // ========================\n\n /** 열려 있는 1depth 인덱스 (-1이면 모두 닫힘) */\n const openIndex = ref(-1)\n /** 사용자가 선택한 2depth 인덱스 (1depth 인덱스별) */\n const subOverrides = ref<Record<number, number>>({})\n /** 활성 서브 패널 높이에 맞춘 `.gnb-main-list` 최소 높이 */\n const panelMinHeight = ref(0)\n\n const mainListEls = new Map<number, HTMLElement>()\n const mainTriggerEls = new Map<number, HTMLElement>()\n\n const setElRef = (map: Map<number, HTMLElement>, el: Element | ComponentPublicInstance | null, key: number) => {\n if (el) {\n map.set(key, el as HTMLElement)\n } else {\n map.delete(key)\n }\n }\n\n /**\n * 기본 활성 2depth 인덱스\n *\n * 원본 스크립트와 동일하게 링크가 아닌 첫 번째 2depth를 활성화한다.\n */\n const defaultSubIndex = (item?: MainMenuItem) => {\n const index = item?.subItems?.findIndex(subItem => !isSubLink(subItem))\n return index === undefined ? -1 : index\n }\n\n const activeSubIndex = (index: number) => {\n const override = subOverrides.value[index]\n return override === undefined ? defaultSubIndex(props.items[index]) : override\n }\n\n /**\n * body 상태 클래스 토글 (backdrop 노출 및 스크롤 잠금)\n */\n const setPcBodyState = (isOpen: boolean) => {\n if (typeof document === 'undefined') return\n document.body.classList.toggle('is-gnb-web', isOpen)\n const needsScroll = document.body.scrollHeight > window.innerHeight\n document.body.classList.toggle('hasScrollY', isOpen && needsScroll)\n }\n\n /**\n * 활성 서브 패널 높이에 맞춰 `.gnb-main-list` 최소 높이를 보정\n *\n * `.gnb-sub-list`가 absolute로 배치되므로 부모 높이를 직접 맞춰줘야 한다.\n */\n const adjustPanelHeight = async () => {\n await nextTick()\n const listEl = mainListEls.get(openIndex.value)\n const activeSubList = listEl?.querySelector<HTMLElement>('.gnb-sub-list.active')\n panelMinHeight.value = activeSubList?.scrollHeight ?? 0\n }\n\n /**\n * 메가 패널 닫기\n */\n const closeMainMenu = (restoreFocus = false) => {\n if (openIndex.value === -1) return\n const closedIndex = openIndex.value\n openIndex.value = -1\n panelMinHeight.value = 0\n setPcBodyState(false)\n emit('menu-toggle', closedIndex, false)\n if (restoreFocus) mainTriggerEls.get(closedIndex)?.focus()\n }\n\n /**\n * 메가 패널 토글\n */\n const toggleMainMenu = (index: number) => {\n if (!hasPanel(props.items[index])) return\n if (openIndex.value === index) {\n closeMainMenu()\n return\n }\n openIndex.value = index\n setPcBodyState(true)\n emit('menu-toggle', index, true)\n void adjustPanelHeight()\n }\n\n /**\n * 2depth 선택\n */\n const selectSubMenu = (index: number, subIndex: number) => {\n subOverrides.value = { ...subOverrides.value, [index]: subIndex }\n void adjustPanelHeight()\n }\n\n /**\n * 메뉴 외부 클릭 시 닫기 (backdrop 클릭 포함)\n */\n const handleDocumentClick = (event: MouseEvent) => {\n const root = rootRef.value\n if (!root || root.contains(event.target as Node)) return\n closeMainMenu()\n }\n\n /**\n * 포커스가 메뉴 밖으로 이동하면 닫기 (Tab 이탈)\n */\n const handlePcFocusout = (event: FocusEvent) => {\n const root = rootRef.value\n const nextTarget = event.relatedTarget as Node | null\n if (!root || !nextTarget || root.contains(nextTarget)) return\n closeMainMenu()\n }\n\n /**\n * PC 키보드 내비게이션 (ESC / Home / End / 방향키)\n */\n const handlePcKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeMainMenu(true)\n return\n }\n\n const target = event.target as HTMLElement | null\n if (!target?.dataset.trigger) return\n\n const focusSibling = (direction: 'next' | 'prev') => {\n const listItem = target.closest('li')\n const sibling = direction === 'next' ? listItem?.nextElementSibling : listItem?.previousElementSibling\n sibling?.querySelector<HTMLElement>('[data-trigger]')?.focus()\n }\n\n switch (event.key) {\n case 'Home':\n event.preventDefault()\n mainTriggerEls.get(0)?.focus()\n break\n case 'End':\n event.preventDefault()\n mainTriggerEls.get(props.items.length - 1)?.focus()\n break\n case 'ArrowRight':\n case 'ArrowDown':\n event.preventDefault()\n focusSibling('next')\n break\n case 'ArrowLeft':\n case 'ArrowUp':\n event.preventDefault()\n focusSibling('prev')\n break\n default:\n break\n }\n }\n\n // ========================\n // 모바일 상태\n // ========================\n\n /** 활성 1depth 탭 인덱스 */\n const activeTab = ref(0)\n /** 3depth 확장 상태 (`${index}-${subIndex}` 키) */\n const depth3Expanded = ref<Record<string, boolean>>({})\n /** 표시 중인 4depth 패널 키 (`display` 제어) */\n const depth4Displayed = ref<string | null>(null)\n /** 열려 있는 4depth 패널 키 (`is-open` 제어) */\n const depth4Opened = ref<string | null>(null)\n /** 드로어 DOM 표시 여부 */\n const drawerDisplayed = ref(props.open)\n /** 드로어 열림 상태 (`is-open` / `is-backdrop`) */\n const drawerOpened = ref(props.open)\n\n const panelEls = new Map<number, HTMLElement>()\n const depth3TriggerEls = new Map<string, HTMLElement>()\n const depth4Els = new Map<string, HTMLElement>()\n const depth4PrevEls = new Map<string, HTMLElement>()\n\n const setKeyedRef = (map: Map<string, HTMLElement>, el: Element | ComponentPublicInstance | null, key: string) => {\n if (el) {\n map.set(key, el as HTMLElement)\n } else {\n map.delete(key)\n }\n }\n\n let openTimer: ReturnType<typeof setTimeout> | undefined\n let closeTimer: ReturnType<typeof setTimeout> | undefined\n\n const setMobileBodyState = (isOpen: boolean) => {\n if (typeof document === 'undefined') return\n document.body.classList.toggle('is-gnb-mobile', isOpen)\n }\n\n /**\n * 드로어 열기\n *\n * `display` 변경 직후에는 transition이 동작하지 않으므로,\n * 원본과 동일하게 지연을 두고 열림 클래스를 부여한다.\n */\n const openDrawer = () => {\n if (closeTimer) clearTimeout(closeTimer)\n drawerDisplayed.value = true\n openTimer = setTimeout(() => {\n drawerOpened.value = true\n setMobileBodyState(true)\n wrapRef.value?.focus()\n }, DRAWER_OPEN_DELAY)\n }\n\n /**\n * 드로어 닫기\n */\n const closeDrawer = () => {\n if (openTimer) clearTimeout(openTimer)\n drawerOpened.value = false\n closeTimer = setTimeout(() => {\n drawerDisplayed.value = false\n setMobileBodyState(false)\n }, DRAWER_CLOSE_DELAY)\n }\n\n watch(\n () => props.open,\n isOpen => {\n if (isOpen) {\n openDrawer()\n } else {\n closeDrawer()\n }\n }\n )\n\n /**\n * 1depth 탭 클릭 시 해당 패널 위치로 스크롤\n */\n const handleTabClick = (event: MouseEvent, index: number) => {\n event.preventDefault()\n activeTab.value = index\n const body = bodyRef.value\n const panel = panelEls.get(index)\n if (body && panel) {\n body.scrollTo({ left: 0, top: panel.offsetTop, behavior: 'smooth' })\n }\n }\n\n /**\n * 스크롤 위치에 따라 활성 탭 갱신\n */\n const handleBodyScroll = () => {\n const body = bodyRef.value\n if (!body) return\n const { scrollTop, scrollHeight, clientHeight } = body\n let nextActive = activeTab.value\n panelEls.forEach((panel, index) => {\n if (scrollTop >= panel.offsetTop || scrollTop + clientHeight >= scrollHeight) {\n nextActive = index\n }\n })\n activeTab.value = nextActive\n }\n\n /**\n * 3depth 토글\n */\n const toggleDepth3 = (event: MouseEvent, key: string) => {\n event.preventDefault()\n depth3Expanded.value = { ...depth3Expanded.value, [key]: !depth3Expanded.value[key] }\n }\n\n /**\n * 4depth 패널 열기\n */\n const openDepth4 = async (event: MouseEvent, key: string) => {\n event.preventDefault()\n depth4Displayed.value = key\n await nextTick()\n depth4Opened.value = key\n await nextTick()\n depth4PrevEls.get(key)?.focus()\n }\n\n /**\n * 4depth 패널 닫기\n */\n const closeDepth4 = (key: string) => {\n depth4Opened.value = null\n depth3TriggerEls.get(key)?.focus()\n setTimeout(() => {\n if (!depth4Opened.value) depth4Displayed.value = null\n }, DRAWER_CLOSE_DELAY)\n }\n\n /**\n * 포커스 트랩\n */\n const trapFocus = (container: HTMLElement, event: KeyboardEvent) => {\n const focusable = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))\n if (!focusable.length) return\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n const active = document.activeElement\n\n if (event.shiftKey && (active === first || active === container)) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && active === last) {\n event.preventDefault()\n first.focus()\n }\n }\n\n /**\n * 모바일 키보드 처리 (ESC 닫기 + 포커스 트랩)\n */\n const handleMobileKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n if (depth4Opened.value) {\n closeDepth4(depth4Opened.value)\n } else {\n emit('update:open', false)\n }\n return\n }\n\n if (event.key !== 'Tab') return\n const container = depth4Opened.value ? depth4Els.get(depth4Opened.value) : wrapRef.value\n if (container) trapFocus(container, event)\n }\n\n // ========================\n // 라이프사이클\n // ========================\n\n onMounted(() => {\n if (isPc.value) {\n document.addEventListener('click', handleDocumentClick)\n return\n }\n if (props.open) {\n drawerDisplayed.value = true\n drawerOpened.value = true\n setMobileBodyState(true)\n }\n // 초기 확장 상태 반영\n const initialExpanded: Record<string, boolean> = {}\n props.items.forEach((item, index) => {\n item.subItems?.forEach((subItem, subIndex) => {\n if (subItem.expanded) initialExpanded[`${index}-${subIndex}`] = true\n })\n })\n depth3Expanded.value = initialExpanded\n })\n\n onBeforeUnmount(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('click', handleDocumentClick)\n document.body.classList.remove('is-gnb-web', 'hasScrollY', 'is-gnb-mobile')\n }\n if (openTimer) clearTimeout(openTimer)\n if (closeTimer) clearTimeout(closeTimer)\n })\n\n // ========================\n // PC 렌더링\n // ========================\n\n /**\n * PC 마지막 뎁스 링크 목록 렌더링\n */\n const renderPcLinkList = (linkItems: MainMenuLinkItem[]): VNode => {\n const isDescription = linkItems.some(linkItem => !!linkItem.description)\n\n const children = linkItems.map((linkItem, linkIndex) => {\n const attrs = externalAttrs(linkItem.external)\n const icon = linkItem.external ? h('i', { class: 'svg-icon ico-go' }) : null\n\n if (isDescription) {\n return h('li', { key: `link-${linkIndex}` }, [\n h('h3', { class: 'tit' }, [\n h(\n 'a',\n {\n href: linkItem.href || '#',\n ...attrs,\n onClick: (event: MouseEvent) => handleItemClick(linkItem, event)\n },\n [linkItem.text, icon]\n )\n ]),\n linkItem.description ? h('p', { class: 'txt' }, linkItem.description) : null\n ])\n }\n\n const tag = linkItem.href ? 'a' : 'button'\n return h('li', { key: `link-${linkIndex}` }, [\n h(\n tag,\n {\n ...(linkItem.href ? { href: linkItem.href, ...attrs } : { type: 'button' }),\n class: { active: linkItem.selected },\n onClick: (event: MouseEvent) => handleItemClick(linkItem, event)\n },\n [linkItem.text, icon]\n )\n ])\n })\n\n return h('ul', { class: isDescription ? 'type-description' : undefined }, children)\n }\n\n /**\n * PC 서브 패널(`.gnb-sub-list`) 렌더링\n */\n const renderPcSubList = (options: {\n id?: string\n title: string\n titleLink?: { text?: string; href: string }\n linkItems: MainMenuLinkItem[]\n layout?: MainMenuLayout\n single?: boolean\n active?: boolean\n banner: VNode | null\n }): VNode => {\n const titleChildren: (VNode | string)[] = options.titleLink\n ? [\n options.title,\n h('a', { href: options.titleLink.href, class: 'krds-btn link basic small' }, [\n h('span', { class: 'underline' }, options.titleLink.text || '바로가기'),\n h('i', { class: 'svg-icon ico-angle right' })\n ])\n ]\n : [h('span', options.title)]\n\n return h(\n 'div',\n {\n id: options.id,\n class: [\n 'gnb-sub-list',\n {\n active: options.active,\n between: options.layout === 'between',\n 'single-list': options.single\n }\n ]\n },\n [\n h('div', { class: 'gnb-sub-content' }, [h('h2', { class: 'sub-title' }, titleChildren), renderPcLinkList(options.linkItems)]),\n options.banner\n ]\n )\n }\n\n /**\n * PC 2depth 트리거 + 서브 패널 렌더링\n */\n const renderPcSubItems = (item: MainMenuItem, index: number): VNode[] => {\n return (item.subItems ?? []).map((subItem, subIndex) => {\n const linkOnly = isSubLink(subItem)\n\n // 서브 패널이 없는 2depth는 바로가기 링크로 렌더링\n if (linkOnly) {\n const tag = subItem.href ? 'a' : 'button'\n return h('li', { key: `sub-${subIndex}` }, [\n h(\n tag,\n {\n ...(subItem.href ? { href: subItem.href, ...externalAttrs(subItem.external) } : { type: 'button' }),\n class: ['gnb-sub-trigger', 'is-link', { 'external-link': subItem.external, selected: subItem.selected }],\n 'data-trigger': 'gnb',\n onClick: (event: MouseEvent) => handleItemClick(subItem, event)\n },\n subItem.text\n )\n ])\n }\n\n const isActive = activeSubIndex(index) === subIndex\n const banner =\n subItem.banner && slots.banner ? h('div', { class: 'gnb-sub-banner' }, slots.banner({ item, subItem, index, subIndex })) : null\n\n return h('li', { key: `sub-${subIndex}` }, [\n h(\n 'button',\n {\n type: 'button',\n class: ['gnb-sub-trigger', { active: isActive, selected: subItem.selected }],\n 'data-trigger': 'gnb',\n 'aria-controls': subPanelId(index, subIndex),\n 'aria-expanded': isActive ? 'true' : 'false',\n 'aria-haspopup': 'true',\n onClick: (event: MouseEvent) => {\n selectSubMenu(index, subIndex)\n handleItemClick(subItem, event)\n }\n },\n subItem.text\n ),\n renderPcSubList({\n id: subPanelId(index, subIndex),\n title: subItem.title || subItem.text,\n titleLink: subItem.titleLink,\n linkItems: subItem.items ?? [],\n layout: subItem.layout,\n active: isActive,\n banner\n })\n ])\n })\n }\n\n /**\n * PC 메가 패널(`.gnb-toggle-wrap`) 렌더링\n */\n const renderPcPanel = (item: MainMenuItem, index: number): VNode => {\n const isOpen = openIndex.value === index\n const withColumns = hasSubColumns(item)\n\n const mainListChildren = withColumns\n ? [h('ul', {}, renderPcSubItems(item, index))]\n : [\n renderPcSubList({\n title: item.title || item.text,\n linkItems: item.items ?? [],\n layout: item.layout,\n single: true,\n banner:\n item.banner && slots.banner ? h('div', { class: 'gnb-sub-banner' }, slots.banner({ item, index, subIndex: -1 })) : null\n })\n ]\n\n return h('div', { id: panelId(index), class: ['gnb-toggle-wrap', { 'is-open': isOpen }] }, [\n h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setElRef(mainListEls, el, index),\n class: 'gnb-main-list',\n ...(withColumns ? { 'data-has-submenu': 'true' } : {}),\n style: isOpen && panelMinHeight.value ? { minHeight: `${panelMinHeight.value}px` } : undefined\n },\n mainListChildren\n )\n ])\n }\n\n /**\n * PC 메인 메뉴 렌더링\n */\n const renderPc = (): VNode => {\n const menuItems = props.items.map((item, index) => {\n const withPanel = hasPanel(item)\n const isOpen = openIndex.value === index\n const tag = !withPanel && item.href ? 'a' : 'button'\n\n const trigger = h(\n tag,\n {\n ref: (el: Element | ComponentPublicInstance | null) => setElRef(mainTriggerEls, el, index),\n ...(tag === 'a' ? { href: item.href, ...externalAttrs(item.external) } : { type: 'button' }),\n class: ['gnb-main-trigger', { active: isOpen, 'is-link': !withPanel, selected: item.selected }],\n 'data-trigger': 'gnb',\n ...(withPanel\n ? {\n 'aria-controls': panelId(index),\n 'aria-expanded': isOpen ? 'true' : 'false',\n 'aria-haspopup': 'true'\n }\n : {}),\n onClick: (event: MouseEvent) => {\n if (withPanel) toggleMainMenu(index)\n handleItemClick(item, event)\n }\n },\n item.text\n )\n\n return h('li', { key: `main-${index}` }, [trigger, withPanel ? renderPcPanel(item, index) : null])\n })\n\n const backdrop =\n props.backdrop && openIndex.value !== -1\n ? h(Teleport, { to: 'body' }, [h('div', { class: 'gnb-backdrop active', 'aria-hidden': 'true' })])\n : null\n\n return h(\n 'nav',\n {\n ref: rootRef,\n class: 'krds-main-menu',\n 'aria-label': props.ariaLabel,\n onKeydown: handlePcKeydown,\n onFocusout: handlePcFocusout\n },\n [h('div', { class: 'inner' }, [h('ul', { class: 'gnb-menu', 'aria-label': props.ariaLabel }, menuItems)]), backdrop]\n )\n }\n\n // ========================\n // 모바일 렌더링\n // ========================\n\n /**\n * 모바일 4depth 패널 렌더링\n */\n const renderDepth4 = (linkItem: MainMenuLinkItem, key: string): VNode => {\n const closeDepth4Panel = () => closeDepth4(key)\n\n return h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setKeyedRef(depth4Els, el, key),\n class: ['depth4-wrap', { 'is-open': depth4Opened.value === key }],\n style: depth4Displayed.value === key ? { display: 'block' } : undefined\n },\n [\n h('div', { class: 'depth4-head' }, [\n h(\n 'button',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setKeyedRef(depth4PrevEls, el, key),\n type: 'button',\n class: 'krds-btn icon trigger-prev',\n onClick: closeDepth4Panel\n },\n [h('span', { class: 'sr-only' }, '이전화면'), h('i', { class: 'svg-icon ico-angle left' })]\n ),\n h('button', { type: 'button', class: 'krds-btn icon trigger-close', onClick: closeDepth4Panel }, [\n h('span', { class: 'sr-only' }, props.closeLabel),\n h('i', { class: 'svg-icon ico-popup-close' })\n ])\n ]),\n h('div', { class: 'depth4-body' }, [\n h('h4', { class: 'sub-title' }, linkItem.panelTitle || linkItem.text),\n h(\n 'ul',\n { class: 'depth4-ul' },\n (linkItem.items ?? []).map((depth4Item, depth4Index) =>\n h('li', { key: `depth4-${depth4Index}` }, [\n h(\n 'a',\n {\n href: depth4Item.href || '#',\n ...externalAttrs(depth4Item.external),\n class: { selected: depth4Item.selected },\n onClick: (event: MouseEvent) => handleItemClick(depth4Item, event)\n },\n depth4Item.text\n )\n ])\n )\n )\n ])\n ]\n )\n }\n\n /**\n * 모바일 3depth 목록 렌더링\n */\n const renderDepth3 = (subItem: MainMenuSubItem, index: number, subIndex: number): VNode => {\n const children = (subItem.items ?? []).map((linkItem, linkIndex) => {\n const key = `${index}-${subIndex}-${linkIndex}`\n const withDepth4 = !!linkItem.items?.length\n\n return h('li', { key: `depth3-${linkIndex}` }, [\n h(\n 'a',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setKeyedRef(depth3TriggerEls, el, key),\n href: linkItem.href || '#',\n ...(withDepth4 ? {} : externalAttrs(linkItem.external)),\n class: ['depth3-trigger', { 'has-depth4': withDepth4, selected: linkItem.selected }],\n ...(withDepth4 ? { 'aria-haspopup': 'true', 'aria-expanded': depth4Opened.value === key ? 'true' : 'false' } : {}),\n onClick: (event: MouseEvent) => {\n if (withDepth4) {\n void openDepth4(event, key)\n }\n handleItemClick(linkItem, event)\n }\n },\n linkItem.text\n ),\n withDepth4 ? renderDepth4(linkItem, key) : null\n ])\n })\n\n return h('div', { class: ['depth3-wrap', { 'is-open': depth3Expanded.value[`${index}-${subIndex}`] }] }, [h('ul', {}, children)])\n }\n\n /**\n * 모바일 1depth 패널(`.gnb-sub-list`) 렌더링\n */\n const renderMobilePanel = (item: MainMenuItem, index: number): VNode => {\n const subItems = item.subItems ?? []\n\n const children = subItems.map((subItem, subIndex) => {\n const key = `${index}-${subIndex}`\n const withDepth3 = !!subItem.items?.length\n\n return h('li', { key: `sub-${subIndex}` }, [\n h(\n 'a',\n {\n href: subItem.href || '#',\n ...(withDepth3 ? {} : externalAttrs(subItem.external)),\n class: [\n 'gnb-sub-trigger',\n { 'has-depth3': withDepth3, active: withDepth3 && depth3Expanded.value[key], selected: subItem.selected }\n ],\n ...(withDepth3\n ? { 'aria-controls': depth3Id(index, subIndex), 'aria-expanded': depth3Expanded.value[key] ? 'true' : 'false' }\n : {}),\n onClick: (event: MouseEvent) => {\n if (withDepth3) toggleDepth3(event, key)\n handleItemClick(subItem, event)\n }\n },\n subItem.text\n ),\n withDepth3 ? renderDepth3(subItem, index, subIndex) : null\n ])\n })\n\n return h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setElRef(panelEls, el, index),\n id: panelId(index),\n class: 'gnb-sub-list',\n role: 'tabpanel',\n 'aria-labelledby': tabId(index)\n },\n [h('h2', { class: 'sub-title' }, item.title || item.text), h('ul', {}, children)]\n )\n }\n\n /**\n * 모바일 드로어 렌더링\n */\n const renderMobile = (): VNode => {\n const tabs = props.items.map((item, index) =>\n h('li', { key: `tab-${index}`, role: 'none' }, [\n h(\n 'a',\n {\n id: tabId(index),\n href: `#${panelId(index)}`,\n class: ['gnb-main-trigger', { active: activeTab.value === index }],\n role: 'tab',\n 'aria-controls': panelId(index),\n 'aria-selected': activeTab.value === index ? 'true' : 'false',\n onClick: (event: MouseEvent) => {\n handleTabClick(event, index)\n handleItemClick(item, event)\n }\n },\n item.text\n )\n ])\n )\n\n const bodyChildren: (VNode | null)[] = [\n h('div', { class: 'gnb-menu' }, [\n h('div', { class: 'menu-wrap' }, [h('ul', { role: 'tablist', 'aria-label': props.ariaLabel }, tabs)]),\n h('div', { class: 'submenu-wrap' }, props.items.map(renderMobilePanel))\n ]),\n slots.bottom ? h('div', { class: 'gnb-bottom' }, slots.bottom()) : null\n ]\n\n return h(\n 'div',\n {\n ref: rootRef,\n id: props.mobileId,\n class: ['krds-main-menu-mobile', { 'is-open': drawerOpened.value, 'is-backdrop': drawerOpened.value }],\n style: drawerDisplayed.value ? undefined : { display: 'none' },\n onKeydown: handleMobileKeydown\n },\n [\n h('div', { ref: wrapRef, class: 'gnb-wrap', tabindex: -1 }, [\n h('div', { class: 'gnb-header' }, slots.header ? slots.header() : []),\n h('div', { ref: bodyRef, class: 'gnb-body', onScroll: handleBodyScroll }, bodyChildren),\n h(\n 'button',\n {\n type: 'button',\n id: 'close-nav',\n class: 'krds-btn medium icon',\n onClick: () => emit('update:open', false)\n },\n [h('span', { class: 'sr-only' }, props.closeLabel), h('i', { class: 'svg-icon ico-popup-close' })]\n )\n ])\n ]\n )\n }\n\n return () => (isPc.value ? renderPc() : renderMobile())\n }\n})\n","/**\n * KRDS MainMenu 컴포넌트\n */\n\nimport KrdsMainMenu from './KrdsMainMenu'\nimport type {\n KrdsMainMenuProps,\n KrdsMainMenuEmits,\n MainMenuItem,\n MainMenuSubItem,\n MainMenuLinkItem,\n MainMenuDepth4Item,\n MainMenuAnyItem,\n MainMenuVariant,\n MainMenuLayout\n} from './KrdsMainMenu'\n\nexport { KrdsMainMenu }\nexport type {\n KrdsMainMenuProps,\n KrdsMainMenuEmits,\n MainMenuItem,\n MainMenuSubItem,\n MainMenuLinkItem,\n MainMenuDepth4Item,\n MainMenuAnyItem,\n MainMenuVariant,\n MainMenuLayout\n}\nexport default KrdsMainMenu\n","import {\n Comment,\n Fragment,\n Text,\n computed,\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n type CSSProperties,\n type VNode\n} from 'vue'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 캐러셀 형태\n * - `visual`: 비주얼 배너형 (원본 carousel.html, 이전/다음 버튼이 슬라이드 좌우에 겹쳐 배치)\n * - `banner`: 배너형 (원본 carousel_banner.html, 인디케이터 안에 페이지네이션·재생 제어·내비게이션 배치)\n */\nexport type KrdsCarouselVariant = 'visual' | 'banner'\n\n/**\n * 페이지네이션 표시 방식\n * - `bullets`: 불릿(점) 목록, 클릭으로 이동 가능\n * - `fraction`: `현재 / 전체` 분수 표기\n * - `none`: 표시하지 않음\n */\nexport type KrdsCarouselPaginationType = 'bullets' | 'fraction' | 'none'\n\n/** 프롭 기본값 — props 선언과 setup 양쪽에서 공유한다 */\nconst DEFAULT_SPEED = 400\nconst DEFAULT_AUTOPLAY_DELAY = 2500\nconst VISUAL_SPACE_BETWEEN = 0\nconst BANNER_SPACE_BETWEEN = 16\n\n/**\n * KRDS Carousel 컴포넌트 속성\n */\nexport interface KrdsCarouselProps {\n /** 캐러셀 형태 (기본값: visual) */\n variant?: KrdsCarouselVariant\n /** 현재 슬라이드 인덱스 (v-model:activeIndex) */\n activeIndex?: number\n /** 처음/마지막 슬라이드에서 순환 이동 여부 (기본값: true) */\n loop?: boolean\n /** 자동 재생 여부. true면 재생/정지 버튼을 노출하고 즉시 재생을 시작한다 (기본값: false) */\n autoplay?: boolean\n /** 자동 재생 간격 (ms, 기본값: 2500) */\n autoplayDelay?: number\n /** 마우스 오버 시 자동 재생 일시 정지 여부 (기본값: true). 포커스 진입 시에는 값과 무관하게 항상 정지한다 */\n pauseOnHover?: boolean\n /** 슬라이드 전환 속도 (ms, 기본값: 400) */\n speed?: number\n /** 슬라이드 사이 간격 (px, 기본값: visual 0 / banner 16) */\n spaceBetween?: number\n /** 페이지네이션 표시 방식 (기본값: visual bullets / banner fraction) */\n pagination?: KrdsCarouselPaginationType\n /** 이전/다음 버튼 표시 여부 (기본값: true) */\n navigation?: boolean\n /** 더 보기 링크 URL. 지정하면 더 보기 버튼을 표시한다 */\n moreHref?: string\n /** 캐러셀 영역 접근성 라벨 */\n ariaLabel?: string\n /** 이전 버튼 라벨 */\n prevLabel?: string\n /** 다음 버튼 라벨 */\n nextLabel?: string\n /** 재생 버튼 라벨 */\n playLabel?: string\n /** 정지 버튼 라벨 */\n stopLabel?: string\n /** 더 보기 버튼 라벨 */\n moreLabel?: string\n /** 엘리먼트 ID */\n id?: string\n}\n\n/**\n * KRDS Carousel 컴포넌트 이벤트\n */\nexport interface KrdsCarouselEmits {\n /** 현재 슬라이드 인덱스 업데이트 (v-model:activeIndex) */\n (e: 'update:activeIndex', value: number): void\n /** 슬라이드 변경 완료 */\n (e: 'change', value: number): void\n /** 자동 재생 시작 */\n (e: 'play'): void\n /** 자동 재생 정지 */\n (e: 'stop'): void\n /** 더 보기 클릭 */\n (e: 'more-click', event: MouseEvent): void\n}\n\n/**\n * 슬롯 자식에서 실제 슬라이드가 될 VNode만 골라낸다.\n * v-for/템플릿으로 전달된 Fragment는 펼치고, 주석·공백 텍스트는 제외한다.\n */\nconst flattenSlides = (nodes?: VNode[]): VNode[] => {\n if (!nodes) return []\n\n return nodes.flatMap(node => {\n if (node.type === Fragment) {\n return Array.isArray(node.children) ? flattenSlides(node.children as VNode[]) : []\n }\n if (node.type === Comment) return []\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '') return []\n return [node]\n })\n}\n\nexport default defineComponent({\n name: 'KrdsCarousel',\n props: {\n /** 캐러셀 형태 (기본값: visual) */\n variant: {\n type: String as () => KrdsCarouselVariant,\n default: 'visual'\n },\n /** 현재 슬라이드 인덱스 (v-model:activeIndex) */\n activeIndex: {\n type: Number,\n default: undefined\n },\n /** 처음/마지막 슬라이드에서 순환 이동 여부 (기본값: true) */\n loop: {\n type: Boolean,\n default: true\n },\n /** 자동 재생 여부. true면 재생/정지 버튼을 노출하고 즉시 재생을 시작한다 (기본값: false) */\n autoplay: {\n type: Boolean,\n default: false\n },\n /** 자동 재생 간격 (ms, 기본값: 2500) */\n autoplayDelay: {\n type: Number,\n default: DEFAULT_AUTOPLAY_DELAY\n },\n /** 마우스 오버 시 자동 재생 일시 정지 여부 (기본값: true). 포커스 진입 시에는 값과 무관하게 항상 정지한다 */\n pauseOnHover: {\n type: Boolean,\n default: true\n },\n /** 슬라이드 전환 속도 (ms, 기본값: 400) */\n speed: {\n type: Number,\n default: DEFAULT_SPEED\n },\n /** 슬라이드 사이 간격 (px, 기본값: visual 0 / banner 16) */\n spaceBetween: {\n type: Number,\n default: undefined\n },\n /** 페이지네이션 표시 방식 (기본값: visual bullets / banner fraction) */\n pagination: {\n type: String as () => KrdsCarouselPaginationType,\n default: undefined\n },\n /** 이전/다음 버튼 표시 여부 (기본값: true) */\n navigation: {\n type: Boolean,\n default: true\n },\n /** 더 보기 링크 URL. 지정하면 더 보기 버튼을 표시한다 */\n moreHref: {\n type: String,\n default: undefined\n },\n /** 캐러셀 영역 접근성 라벨 */\n ariaLabel: {\n type: String,\n default: '캐러셀'\n },\n /** 이전 버튼 라벨 */\n prevLabel: {\n type: String,\n default: '이전'\n },\n /** 다음 버튼 라벨 */\n nextLabel: {\n type: String,\n default: '다음'\n },\n /** 재생 버튼 라벨 */\n playLabel: {\n type: String,\n default: '슬라이드 재생'\n },\n /** 정지 버튼 라벨 */\n stopLabel: {\n type: String,\n default: '슬라이드 멈춤'\n },\n /** 더 보기 버튼 라벨 */\n moreLabel: {\n type: String,\n default: '더 보기'\n },\n /** 엘리먼트 ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:activeIndex': (value: number) => true,\n change: (value: number) => true,\n play: () => true,\n stop: () => true,\n 'more-click': (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n const uid = getCurrentInstance()?.uid\n const wrapperId = computed(() => `${props.id ?? `krds-carousel-${uid}`}-wrapper`)\n\n /** 렌더 시점에 갱신되는 슬라이드 개수 — 이벤트 핸들러는 렌더 이후에 실행되므로 반응형일 필요가 없다 */\n let slideCount = 0\n\n const internalIndex = ref(props.activeIndex ?? 0)\n\n // ========================\n // Computed Properties\n // ========================\n\n /** 슬라이드 간격 — 원본 Swiper 옵션(visual 0 / banner 16)을 기본값으로 사용 */\n const spaceBetween = computed(() => props.spaceBetween ?? (props.variant === 'banner' ? BANNER_SPACE_BETWEEN : VISUAL_SPACE_BETWEEN))\n\n /** 페이지네이션 방식 — 원본 Swiper 옵션(visual bullets / banner fraction)을 기본값으로 사용 */\n const paginationType = computed<KrdsCarouselPaginationType>(\n () => props.pagination ?? (props.variant === 'banner' ? 'fraction' : 'bullets')\n )\n\n // ========================\n // 자동 재생\n // ========================\n\n const isPlaying = ref(false)\n const hoverPaused = ref(false)\n const focusPaused = ref(false)\n const isPaused = computed(() => hoverPaused.value || focusPaused.value)\n\n let autoplayTimer: ReturnType<typeof setInterval> | undefined\n\n const clearAutoplayTimer = () => {\n if (autoplayTimer === undefined) return\n clearInterval(autoplayTimer)\n autoplayTimer = undefined\n }\n\n /**\n * 슬라이드 이동\n */\n const goTo = (index: number) => {\n if (slideCount <= 0) return\n\n const next = props.loop ? ((index % slideCount) + slideCount) % slideCount : Math.min(Math.max(index, 0), slideCount - 1)\n\n if (next === internalIndex.value) return\n\n internalIndex.value = next\n emit('update:activeIndex', next)\n emit('change', next)\n }\n\n const goPrev = () => goTo(internalIndex.value - 1)\n const goNext = () => goTo(internalIndex.value + 1)\n\n const startAutoplay = () => {\n if (isPlaying.value) return\n isPlaying.value = true\n emit('play')\n }\n\n const stopAutoplay = () => {\n if (!isPlaying.value) return\n isPlaying.value = false\n emit('stop')\n }\n\n /**\n * 재생 상태·일시 정지 상태에 맞춰 타이머를 동기화한다\n */\n const syncAutoplayTimer = () => {\n clearAutoplayTimer()\n if (!isPlaying.value || isPaused.value) return\n\n autoplayTimer = setInterval(() => {\n // 순환하지 않는 캐러셀은 마지막 슬라이드에서 재생을 종료한다\n if (!props.loop && slideCount > 0 && internalIndex.value >= slideCount - 1) {\n stopAutoplay()\n return\n }\n goNext()\n }, props.autoplayDelay)\n }\n\n watch([isPlaying, isPaused, () => props.autoplayDelay], syncAutoplayTimer)\n\n watch(\n () => props.autoplay,\n value => {\n if (value) {\n startAutoplay()\n } else {\n stopAutoplay()\n }\n }\n )\n\n watch(\n () => props.activeIndex,\n value => {\n if (typeof value !== 'number' || value === internalIndex.value) return\n internalIndex.value = slideCount > 0 ? Math.min(Math.max(value, 0), slideCount - 1) : value\n }\n )\n\n // ========================\n // 모션 최소화 설정\n // ========================\n\n const reducedMotion = ref(false)\n let motionQuery: MediaQueryList | undefined\n\n const handleMotionChange = (event: MediaQueryListEvent) => {\n reducedMotion.value = event.matches\n }\n\n /** 전환 시간 — 모션 최소화 설정에서는 즉시 이동한다 */\n const transitionDuration = computed(() => (reducedMotion.value ? 0 : props.speed))\n\n onMounted(() => {\n if (typeof window !== 'undefined' && window.matchMedia) {\n motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n reducedMotion.value = motionQuery.matches\n motionQuery.addEventListener('change', handleMotionChange)\n }\n\n if (props.autoplay) startAutoplay()\n })\n\n onBeforeUnmount(() => {\n clearAutoplayTimer()\n motionQuery?.removeEventListener('change', handleMotionChange)\n })\n\n // ========================\n // Event Handlers\n // ========================\n\n const handlePointerEnter = () => {\n if (props.pauseOnHover) hoverPaused.value = true\n }\n\n const handlePointerLeave = () => {\n hoverPaused.value = false\n }\n\n const handleFocusIn = () => {\n focusPaused.value = true\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n const root = event.currentTarget as HTMLElement | null\n if (root && root.contains(event.relatedTarget as Node | null)) return\n focusPaused.value = false\n }\n\n const handleMoreClick = (event: MouseEvent) => {\n emit('more-click', event)\n }\n\n // ========================\n // 인라인 스타일\n // ========================\n // 원본은 swiper-bundle.min.css가 제공하는 트랙 레이아웃에 의존하지만\n // 이 라이브러리에는 해당 CSS가 없으므로 최소한의 레이아웃만 인라인으로 지정한다.\n\n const swiperStyle: CSSProperties = {\n position: 'relative',\n overflow: 'hidden',\n width: '100%'\n }\n\n const slideStyle: CSSProperties = {\n flex: '0 0 100%',\n width: '100%'\n }\n\n const buildWrapperStyle = (current: number): CSSProperties => ({\n display: 'flex',\n width: '100%',\n gap: spaceBetween.value > 0 ? `${spaceBetween.value}px` : undefined,\n transform: `translate3d(calc(${-current} * (100% + ${spaceBetween.value}px)), 0, 0)`,\n transitionProperty: 'transform',\n transitionDuration: `${transitionDuration.value}ms`,\n transitionTimingFunction: 'ease-out',\n willChange: 'transform'\n })\n\n /** visual 형태의 이전/다음 버튼은 슬라이드 좌우에 겹쳐 배치된다 */\n const buildOverlayNavStyle = (isPrev: boolean): CSSProperties => ({\n position: 'absolute',\n top: '50%',\n left: isPrev ? '0' : undefined,\n right: isPrev ? undefined : '0',\n transform: 'translateY(-50%)',\n zIndex: 10\n })\n\n // ========================\n // 렌더 함수\n // ========================\n\n /**\n * 슬라이드 렌더링 — 현재 슬라이드 외에는 보조기기·포커스 대상에서 제외한다\n *\n * 원본 마크업(li)의 목록 의미를 유지하기 위해 role=\"group\"으로 덮어쓰지 않고\n * aria-roledescription으로만 슬라이드임을 알린다. li에 role=\"group\"을 지정하면\n * axe(aria-allowed-role)에 위배된다.\n */\n const renderSlides = (slides: VNode[], current: number): VNode[] =>\n slides.map((slide, index) => {\n const isActive = index === current\n\n return h(\n 'li',\n {\n key: slide.key ?? `krds-carousel-slide-${index}`,\n class: ['swiper-slide', { 'swiper-slide-active': isActive }],\n style: slideStyle,\n 'aria-roledescription': 'slide',\n 'aria-label': `${index + 1} / ${slides.length}`,\n 'aria-hidden': isActive ? undefined : 'true',\n inert: isActive ? undefined : true\n },\n [slide]\n )\n })\n\n /**\n * 이전/다음 버튼 렌더링\n */\n const renderNavigationButton = (direction: 'prev' | 'next', current: number, overlay: boolean): VNode => {\n const isPrev = direction === 'prev'\n const disabled = !props.loop && (isPrev ? current <= 0 : current >= slideCount - 1)\n\n return h(\n 'button',\n {\n type: 'button',\n class: [`swiper-button-${direction}`, { 'swiper-button-disabled': disabled }],\n style: overlay ? buildOverlayNavStyle(isPrev) : undefined,\n disabled,\n 'aria-controls': wrapperId.value,\n onClick: isPrev ? goPrev : goNext\n },\n [h('span', { class: 'sr-only' }, isPrev ? props.prevLabel : props.nextLabel)]\n )\n }\n\n /**\n * 더 보기 링크 렌더링\n */\n const renderMoreLink = (): VNode =>\n h(\n 'a',\n {\n href: props.moreHref,\n class: 'swiper-button-more',\n onClick: handleMoreClick\n },\n [h('span', { class: 'sr-only' }, props.moreLabel)]\n )\n\n /**\n * 페이지네이션 렌더링 (불릿 / 분수)\n */\n const renderPagination = (total: number, current: number): VNode => {\n if (paginationType.value === 'fraction') {\n return h('div', { class: 'swiper-pagination swiper-pagination-fraction' }, [\n h('span', { class: 'swiper-pagination-current' }, String(current + 1)),\n h('span', { 'aria-hidden': 'true' }, '/'),\n h('span', { class: 'swiper-pagination-total' }, String(total))\n ])\n }\n\n return h(\n 'div',\n { class: 'swiper-pagination' },\n Array.from({ length: total }, (_, index) =>\n h('button', {\n key: `krds-carousel-bullet-${index}`,\n type: 'button',\n class: ['swiper-pagination-bullet', { 'swiper-pagination-bullet-active': index === current }],\n 'aria-label': `${index + 1}번째 슬라이드로 이동`,\n 'aria-current': index === current ? 'true' : undefined,\n 'aria-controls': wrapperId.value,\n onClick: () => goTo(index)\n })\n )\n )\n }\n\n /**\n * 재생/정지 컨트롤 렌더링 — 원본 스크립트와 같이 현재 상태의 버튼만 노출한다\n */\n const renderController = (): VNode =>\n h('div', { class: 'swiper-controller' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'swiper-button-play',\n style: isPlaying.value ? { display: 'none' } : undefined,\n 'aria-controls': wrapperId.value,\n onClick: startAutoplay\n },\n [h('span', { class: 'sr-only' }, props.playLabel)]\n ),\n h(\n 'button',\n {\n type: 'button',\n class: 'swiper-button-stop',\n style: isPlaying.value ? undefined : { display: 'none' },\n 'aria-controls': wrapperId.value,\n onClick: stopAutoplay\n },\n [h('span', { class: 'sr-only' }, props.stopLabel)]\n )\n ])\n\n /**\n * 인디케이터 영역 렌더링 — 형태에 따라 구성 요소와 배치가 달라진다\n */\n const renderIndicator = (total: number, current: number): VNode | null => {\n const isBanner = props.variant === 'banner'\n const showPagination = paginationType.value !== 'none'\n const showMore = Boolean(props.moreHref)\n const children: (VNode | null)[] = []\n\n if (showPagination) children.push(renderPagination(total, current))\n if (props.autoplay) children.push(renderController())\n\n if (isBanner) {\n const navigationChildren: VNode[] = []\n if (props.navigation) {\n navigationChildren.push(renderNavigationButton('prev', current, false), renderNavigationButton('next', current, false))\n }\n if (showMore) navigationChildren.push(renderMoreLink())\n if (navigationChildren.length > 0) children.push(h('div', { class: 'swiper-navigation' }, navigationChildren))\n } else if (showMore) {\n children.push(renderMoreLink())\n }\n\n if (children.length === 0) return null\n\n return h('div', { class: ['swiper-indicator', { 'text-center': !isBanner }] }, children)\n }\n\n return () => {\n const slides = flattenSlides(slots.default?.())\n const total = slides.length\n slideCount = total\n\n const current = total > 0 ? Math.min(Math.max(internalIndex.value, 0), total - 1) : 0\n const isBanner = props.variant === 'banner'\n\n return h(\n 'div',\n {\n id: props.id,\n class: ['krds-carousel', isBanner ? 'main-d-ban-swiper' : 'vb-swiper'],\n style: { position: 'relative' } as CSSProperties,\n role: 'region',\n 'aria-roledescription': 'carousel',\n 'aria-label': props.ariaLabel,\n onMouseenter: handlePointerEnter,\n onMouseleave: handlePointerLeave,\n onFocusin: handleFocusIn,\n onFocusout: handleFocusOut\n },\n [\n // 슬라이드 트랙\n h(\n 'div',\n {\n class: 'swiper',\n style: swiperStyle,\n 'aria-live': isPlaying.value ? 'off' : 'polite'\n },\n [\n h(\n 'ul',\n {\n id: wrapperId.value,\n class: 'swiper-wrapper',\n style: buildWrapperStyle(current)\n },\n renderSlides(slides, current)\n )\n ]\n ),\n\n // visual 형태의 이전/다음 버튼은 슬라이드 위에 겹쳐 배치한다\n !isBanner && props.navigation && total > 0 ? renderNavigationButton('prev', current, true) : null,\n !isBanner && props.navigation && total > 0 ? renderNavigationButton('next', current, true) : null,\n\n // 인디케이터 (페이지네이션 / 재생 제어 / 내비게이션 / 더 보기)\n total > 0 ? renderIndicator(total, current) : null\n ]\n )\n }\n }\n})\n","/**\n * KRDS Carousel 컴포넌트\n */\n\nimport KrdsCarousel from './KrdsCarousel'\nimport type { KrdsCarouselProps, KrdsCarouselEmits, KrdsCarouselVariant, KrdsCarouselPaginationType } from './KrdsCarousel'\n\nexport { KrdsCarousel }\nexport type { KrdsCarouselProps, KrdsCarouselEmits, KrdsCarouselVariant, KrdsCarouselPaginationType }\nexport default KrdsCarousel\n","import { computed, defineComponent, h, ref, useId } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Tabs 탭 아이템\n */\nexport interface KrdsTabItem {\n /** 탭 고유 식별자 (패널 슬롯 이름으로 사용) */\n id: string\n /** 탭 버튼 레이블 */\n label: string\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * 탭 스타일 변형 (line: 라인형, fill: 버튼형)\n */\nexport type KrdsTabsVariant = 'line' | 'fill'\n\n/**\n * KRDS Tabs 컴포넌트 속성\n */\nexport interface KrdsTabsProps extends BaseComponentProps {\n /** 탭 아이템 목록 */\n tabs: KrdsTabItem[]\n /** 활성 탭 id (v-model) */\n modelValue?: string\n /** 탭 스타일 변형 */\n variant?: KrdsTabsVariant\n /** 풀사이즈 레이아웃 여부 */\n full?: boolean\n /** 선택된 탭의 스크린 리더 대체 텍스트 */\n selectedText?: string\n}\n\n/**\n * KRDS Tabs 컴포넌트 이벤트\n */\nexport interface KrdsTabsEmits {\n (e: 'update:modelValue', id: string): void\n (e: 'change', id: string): void\n}\n\nexport default defineComponent({\n name: 'KrdsTabs',\n props: {\n /** 탭 아이템 목록 */\n tabs: {\n type: Array as PropType<KrdsTabItem[]>,\n required: true\n },\n /** 활성 탭 id (v-model) */\n modelValue: {\n type: String,\n default: undefined\n },\n /** 탭 스타일 변형 */\n variant: {\n type: String as PropType<KrdsTabsVariant>,\n default: 'line'\n },\n /** 풀사이즈 레이아웃 여부 */\n full: {\n type: Boolean,\n default: false\n },\n /** 선택된 탭의 스크린 리더 대체 텍스트 */\n selectedText: {\n type: String,\n default: '선택됨'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (id: string) => true,\n change: (id: string) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n /**\n * 컴포넌트 고유 ID (탭-패널 ARIA 연결용)\n */\n const uid = useId()\n const tabId = (id: string): string => `tab-${uid}-${id}`\n const panelId = (id: string): string => `panel-${uid}-${id}`\n\n /**\n * 비제어 모드에서 사용하는 내부 활성 탭 상태\n */\n const internalActiveId = ref(props.tabs.find(tab => !tab.disabled)?.id)\n\n /**\n * 현재 활성 탭 id (modelValue 우선)\n */\n const activeId = computed(() => props.modelValue ?? internalActiveId.value)\n\n const selectTab = (tab: KrdsTabItem): void => {\n if (tab.disabled || tab.id === activeId.value) return\n internalActiveId.value = tab.id\n emit('update:modelValue', tab.id)\n emit('change', tab.id)\n }\n\n /**\n * 좌우 방향키로 탭 버튼 간 초점 이동 (원본 krds_tab 키보드 동작)\n */\n const handleKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') return\n event.preventDefault()\n const currentTab = event.currentTarget as HTMLElement\n const sibling = event.key === 'ArrowRight' ? currentTab.nextElementSibling : currentTab.previousElementSibling\n sibling?.querySelector('button')?.focus()\n }\n\n return () =>\n h('div', { class: ['krds-tab-area', 'layer', props.class] }, [\n // 탭 목록\n h('div', { class: ['tab', props.variant, { full: props.full }] }, [\n h(\n 'ul',\n { role: 'tablist' },\n props.tabs.map(tab =>\n h(\n 'li',\n {\n key: tab.id,\n id: tabId(tab.id),\n role: 'tab',\n 'aria-selected': tab.id === activeId.value,\n 'aria-controls': panelId(tab.id),\n class: { active: tab.id === activeId.value },\n onKeydown: handleKeydown\n },\n [\n h(\n 'button',\n {\n type: 'button',\n class: 'btn-tab',\n disabled: tab.disabled || undefined,\n onClick: () => selectTab(tab)\n },\n [tab.label, tab.id === activeId.value ? h('i', { class: 'sr-only' }, ` ${props.selectedText}`) : null]\n )\n ]\n )\n )\n )\n ]),\n // 탭 콘텐츠\n h(\n 'div',\n { class: 'tab-conts-wrap' },\n props.tabs.map(tab =>\n h(\n 'section',\n {\n key: tab.id,\n id: panelId(tab.id),\n role: 'tabpanel',\n 'aria-labelledby': tabId(tab.id),\n class: ['tab-conts', { active: tab.id === activeId.value }]\n },\n slots[tab.id]?.()\n )\n )\n )\n ])\n }\n})\n","/**\n * KRDS Tabs 컴포넌트\n */\n\nimport KrdsTabs from './KrdsTabs'\nimport type { KrdsTabsProps, KrdsTabsEmits, KrdsTabItem, KrdsTabsVariant } from './KrdsTabs'\n\nexport { KrdsTabs }\nexport type { KrdsTabsProps, KrdsTabsEmits, KrdsTabItem, KrdsTabsVariant }\nexport default KrdsTabs\n","/**\n * KRDS Vue 컴포넌트 진입점\n */\n\n// Button 컴포넌트\nexport { default as KrdsButton } from './KrdsButton'\nexport type { KrdsButtonProps, KrdsButtonEmits } from './KrdsButton'\n\n// ButtonGroup 컴포넌트\nexport { default as KrdsButtonGroup } from './KrdsButtonGroup'\nexport type { KrdsButtonGroupProps } from './KrdsButtonGroup'\n\n// Icon 컴포넌트\nexport { default as KrdsIcon } from './KrdsIcon'\nexport type { KrdsIconProps } from './KrdsIcon'\n\n// Link 컴포넌트\nexport { default as KrdsLink } from './KrdsLink'\nexport type { KrdsLinkProps, KrdsLinkEmits, KrdsLinkSize } from './KrdsLink'\n\n// Input 컴포넌트\nexport { default as KrdsInput } from './KrdsInput'\nexport type { KrdsInputProps, KrdsInputEmits } from './KrdsInput'\n\n// FormLabel 컴포넌트\nexport { default as KrdsFormLabel } from './KrdsFormLabel'\nexport type { KrdsFormLabelProps, KrdsFormLabelEmits } from './KrdsFormLabel'\n\n// FormHint 컴포넌트\nexport { default as KrdsFormHint } from './KrdsFormHint'\nexport type { KrdsFormHintProps, KrdsFormHintEmits } from './KrdsFormHint'\n\n// FormGroup 컴포넌트\nexport { default as KrdsFormGroup } from './KrdsFormGroup'\nexport type { KrdsFormGroupProps } from './KrdsFormGroup'\n\n// DateInput 컴포넌트\nexport { default as KrdsDateInput } from './KrdsDateInput'\nexport type { KrdsDateInputProps, KrdsDateInputEmits } from './KrdsDateInput'\n\n// Textarea 컴포넌트\nexport { default as KrdsTextarea } from './KrdsTextarea'\nexport type { KrdsTextareaProps, KrdsTextareaEmits } from './KrdsTextarea'\n\n// Select 컴포넌트\nexport { default as KrdsSelect } from './KrdsSelect'\nexport type { KrdsSelectProps, KrdsSelectEmits, SelectOption } from './KrdsSelect'\n\n// FileUpload 컴포넌트\nexport { default as KrdsFileUpload } from './KrdsFileUpload'\nexport type { KrdsFileUploadProps, KrdsFileUploadEmits, FileInfo } from './KrdsFileUpload'\n\n// Badge 컴포넌트\nexport { default as KrdsBadge } from './KrdsBadge'\nexport type { KrdsBadgeProps, KrdsBadgeEmits } from './KrdsBadge'\n\n// Tag 컴포넌트\nexport { default as KrdsTag } from './KrdsTag'\nexport type { KrdsTagProps, KrdsTagEmits } from './KrdsTag'\n\n// TagGroup 컴포넌트\nexport { default as KrdsTagGroup } from './KrdsTagGroup'\nexport type { KrdsTagGroupProps, KrdsTagGroupSize } from './KrdsTagGroup'\n\n// Masthead 컴포넌트\nexport { default as KrdsMasthead } from './KrdsMasthead'\nexport type { KrdsMastheadProps, KrdsMastheadEmits } from './KrdsMasthead'\n\n// ToggleSwitch 컴포넌트\nexport { default as KrdsToggleSwitch } from './KrdsToggleSwitch'\nexport type { KrdsToggleSwitchProps, KrdsToggleSwitchEmits } from './KrdsToggleSwitch'\n\n// CheckArea 컴포넌트\nexport { default as KrdsCheckArea } from './KrdsCheckArea'\nexport type { KrdsCheckAreaProps } from './KrdsCheckArea'\n\n// Checkbox 컴포넌트\nexport { default as KrdsCheckbox } from './KrdsCheckbox'\nexport type { KrdsCheckboxProps, KrdsCheckboxEmits } from './KrdsCheckbox'\n\n// Radio 컴포넌트\nexport { default as KrdsRadio } from './KrdsRadio'\nexport type { KrdsRadioProps, KrdsRadioEmits } from './KrdsRadio'\n\n// Spinner 컴포넌트\nexport { default as KrdsSpinner } from './KrdsSpinner'\n\n// StepIndicator 컴포넌트\nexport { default as KrdsStepIndicator } from './KrdsStepIndicator'\nexport type { KrdsStepIndicatorProps, KrdsStepIndicatorEmits } from './KrdsStepIndicator'\n\n// Step 컴포넌트\nexport { default as KrdsStep } from './KrdsStep'\nexport type { KrdsStepProps, KrdsStepEmits } from './KrdsStep'\n\n// SkipLink 컴포넌트\nexport { default as KrdsSkipLink } from './KrdsSkipLink'\nexport type { KrdsSkipLinkProps } from './KrdsSkipLink'\n\n// Breadcrumb 컴포넌트\nexport { default as KrdsBreadcrumb } from './KrdsBreadcrumb'\nexport type { KrdsBreadcrumbProps, KrdsBreadcrumbEmits, BreadcrumbItem } from './KrdsBreadcrumb'\n\n// InPageNavigation 컴포넌트\nexport { default as KrdsInPageNavigation } from './KrdsInPageNavigation'\nexport type { KrdsInPageNavigationProps, KrdsInPageNavigationEmits, NavigationItem } from './KrdsInPageNavigation'\n\n// Pagination 컴포넌트\nexport { default as KrdsPagination } from './KrdsPagination'\nexport type { KrdsPaginationProps, KrdsPaginationEmits } from './KrdsPagination'\n\n// Panel 컴포넌트\nexport { default as KrdsPanel } from './KrdsPanel'\nexport type { KrdsPanelProps, KrdsPanelEmits } from './KrdsPanel'\n\n// ContextualHelp 컴포넌트\nexport { default as KrdsContextualHelp } from './KrdsContextualHelp'\nexport type { KrdsContextualHelpProps } from './KrdsContextualHelp'\n\n// CoachMark 컴포넌트\nexport { default as KrdsCoachMark } from './KrdsCoachMark'\nexport type { KrdsCoachMarkProps, KrdsCoachMarkEmits } from './KrdsCoachMark'\n\n// Tooltip 컴포넌트\nexport { default as KrdsTooltip } from './KrdsTooltip'\nexport type { KrdsTooltipProps } from './KrdsTooltip'\n\n// LanguageSwitcher 컴포넌트\nexport { default as KrdsLanguageSwitcher } from './KrdsLanguageSwitcher'\nexport type { KrdsLanguageSwitcherProps, KrdsLanguageSwitcherEmits, DropdownPosition } from './KrdsLanguageSwitcher'\n\n// Resize 컴포넌트\nexport { default as KrdsResize } from './KrdsResize'\nexport type { KrdsResizeEmits } from './KrdsResize'\n\n// Modal 컴포넌트\nexport { default as KrdsModal } from './KrdsModal'\nexport type { KrdsModalProps, KrdsModalSize } from './KrdsModal'\n\n// AccordionGroup 컴포넌트\nexport { default as KrdsAccordionGroup } from './KrdsAccordionGroup'\nexport type { KrdsAccordionGroupProps } from './KrdsAccordionGroup'\n\n// AccordionItem 컴포넌트\nexport { default as KrdsAccordionItem } from './KrdsAccordionItem'\nexport type { KrdsAccordionItemProps, KrdsAccordionItemEmits } from './KrdsAccordionItem'\n\n// Tts 컴포넌트\nexport { default as KrdsTts } from './KrdsTts'\nexport type { KrdsTtsProps, KrdsTtsEmits, TtsSize, TtsIcon } from './KrdsTts'\n\n// Table 컴포넌트\nexport { default as KrdsTable } from './KrdsTable'\nexport type { KrdsTableProps, KrdsTableEmits, TableColumn, TableRow } from './KrdsTable'\n\n// Header 컴포넌트\nexport { default as KrdsHeader } from './KrdsHeader'\nexport type { KrdsHeaderProps } from './KrdsHeader'\n\n// Footer 컴포넌트\nexport { default as KrdsFooter } from './KrdsFooter'\nexport type { KrdsFooterProps } from './KrdsFooter'\n\n// Disclosure 컴포넌트\nexport { default as KrdsDisclosure } from './KrdsDisclosure'\nexport type { KrdsDisclosureProps, KrdsDisclosureEmits } from './KrdsDisclosure'\n\n// Identifier 컴포넌트\nexport { default as KrdsIdentifier } from './KrdsIdentifier'\nexport type { KrdsIdentifierProps, KrdsIdentifierEmits } from './KrdsIdentifier'\n\n// Layout 컴포넌트\nexport { default as KrdsLayout } from './KrdsLayout'\nexport type { KrdsLayoutProps, KrdsLayoutEmits, ScrollDetails, LayoutSize } from './KrdsLayout'\n\n// SideNavigation 컴포넌트\nexport { default as KrdsSideNavigation } from './KrdsSideNavigation'\nexport type { KrdsSideNavigationProps, KrdsSideNavigationEmits, SideNavItem, SideNavSubItem, SideNavPopupItem } from './KrdsSideNavigation'\n\n// StructuredList 컴포넌트\nexport { default as KrdsStructuredList } from './KrdsStructuredList'\nexport type { KrdsStructuredListProps } from './KrdsStructuredList'\n\n// TextList 컴포넌트\nexport { default as KrdsTextList } from './KrdsTextList'\nexport type { KrdsTextListProps } from './KrdsTextList'\n\n// CriticalAlerts 컴포넌트\nexport { default as KrdsCriticalAlerts } from './KrdsCriticalAlerts'\nexport type { KrdsCriticalAlertsProps, KrdsCriticalAlertsEmits, AlertType } from './KrdsCriticalAlerts'\n\n// MainMenu 컴포넌트\nexport { default as KrdsMainMenu } from './KrdsMainMenu'\nexport type {\n KrdsMainMenuProps,\n KrdsMainMenuEmits,\n MainMenuItem,\n MainMenuSubItem,\n MainMenuLinkItem,\n MainMenuDepth4Item,\n MainMenuAnyItem,\n MainMenuVariant,\n MainMenuLayout\n} from './KrdsMainMenu'\n\n// Carousel 컴포넌트\nexport { default as KrdsCarousel } from './KrdsCarousel'\nexport type { KrdsCarouselProps, KrdsCarouselEmits, KrdsCarouselVariant, KrdsCarouselPaginationType } from './KrdsCarousel'\n\n// Tabs 컴포넌트\nexport { default as KrdsTabs } from './KrdsTabs'\nexport type { KrdsTabsProps, KrdsTabsEmits, KrdsTabItem, KrdsTabsVariant } from './KrdsTabs'\n","/**\n * KRDS Vue 디자인 시스템\n * 대한민국 정부 표준 디자인 시스템 Vue 3 구현체\n *\n * @packageDocumentation\n */\n\nimport type { App, Plugin } from 'vue'\n\ndeclare const __KRDS_VERSION__: string\n\nconst krdsVersion = __KRDS_VERSION__\n\n// 컴포넌트 imports\nimport * as components from './components'\n\n// 디렉티브 imports\nimport { installDirectives } 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 installDirectives(app)\n\n // 전역 속성 추가\n app.config.globalProperties.$krds = {\n version: krdsVersion\n }\n\n // 개발 모드에서 설치 로그\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.log(`[KRDS Vue] v${krdsVersion} 설치 완료 - 컴포넌트: ${componentsToInstall.length}개`)\n }\n }\n}\n\nexport default KrdsVue\n\n// 버전 정보\nexport const version = krdsVersion\n"],"mappings":"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"}
1
+ {"version":3,"file":"krds-vue.es.js","names":["KrdsButton","KrdsSpinner","KrdsInput","KrdsFormLabel","KrdsFormHint","KrdsFormGroup","KrdsButton","KrdsDateInput","KrdsTextarea","KrdsSelect","KrdsFileUpload","KrdsBadge","KrdsTag","KrdsTagGroup","KrdsMasthead","KrdsToggleSwitch","KrdsCheckArea","KrdsCheckbox","KrdsRadio","KrdsSpinner","KrdsStepIndicator","KrdsStep","KrdsSkipLink","KrdsBreadcrumb","KrdsInPageNavigation","KrdsPagination","KrdsPanel","KrdsContextualHelp","KrdsCoachMark","KrdsTooltip","KrdsLanguageSwitcher","KrdsResize","KrdsModal","KrdsAccordionGroup","KrdsAccordionItem","KrdsTts","KrdsTable","KrdsHeader","KrdsFooter","KrdsDisclosure","KrdsIdentifier","KrdsLayout","KrdsSideNavigation","KrdsStructuredList","KrdsTextList","KrdsCriticalAlerts","KrdsMainMenu","KrdsCarousel","KrdsTabs","components","Comment","Fragment","Teleport","Text","computed","defineComponent","getCurrentInstance","h","inject","nextTick","onBeforeUnmount","onMounted","onUnmounted","provide","ref","useId","vShow","watch","withDirectives","withModifiers","__defProp","__exportAll","all","no_symbols","target","name","KrdsButton_default$1","event","props","emit","slots","buttonClasses","classes","handleClick","KrdsButton_default","KrdsButtonGroup_default","_","KrdsIcon_default","KrdsLink_default","linkClasses","linkAttributes","attrs","KrdsSpinner_default$1","children","KrdsInput_default$1","value","inputClasses","handleInput","handleChange","handleFocus","handleBlur","handleKeydown","handleKeyup","inputProps","formContsClasses","classList","KrdsInput_default","KrdsFormLabel_default$1","KrdsFormLabel_default","KrdsFormHint_default$1","baseClass","KrdsFormHint_default","KrdsFormGroup_default$1","KrdsFormGroup_default","useDatePicker","initialYear","initialMonth","today","currentYear","currentMonth","selectedStartDate","selectedEndDate","activeDateSelector","yearOptions","currentYearValue","years","i","monthOptions","clearDateSelection","prevMonth","nextMonth","handleDateSelection","dateString","isSingle","startDate","todayString","isStart","currentDate","endDate","isEnd","useClickOutside","targetRef","callback","options","globalClickHandler","ignore","setupGlobalListeners","e","removeGlobalListeners","eventType","WEEKDAY_LABELS","openCalendars","KrdsDateInput_default$1","datePickerAreaRef","datePickerButtonRef","isCalendarOpen","activeDropdown","openUpward","teleportStyle","isMounted","updateTeleportPosition","rect","updatePlacement","calendarWrap","spaceAbove","spaceBelow","togglePositionListeners","enabled","method","isOpen","selectToday","isDateInSelectedRange","closeAllDatePickers","calendarAreaClasses","calendarGrid","year","month","firstDate","weeks","week","days","day","dayOfWeek","getCellClasses","rangeInfo","actionButtons","confirmSelection","focusSwitchButton","type","toggleDropdown","selectYear","selectMonth","openDatePicker","close","handleDatePickerToggle","renderSwitchDropdown","isYear","currentValue","format","option","renderCalendarTable","label","weekIndex","dayIndex","action","KrdsDateInput_default","KrdsTextarea_default$1","currentLength","newValue","textareaClasses","textareaStyles","styles","textareaProps","textareaWrapClasses","countDisplay","KrdsTextarea_default","KrdsSelect_default$1","selectClasses","selectProps","renderOptions","optionElements","selectElement","KrdsSelect_default","uid","KrdsFileUpload_default$1","files","file","fileId","error","progress","isDragOver","inputRef","inputId","formatFileSize","bytes","getFileExtension","parts","formatFileName","ext","nameWithoutExt","generateId","validateFile","accepted","t","mime","addFiles","fileList","currentFiles","newFiles","validCount","f","fileInfo","onFileChange","input","onDragOver","onDragLeave","onDrop","triggerFileSelect","removeFile","clearAll","rootClasses","renderFileHead","renderUploadArea","renderBtnWrap","renderFileItem","liChildren","hintContent","part","renderFileList","KrdsFileUpload_default","KrdsBadge_default$1","KrdsBadge_default","KrdsTag_default$1","tagClasses","handleDelete","renderDeleteButton","content","slotContent","linkAttrs","KrdsTag_default","KrdsTagGroup_default$1","tagGroupClasses","KrdsTagGroup_default","KrdsMasthead_default$1","mastheadClasses","KrdsMasthead_default","idCounter","prefix","generateUid","classNames","KrdsToggleSwitch_default$1","generatedInputId","isChecked","containerClasses","handleToggle","KrdsToggleSwitch_default","KrdsCheckArea_default$1","KrdsCheckArea_default","KrdsCheckbox_default$1","KrdsCheckbox_default","KrdsRadio_default$1","inputName","KrdsRadio_default","KrdsSpinner_default","KrdsStepIndicator_default$1","stepperClasses","getStepStatus","index","currentStep","stepIndex","resetStepIndex","getNextStepIndex","KrdsStepIndicator_default","KrdsStep_default$1","step","stepIndicatorContext","stepStatus","stepClasses","isActive","KrdsStep_default","KrdsSkipLink_default$1","link","KrdsSkipLink_default","KrdsBreadcrumb_default$1","item","isCurrentPage","isHome","KrdsBreadcrumb_default","KrdsInPageNavigation_default$1","activeItem","sectionElements","calculateHeaderHeight","headerTopSelector","headerInnerSelector","handleItemClick","targetElement","headerHeight","focusable","cacheSectionElements","element","updateActiveItem","winHeight","topHeight","scrollBottom","scrollHeight","sections","firstSection","lastSection","firstSecTop","newActiveItem","section","sectionHeight","sectionTop","initActiveItem","activeFromProps","observer","renderHeader","renderNavList","listItems","renderAction","KrdsInPageNavigation_default","vSrOnly","el","binding","installDirectives","app","DEFAULT_MIN","DEFAULT_PAGE_RANGE","KrdsPagination_default$1","minPage","currentPage","prevDisabled","nextDisabled","prevHref","nextHref","displayedPages","totalPages","pageRange","boundaryRange","pages","leftBoundary","rightBoundary","rangeStart","rangeEnd","adjustedRangeStart","startPage","endPage","handlePageClick","page","handlePrevClick","handleNextClick","renderPageItem","isCurrent","KrdsPagination_default","KrdsPanel_default$1","open","handleOpen","handleClose","KrdsPanel_default","KrdsContextualHelp_default$1","containerRef","tooltipBtnRef","tooltipPopoverRef","closeBtnRef","isVisible","toggleTooltip","wasVisible","closeAllTooltips","showTooltip","adjustTooltipPosition","closeTooltip","allPopovers","allButtons","popover","button","isMobile","tooltipAction","contentsPaddingX","offsetLeft","width","handleOutsideClick","handleResize","KrdsContextualHelp_default","KrdsCoachMark_default$1","currentStepData","prevStep","nextStep","closeCoachMark","renderBalloon","KrdsCoachMark_default","KrdsTooltip_default$1","popoverRef","isTooltipVisible","popoverStyle","popoverId","tooltipClasses","popoverClasses","buttonText","checkIsMobile","calculateTooltipPosition","tooltipGap","tooltipHeight","tooltipWidth","itemTop","itemLeft","itemRight","itemHeight","itemWidth","halfWindowWidth","halfWindowHeight","tooltipTop","tooltipLeft","mobileSmall","hideTooltip","handleScroll","KrdsTooltip_default","KrdsLanguageSwitcher_default$1","dropdownRef","buttonRef","positionDropdown","closeDropdown","selectLanguage","languageCode","menu","menuRect","windowWidth","handleClickOutside","handleFocusOut","handleItemFocus","currentItem","isDropdownOpen","renderDefaultList","language","renderExternalList","KrdsLanguageSwitcher_default","KrdsResize_default$1","_props","selectedSize","scaleList","selectSize","scale","resetSize","defaultScale","KrdsResize_default","KrdsModal_default$1","computedModalId","titleId","sizeClass","originalOverflow","previousActiveElement","modalRef","getFocusableElements","trapFocus","focusableElements","firstElement","lastElement","cleanupEffects","applyEffects","modalElement","modalConts","modalAttrs","KrdsModal_default","KrdsAccordionGroup_default$1","accordionGroupClasses","KrdsAccordionGroup_default","KrdsAccordionItem_default$1","id","openToggle","KrdsAccordionItem_default","KrdsTts_default$1","text","isPlaying","utterance","stopSpeech","toggleTts","currentIcon","KrdsTts_default","KrdsTable_default$1","row","instance","tableClasses","wrapperClasses","getHeaderStyle","column","getHeaderClasses","getCellStyle","columnClasses","renderColgroup","widthMatch","headerCells","headerStyle","headerClasses","getCellValue","renderBody","vnodeProps","clickable","bodyRows","cells","colIndex","cellValue","cellContent","cellStyle","cellClasses","handleRowClick","handleRowKeydown","KrdsTable_default","KrdsHeader_default$1","headerInChildren","innerChildren","KrdsHeader_default","KrdsFooter_default$1","footerClasses","renderTop","renderLogo","renderContent","renderBottom","top","logo","bottom","KrdsFooter_default","KrdsDisclosure_default$1","contentId","isExpanded","KrdsDisclosure_default","KrdsIdentifier_default$1","identifierClasses","KrdsIdentifier_default","SCROLL_OFFSET_THRESHOLD","KrdsLayout_default$1","_size","_details","_height","scrollY","scrollH","lastScrollY","scrollDirection","wrapElement","resizeObserver","updateScrollValues","prevScrollHeight","handleScrollDirection","container","containerOffsetTop","currentScrollY","isScrollingDown","isScrollingUp","entries","entry","height","KrdsLayout_default","KrdsSideNavigation_default$1","modelValue","popupTriggerRefs","popupRefs","popupTitleRefs","lastClickedPopupButton","setPopupTriggerRef","parentIndex","subIndex","key","setPopupRef","setPopupTitleRef","toggleSubmenu","idx","wasExpanded","updatedItem","subItem","togglePopup","subIdx","updatedSubItem","popupElement","titleButton","closePopup","buttonToFocus","handlePopupFocusOut","handlePopupTitleClick","renderPopupItems","items","popupItem","popupIndex","renderSubItems","subItems","renderMenuItems","KrdsSideNavigation_default","KrdsStructuredList_default$1","cardTop","cardBody","cardBtm","cardBtn","structuredItem","KrdsStructuredList_default","KrdsTextList_default$1","KrdsTextList_default","KrdsCriticalAlerts_default$1","getBadgeText","handleLinkClick","KrdsCriticalAlerts_default","NEW_WINDOW_TITLE","DRAWER_OPEN_DELAY","DRAWER_CLOSE_DELAY","FOCUSABLE_SELECTOR","KrdsMainMenu_default$1","expanded","mouseEvent","rootRef","wrapRef","bodyRef","isPc","panelId","subPanelId","tabId","depth3Id","hasSubColumns","hasSingleList","hasPanel","isSubLink","externalAttrs","external","openIndex","subOverrides","panelMinHeight","mainListEls","mainTriggerEls","setElRef","map","defaultSubIndex","activeSubIndex","override","setPcBodyState","needsScroll","adjustPanelHeight","activeSubList","closeMainMenu","restoreFocus","closedIndex","toggleMainMenu","selectSubMenu","handleDocumentClick","root","handlePcFocusout","nextTarget","handlePcKeydown","focusSibling","direction","listItem","activeTab","depth3Expanded","depth4Displayed","depth4Opened","drawerDisplayed","drawerOpened","panelEls","depth3TriggerEls","depth4Els","depth4PrevEls","setKeyedRef","openTimer","closeTimer","setMobileBodyState","focusDrawer","openDrawer","closeDrawer","handleTabClick","body","panel","handleBodyScroll","scrollTop","clientHeight","nextActive","toggleDepth3","openDepth4","closeDepth4","first","last","active","handleMobileKeydown","initialExpanded","renderPcLinkList","linkItems","isDescription","linkItem","linkIndex","icon","tag","renderPcSubList","titleChildren","renderPcSubItems","banner","renderPcPanel","withColumns","mainListChildren","renderPc","menuItems","withPanel","trigger","backdrop","renderDepth4","closeDepth4Panel","depth4Item","depth4Index","renderDepth3","withDepth4","renderMobilePanel","withDepth3","renderMobile","tabs","bodyChildren","KrdsMainMenu_default","DEFAULT_SPEED","DEFAULT_AUTOPLAY_DELAY","VISUAL_SPACE_BETWEEN","BANNER_SPACE_BETWEEN","flattenSlides","nodes","node","KrdsCarousel_default$1","wrapperId","slideCount","internalIndex","spaceBetween","paginationType","hoverPaused","focusPaused","isPaused","autoplayTimer","clearAutoplayTimer","goTo","next","goPrev","goNext","startAutoplay","stopAutoplay","reducedMotion","motionQuery","handleMotionChange","transitionDuration","handlePointerEnter","handlePointerLeave","handleFocusIn","handleMoreClick","swiperStyle","slideStyle","buildWrapperStyle","current","buildOverlayNavStyle","isPrev","renderSlides","slides","slide","renderNavigationButton","overlay","disabled","renderMoreLink","renderPagination","total","renderController","renderIndicator","isBanner","showPagination","showMore","navigationChildren","KrdsCarousel_default","KrdsTabs_default$1","internalActiveId","tab","activeId","selectTab","currentTab","KrdsTabs_default","components_exports","krdsVersion","KrdsVue","componentName","component","version"],"sources":["../src/components/KrdsButton/KrdsButton.ts","../src/components/KrdsButton/index.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/KrdsInput/index.ts","../src/components/KrdsFormLabel/KrdsFormLabel.ts","../src/components/KrdsFormLabel/index.ts","../src/components/KrdsFormHint/KrdsFormHint.ts","../src/components/KrdsFormHint/index.ts","../src/components/KrdsFormGroup/KrdsFormGroup.ts","../src/components/KrdsFormGroup/index.ts","../src/composables/useDatePicker.ts","../src/composables/useClickOutside.ts","../src/components/KrdsDateInput/KrdsDateInput.ts","../src/components/KrdsDateInput/index.ts","../src/components/KrdsTextarea/KrdsTextarea.ts","../src/components/KrdsTextarea/index.ts","../src/components/KrdsSelect/KrdsSelect.ts","../src/components/KrdsSelect/index.ts","../src/components/KrdsFileUpload/KrdsFileUpload.ts","../src/components/KrdsFileUpload/index.ts","../src/components/KrdsBadge/KrdsBadge.ts","../src/components/KrdsBadge/index.ts","../src/components/KrdsTag/KrdsTag.ts","../src/components/KrdsTag/index.ts","../src/components/KrdsTagGroup/KrdsTagGroup.ts","../src/components/KrdsTagGroup/index.ts","../src/components/KrdsMasthead/KrdsMasthead.ts","../src/components/KrdsMasthead/index.ts","../src/utils/index.ts","../src/components/KrdsToggleSwitch/KrdsToggleSwitch.ts","../src/components/KrdsToggleSwitch/index.ts","../src/components/KrdsCheckArea/KrdsCheckArea.ts","../src/components/KrdsCheckArea/index.ts","../src/components/KrdsCheckbox/KrdsCheckbox.ts","../src/components/KrdsCheckbox/index.ts","../src/components/KrdsRadio/KrdsRadio.ts","../src/components/KrdsRadio/index.ts","../src/components/KrdsSpinner/index.ts","../src/components/KrdsStepIndicator/KrdsStepIndicator.ts","../src/components/KrdsStepIndicator/index.ts","../src/components/KrdsStep/KrdsStep.ts","../src/components/KrdsStep/index.ts","../src/components/KrdsSkipLink/KrdsSkipLink.ts","../src/components/KrdsSkipLink/index.ts","../src/components/KrdsBreadcrumb/KrdsBreadcrumb.ts","../src/components/KrdsBreadcrumb/index.ts","../src/components/KrdsInPageNavigation/KrdsInPageNavigation.ts","../src/components/KrdsInPageNavigation/index.ts","../src/directives/vSrOnly.ts","../src/directives/index.ts","../src/components/KrdsPagination/KrdsPagination.ts","../src/components/KrdsPagination/index.ts","../src/components/KrdsPanel/KrdsPanel.ts","../src/components/KrdsPanel/index.ts","../src/components/KrdsContextualHelp/KrdsContextualHelp.ts","../src/components/KrdsContextualHelp/index.ts","../src/components/KrdsCoachMark/KrdsCoachMark.ts","../src/components/KrdsCoachMark/index.ts","../src/components/KrdsTooltip/KrdsTooltip.ts","../src/components/KrdsTooltip/index.ts","../src/components/KrdsLanguageSwitcher/KrdsLanguageSwitcher.ts","../src/components/KrdsLanguageSwitcher/index.ts","../src/components/KrdsResize/KrdsResize.ts","../src/components/KrdsResize/index.ts","../src/components/KrdsModal/KrdsModal.ts","../src/components/KrdsModal/index.ts","../src/components/KrdsAccordionGroup/KrdsAccordionGroup.ts","../src/components/KrdsAccordionGroup/index.ts","../src/components/KrdsAccordionItem/KrdsAccordionItem.ts","../src/components/KrdsAccordionItem/index.ts","../src/components/KrdsTts/KrdsTts.ts","../src/components/KrdsTts/index.ts","../src/components/KrdsTable/KrdsTable.ts","../src/components/KrdsTable/index.ts","../src/components/KrdsHeader/KrdsHeader.ts","../src/components/KrdsHeader/index.ts","../src/components/KrdsFooter/KrdsFooter.ts","../src/components/KrdsFooter/index.ts","../src/components/KrdsDisclosure/KrdsDisclosure.ts","../src/components/KrdsDisclosure/index.ts","../src/components/KrdsIdentifier/KrdsIdentifier.ts","../src/components/KrdsIdentifier/index.ts","../src/components/KrdsLayout/KrdsLayout.ts","../src/components/KrdsLayout/index.ts","../src/components/KrdsSideNavigation/KrdsSideNavigation.ts","../src/components/KrdsSideNavigation/index.ts","../src/components/KrdsStructuredList/KrdsStructuredList.ts","../src/components/KrdsStructuredList/index.ts","../src/components/KrdsTextList/KrdsTextList.ts","../src/components/KrdsTextList/index.ts","../src/components/KrdsCriticalAlerts/KrdsCriticalAlerts.ts","../src/components/KrdsCriticalAlerts/index.ts","../src/components/KrdsMainMenu/KrdsMainMenu.ts","../src/components/KrdsMainMenu/index.ts","../src/components/KrdsCarousel/KrdsCarousel.ts","../src/components/KrdsCarousel/index.ts","../src/components/KrdsTabs/KrdsTabs.ts","../src/components/KrdsTabs/index.ts","../src/components/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 /* @__PURE__ */ defineComponent({\n name: 'KrdsButton',\n props: {\n /** 버튼 타입 */\n type: {\n type: String as () => 'button' | 'submit' | 'reset',\n default: 'button'\n },\n /** 버튼 크기 */\n size: {\n type: String as () => Size,\n default: undefined\n },\n /** 버튼 변형 */\n variant: {\n type: String as () => Variant,\n default: 'primary'\n },\n /** 아이콘 전용 버튼 */\n icon: {\n type: Boolean,\n default: false\n },\n /** 테두리 스타일 (아이콘 버튼용) */\n border: {\n type: Boolean,\n default: false\n },\n /** Pure 버튼 여부 (가상클래스 상태 시 컬러 유지) */\n pure: {\n type: Boolean,\n default: false\n },\n /** 텍스트 버튼 스타일 */\n text: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Button 컴포넌트\n */\n\nimport KrdsButton from './KrdsButton'\nimport type { KrdsButtonProps, KrdsButtonEmits } from './KrdsButton'\n\nexport { KrdsButton }\nexport type { KrdsButtonProps, KrdsButtonEmits }\nexport default KrdsButton\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS ButtonGroup 컴포넌트 속성\n */\nexport type KrdsButtonGroupProps = BaseComponentProps\n\nexport default /* @__PURE__ */ defineComponent({\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsIcon',\n props: {\n /** 아이콘 이름 */\n name: {\n type: String,\n required: true\n },\n /** CSS 클래스 */\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsLink',\n props: {\n /** 링크 URL */\n href: {\n type: String,\n default: '#!'\n },\n /** 링크 대상 (_blank, _self 등) */\n target: {\n type: String as () => '_blank' | '_self' | '_parent' | '_top' | string,\n default: undefined\n },\n /** 링크 제목 (접근성) */\n title: {\n type: String,\n default: undefined\n },\n /** 링크 크기 */\n size: {\n type: String as () => KrdsLinkSize,\n default: undefined\n },\n /** Link 클래스 적용 여부 */\n link: {\n type: Boolean,\n default: true\n },\n /** Basic 링크 여부 (본문 텍스트 컬러) */\n basic: {\n type: Boolean,\n default: false\n },\n /** Pure 링크 여부 (가상클래스 상태 시 컬러 유지) */\n pure: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsSpinner',\n props: {\n /** 로딩 안내 텍스트 */\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsInput',\n props: {\n /** 입력값 */\n modelValue: {\n type: [String, Number],\n default: undefined\n },\n /** 입력 타입 */\n type: {\n type: String as () => InputType,\n default: 'text'\n },\n /** 입력 크기 */\n size: {\n type: String as () => Size,\n default: undefined\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: undefined\n },\n /** 최대 글자 수 */\n maxlength: {\n type: Number,\n default: undefined\n },\n /** 최소 글자 수 */\n minlength: {\n type: Number,\n default: undefined\n },\n /** 최대값 (number 타입용) */\n max: {\n type: Number,\n default: undefined\n },\n /** 최소값 (number 타입용) */\n min: {\n type: Number,\n default: undefined\n },\n /** 단계값 (number 타입용) */\n step: {\n type: Number,\n default: undefined\n },\n /** 자동완성 */\n autocomplete: {\n type: String,\n default: undefined\n },\n /** 자동 포커스 */\n autofocus: {\n type: Boolean,\n default: false\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 입력 상태 */\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n /** 아이콘 (있을 때 btn-ico-wrap 클래스 적용) */\n icon: {\n type: Boolean,\n default: false\n },\n /** 로딩 상태 */\n loading: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string | number) => true,\n input: (event: Event) => true,\n change: (event: Event) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true,\n keydown: (event: KeyboardEvent) => true,\n keyup: (event: KeyboardEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Input 컴포넌트\n */\n\nimport KrdsInput from './KrdsInput'\nimport type { KrdsInputProps, KrdsInputEmits } from './KrdsInput'\n\nexport { KrdsInput }\nexport type { KrdsInputProps, KrdsInputEmits }\nexport default KrdsInput\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsFormLabel',\n props: {\n /** label의 for 속성 */\n for: {\n type: String,\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS FormLabel 컴포넌트\n */\n\nimport KrdsFormLabel from './KrdsFormLabel'\nimport type { KrdsFormLabelProps, KrdsFormLabelEmits } from './KrdsFormLabel'\n\nexport { KrdsFormLabel }\nexport type { KrdsFormLabelProps, KrdsFormLabelEmits }\nexport default KrdsFormLabel\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsFormHint',\n props: {\n /** 힌트 타입 */\n type: {\n type: String as () => 'hint' | 'error' | 'success' | 'information',\n default: 'hint'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS FormHint 컴포넌트\n */\n\nimport KrdsFormHint from './KrdsFormHint'\nimport type { KrdsFormHintProps, KrdsFormHintEmits } from './KrdsFormHint'\n\nexport { KrdsFormHint }\nexport type { KrdsFormHintProps, KrdsFormHintEmits }\nexport default KrdsFormHint\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsFormGroup',\n props: {\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\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","/**\n * KRDS FormGroup 컴포넌트\n */\n\nimport KrdsFormGroup from './KrdsFormGroup'\nimport type { KrdsFormGroupProps } from './KrdsFormGroup'\n\nexport { KrdsFormGroup }\nexport type { KrdsFormGroupProps }\nexport default KrdsFormGroup\n","import { computed, ref } from 'vue'\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) {\n return { isInRange: false, isStart: false, isEnd: false }\n }\n\n const isStart = dateString === selectedStartDate.value\n\n // 종료일 선택 전: 시작일만 선택 표시\n if (!selectedEndDate.value) {\n return { isInRange: isStart, isStart, 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 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","import { Teleport, computed, defineComponent, h, nextTick, onBeforeUnmount, onMounted, ref, vShow, watch, withDirectives } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseFormProps, Size } from '@/types'\nimport KrdsButton from '@/components/KrdsButton/KrdsButton'\nimport { useDatePicker } from '@/composables/useDatePicker'\nimport { useClickOutside } from '@/composables/useClickOutside'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 캘린더 날짜 정보\n */\ninterface 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 */\ninterface 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 */\nexport 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 /** 달력을 body에 렌더 (overflow로 잘리는 컨테이너 안에서 사용. 모달 안에서는 쓰지 않음) */\n teleport?: boolean\n}\n\n/**\n * KRDS DateInput 컴포넌트 이벤트\n */\nexport interface KrdsDateInputEmits {\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}\n\n/** 요일 헤더 */\nconst WEEKDAY_LABELS = ['일', '월', '화', '수', '목', '금', '토']\n\n/** 열린 달력의 닫기 함수 (원본처럼 달력을 열면 다른 달력은 모두 닫는다) */\nconst openCalendars = /* @__PURE__ */ new Set<() => void>()\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsDateInput',\n props: {\n /** 선택된 날짜 값 */\n modelValue: {\n type: String,\n default: undefined\n },\n /** 입력 크기 */\n size: {\n type: String as PropType<Size>,\n default: 'medium'\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: 'YYYY.MM.DD'\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 자동 포커스 */\n autofocus: {\n type: Boolean,\n default: false\n },\n /** 일정이 있는 날짜 배열 (YYYY.MM.DD 형식) */\n eventDates: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /** 휴일 날짜 배열 (YYYY.MM.DD 형식) */\n holidays: {\n type: Array as PropType<string[]>,\n default: () => []\n },\n /** 초기 표시 년도 (기본: 현재 년도) */\n initialYear: {\n type: Number,\n default: undefined\n },\n /** 초기 표시 월 (기본: 현재 월) */\n initialMonth: {\n type: Number,\n default: undefined\n },\n /** 달력을 body에 렌더 (overflow로 잘리는 컨테이너 안에서 사용. 모달 안에서는 쓰지 않음) */\n teleport: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n input: (event: Event) => true,\n change: (event: Event) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\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 const openUpward = ref(true)\n const teleportStyle = ref<Record<string, string>>()\n const isMounted = ref(false)\n onMounted(() => (isMounted.value = true))\n\n /** 입력 행 바로 아래에 달력 영역을 둔다 (body로 렌더할 때 원래 자리와 같은 위치) */\n const updateTeleportPosition = () => {\n const rect = datePickerButtonRef.value?.parentElement?.getBoundingClientRect()\n if (!rect) return\n teleportStyle.value = {\n position: 'absolute',\n top: `${rect.bottom + window.scrollY}px`,\n left: `${rect.left + window.scrollX}px`,\n width: `${rect.width}px`\n }\n }\n\n const updatePlacement = () => {\n const rect = datePickerButtonRef.value?.parentElement?.getBoundingClientRect()\n const calendarWrap = datePickerAreaRef.value?.querySelector<HTMLElement>('.calendar-wrap')\n if (!rect || !calendarWrap) return\n const spaceAbove = rect.top\n const spaceBelow = window.innerHeight - rect.bottom\n openUpward.value = spaceAbove >= calendarWrap.offsetHeight || spaceAbove >= spaceBelow\n if (props.teleport) updateTeleportPosition()\n }\n\n const togglePositionListeners = (enabled: boolean) => {\n const method = enabled ? 'addEventListener' : 'removeEventListener'\n // 스크롤 컨테이너 안의 입력 필드도 따라가도록 capture로 모든 스크롤을 받는다\n window[method]('scroll', updateTeleportPosition, { capture: true })\n window[method]('resize', updateTeleportPosition)\n }\n\n watch(isCalendarOpen, async isOpen => {\n if (props.teleport) togglePositionListeners(isOpen)\n if (!isOpen) return\n await nextTick()\n updatePlacement()\n })\n onBeforeUnmount(() => togglePositionListeners(false))\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 openCalendars.delete(closeAllDatePickers)\n }\n onBeforeUnmount(() => openCalendars.delete(closeAllDatePickers))\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 < firstDate,\n isNextMonth: currentDate.getMonth() !== month - 1 && currentDate > firstDate,\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 /** 연/월 버튼으로 초점 이동 (목록이 숨겨질 때 초점 유실 방지) */\n const focusSwitchButton = (type: 'year' | 'month') => {\n datePickerAreaRef.value?.querySelector<HTMLElement>(`.btn-cal-switch.${type}`)?.focus()\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 openCalendars.forEach(close => close())\n openCalendars.add(closeAllDatePickers)\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\n // ========================\n // Render\n // ========================\n\n /**\n * 연/월 드롭다운\n */\n const renderSwitchDropdown = (type: 'year' | 'month') => {\n const isYear = type === 'year'\n const options = isYear ? yearOptions.value : monthOptions.value\n const currentValue = isYear ? currentYear.value : currentMonth.value\n const format = (value: number) => (isYear ? `${value}년` : `${value.toString().padStart(2, '0')}월`)\n const isOpen = activeDropdown.value === type\n\n return h('div', { class: 'calendar-drop-down' }, [\n h(\n 'button',\n {\n type: 'button',\n class: `btn-cal-switch ${type}`,\n 'aria-label': isYear ? '연도 선택' : '월 선택',\n 'aria-expanded': isOpen,\n onClick: () => toggleDropdown(type)\n },\n format(currentValue)\n ),\n withDirectives(\n h('div', { class: ['calendar-select', isYear ? 'calendar-year-wrap' : 'calendar-mon-wrap', { active: isOpen }] }, [\n h(\n 'ul',\n { class: `sel ${type}` },\n options.map(option =>\n h('li', { key: option }, [\n h(\n 'button',\n {\n type: 'button',\n class: { active: option === currentValue },\n onClick: () => {\n if (isYear) selectYear(option)\n else selectMonth(option)\n focusSwitchButton(type)\n }\n },\n format(option)\n )\n ])\n )\n )\n ]),\n [[vShow, isOpen]]\n )\n ])\n }\n\n /**\n * 캘린더 표\n */\n const renderCalendarTable = () =>\n h('table', { class: 'calendar-tbl' }, [\n h('caption', null, `${currentYear.value}년 ${currentMonth.value.toString().padStart(2, '0')}월`),\n h('thead', null, [\n h(\n 'tr',\n null,\n WEEKDAY_LABELS.map(label => h('th', null, label))\n )\n ]),\n h(\n 'tbody',\n null,\n calendarGrid.value.map((week, weekIndex) =>\n h(\n 'tr',\n { key: weekIndex },\n week.map((day, dayIndex) =>\n h('td', { key: dayIndex, class: getCellClasses(day), 'data-date': day.dateString }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'btn-set-date',\n 'aria-pressed': isDateInSelectedRange(day.dateString).isInRange ? 'true' : 'false',\n onClick: () => handleDateSelection(day.dateString)\n },\n [h('span', null, String(day.day))]\n )\n ])\n )\n )\n )\n )\n ])\n\n return () =>\n h('div', { class: 'form-conts' }, [\n h('div', { class: formContsClasses.value }, [\n h('div', { class: 'calendar-input' }, [\n h('input', {\n id: props.id,\n name: props.name,\n class: inputClasses.value,\n placeholder: props.placeholder,\n value: props.modelValue,\n readonly: props.readonly,\n disabled: props.disabled,\n required: props.required,\n autofocus: props.autofocus,\n type: 'text',\n onInput: handleInput,\n onChange: handleChange,\n onFocus: handleFocus,\n onBlur: handleBlur\n }),\n h(\n 'button',\n {\n ref: datePickerButtonRef,\n class: `krds-btn ${props.size || 'medium'} icon form-btn-datepicker`,\n disabled: props.disabled,\n 'aria-expanded': isCalendarOpen.value,\n type: 'button',\n onClick: handleDatePickerToggle\n },\n [h('span', { class: 'sr-only' }, '달력 열기'), h('i', { class: 'svg-icon ico-calendar' })]\n )\n ]),\n h(Teleport, { to: 'body', disabled: !(props.teleport && isMounted.value) }, [\n h(\n 'div',\n { ref: datePickerAreaRef, class: calendarAreaClasses.value, style: props.teleport ? teleportStyle.value : undefined },\n [\n withDirectives(\n h(\n 'div',\n {\n class: ['calendar-wrap', { bottom: openUpward.value }],\n 'aria-label': '달력',\n tabindex: '0',\n onKeydown: handleKeydown\n },\n [\n // 캘린더 헤더\n h('div', { class: 'calendar-head' }, [\n h('button', { type: 'button', class: 'btn-cal-move prev', onClick: prevMonth }, [\n h('span', { class: 'sr-only' }, '이전 달')\n ]),\n h('div', { class: 'calendar-switch-wrap' }, [renderSwitchDropdown('year'), renderSwitchDropdown('month')]),\n h('button', { type: 'button', class: 'btn-cal-move next', onClick: nextMonth }, [\n h('span', { class: 'sr-only' }, '다음 달')\n ])\n ]),\n // 캘린더 바디\n h('div', { class: 'calendar-body' }, [h('div', { class: 'calendar-table-wrap' }, [renderCalendarTable()])]),\n // 캘린더 푸터\n h('div', { class: 'calendar-footer' }, [\n h(\n 'div',\n { class: 'calendar-btn-wrap' },\n actionButtons.value.map(action =>\n h(\n KrdsButton,\n {\n id: action.id,\n key: action.id,\n class: action.class,\n variant: action.variant,\n size: action.size,\n onClick: action.handler\n },\n { default: () => action.label }\n )\n )\n )\n ])\n ]\n ),\n [[vShow, isCalendarOpen.value]]\n )\n ]\n )\n ])\n ])\n ])\n }\n})\n","import KrdsDateInput from './KrdsDateInput'\nimport type { KrdsDateInputProps, KrdsDateInputEmits } from './KrdsDateInput'\n\nexport { KrdsDateInput }\nexport type { KrdsDateInputProps, KrdsDateInputEmits }\nexport default KrdsDateInput\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsTextarea',\n props: {\n /** 입력값 */\n modelValue: {\n type: String,\n default: ''\n },\n /** 입력 크기 */\n size: {\n type: String as () => Size,\n default: undefined\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: undefined\n },\n /** 최대 글자 수 */\n maxlength: {\n type: Number,\n default: undefined\n },\n /** 최소 글자 수 */\n minlength: {\n type: Number,\n default: undefined\n },\n /** 행 수 */\n rows: {\n type: Number,\n default: 4\n },\n /** 열 수 */\n cols: {\n type: Number,\n default: undefined\n },\n /** 자동 포커스 */\n autofocus: {\n type: Boolean,\n default: false\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 글자 수 표시 여부 */\n showCount: {\n type: Boolean,\n default: true\n },\n /** 리사이즈 가능 여부 */\n resize: {\n type: String as () => 'none' | 'both' | 'horizontal' | 'vertical',\n default: 'vertical'\n },\n // BaseFormProps에서 상속\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n input: (event: Event) => true,\n change: (event: Event) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true,\n keydown: (event: KeyboardEvent) => true,\n keyup: (event: KeyboardEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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 KrdsTextarea from './KrdsTextarea'\nimport type { KrdsTextareaProps, KrdsTextareaEmits } from './KrdsTextarea'\n\nexport { KrdsTextarea }\nexport type { KrdsTextareaProps, KrdsTextareaEmits }\nexport default KrdsTextarea\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsSelect',\n props: {\n /** 선택된 값 */\n modelValue: {\n type: [String, Number, null] as unknown as () => string | number | null,\n default: null\n },\n /** 선택 크기 */\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n /** 타이틀 */\n title: {\n type: String,\n default: undefined\n },\n /** 옵션 목록 */\n options: {\n type: Array as () => SelectOption[],\n default: () => []\n },\n /** 플레이스홀더 */\n placeholder: {\n type: String,\n default: '선택'\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 입력 상태 */\n state: {\n type: String as () => 'default' | 'error' | 'success' | 'information',\n default: 'default'\n },\n /** 정렬 스타일 여부 */\n sort: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string | number | null) => true,\n focus: (event: FocusEvent) => true,\n blur: (event: FocusEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Select 컴포넌트\n */\n\nimport KrdsSelect from './KrdsSelect'\nimport type { KrdsSelectProps, KrdsSelectEmits, SelectOption } from './KrdsSelect'\n\nexport { KrdsSelect }\nexport type { KrdsSelectProps, KrdsSelectEmits, SelectOption }\nexport default KrdsSelect\n","import { defineComponent, computed, ref, h, type VNode } 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\nlet uid = 0\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsFileUpload',\n props: {\n /** 파일 목록 */\n modelValue: {\n type: Array as () => FileInfo[],\n default: () => []\n },\n /** 입력 크기 */\n size: {\n type: String as () => Size,\n default: 'medium'\n },\n /** 허용되는 파일 타입 (예: '.jpg,.png,.pdf') */\n accept: {\n type: String,\n default: undefined\n },\n /** 최대 파일 개수 */\n maxFiles: {\n type: Number,\n default: 10\n },\n /** 최대 파일 크기 (bytes) */\n maxFileSize: {\n type: Number,\n default: 20 * 1024 * 1024 // 20MB\n },\n /** 다중 파일 선택 여부 */\n multiple: {\n type: Boolean,\n default: true\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 드래그 앤 드롭 활성화 여부 */\n dragAndDrop: {\n type: Boolean,\n default: true\n },\n /** 제목 */\n title: {\n type: String,\n default: '타이틀영역'\n },\n /** 설명 텍스트 */\n description: {\n type: String,\n default: '컨텐츠 영역'\n },\n /** 플레이스홀더 텍스트 */\n placeholder: {\n type: String,\n default: '첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.'\n },\n /** 미리보기 표시 여부 */\n showPreview: {\n type: Boolean,\n default: true\n },\n /** 다운로드 버튼 표시 여부 */\n showDownload: {\n type: Boolean,\n default: true\n },\n /** 바로보기 버튼 표시 여부 */\n showPreviewButton: {\n type: Boolean,\n default: true\n },\n /** 전체 삭제 버튼 표시 여부 */\n showClearAll: {\n type: Boolean,\n default: true\n },\n // BaseFormProps에서 상속\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object],\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (files: FileInfo[]) => true,\n 'file-added': (file: FileInfo) => true,\n 'file-removed': (fileId: string) => true,\n 'file-error': (file: FileInfo, error: string) => true,\n 'upload-start': (file: FileInfo) => true,\n 'upload-progress': (file: FileInfo, progress: number) => true,\n 'upload-complete': (file: FileInfo) => true,\n 'upload-error': (file: FileInfo, error: string) => true,\n 'clear-all': () => true,\n download: (file: FileInfo) => true,\n preview: (file: FileInfo) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n const isDragOver = ref(false)\n const inputRef = ref<HTMLInputElement | null>(null)\n const inputId = props.id ? `${props.id}-input` : `krds-file-upload-${++uid}`\n\n // --- helpers ---\n\n const formatFileSize = (bytes: number): string => {\n if (bytes < 1024) return `${bytes}B`\n if (bytes < 1024 * 1024) return `${Math.round(bytes / 1024)}KB`\n return `${Number((bytes / (1024 * 1024)).toFixed(1))}MB`\n }\n\n const getFileExtension = (name: string): string => {\n const parts = name.split('.')\n return parts.length > 1 ? parts.pop()!.toLowerCase() : ''\n }\n\n const formatFileName = (file: FileInfo): string => {\n const ext = getFileExtension(file.name)\n const nameWithoutExt = ext ? file.name.slice(0, -(ext.length + 1)) : file.name\n return ext ? `${nameWithoutExt} [${ext}, ${formatFileSize(file.size)}]` : `${file.name} [${formatFileSize(file.size)}]`\n }\n\n const generateId = (): string => {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`\n }\n\n const validateFile = (file: File): string | null => {\n if (props.maxFileSize && file.size >= props.maxFileSize) {\n return `등록 가능한 파일 용량을 초과하였습니다.\\n${formatFileSize(props.maxFileSize)} 미만의 파일만 등록할 수 있습니다.`\n }\n if (props.accept) {\n const accepted = props.accept.split(',').map(t => t.trim().toLowerCase())\n const ext = `.${getFileExtension(file.name)}`\n const mime = file.type\n if (\n !accepted.some(t => {\n if (t.startsWith('.')) return ext === t\n if (t.endsWith('/*')) return mime.startsWith(t.replace('/*', '/'))\n return mime === t\n })\n ) {\n return '허용되지 않는 파일 형식입니다.'\n }\n }\n return null\n }\n\n // --- event handlers ---\n\n const addFiles = (fileList: FileList) => {\n if (props.disabled || props.readonly) return\n\n // 단일 파일 모드: 기존 파일 교체\n let currentFiles = [...(props.modelValue || [])]\n if (!props.multiple && currentFiles.length > 0) {\n currentFiles = []\n }\n\n const newFiles: FileInfo[] = []\n // 오류 항목은 개수에서 제외 (목록의 유효 개수 표시와 동일 기준)\n let validCount = currentFiles.filter(f => f.status !== 'error').length\n // 단일 파일 모드는 첫 파일만 사용 (네이티브 input과 동일)\n const files = props.multiple ? Array.from(fileList) : Array.from(fileList).slice(0, 1)\n\n for (const file of files) {\n if (validCount >= props.maxFiles) break\n\n const error = validateFile(file)\n if (!error) validCount++\n const fileInfo: FileInfo = {\n id: generateId(),\n file,\n name: file.name,\n size: file.size,\n type: file.type,\n status: error ? 'error' : 'pending',\n errorMessage: error || undefined\n }\n newFiles.push(fileInfo)\n\n if (error) {\n emit('file-error', fileInfo, error)\n } else {\n emit('file-added', fileInfo)\n }\n }\n\n if (newFiles.length > 0) {\n emit('update:modelValue', [...currentFiles, ...newFiles])\n }\n }\n\n const onFileChange = (event: Event) => {\n const input = event.target as HTMLInputElement\n if (input.files?.length) {\n addFiles(input.files)\n input.value = ''\n }\n }\n\n const onDragOver = (event: DragEvent) => {\n if (props.disabled || props.readonly || !props.dragAndDrop) return\n event.preventDefault()\n isDragOver.value = true\n }\n\n const onDragLeave = () => {\n isDragOver.value = false\n }\n\n const onDrop = (event: DragEvent) => {\n event.preventDefault()\n isDragOver.value = false\n if (props.disabled || props.readonly || !props.dragAndDrop) return\n if (event.dataTransfer?.files) {\n addFiles(event.dataTransfer.files)\n }\n }\n\n const triggerFileSelect = () => {\n if (props.disabled || props.readonly) return\n inputRef.value?.click()\n }\n\n const removeFile = (fileId: string) => {\n if (props.disabled || props.readonly) return\n emit(\n 'update:modelValue',\n (props.modelValue || []).filter(f => f.id !== fileId)\n )\n emit('file-removed', fileId)\n }\n\n const clearAll = () => {\n if (props.disabled || props.readonly) return\n emit('update:modelValue', [])\n emit('clear-all')\n }\n\n // --- computed ---\n\n const rootClasses = computed(() => {\n const classes = ['krds-file-upload', 'line']\n if (props.class) classes.push(props.class)\n return classes\n })\n\n // --- render helpers ---\n\n const renderFileHead = (): VNode =>\n h('div', { class: 'file-head' }, [h('h3', { class: 'tit' }, props.title), h('div', null, [h('p', null, props.description)])])\n\n const renderUploadArea = (): VNode =>\n h(\n 'div',\n {\n class: ['file-upload', { active: isDragOver.value }],\n onDragover: onDragOver,\n onDragleave: onDragLeave,\n onDrop: onDrop\n },\n [\n h('p', { class: 'txt' }, props.placeholder),\n h('div', { class: 'file-upload-btn-wrap' }, [\n h('input', {\n ref: inputRef,\n type: 'file',\n name: props.name || 'myFile',\n id: inputId,\n hidden: true,\n accept: props.accept || undefined,\n multiple: props.multiple,\n onChange: onFileChange\n }),\n h('label', { for: inputId }, [\n h(\n 'button',\n {\n type: 'button',\n class: ['krds-btn', props.size],\n disabled: props.disabled || undefined,\n onClick: triggerFileSelect\n },\n [h('i', { class: 'svg-icon ico-upload' }), '파일선택']\n )\n ])\n ])\n ]\n )\n\n const renderBtnWrap = (file: FileInfo): VNode[] => {\n const children: VNode[] = []\n\n if (file.status === 'uploading') {\n children.push(h('span', { class: 'krds-spinner', role: 'status' }, [h('span', { class: 'sr-only' }, '업로드 중')]))\n } else if (file.downloadUrl) {\n if (props.showDownload) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n onClick: () => emit('download', file)\n },\n ['다운로드 ', h('i', { class: 'svg-icon ico-down' })]\n )\n )\n }\n if (props.showPreviewButton) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n onClick: () => emit('preview', file)\n },\n ['바로보기 ', h('i', { class: 'svg-icon ico-angle right' })]\n )\n )\n }\n } else if (file.status === 'completed') {\n children.push(h('span', { class: 'ico-invalid complete' }, [h('em', { class: 'sr-only' }, '업로드 완료')]))\n } else if (!props.readonly) {\n children.push(\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n disabled: props.disabled || undefined,\n onClick: () => removeFile(file.id)\n },\n ['삭제 ', h('i', { class: 'svg-icon ico-delete-fill' })]\n )\n )\n }\n\n return children\n }\n\n const renderFileItem = (file: FileInfo): VNode => {\n const liChildren: VNode[] = [\n h(\n 'div',\n {\n class: file.downloadUrl ? 'file-info m-column' : 'file-info'\n },\n [h('div', { class: 'file-name' }, formatFileName(file)), h('div', { class: 'btn-wrap' }, renderBtnWrap(file))]\n )\n ]\n\n if (file.status === 'error' && file.errorMessage) {\n const parts = file.errorMessage.split('\\n')\n const hintContent: (string | VNode)[] = []\n parts.forEach((part, i) => {\n if (i > 0) hintContent.push(h('br'))\n hintContent.push(part)\n })\n liChildren.push(h('p', { class: 'file-hint-invalid' }, hintContent))\n }\n\n return h(\n 'li',\n {\n key: file.id,\n class: file.status === 'error' ? 'is-error' : undefined\n },\n liChildren\n )\n }\n\n const renderFileList = (files: FileInfo[]): VNode => {\n const validCount = files.filter(f => f.status !== 'error').length\n const children: VNode[] = [\n h('div', { class: 'total' }, [h('span', { class: 'current' }, `${validCount}개`), ` / ${props.maxFiles}개`]),\n h('ul', { class: 'upload-list' }, files.map(renderFileItem))\n ]\n\n if (props.showClearAll && !props.readonly) {\n children.push(\n h('div', { class: 'upload-delete-btn' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn xsmall tertiary',\n disabled: props.disabled || undefined,\n onClick: clearAll\n },\n ['전체 파일 삭제', h('i', { class: 'svg-icon ico-angle right' })]\n )\n ])\n )\n }\n\n return h('div', { class: 'file-list' }, children)\n }\n\n // --- main render ---\n\n return () => {\n const children: VNode[] = [renderFileHead()]\n\n if (!props.readonly) {\n children.push(renderUploadArea())\n }\n\n const files = props.modelValue || []\n if (files.length > 0) {\n children.push(renderFileList(files))\n }\n\n return h(\n 'div',\n {\n class: rootClasses.value,\n style: props.style || undefined\n },\n children\n )\n }\n }\n})\n","import KrdsFileUpload from './KrdsFileUpload'\nimport type { KrdsFileUploadProps, KrdsFileUploadEmits, FileInfo } from './KrdsFileUpload'\n\nexport { KrdsFileUpload }\nexport type { KrdsFileUploadProps, KrdsFileUploadEmits, FileInfo }\nexport default KrdsFileUpload\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsBadge',\n props: {\n /** 배지 타입 */\n type: {\n type: String as () => 'outline' | 'bg' | 'bg-light',\n default: 'outline'\n },\n /** 배지 컬러 */\n color: {\n type: String as () => ColorVariant,\n default: 'primary'\n },\n /** 배지 크기 */\n size: {\n type: String as () => Size,\n default: 'large'\n },\n /** 넘버 여부 */\n number: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Badge 컴포넌트\n */\n\nimport KrdsBadge from './KrdsBadge'\nimport type { KrdsBadgeProps, KrdsBadgeEmits } from './KrdsBadge'\n\nexport { KrdsBadge }\nexport type { KrdsBadgeProps, KrdsBadgeEmits }\nexport default KrdsBadge\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsTag',\n props: {\n /** 링크 태그 여부 */\n link: {\n type: Boolean,\n default: false\n },\n /** 링크 URL (link가 true일 때 사용) */\n href: {\n type: String,\n default: '#'\n },\n /** 링크 타겟 (link가 true일 때 사용) */\n target: {\n type: String,\n default: undefined\n },\n /** 링크 관계 (link가 true일 때 사용) */\n rel: {\n type: String,\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n remove: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Tag 컴포넌트\n */\n\nimport KrdsTag from './KrdsTag'\nimport type { KrdsTagProps, KrdsTagEmits } from './KrdsTag'\n\nexport { KrdsTag }\nexport type { KrdsTagProps, KrdsTagEmits }\nexport default KrdsTag\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsTagGroup',\n props: {\n /** 태그 그룹 크기 */\n size: {\n type: String as () => KrdsTagGroupSize,\n default: 'medium'\n },\n /** CSS 클래스 */\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","/**\n * KRDS TagGroup 컴포넌트\n */\n\nimport KrdsTagGroup from './KrdsTagGroup'\nimport type { KrdsTagGroupProps, KrdsTagGroupSize } from './KrdsTagGroup'\n\nexport { KrdsTagGroup }\nexport type { KrdsTagGroupProps, KrdsTagGroupSize }\nexport default KrdsTagGroup\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsMasthead',\n props: {\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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 Masthead 컴포넌트\n */\n\nimport KrdsMasthead from './KrdsMasthead'\nimport type { KrdsMastheadProps, KrdsMastheadEmits } from './KrdsMasthead'\n\nexport { KrdsMasthead }\nexport type { KrdsMastheadProps, KrdsMastheadEmits }\nexport default KrdsMasthead\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 * @deprecated 모듈 전역 카운터라 SSR에서 요청 간 값이 공유된다. Vue의 `useId()`를 사용. 다음 breaking 릴리스에서 제거 예정\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 * @deprecated 라이브러리에서 쓰이지 않아 다음 breaking 릴리스에서 제거 예정\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, useId } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { 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 /* @__PURE__ */ defineComponent({\n name: 'KrdsToggleSwitch',\n props: {\n /** 모델 값 */\n modelValue: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 스위치 라벨 */\n label: {\n type: String,\n default: undefined\n },\n /** 크기 */\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** 필수 입력 여부 */\n required: {\n type: Boolean,\n default: false\n },\n /** 읽기 전용 여부 */\n readonly: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true,\n change: (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, attrs }) {\n const generatedInputId = `toggle-switch-${useId()}`\n\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 || generatedInputId\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","/**\n * KRDS ToggleSwitch 컴포넌트\n */\n\nimport KrdsToggleSwitch from './KrdsToggleSwitch'\nimport type { KrdsToggleSwitchProps, KrdsToggleSwitchEmits } from './KrdsToggleSwitch'\n\nexport { KrdsToggleSwitch }\nexport type { KrdsToggleSwitchProps, KrdsToggleSwitchEmits }\nexport default KrdsToggleSwitch\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsCheckArea',\n props: {\n /** 추가 클래스 */\n class: {\n type: String,\n default: undefined\n },\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","/**\n * KRDS CheckArea 컴포넌트\n */\n\nimport KrdsCheckArea from './KrdsCheckArea'\nimport type { KrdsCheckAreaProps } from './KrdsCheckArea'\n\nexport { KrdsCheckArea }\nexport type { KrdsCheckAreaProps }\nexport default KrdsCheckArea\n","import { defineComponent, computed, h, SlotsType, useId, type VNode } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { 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 /* @__PURE__ */ defineComponent({\n name: 'KrdsCheckbox',\n props: {\n /** 모델 값 */\n modelValue: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 크기 */\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n /** Chip 스타일 여부 */\n chip: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n default?: () => VNode[] // Default slot with props\n description?: () => VNode[] // Description slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n const generatedInputId = `checkbox-${useId()}`\n\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 || generatedInputId\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 Checkbox 컴포넌트\n */\n\nimport KrdsCheckbox from './KrdsCheckbox'\nimport type { KrdsCheckboxProps, KrdsCheckboxEmits } from './KrdsCheckbox'\n\nexport { KrdsCheckbox }\nexport type { KrdsCheckboxProps, KrdsCheckboxEmits }\nexport default KrdsCheckbox\n","import { defineComponent, computed, h, SlotsType, useId, type VNode } from 'vue'\nimport type { BaseFormProps } from '@/types'\nimport { 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 /* @__PURE__ */ defineComponent({\n name: 'KrdsRadio',\n props: {\n /** 모델 값 */\n modelValue: {\n type: [String, Number, Boolean],\n default: undefined\n },\n /** 라디오 값 */\n value: {\n type: [String, Number, Boolean],\n required: true\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** 크기 */\n size: {\n type: String as () => 'medium' | 'large',\n default: 'medium',\n validator: (value: string) => ['medium', 'large'].includes(value)\n },\n /** Chip 스타일 여부 */\n chip: {\n type: Boolean,\n default: false\n },\n /** 폼 필드 이름 */\n name: {\n type: String,\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** HTML ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string | number | boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n default?: () => VNode[] // Default slot with props\n description?: () => VNode[] // Named slot without props\n }>,\n setup(props, { emit, attrs, slots }) {\n const generatedInputId = `radio-${useId()}`\n\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 || generatedInputId\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 KrdsRadio from './KrdsRadio'\nimport type { KrdsRadioProps, KrdsRadioEmits } from './KrdsRadio'\n\nexport { KrdsRadio }\nexport type { KrdsRadioProps, KrdsRadioEmits }\nexport default KrdsRadio\n","/**\n * KRDS Spinner 컴포넌트\n */\n\nimport KrdsSpinner from './KrdsSpinner'\n\nexport { KrdsSpinner }\nexport default KrdsSpinner\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsStepIndicator',\n props: {\n /** 현재 활성 단계 인덱스 (0부터 시작) - v-model */\n modelValue: {\n type: Number,\n default: 0\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS StepIndicator 컴포넌트\n */\n\nimport KrdsStepIndicator from './KrdsStepIndicator'\nimport type { KrdsStepIndicatorProps, KrdsStepIndicatorEmits } from './KrdsStepIndicator'\n\nexport { KrdsStepIndicator }\nexport type { KrdsStepIndicatorProps, KrdsStepIndicatorEmits }\nexport default KrdsStepIndicator\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsStep',\n props: {\n /** 단계 번호 */\n step: {\n type: [String, Number],\n required: true\n },\n /** 단계 제목 */\n title: {\n type: String,\n required: true\n },\n /** 단계 상태 강제 설정 (선택적) */\n status: {\n type: String as () => 'done' | 'active' | 'pending',\n default: undefined\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent, step: string | number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\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","/**\n * KRDS Step 컴포넌트\n */\n\nimport KrdsStep from './KrdsStep'\nimport type { KrdsStepProps, KrdsStepEmits } from './KrdsStep'\n\nexport { KrdsStep }\nexport type { KrdsStepProps, KrdsStepEmits }\nexport default KrdsStep\n","import { defineComponent, h, type PropType, 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 /** 여러 건너뛰기 링크 (하나의 래퍼 안에 렌더링, 지정 시 href·기본 슬롯 대신 사용) */\n links?: { href: string; label: string }[]\n}\n\n/**\n * KRDS SkipLink 컴포넌트\n *\n * 건너뛰기 링크는 웹사이트에서 웹 페이지의 주요 콘텐츠 섹션의 탐색을 도와주는 페이지 내부 링크입니다.\n * 키보드나 가상 초점을 이용하여 콘텐츠를 탐색하는 사용자는 건너뛰기 링크를 이용하여\n * 대부분의 페이지에서 반복되는 콘텐츠 영역을 건너뛰고 주요 콘텐츠로 빠르게 이동할 수 있습니다.\n *\n * @example\n * ```vue\n * <!-- 단일 링크 -->\n * <KrdsSkipLink href=\"#main-content\">본문 바로가기</KrdsSkipLink>\n *\n * <!-- 여러 링크: 컴포넌트를 나란히 두면 #krds-skip-link가 중복되므로 links 사용 -->\n * <KrdsSkipLink\n * :links=\"[\n * { href: '#main-content', label: '본문 바로가기' },\n * { href: '#gnb', label: '메인메뉴 바로가기' }\n * ]\"\n * />\n * ```\n */\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsSkipLink',\n props: {\n /**\n * 건너뛸 대상 요소의 ID\n * @example '#main-content', '#breadcrumb'\n */\n href: {\n type: String,\n default: undefined,\n validator: (value: string) => value.startsWith('#')\n },\n /**\n * 여러 건너뛰기 링크 (하나의 래퍼 안에 렌더링, 지정 시 href·기본 슬롯 대신 사용)\n */\n links: {\n type: Array as PropType<{ href: string; label: string }[]>,\n default: undefined,\n validator: (value: { href: string }[]) => value.every(link => link.href.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 props.links\n ? props.links.map(link => h('a', { href: link.href }, link.label))\n : [\n h(\n 'a',\n {\n href: props.href\n },\n slots.default?.()\n )\n ]\n )\n }\n }\n})\n","/**\n * KRDS SkipLink 컴포넌트\n */\n\nimport KrdsSkipLink from './KrdsSkipLink'\nimport type { KrdsSkipLinkProps } from './KrdsSkipLink'\n\nexport { KrdsSkipLink }\nexport type { KrdsSkipLinkProps }\nexport default KrdsSkipLink\n","import { defineComponent, h } from 'vue'\nimport type { PropType } from 'vue'\n\n/**\n * 브레드크럼 아이템 인터페이스\n */\nexport interface BreadcrumbItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * KRDS Breadcrumb 컴포넌트 속성\n */\nexport 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 */\nexport interface KrdsBreadcrumbEmits {\n (e: 'item-click', item: BreadcrumbItem, event: MouseEvent): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsBreadcrumb',\n props: {\n /** 브레드크럼 아이템 배열 */\n items: {\n type: Array as PropType<BreadcrumbItem[]>,\n required: true\n },\n /** 엘리먼트 ID */\n id: {\n type: String,\n default: undefined\n },\n /** 접근성 라벨 */\n ariaLabel: {\n type: String,\n default: '현재 경로'\n },\n /** 홈 아이콘 표시 여부 */\n showHomeIcon: {\n type: Boolean,\n default: true\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'item-click': (item: BreadcrumbItem, event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n /**\n * 현재 페이지 여부 확인\n */\n const isCurrentPage = (index: number) => index === props.items.length - 1\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\n return () =>\n h('nav', { id: props.id, class: 'krds-breadcrumb-wrap', 'aria-label': props.ariaLabel }, [\n h(\n 'ol',\n { class: 'breadcrumb' },\n props.items.map((item, index) => {\n const isHome = index === 0 && props.showHomeIcon\n\n return h('li', { key: `breadcrumb-${index}`, class: { home: isHome } }, [\n h(\n 'a',\n {\n href: item.href || '#',\n class: 'txt',\n 'aria-current': isCurrentPage(index) ? 'page' : undefined,\n onClick: (event: MouseEvent) => handleClick(item, event)\n },\n [h('span', null, item.text)]\n )\n ])\n })\n )\n ])\n }\n})\n","/**\n * KRDS Breadcrumb 컴포넌트\n */\n\nimport KrdsBreadcrumb from './KrdsBreadcrumb'\nimport type { KrdsBreadcrumbProps, KrdsBreadcrumbEmits, BreadcrumbItem } from './KrdsBreadcrumb'\n\nexport { KrdsBreadcrumb }\nexport type { KrdsBreadcrumbProps, KrdsBreadcrumbEmits, BreadcrumbItem }\nexport default KrdsBreadcrumb\n","import { defineComponent, computed, h, ref, onMounted, onUnmounted, SlotsType, type VNode } 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 /* @__PURE__ */ defineComponent({\n name: 'KrdsInPageNavigation',\n props: {\n /** 네비게이션 제목 */\n title: {\n type: String,\n default: undefined\n },\n /** 네비게이션 캡션 */\n caption: {\n type: String,\n default: '이 페이지의 구성'\n },\n /** 네비게이션 아이템 목록 */\n items: {\n type: Array as () => NavigationItem[],\n default: () => []\n },\n /** 스크롤에 따른 자동 활성화 여부 */\n autoActive: {\n type: Boolean,\n default: true\n },\n /** 헤더 상단 영역 선택자 (기본값: '#krds-masthead') */\n headerTopSelector: {\n type: String,\n default: '#krds-masthead'\n },\n /** 헤더 내부 영역 선택자 (기본값: '#krds-header .header-in') */\n headerInnerSelector: {\n type: String,\n default: '#krds-header .header-in'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n itemClick: (item: NavigationItem, event: MouseEvent | KeyboardEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n action?: () => VNode[] // 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","/**\n * KRDS InPageNavigation 컴포넌트\n */\n\nimport KrdsInPageNavigation from './KrdsInPageNavigation'\nimport type { KrdsInPageNavigationProps, KrdsInPageNavigationEmits, NavigationItem } from './KrdsInPageNavigation'\n\nexport { KrdsInPageNavigation }\nexport type { KrdsInPageNavigationProps, KrdsInPageNavigationEmits, NavigationItem }\nexport default KrdsInPageNavigation\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","/**\n * KRDS Vue 디렉티브\n */\n\nimport type { App } from 'vue'\nimport { vSrOnly } from './vSrOnly'\n\n/**\n * 디렉티브 설치 함수\n */\nexport const installDirectives = (app: App) => {\n app.directive('sr-only', vSrOnly)\n}\n\nexport { vSrOnly }\n","import { computed, defineComponent, h, withDirectives } from 'vue'\nimport { vSrOnly } from '@/directives'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 페이지 아이템 타입\n */\ninterface PageItem {\n type: 'page' | 'ellipsis'\n key: string\n page?: number\n href?: string\n}\n\n/** 프롭 기본값 — props 선언과 setup 양쪽에서 공유한다 */\nconst DEFAULT_MIN = 1\nconst DEFAULT_PAGE_RANGE = 8\n\n/**\n * KRDS Pagination 컴포넌트 속성\n */\nexport 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 */\nexport interface KrdsPaginationEmits {\n /** v-model 업데이트 이벤트 */\n (e: 'update:modelValue', value: number): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsPagination',\n props: {\n /** 현재 페이지 번호 (v-model) */\n modelValue: {\n type: Number,\n default: 1\n },\n /** 최소 페이지 번호 (기본값: 1, 최소값: 1) */\n min: {\n type: Number,\n default: DEFAULT_MIN\n },\n /** 최대 페이지 번호 (전체 페이지 수) */\n max: {\n type: Number,\n required: true\n },\n /** 엘리먼트 ID */\n id: {\n type: String,\n default: undefined\n },\n /** 접근성 라벨 */\n ariaLabel: {\n type: String,\n default: '페이지 내비게이션'\n },\n /** 표시할 페이지 범위 */\n pageRange: {\n type: Number,\n default: DEFAULT_PAGE_RANGE\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 최소 페이지 번호 (1보다 작을 수 없음)\n */\n const minPage = computed(() => Math.max(1, props.min ?? DEFAULT_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 { max: totalPages } = props\n const pageRange = props.pageRange ?? DEFAULT_PAGE_RANGE\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 })\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 })\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\n /**\n * 페이지 링크 / 생략 표시 렌더링\n */\n const renderPageItem = (item: PageItem) => {\n if (item.type === 'page') {\n const isCurrent = item.page === currentPage.value\n\n return h(\n 'a',\n {\n key: item.key,\n href: item.href || '#',\n class: ['page-link', { active: isCurrent }],\n 'aria-current': isCurrent ? 'page' : undefined,\n onClick: (event: MouseEvent) => handlePageClick(item.page!, event)\n },\n [isCurrent ? withDirectives(h('span', null, '현재페이지'), [[vSrOnly]]) : null, ` ${item.page} `]\n )\n }\n\n return h('span', {\n key: item.key,\n class: 'page-link link-dot'\n })\n }\n\n return () =>\n h('div', { id: props.id, class: 'krds-pagination' }, [\n // 이전 버튼\n h(\n prevDisabled.value ? 'span' : 'a',\n {\n href: prevDisabled.value ? undefined : prevHref.value,\n class: ['page-navi', 'prev', { disabled: prevDisabled.value }],\n onClick: handlePrevClick\n },\n '이전'\n ),\n\n // 페이지 링크\n h('div', { class: 'page-links' }, displayedPages.value.map(renderPageItem)),\n\n // 다음 버튼\n h(\n nextDisabled.value ? 'span' : 'a',\n {\n href: nextDisabled.value ? undefined : nextHref.value,\n class: ['page-navi', 'next', { disabled: nextDisabled.value }],\n onClick: handleNextClick\n },\n '다음'\n )\n ])\n }\n})\n","/**\n * KRDS Pagination 컴포넌트\n */\n\nimport KrdsPagination from './KrdsPagination'\nimport type { KrdsPaginationProps, KrdsPaginationEmits } from './KrdsPagination'\n\nexport { KrdsPagination }\nexport type { KrdsPaginationProps, KrdsPaginationEmits }\nexport default KrdsPagination\n","import { computed, defineComponent, h } from 'vue'\n\n/**\n * KRDS Panel 컴포넌트 속성\n */\nexport interface KrdsPanelProps {\n /** 도움말 패널 펼침 상태 (v-model) */\n modelValue?: boolean\n}\n\n/**\n * KRDS Panel 컴포넌트 이벤트\n */\nexport interface KrdsPanelEmits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsPanel',\n props: {\n /** 도움말 패널 펼침 상태 (v-model) */\n modelValue: {\n type: Boolean,\n default: false\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\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\n return () =>\n h('div', { class: 'inner help-panel-flexible' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn small tertiary btn-help-panel expand btn-help-exec',\n onClick: handleOpen\n },\n [h('i', { class: 'svg-icon ico-fold' }), ' 도움말']\n ),\n h('div', { class: ['krds-help-panel', { expand: open.value }] }, [\n h('div', { class: 'help-panel-wrap' }, [\n h('div', { class: 'help-conts-area' }, [\n slots.default?.(),\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn small tertiary btn-help-panel fold',\n onClick: handleClose\n },\n [h('span', { class: 'sr-only' }, '도움말'), ' 접어두기 ', h('i', { class: 'svg-icon ico-angle right' })]\n )\n ])\n ])\n ])\n ])\n }\n})\n","/**\n * KRDS Panel 컴포넌트\n */\n\nimport KrdsPanel from './KrdsPanel'\nimport type { KrdsPanelProps, KrdsPanelEmits } from './KrdsPanel'\n\nexport { KrdsPanel }\nexport type { KrdsPanelProps, KrdsPanelEmits }\nexport default KrdsPanel\n","import { defineComponent, h, onMounted, onUnmounted, ref } from 'vue'\nimport type { PropType } from 'vue'\n\ntype ContextualHelpPosition = 'top left' | 'top center' | 'top right' | 'bottom left' | 'bottom center' | 'bottom right'\n\n/**\n * KRDS ContextualHelp 컴포넌트 속성\n */\nexport interface KrdsContextualHelpProps {\n /** 툴팁 제목 */\n tooltipTitle?: string\n /** 도움말 아이콘 사용 여부 (false 면 툴팁 아이콘) */\n helpIcon?: boolean\n /** 툴팁 노출 위치 */\n position?: ContextualHelpPosition\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsContextualHelp',\n props: {\n /** 툴팁 제목 */\n tooltipTitle: {\n type: String,\n default: '도움말 제목'\n },\n /** 도움말 아이콘 사용 여부 (false 면 툴팁 아이콘) */\n helpIcon: {\n type: Boolean,\n default: false\n },\n /** 툴팁 노출 위치 */\n position: {\n type: String as PropType<ContextualHelpPosition>,\n default: 'top left'\n }\n },\n setup(props, { slots }) {\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\n return () =>\n h('div', { ref: containerRef, class: ['krds-contextual-help', props.position] }, [\n h('div', { class: 'tooltip-action' }, [\n h(\n 'button',\n {\n ref: tooltipBtnRef,\n type: 'button',\n class: 'krds-btn medium icon tooltip-btn',\n onClick: toggleTooltip\n },\n [\n h('span', { class: 'sr-only' }, '도움말'),\n props.helpIcon ? h('i', { class: 'svg-icon ico-help' }) : h('i', { class: 'svg-icon ico-tooltip' })\n ]\n ),\n h('div', { ref: tooltipPopoverRef, class: 'tooltip-popover', role: 'tooltip' }, [\n h('h4', { class: 'tooltip-title' }, props.tooltipTitle),\n h('div', { class: 'tooltip-contents' }, slots.default?.()),\n h(\n 'button',\n {\n ref: closeBtnRef,\n type: 'button',\n class: 'krds-btn xsmall icon tooltip-close',\n onClick: closeTooltip\n },\n [h('span', { class: 'sr-only' }, '닫기'), h('i', { class: 'svg-icon ico-modal-close' })]\n )\n ])\n ])\n ])\n }\n})\n","/**\n * KRDS ContextualHelp 컴포넌트\n */\n\nimport KrdsContextualHelp from './KrdsContextualHelp'\nimport type { KrdsContextualHelpProps } from './KrdsContextualHelp'\n\nexport { KrdsContextualHelp }\nexport type { KrdsContextualHelpProps }\nexport default KrdsContextualHelp\n","import { computed, defineComponent, h } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\ntype StepsData = { id: number; title: string; description: string }\n\n/**\n * KRDS CoachMark 컴포넌트 속성\n */\nexport interface KrdsCoachMarkProps extends BaseComponentProps {\n /** 코치마크 래퍼에 추가할 클래스 */\n coachMarkClass?: string | string[]\n /** 전체 단계 데이터 */\n stepsData: StepsData[]\n /** 이 코치마크가 담당하는 단계 번호 */\n activeStep: number\n /** 현재 노출 중인 단계 (v-model) */\n modelValue?: number | null\n}\n\n/**\n * KRDS CoachMark 컴포넌트 이벤트\n */\nexport interface KrdsCoachMarkEmits {\n (e: 'update:modelValue', value: number | null): void\n (e: 'close'): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsCoachMark',\n props: {\n /** 코치마크 래퍼에 추가할 클래스 */\n coachMarkClass: {\n type: [String, Array] as PropType<string | string[]>,\n default: ''\n },\n /** 전체 단계 데이터 */\n stepsData: {\n type: Array as () => StepsData[],\n required: true\n },\n /** 이 코치마크가 담당하는 단계 번호 */\n activeStep: {\n type: Number,\n required: true\n },\n /** 현재 노출 중인 단계 (v-model) */\n modelValue: {\n type: Number,\n default: null\n },\n /** 인라인 스타일 */\n style: {\n type: [String, Object] as PropType<string | Record<string, string | number>>,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: number | null) => true,\n close: () => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\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 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\n const renderBalloon = () => {\n const step = currentStepData.value\n if (props.modelValue !== props.activeStep || !step) {\n return null\n }\n\n return h('div', { class: 'coach-balloon' }, [\n h('h5', { class: 'sr-only' }, '따라하기 가이드'),\n h('h6', { class: 'coach-tit' }, `${props.activeStep}단계 : ${step.title}`),\n h('p', { class: 'desc' }, step.description),\n h('div', { class: 'coach-controls' }, [\n h('div', { class: 'num' }, [\n h('span', { class: 'sr-only' }, '현재 단계'),\n h('strong', null, String(props.activeStep)),\n h('span', { class: 'sr-only' }, '총 단계'),\n h('span', null, String(props.stepsData.length))\n ]),\n h('div', { class: 'btn-wrap' }, [\n h('button', { type: 'button', class: 'krds-btn small text', onClick: closeCoachMark }, '그만보기'),\n props.activeStep !== 1 ? h('button', { type: 'button', class: 'krds-btn small text', onClick: prevStep }, '이전으로') : null,\n props.activeStep !== props.stepsData.length\n ? h('button', { type: 'button', class: 'krds-btn small tertiary', onClick: nextStep }, '다음으로')\n : null\n ])\n ])\n ])\n }\n\n return () =>\n h('div', { class: ['krds-coach-mark', props.coachMarkClass], style: props.style }, [renderBalloon(), slots['coach-mark-content']?.()])\n }\n})\n","/**\n * KRDS KrdsCoachMark 컴포넌트\n */\n\nimport KrdsCoachMark from './KrdsCoachMark'\nimport type { KrdsCoachMarkProps, KrdsCoachMarkEmits } from './KrdsCoachMark'\n\nexport { KrdsCoachMark }\nexport type { KrdsCoachMarkProps, KrdsCoachMarkEmits }\nexport default KrdsCoachMark\n","import { computed, defineComponent, h, nextTick, onMounted, onUnmounted, ref, useId, vShow, withDirectives } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\ntype TooltipType = 'default' | 'icon' | 'button'\n\n/**\n * KRDS Tooltip 컴포넌트 속성\n */\nexport interface KrdsTooltipProps extends BaseComponentProps {\n /** 트리거 버튼 타입 */\n type?: TooltipType\n /** 툴팁 본문 */\n tooltipContent: string\n /** 세로 방향 배치 여부 */\n vertical?: boolean\n /** 박스형 여부 */\n box?: boolean\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsTooltip',\n props: {\n /** 트리거 버튼 타입 */\n type: {\n type: String as PropType<TooltipType>,\n default: 'default'\n },\n /** 툴팁 본문 */\n tooltipContent: {\n type: String,\n required: true\n },\n /** 세로 방향 배치 여부 */\n vertical: {\n type: Boolean,\n default: false\n },\n /** 박스형 여부 */\n box: {\n type: Boolean,\n default: false\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n }\n },\n setup(props, { slots }) {\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 = `tooltip-popover-${useId()}`\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\n return () =>\n h('div', { ref: containerRef }, [\n h(\n 'button',\n {\n type: 'button',\n class: tooltipClasses.value,\n disabled: props.disabled,\n 'aria-labelledby': popoverId,\n onMouseover: showTooltip,\n onMouseout: hideTooltip,\n onFocusin: showTooltip,\n onFocusout: hideTooltip\n },\n slots.default?.()\n ),\n withDirectives(\n h(\n 'div',\n {\n id: popoverId,\n ref: popoverRef,\n class: ['krds-tooltip-popover', popoverClasses.value],\n style: popoverStyle.value,\n 'aria-hidden': !isTooltipVisible.value,\n role: 'tooltip'\n },\n [h('span', { class: 'sr-only' }, buttonText.value), ' ', props.tooltipContent]\n ),\n [[vShow, isTooltipVisible.value]]\n )\n ])\n }\n})\n","/**\n * KRDS Tooltip 컴포넌트\n */\n\nimport KrdsTooltip from './KrdsTooltip'\nimport type { KrdsTooltipProps } from './KrdsTooltip'\n\nexport { KrdsTooltip }\nexport type { KrdsTooltipProps }\nexport default KrdsTooltip\n","import { defineComponent, h, onUnmounted, ref, watch, withModifiers } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\nexport type LanguageData = { code: string; name: string; url?: string }\n\nexport type DropdownPosition = 'left' | 'center' | 'right'\n\n/**\n * KRDS LanguageSwitcher 컴포넌트 속성\n */\nexport interface KrdsLanguageSwitcherProps extends BaseComponentProps {\n /** 언어 목록 */\n languageList: LanguageData[]\n /** 선택된 언어 코드 (v-model) */\n modelValue?: string\n /** 동작 타입 (default: 언어 선택, external: 외부 페이지 이동) */\n type?: 'default' | 'external'\n /** 드롭다운 정렬 위치 */\n dropPosition?: DropdownPosition\n}\n\n/**\n * KRDS LanguageSwitcher 컴포넌트 이벤트\n */\nexport interface KrdsLanguageSwitcherEmits {\n (e: 'update:modelValue', value: string): void\n (e: 'close'): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsLanguageSwitcher',\n props: {\n /** 언어 목록 */\n languageList: {\n type: Array as PropType<LanguageData[]>,\n required: true\n },\n /** 선택된 언어 코드 (v-model) */\n modelValue: {\n type: String,\n default: ''\n },\n /** 동작 타입 (default: 언어 선택, external: 외부 페이지 이동) */\n type: {\n type: String as PropType<'default' | 'external'>,\n default: 'default'\n },\n /** 드롭다운 정렬 위치 */\n dropPosition: {\n type: String as PropType<DropdownPosition>,\n default: 'center'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n close: () => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\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\n /**\n * 기본 타입 (언어 선택)\n */\n const renderDefaultList = () =>\n h(\n 'ul',\n { class: 'drop-list' },\n props.languageList.map(language =>\n h('li', { key: language.code }, [\n h(\n 'a',\n {\n href: '#',\n class: ['item-link', { active: props.modelValue === language.code }],\n lang: language.code,\n 'aria-selected': props.modelValue === language.code,\n onClick: withModifiers(() => selectLanguage(language.code), ['prevent']),\n onFocus: handleItemFocus\n },\n [language.name, ' ', h('span', { class: 'sr-only' }, props.modelValue === language.code ? '선택됨' : '')]\n )\n ])\n )\n )\n\n /**\n * 외부 페이지 이동 타입\n */\n const renderExternalList = () =>\n h(\n 'ul',\n { class: 'drop-list' },\n props.languageList.map(language =>\n h('li', { key: language.code }, [\n h(\n 'a',\n {\n href: language.url || '#',\n class: 'item-link',\n lang: language.code,\n target: '_blank',\n title: '새 창 열림',\n onFocus: handleItemFocus\n },\n [language.name, ' ', h('i', { class: 'svg-icon ico-go' })]\n )\n ])\n )\n )\n\n return () =>\n h(\n 'div',\n {\n ref: dropdownRef,\n class: [\n 'krds-drop-wrap',\n 'krds-language',\n {\n active: isOpen.value,\n 'drop-left': props.dropPosition === 'left',\n 'drop-right': props.dropPosition === 'right'\n }\n ],\n onFocusout: handleFocusOut\n },\n [\n h(\n 'button',\n {\n ref: buttonRef,\n type: 'button',\n class: ['krds-btn small text drop-btn', { active: isOpen.value }],\n 'aria-expanded': isOpen.value,\n onClick: toggleDropdown\n },\n [h('i', { class: 'svg-icon ico-global' }), slots.default?.(), h('i', { class: 'svg-icon ico-toggle' })]\n ),\n h('div', { class: 'drop-menu', style: { display: isOpen.value ? 'block' : 'none' } }, [\n h('div', { class: 'drop-in' }, [\n slots['prev-item'] ? h('div', { class: 'drop-top' }, slots['prev-item']()) : null,\n props.type === 'default' ? renderDefaultList() : props.type === 'external' ? renderExternalList() : null\n ])\n ])\n ]\n )\n }\n})\n","/**\n * KRDS LanguageSwitcher 컴포넌트\n */\n\nimport KrdsLanguageSwitcher from './KrdsLanguageSwitcher'\nimport type { KrdsLanguageSwitcherProps, KrdsLanguageSwitcherEmits, DropdownPosition } from './KrdsLanguageSwitcher'\n\nexport { KrdsLanguageSwitcher }\nexport type { KrdsLanguageSwitcherProps, KrdsLanguageSwitcherEmits, DropdownPosition }\nexport default KrdsLanguageSwitcher\n","import { defineComponent, h, onUnmounted, ref, watch, withModifiers } from 'vue'\n\n/**\n * KRDS Resize 컴포넌트 이벤트\n */\nexport interface KrdsResizeEmits {\n (e: 'update:modelValue', value: string): void\n (e: 'close'): void\n}\n\ninterface ScaleProps {\n key: 'sm' | 'md' | 'lg' | 'xlg' | 'xxlg'\n label: string\n zoom: string\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsResize',\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: string) => true,\n close: () => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(_props, { emit }) {\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\n return () =>\n h(\n 'div',\n {\n ref: dropdownRef,\n class: 'krds-drop-wrap krds-resize',\n 'data-adjust': 'scale',\n onFocusout: handleFocusOut\n },\n [\n h(\n 'button',\n {\n ref: buttonRef,\n type: 'button',\n class: 'krds-btn small text drop-btn',\n onClick: toggleDropdown\n },\n ['화면크기 ', h('i', { class: 'svg-icon ico-toggle' })]\n ),\n h('div', { class: 'drop-menu', style: { display: isOpen.value ? 'block' : 'none' } }, [\n h('div', { class: 'drop-in' }, [\n h(\n 'ul',\n { class: 'drop-list' },\n scaleList.map(scale =>\n h('li', { key: scale.key }, [\n h(\n 'button',\n {\n type: 'button',\n class: ['item-link', scale.key, scale.key === selectedSize.value ? 'active' : ''],\n 'data-adjust-scale': scale.key,\n onClick: withModifiers(() => selectSize(scale), ['prevent']),\n onFocus: handleItemFocus\n },\n scale.label\n )\n ])\n )\n ),\n h('div', { class: 'drop-bottom' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'krds-btn medium text',\n 'data-adjust-scale': 'md',\n onClick: withModifiers(resetSize, ['prevent']),\n onFocus: handleItemFocus\n },\n [h('i', { class: 'svg-icon ico-reset' }), ' 초기화']\n )\n ])\n ])\n ])\n ]\n )\n }\n})\n","/**\n * KRDS Resize 컴포넌트\n */\n\nimport KrdsResize from './KrdsResize'\nimport type { KrdsResizeEmits } from './KrdsResize'\n\nexport { KrdsResize }\nexport type { KrdsResizeEmits }\nexport default KrdsResize\n","import {\n computed,\n defineComponent,\n h,\n Teleport,\n watch,\n onMounted,\n onBeforeUnmount,\n nextTick,\n ref,\n getCurrentInstance,\n type SlotsType\n} 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 /* @__PURE__ */ defineComponent({\n name: 'KrdsModal',\n props: {\n /** 모달 표시 여부 (v-model) */\n modelValue: {\n type: Boolean,\n default: false\n },\n /** 모달 엘리먼트 ID */\n modalId: {\n type: String,\n default: undefined\n },\n /** 배경 딤(backdrop) 표시 여부 */\n backdrop: {\n type: Boolean,\n default: true\n },\n /** 모달 크기 */\n size: {\n type: String as () => KrdsModalSize,\n default: 'medium'\n },\n /** 전체 화면 모달 여부 */\n full: {\n type: Boolean,\n default: false\n },\n /** 하단 시트형 모달 여부 */\n bottomSheet: {\n type: Boolean,\n default: false\n },\n /** 배경 클릭·Esc 키로 닫히지 않는 지속형 모달 여부 */\n persistent: {\n type: Boolean,\n default: false\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n /* eslint-disable @typescript-eslint/no-explicit-any -- Vue SlotsType requires `any` for h() children compatibility */\n slots: Object as SlotsType<{\n title?: () => any\n default?: () => any\n footer?: () => any\n }>,\n /* eslint-enable @typescript-eslint/no-explicit-any */\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 const applyEffects = async () => {\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 }\n\n // DOM 효과는 마운트 이후에만 적용한다 (SSR 안전).\n // 닫힘 정리는 열린 상태에서 닫힐 때만 실행해, 닫힌 모달이 body overflow를 덮어쓰지 않게 한다.\n watch(\n () => props.modelValue,\n newValue => (newValue ? applyEffects() : cleanupEffects())\n )\n\n onMounted(() => {\n if (props.modelValue) applyEffects()\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, string | boolean | undefined> = {\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 KrdsModal from './KrdsModal'\nexport { KrdsModal }\nexport default KrdsModal\nexport type { KrdsModalProps, KrdsModalSize } from './KrdsModal'\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 /* @__PURE__ */ defineComponent({\n name: 'KrdsAccordionGroup',\n props: {\n /** 라인 타입 아코디언 여부 */\n typeLine: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\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","/**\n * KRDS AccordionGroup 컴포넌트\n */\n\nimport KrdsAccordionGroup from './KrdsAccordionGroup'\nimport type { KrdsAccordionGroupProps } from './KrdsAccordionGroup'\n\nexport { KrdsAccordionGroup }\nexport type { KrdsAccordionGroupProps }\nexport default KrdsAccordionGroup\n","import { computed, defineComponent, h } from 'vue'\n\n/**\n * KRDS AccordionItem 컴포넌트 속성\n */\nexport interface KrdsAccordionItemProps {\n /** 아이템 고유 식별자 */\n id: string\n /** 현재 열려 있는 아이템의 id */\n openItem?: string\n /** 헤더 텍스트 (title 슬롯으로 대체 가능) */\n title?: string\n /** 본문 텍스트 (content 슬롯으로 대체 가능) */\n content?: string\n}\n\n/**\n * KRDS AccordionItem 컴포넌트 이벤트\n */\nexport interface KrdsAccordionItemEmits {\n (e: 'toggle', id: string): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsAccordionItem',\n props: {\n /** 아이템 고유 식별자 */\n id: {\n type: String,\n required: true\n },\n /** 현재 열려 있는 아이템의 id */\n openItem: {\n type: String,\n default: undefined\n },\n /** 헤더 텍스트 (title 슬롯으로 대체 가능) */\n title: {\n type: String,\n default: undefined\n },\n /** 본문 텍스트 (content 슬롯으로 대체 가능) */\n content: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n toggle: (id: string) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n const isOpen = computed(() => props.openItem === props.id)\n\n const openToggle = (): void => {\n emit('toggle', props.id)\n }\n\n return () =>\n h('div', { id: props.id, class: ['accordion-item', { active: isOpen.value }] }, [\n h('h5', { class: 'accordion-header' }, [\n h(\n 'button',\n {\n id: `accordion-header-${props.id}`,\n type: 'button',\n class: ['btn-accordion', { active: isOpen.value }],\n 'aria-expanded': isOpen.value,\n 'aria-controls': `accordion-collapse-${props.id}`,\n onClick: openToggle\n },\n slots.title?.() ?? props.title\n )\n ]),\n h(\n 'div',\n {\n id: `accordion-collapse-${props.id}`,\n class: 'accordion-collapse collapse',\n role: 'region',\n 'aria-labelledby': `accordion-header-${props.id}`\n },\n [h('div', { class: 'accordion-body' }, slots.content?.() ?? props.content)]\n )\n ])\n }\n})\n","/**\n * KRDS AccordionItem 컴포넌트\n */\n\nimport KrdsAccordionItem from './KrdsAccordionItem'\nimport type { KrdsAccordionItemProps, KrdsAccordionItemEmits } from './KrdsAccordionItem'\n\nexport { KrdsAccordionItem }\nexport type { KrdsAccordionItemProps, KrdsAccordionItemEmits }\nexport default KrdsAccordionItem\n","import { defineComponent, ref, computed, h, onBeforeUnmount } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * TTS 사이즈 타입\n */\nexport type TtsSize = 'xsmall' | 'small' | 'medium'\n\n/**\n * TTS 아이콘 타입\n */\nexport type TtsIcon = 'volume' | 'play'\n\n/**\n * KRDS TTS 컴포넌트 속성\n */\nexport interface KrdsTtsProps extends BaseComponentProps {\n /** 읽어줄 텍스트 */\n text: string\n /** 레이블 텍스트 (미지정 시 아이콘만 표시) */\n label?: string\n /** 버튼 크기 */\n size?: TtsSize\n /** 아이콘 타입 */\n icon?: TtsIcon\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * KRDS TTS 컴포넌트 이벤트\n */\nexport interface KrdsTtsEmits {\n (e: 'play', text: string): void\n (e: 'pause'): void\n (e: 'end'): void\n (e: 'error', error: Error): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsTts',\n props: {\n /** 읽어줄 텍스트 */\n text: {\n type: String,\n required: true\n },\n /** 레이블 텍스트 (미지정 시 아이콘만 표시) */\n label: {\n type: String,\n default: undefined\n },\n /** 버튼 크기 */\n size: {\n type: String as () => TtsSize,\n default: 'medium'\n },\n /** 아이콘 타입 */\n icon: {\n type: String as () => TtsIcon,\n default: 'volume'\n },\n /** 비활성화 여부 */\n disabled: {\n type: Boolean,\n default: false\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n play: (text: string) => true,\n pause: () => true,\n end: () => true,\n error: (error: Error) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n const isPlaying = ref(false)\n let utterance: SpeechSynthesisUtterance | null = null\n\n const stopSpeech = () => {\n if (typeof window !== 'undefined' && window.speechSynthesis) {\n window.speechSynthesis.cancel()\n }\n isPlaying.value = false\n utterance = null\n }\n\n const toggleTts = () => {\n if (props.disabled) return\n\n if (isPlaying.value) {\n stopSpeech()\n emit('pause')\n return\n }\n\n if (typeof window === 'undefined' || !window.speechSynthesis) {\n emit('error', new Error('SpeechSynthesis API is not supported'))\n return\n }\n\n // 기존 재생 중지\n window.speechSynthesis.cancel()\n\n utterance = new SpeechSynthesisUtterance(props.text)\n utterance.lang = 'ko-KR'\n\n utterance.onstart = () => {\n isPlaying.value = true\n }\n\n utterance.onend = () => {\n isPlaying.value = false\n utterance = null\n emit('end')\n }\n\n utterance.onerror = event => {\n isPlaying.value = false\n utterance = null\n if (event.error !== 'canceled') {\n emit('error', new Error(event.error))\n }\n }\n\n window.speechSynthesis.speak(utterance)\n emit('play', props.text)\n }\n\n const buttonClasses = computed(() => {\n const classes = ['krds-tts']\n\n if (props.size) {\n classes.push(props.size)\n }\n\n if (isPlaying.value) {\n classes.push('pause')\n } else if (props.icon === 'play') {\n classes.push('play')\n }\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n const currentIcon = computed(() => {\n if (isPlaying.value) return 'ico-stop'\n return props.icon === 'play' ? 'ico-play' : 'ico-volume'\n })\n\n onBeforeUnmount(() => {\n stopSpeech()\n })\n\n return () => {\n const children = [h('span', { class: 'krds-tts-icon', 'aria-hidden': 'true' }, [h('i', { class: `svg-icon ${currentIcon.value}` })])]\n\n if (props.label) {\n children.push(h('span', { class: 'krds-tts-text' }, props.label))\n }\n\n return h(\n 'button',\n {\n type: 'button',\n class: buttonClasses.value,\n disabled: props.disabled || undefined,\n onClick: toggleTts\n },\n children\n )\n }\n }\n})\n","/**\n * KRDS TTS 컴포넌트\n */\n\nimport KrdsTts from './KrdsTts'\nimport type { KrdsTtsProps, KrdsTtsEmits, TtsSize, TtsIcon } from './KrdsTts'\n\nexport { KrdsTts }\nexport type { KrdsTtsProps, KrdsTtsEmits, TtsSize, TtsIcon }\nexport default KrdsTts\n","import { defineComponent, h, computed, getCurrentInstance, SlotsType, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * 테이블 행 데이터\n */\nexport type TableRow = Record<string, unknown>\n\n/**\n * 테이블 열 정의\n */\nexport interface TableColumn {\n /** 고유 ID - 컬럼 식별자 */\n name: string\n /** 헤더 라벨 */\n label: string\n /** 행 객체 속성명 또는 함수 */\n field: string | ((row: TableRow) => unknown)\n /** 필수 컬럼 여부 (visible-columns 사용시 항상 표시) */\n required?: boolean\n /** 정렬 */\n align?: 'left' | 'center' | 'right'\n /** body td 스타일 */\n style?: string | ((row: TableRow) => string)\n /** body td 클래스 */\n classes?: string | ((row: TableRow) => string)\n /** header th 스타일 */\n headerStyle?: string\n /** header th 클래스 */\n headerClasses?: string\n}\n\n/**\n * KRDS Table 컴포넌트 속성\n */\nexport interface KrdsTableProps extends BaseComponentProps {\n /** 테이블 캡션 */\n caption?: string\n /** 테이블 열 정의 */\n columns: TableColumn[]\n /** 테이블 행 데이터 */\n rows: TableRow[]\n}\n\n/**\n * KRDS Table 컴포넌트 이벤트\n */\nexport interface KrdsTableEmits {\n (e: 'row-click', row: TableRow, index: number): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsTable',\n props: {\n /** 테이블 캡션 */\n caption: {\n type: String,\n default: undefined\n },\n /** 테이블 열 정의 */\n columns: {\n type: Array as () => TableColumn[],\n required: true\n },\n /** 테이블 행 데이터 */\n rows: {\n type: Array as () => TableRow[],\n required: true\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'row-click': (row: TableRow, index: number) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n 'no-data'?: () => VNode[]\n }>,\n setup(props, { emit, slots }) {\n const instance = getCurrentInstance()\n\n /**\n * 테이블 클래스 계산\n */\n const tableClasses = computed(() => {\n const classes = ['tbl']\n\n // 사용자 정의 클래스 (원본 HTML: \"tbl col data\")\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n /**\n * 컨테이너 클래스 계산\n */\n const wrapperClasses = computed(() => {\n return ['krds-table-wrap']\n })\n\n /**\n * 헤더 스타일 반환\n */\n const getHeaderStyle = (column: TableColumn) => {\n return column.headerStyle || undefined\n }\n\n /**\n * 헤더 클래스 계산\n */\n const getHeaderClasses = (column: TableColumn) => {\n const classes: string[] = []\n\n if (column.align) {\n classes.push(`text-${column.align}`)\n }\n\n if (column.headerClasses) {\n classes.push(column.headerClasses)\n }\n\n return classes.length > 0 ? classes : undefined\n }\n\n /**\n * 바디 셀 스타일 반환\n */\n const getCellStyle = (row: TableRow, column: TableColumn) => {\n if (!column.style) return undefined\n\n if (typeof column.style === 'function') {\n return column.style(row)\n }\n\n return column.style\n }\n\n /**\n * 바디 셀 클래스 계산\n */\n const getCellClasses = (row: TableRow, column: TableColumn) => {\n const classes: string[] = []\n\n if (column.align) {\n classes.push(`text-${column.align}`)\n }\n\n if (column.classes) {\n const columnClasses = typeof column.classes === 'function' ? column.classes(row) : column.classes\n classes.push(columnClasses)\n }\n\n return classes.length > 0 ? classes : undefined\n }\n\n /**\n * colgroup 생성\n */\n const renderColgroup = () => {\n if (!props.columns.length) return null\n\n // headerStyle에서 width 추출\n const hasWidthStyles = props.columns.some(column => column.headerStyle && column.headerStyle.includes('width'))\n\n if (!hasWidthStyles) return null\n\n return h(\n 'colgroup',\n props.columns.map(column => {\n if (!column.headerStyle) return h('col')\n\n // width 값 추출 (예: \"width: 100px;\" 또는 \"width:100px\")\n const widthMatch = column.headerStyle.match(/width\\s*:\\s*([^;]+)/i)\n return h('col', {\n style: widthMatch ? { width: widthMatch[1].trim() } : undefined\n })\n })\n )\n }\n\n /**\n * 테이블 헤더 생성\n */\n const renderHeader = () => {\n if (!props.columns.length) return null\n\n const headerCells = props.columns.map(column => {\n const headerStyle = getHeaderStyle(column)\n const headerClasses = getHeaderClasses(column)\n\n return h(\n 'th',\n {\n scope: 'col',\n class: headerClasses,\n style: headerStyle\n },\n column.label\n )\n })\n\n return h('thead', [h('tr', headerCells)])\n }\n\n /**\n * 셀 값 추출\n */\n const getCellValue = (row: TableRow, column: TableColumn) => {\n if (typeof column.field === 'function') {\n return column.field(row)\n }\n return row[column.field]\n }\n\n /**\n * 테이블 바디 생성\n */\n const renderBody = () => {\n if (!props.rows.length) {\n return h('tbody', [\n h('tr', [\n h(\n 'td',\n {\n colspan: props.columns.length || 1,\n class: 'text-center'\n },\n // no-data 슬롯이 있으면 슬롯 사용, 없으면 기본 텍스트\n slots['no-data'] ? slots['no-data']() : '데이터가 없습니다.'\n )\n ])\n ])\n }\n\n // row-click 리스너가 있을 때만 행을 대화형으로 (기본 표는 비대화형)\n const vnodeProps = instance?.vnode.props\n const clickable = !!(vnodeProps?.onRowClick || vnodeProps?.['onRow-click'])\n\n const bodyRows = props.rows.map((row, index) => {\n const cells = props.columns.map((column, colIndex) => {\n const cellValue = getCellValue(row, column)\n const cellContent = typeof cellValue === 'function' ? cellValue() : cellValue\n const cellStyle = getCellStyle(row, column)\n const cellClasses = getCellClasses(row, column)\n\n return h(\n colIndex === 0 ? 'th' : 'td',\n {\n scope: colIndex === 0 ? 'row' : undefined,\n class: cellClasses,\n style: cellStyle\n },\n cellContent\n )\n })\n\n return h(\n 'tr',\n clickable\n ? {\n tabindex: 0,\n onClick: () => handleRowClick(row, index),\n onKeydown: (event: KeyboardEvent) => handleRowKeydown(event, row, index)\n }\n : null,\n cells\n )\n })\n\n return h('tbody', bodyRows)\n }\n\n /**\n * 행 클릭 핸들러\n */\n const handleRowClick = (row: TableRow, index: number) => {\n emit('row-click', row, index)\n }\n\n /**\n * 행 키보드 핸들러 (Enter·Space로 행 선택, 셀 안 컨트롤의 키 입력은 무시)\n */\n const handleRowKeydown = (event: KeyboardEvent, row: TableRow, index: number) => {\n if (event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' ')) return\n // Space의 페이지 스크롤 방지\n event.preventDefault()\n handleRowClick(row, index)\n }\n\n return () => {\n return h('div', { class: wrapperClasses.value }, [\n h('table', { class: tableClasses.value }, [\n props.caption && h('caption', props.caption),\n renderColgroup(),\n renderHeader(),\n renderBody()\n ])\n ])\n }\n }\n})\n","/**\n * KRDS Table 컴포넌트\n */\n\nimport KrdsTable from './KrdsTable'\nimport type { KrdsTableProps, KrdsTableEmits, TableColumn, TableRow } from './KrdsTable'\n\nexport { KrdsTable }\nexport type { KrdsTableProps, KrdsTableEmits, TableColumn, TableRow }\nexport default KrdsTable\n","import { computed, defineComponent, h, VNode } from 'vue'\nimport type { SlotsType } from 'vue'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * KRDS Header 컴포넌트 속성\n */\nexport interface KrdsHeaderProps {\n /** 헤더 ID */\n id?: string\n /** 추가 CSS 클래스 */\n class?: string\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsHeader',\n props: {\n /** 헤더 ID */\n id: {\n type: String,\n default: 'krds-header'\n },\n /** 추가 CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n slots: Object as SlotsType<{\n /** 유틸리티 메뉴 슬롯 */\n utility?(): VNode[]\n /** 브랜딩 영역 슬롯 (로고, 액션 버튼) */\n branding?(): VNode[]\n /** 데스크탑 네비게이션 슬롯 — KrdsMainMenu 등 완성된 메뉴 요소를 그대로 전달 */\n navigation?(): VNode[]\n /** 모바일 네비게이션 슬롯 — KrdsMainMenu(variant=\"mobile\") 등 완성된 드로어 요소를 그대로 전달 */\n mobileNavigation?(): VNode[]\n }>,\n setup(props, { slots }) {\n // ========================\n // Computed Properties\n // ========================\n\n /**\n * 헤더 클래스 계산\n */\n const headerClasses = computed(() => {\n const classes = []\n\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n // ========================\n // 렌더 함수\n // ========================\n\n return () => {\n const headerInChildren = []\n\n // 헤더 컨테이너 (utility + branding)\n if (slots.utility || slots.branding) {\n const innerChildren = []\n\n if (slots.utility) {\n innerChildren.push(h('div', { class: 'header-utility' }, slots.utility()))\n }\n\n if (slots.branding) {\n innerChildren.push(h('div', { class: 'header-branding' }, slots.branding()))\n }\n\n headerInChildren.push(h('div', { class: 'header-container' }, [h('div', { class: 'inner' }, innerChildren)]))\n }\n\n // 네비게이션 (슬롯이 .krds-main-menu 루트를 포함한 완성된 메뉴를 렌더링)\n if (slots.navigation) {\n headerInChildren.push(...slots.navigation())\n }\n\n const children = [h('div', { class: 'header-in' }, headerInChildren)]\n\n // 모바일 네비게이션 (슬롯이 .krds-main-menu-mobile 루트를 포함한 완성된 드로어를 렌더링)\n if (slots.mobileNavigation) {\n children.push(...slots.mobileNavigation())\n }\n\n return h(\n 'header',\n {\n id: props.id,\n class: headerClasses.value\n },\n children\n )\n }\n }\n})\n","/**\n * KRDS Header 컴포넌트\n */\n\nimport KrdsHeader from './KrdsHeader'\nimport type { KrdsHeaderProps } from './KrdsHeader'\n\nexport { KrdsHeader }\nexport type { KrdsHeaderProps }\nexport default KrdsHeader\n","import { computed, defineComponent, h, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Footer 컴포넌트 속성\n */\nexport interface KrdsFooterProps extends BaseComponentProps {\n /** Footer ID */\n id?: string\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsFooter',\n props: {\n /** Footer ID */\n id: {\n type: String,\n default: 'krds-footer'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n setup(props, { slots }) {\n /**\n * Footer 클래스 계산\n */\n const footerClasses = computed(() => {\n const classes = []\n if (props.class) {\n classes.push(props.class)\n }\n return classes\n })\n\n /**\n * Top 섹션 렌더링\n */\n const renderTop = (): VNode | null => {\n if (!slots.top) return null\n\n return h('div', { class: 'foot-quick' }, [h('div', { class: 'inner' }, slots.top())])\n }\n\n /**\n * 로고 섹션 렌더링\n */\n const renderLogo = (): VNode | null => {\n if (!slots.logo) return null\n return h('div', { class: 'f-logo' }, slots.logo())\n }\n\n /**\n * Footer 콘텐츠 렌더링\n */\n const renderContent = (): VNode | null => {\n if (!slots.content) return null\n return h('div', { class: 'f-cnt' }, slots.content())\n }\n\n /**\n * Footer 하단 렌더링\n */\n const renderBottom = (): VNode | null => {\n if (!slots.bottom) return null\n return h('div', { class: 'f-btm' }, slots.bottom())\n }\n\n return () => {\n const top = renderTop()\n const logo = renderLogo()\n const content = renderContent()\n const bottom = renderBottom()\n\n const innerChildren: VNode[] = []\n if (logo) innerChildren.push(logo)\n if (content) innerChildren.push(content)\n if (bottom) innerChildren.push(bottom)\n\n const children: VNode[] = []\n if (top) children.push(top)\n if (innerChildren.length > 0) {\n children.push(h('div', { class: 'inner' }, innerChildren))\n }\n\n return h(\n 'footer',\n {\n id: props.id,\n class: footerClasses.value\n },\n children\n )\n }\n }\n})\n","/**\n * KRDS Footer 컴포넌트\n */\n\nimport KrdsFooter from './KrdsFooter'\nimport type { KrdsFooterProps } from './KrdsFooter'\n\nexport { KrdsFooter }\nexport type { KrdsFooterProps }\nexport default KrdsFooter\n","import { defineComponent, h, computed, useId } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Disclosure 컴포넌트 속성\n */\nexport interface KrdsDisclosureProps extends BaseComponentProps {\n /** 디스클로저 제목 */\n title: string\n /** 확장 상태 (v-model) */\n modelValue?: boolean\n}\n\n/**\n * KRDS Disclosure 컴포넌트 이벤트\n */\nexport interface KrdsDisclosureEmits {\n (e: 'update:modelValue', value: boolean): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsDisclosure',\n props: {\n /** 디스클로저 제목 */\n title: {\n type: String,\n required: true\n },\n /** 확장 상태 (v-model) */\n modelValue: {\n type: Boolean,\n default: false\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: boolean) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n /**\n * 컴포넌트 고유 ID\n */\n const contentId = `disclosure-${useId()}`\n\n /**\n * 확장 상태 (computed로 props와 동기화)\n */\n const isExpanded = computed(() => props.modelValue)\n\n /**\n * 토글 핸들러\n */\n const handleToggle = () => {\n emit('update:modelValue', !props.modelValue)\n }\n\n return () =>\n h(\n 'div',\n {\n class: ['krds-disclosure', 'conts-expand-area', isExpanded.value && 'active']\n },\n [\n // 토글 버튼\n h(\n 'button',\n {\n type: 'button',\n class: 'btn-conts-expand',\n onClick: handleToggle,\n 'aria-expanded': isExpanded.value,\n 'aria-controls': contentId\n },\n props.title\n ),\n // 확장 콘텐츠 영역\n h(\n 'div',\n {\n id: contentId,\n class: 'expand-wrap',\n inert: !isExpanded.value\n },\n [h('div', { class: 'expand-in' }, slots.default?.())]\n )\n ]\n )\n }\n})\n","/**\n * KRDS Disclosure 컴포넌트\n */\n\nimport KrdsDisclosure from './KrdsDisclosure'\nimport type { KrdsDisclosureProps, KrdsDisclosureEmits } from './KrdsDisclosure'\n\nexport { KrdsDisclosure }\nexport type { KrdsDisclosureProps, KrdsDisclosureEmits }\nexport default KrdsDisclosure\n","import { defineComponent, computed, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Identifier 컴포넌트 속성\n */\n\nexport interface KrdsIdentifierProps extends BaseComponentProps {\n logoLabel?: string\n}\n\n/**\n * KRDS Identifier 컴포넌트 이벤트\n */\nexport interface KrdsIdentifierEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsIdentifier',\n props: {\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 로고 스크린리더 텍스트 */\n logoLabel: {\n type: String,\n default: 'KRDS - Korea Design System'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n click: (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n /**\n * 배지 클래스 계산\n */\n const identifierClasses = computed(() => {\n const classes = ['krds-identifier']\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 class: identifierClasses.value,\n onClick: handleClick\n },\n [\n h('span', { class: 'logo' }, [h('span', { class: 'sr-only' }, props.logoLabel)]),\n h('span', { class: 'ban-txt' }, slots.default?.())\n ]\n )\n }\n})\n","/**\n * KRDS Identifier 컴포넌트\n */\n\nimport KrdsIdentifier from './KrdsIdentifier'\nimport type { KrdsIdentifierProps, KrdsIdentifierEmits } from './KrdsIdentifier'\n\nexport { KrdsIdentifier }\nexport type { KrdsIdentifierProps, KrdsIdentifierEmits }\nexport default KrdsIdentifier\n","import { computed, defineComponent, h, onMounted, onUnmounted, ref } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Layout 컴포넌트 속성\n */\nexport interface KrdsLayoutProps extends BaseComponentProps {\n /** 레이아웃 ID */\n id?: string\n /** 스크롤 감지 활성화 여부 */\n enableScrollDetection?: boolean\n}\n/**\n * 스크롤 상세 정보\n */\nexport interface ScrollDetails {\n scrollY: number\n scrollHeight: number\n direction: 'up' | 'down' | null\n timestamp: number\n}\n\n/**\n * 레이아웃 크기 정보\n */\nexport interface LayoutSize {\n width: number\n height: number\n}\n\n/**\n * KRDS Layout 컴포넌트 이벤트\n */\nexport interface KrdsLayoutEmits {\n resize: [size: LayoutSize]\n scroll: [details: ScrollDetails]\n 'scroll-height': [height: number]\n}\n\n/**\n * 스크롤 감지 시작 오프셋 (px)\n */\nconst SCROLL_OFFSET_THRESHOLD = 50\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsLayout',\n props: {\n /** 레이아웃 ID */\n id: {\n type: String,\n default: 'wrap'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n },\n /** 스크롤 감지 활성화 여부 */\n enableScrollDetection: {\n type: Boolean,\n default: true\n }\n },\n emits: {\n resize: (_size: LayoutSize) => true,\n scroll: (_details: ScrollDetails) => true,\n 'scroll-height': (_height: number) => true\n },\n setup(props, { slots, emit }) {\n const scrollY = ref(0)\n const scrollH = ref(0)\n const lastScrollY = ref(0)\n const scrollDirection = ref<'up' | 'down' | null>(null)\n const wrapElement = ref<HTMLElement | null>(null)\n const resizeObserver = ref<ResizeObserver | null>(null)\n\n /**\n * 스크롤 값 업데이트\n */\n const updateScrollValues = () => {\n const prevScrollHeight = scrollH.value\n scrollY.value = window.scrollY\n scrollH.value = document.body.scrollHeight\n\n // scroll-height 이벤트 발생 (높이가 변경된 경우)\n if (prevScrollHeight !== scrollH.value && prevScrollHeight > 0) {\n emit('scroll-height', scrollH.value)\n }\n }\n\n /**\n * 스크롤 방향 처리\n */\n const handleScrollDirection = () => {\n if (!wrapElement.value || !props.enableScrollDetection) return\n\n const container = document.querySelector('#container')\n if (!container) return\n\n const containerOffsetTop = (container as HTMLElement).offsetTop\n const currentScrollY = window.scrollY\n const isScrollingDown = currentScrollY > lastScrollY.value\n const isScrollingUp = currentScrollY < lastScrollY.value\n\n if (currentScrollY > containerOffsetTop + SCROLL_OFFSET_THRESHOLD) {\n if (isScrollingDown) {\n wrapElement.value.classList.add('scroll-down')\n wrapElement.value.classList.remove('scroll-up')\n scrollDirection.value = 'down'\n } else if (isScrollingUp) {\n wrapElement.value.classList.add('scroll-up')\n wrapElement.value.classList.remove('scroll-down')\n scrollDirection.value = 'up'\n }\n } else {\n wrapElement.value.classList.remove('scroll-down', 'scroll-up')\n scrollDirection.value = null\n }\n\n lastScrollY.value = currentScrollY\n }\n\n /**\n * 스크롤 이벤트 핸들러\n */\n const handleScroll = () => {\n updateScrollValues()\n handleScrollDirection()\n\n // scroll 이벤트 발생\n const scrollDetails: ScrollDetails = {\n scrollY: scrollY.value,\n scrollHeight: scrollH.value,\n direction: scrollDirection.value,\n timestamp: Date.now()\n }\n emit('scroll', scrollDetails)\n }\n\n /**\n * 리사이즈 핸들러\n */\n const handleResize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n const size: LayoutSize = { width, height }\n emit('resize', size)\n }\n }\n\n /**\n * 컨테이너 클래스 계산\n */\n const containerClasses = computed(() => {\n const classes = ['g-wrap']\n\n // 사용자 정의 클래스\n if (props.class) {\n classes.push(props.class)\n }\n\n return classes\n })\n\n onMounted(() => {\n if (props.enableScrollDetection) {\n updateScrollValues()\n window.addEventListener('scroll', handleScroll, { passive: true })\n }\n\n // ResizeObserver 설정\n if (wrapElement.value && typeof ResizeObserver !== 'undefined') {\n resizeObserver.value = new ResizeObserver(handleResize)\n resizeObserver.value.observe(wrapElement.value)\n }\n })\n\n onUnmounted(() => {\n if (props.enableScrollDetection) {\n window.removeEventListener('scroll', handleScroll)\n }\n\n // ResizeObserver 정리\n if (resizeObserver.value) {\n resizeObserver.value.disconnect()\n resizeObserver.value = null\n }\n })\n\n return () => {\n return h(\n 'div',\n {\n id: props.id,\n class: containerClasses.value,\n ref: wrapElement\n },\n slots.default?.()\n )\n }\n }\n})\n","import KrdsLayout from './KrdsLayout'\nimport type { KrdsLayoutProps, KrdsLayoutEmits, ScrollDetails, LayoutSize } from './KrdsLayout'\n\nexport { KrdsLayout }\nexport type { KrdsLayoutProps, KrdsLayoutEmits, ScrollDetails, LayoutSize }\nexport default KrdsLayout\n","import { defineComponent, ref, computed, h, useId, type VNode, type ComponentPublicInstance } from 'vue'\n\n/**\n * 사이드 네비게이션 아이템 인터페이스\n */\nexport interface SideNavItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 확장 상태 */\n expanded?: boolean\n /** 하위 아이템 */\n subItems?: SideNavSubItem[]\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 사이드 네비게이션 하위 아이템 인터페이스\n */\nexport interface SideNavSubItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 확장 상태 (3depth popup용) */\n expanded?: boolean\n /** 팝업 제목 (3depth popup용) */\n popupTitle?: string\n /** 하위 아이템 (4depth용) */\n subItems?: SideNavPopupItem[]\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 사이드 네비게이션 팝업 아이템 인터페이스 (4depth)\n */\nexport interface SideNavPopupItem {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * KRDS SideNavigation 컴포넌트 속성\n */\nexport interface KrdsSideNavigationProps {\n /** 네비게이션 제목 */\n title: string\n /** 메뉴 아이템 배열 */\n modelValue?: SideNavItem[]\n}\n\n/**\n * KRDS SideNavigation 컴포넌트 이벤트\n */\nexport interface KrdsSideNavigationEmits {\n (event: 'update:modelValue', value: SideNavItem[]): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsSideNavigation',\n props: {\n /** 네비게이션 제목 */\n title: {\n type: String,\n required: true\n },\n /** 메뉴 아이템 배열 */\n modelValue: {\n type: Array as () => SideNavItem[],\n default: () => []\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (value: SideNavItem[]) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props: KrdsSideNavigationProps, { emit }: { emit: KrdsSideNavigationEmits }) {\n const modelValue = computed(() => props.modelValue || [])\n // 한 페이지에 여러 개를 두어도 aria-controls 대상 id가 겹치지 않도록\n const uid = useId()\n\n // Template refs를 위한 Map들\n const popupTriggerRefs = ref(new Map<string, HTMLButtonElement>())\n const popupRefs = ref(new Map<string, HTMLDivElement>())\n const popupTitleRefs = ref(new Map<string, HTMLButtonElement>())\n const lastClickedPopupButton = ref<HTMLButtonElement | null>(null)\n\n // Template ref 설정 함수들\n const setPopupTriggerRef = (el: HTMLButtonElement | null, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n if (el) {\n popupTriggerRefs.value.set(key, el)\n } else {\n popupTriggerRefs.value.delete(key)\n }\n }\n\n const setPopupRef = (el: HTMLDivElement | null, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n if (el) {\n popupRefs.value.set(key, el)\n } else {\n popupRefs.value.delete(key)\n }\n }\n\n const setPopupTitleRef = (el: HTMLButtonElement | null, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n if (el) {\n popupTitleRefs.value.set(key, el)\n } else {\n popupTitleRefs.value.delete(key)\n }\n }\n\n /**\n * 서브메뉴 토글\n */\n const toggleSubmenu = (index: number) => {\n const newMenuItems = modelValue.value.map((item, idx) => {\n if (idx === index && item.subItems) {\n const wasExpanded = item.expanded\n const updatedItem = {\n ...item,\n expanded: !item.expanded\n }\n\n // 2뎁스가 닫힐 때 모든 3뎁스 팝업들을 닫기\n if (wasExpanded && !updatedItem.expanded) {\n updatedItem.subItems = item.subItems.map(subItem => ({\n ...subItem,\n expanded: false\n }))\n // 마지막 클릭된 팝업 버튼 참조 초기화\n lastClickedPopupButton.value = null\n }\n\n return updatedItem\n }\n return item\n })\n\n emit('update:modelValue', newMenuItems)\n }\n\n /**\n * 팝업 토글\n */\n const togglePopup = (parentIndex: number, subIndex: number) => {\n const newMenuItems = modelValue.value.map((item, idx) => {\n if (idx === parentIndex && item.subItems) {\n return {\n ...item,\n subItems: item.subItems.map((subItem, subIdx) => {\n if (subIdx === subIndex && subItem.subItems) {\n const updatedSubItem = {\n ...subItem,\n expanded: !subItem.expanded\n }\n\n if (updatedSubItem.expanded) {\n // 현재 클릭된 버튼 저장 - template ref 사용\n const key = `${parentIndex}-${subIndex}`\n lastClickedPopupButton.value = popupTriggerRefs.value.get(key) || null\n\n // 팝업이 열릴 때 포커스 관리 - template ref 사용\n const popupElement = popupRefs.value.get(key)\n const titleButton = popupTitleRefs.value.get(key)\n\n if (popupElement && titleButton) {\n popupElement.addEventListener(\n 'transitionend',\n () => {\n titleButton.focus()\n },\n { once: true }\n )\n // 전환이 없으면(transition: none 등) transitionend가 오지 않으므로 렌더 후 바로 포커스\n requestAnimationFrame(() => {\n if (!popupElement.getAnimations({ subtree: true }).length) titleButton.focus()\n })\n }\n }\n\n return updatedSubItem\n }\n return subItem\n })\n }\n }\n return item\n })\n\n emit('update:modelValue', newMenuItems)\n }\n\n /**\n * 팝업 닫기\n */\n const closePopup = (parentIndex: number, subIndex: number) => {\n const newMenuItems = modelValue.value.map((item, idx) => {\n if (idx === parentIndex && item.subItems) {\n return {\n ...item,\n subItems: item.subItems.map((subItem, subIdx) => {\n if (subIdx === subIndex && subItem.subItems && subItem.expanded) {\n // 포커스를 원래 버튼으로 돌리기 (원본 KRDS와 동일하게 focusout으로 닫힐 때도 복귀)\n if (lastClickedPopupButton.value) {\n const buttonToFocus = lastClickedPopupButton.value\n requestAnimationFrame(() => {\n buttonToFocus.focus()\n })\n lastClickedPopupButton.value = null\n }\n\n return {\n ...subItem,\n expanded: false\n }\n }\n return subItem\n })\n }\n }\n return item\n })\n\n emit('update:modelValue', newMenuItems)\n }\n\n /**\n * 팝업 외부 클릭 시 닫기\n */\n const handlePopupFocusOut = (event: FocusEvent, parentIndex: number, subIndex: number) => {\n const key = `${parentIndex}-${subIndex}`\n const popupElement = popupRefs.value.get(key)\n if (popupElement && !popupElement.contains(event.relatedTarget as Node)) {\n closePopup(parentIndex, subIndex)\n }\n }\n\n /**\n * 팝업 제목 클릭 시 닫기\n */\n const handlePopupTitleClick = (parentIndex: number, subIndex: number) => {\n closePopup(parentIndex, subIndex)\n }\n\n /**\n * 아이템 클릭 핸들러\n */\n const handleItemClick = (item: SideNavItem | SideNavSubItem | SideNavPopupItem, event: MouseEvent) => {\n if (item.onClick) {\n item.onClick(event)\n }\n }\n\n /**\n * 4depth 아이템 렌더링\n */\n const renderPopupItems = (items: SideNavPopupItem[], parentIndex: number, subIndex: number): VNode[] => {\n return items.map((popupItem, popupIndex) =>\n h(\n 'li',\n {\n key: `popup-item-${parentIndex}-${subIndex}-${popupIndex}`,\n role: 'none'\n },\n h(\n 'a',\n {\n href: popupItem.href || '#',\n class: 'lnb-btn',\n role: 'menuitem',\n onClick: (event: MouseEvent) => handleItemClick(popupItem, event)\n },\n popupItem.text\n )\n )\n )\n }\n\n /**\n * 3depth 서브메뉴 렌더링\n */\n const renderSubItems = (subItems: SideNavSubItem[], parentIndex: number): VNode[] => {\n return subItems.map((subItem, subIndex) => {\n const key = `lnb-subitem-${parentIndex}-${subIndex}`\n\n return h(\n 'li',\n {\n key,\n class: ['lnb-subitem', { active: subItem.expanded }],\n role: 'none'\n },\n [\n // 3depth 링크 또는 팝업 버튼\n !subItem.subItems\n ? h(\n 'a',\n {\n href: subItem.href || '#',\n class: ['lnb-btn', 'lnb-link'],\n role: 'menuitem',\n onClick: (event: MouseEvent) => handleItemClick(subItem, event)\n },\n subItem.text\n )\n : [\n // 3depth 팝업 버튼\n h(\n 'button',\n {\n ref: (el: Element | ComponentPublicInstance | null) =>\n setPopupTriggerRef(el as HTMLButtonElement | null, parentIndex, subIndex),\n type: 'button',\n class: 'lnb-btn lnb-toggle-popup',\n role: 'menuitem',\n 'aria-controls': `${uid}-lnbmenu-${parentIndex}-${subIndex}`,\n 'aria-expanded': subItem.expanded ? 'true' : 'false',\n 'aria-haspopup': 'true',\n onClick: () => togglePopup(parentIndex, subIndex)\n },\n subItem.text\n ),\n\n // 3depth 팝업 서브메뉴\n h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) =>\n setPopupRef(el as HTMLDivElement | null, parentIndex, subIndex),\n id: `${uid}-lnbmenu-${parentIndex}-${subIndex}`,\n class: ['lnb-submenu-lv2', { active: subItem.expanded }],\n role: 'menu',\n onFocusout: (event: FocusEvent) => handlePopupFocusOut(event, parentIndex, subIndex)\n },\n [\n // 팝업 제목 버튼\n h(\n 'button',\n {\n ref: (el: Element | ComponentPublicInstance | null) =>\n setPopupTitleRef(el as HTMLButtonElement | null, parentIndex, subIndex),\n type: 'button',\n class: 'lnb-btn-tit',\n onClick: () => handlePopupTitleClick(parentIndex, subIndex)\n },\n subItem.popupTitle || subItem.text\n ),\n\n // 4depth 아이템 목록\n h('ul', {}, renderPopupItems(subItem.subItems || [], parentIndex, subIndex))\n ]\n )\n ]\n ]\n )\n })\n }\n\n /**\n * 2depth 메뉴 아이템 렌더링\n */\n const renderMenuItems = (): VNode[] => {\n return modelValue.value.map((item: SideNavItem, index: number) =>\n h(\n 'li',\n {\n key: `lnb-item-${index}`,\n class: ['lnb-item', { active: item.expanded }],\n role: 'none'\n },\n [\n // 2depth 토글 버튼 (하위 메뉴가 없으면 링크)\n item.subItems\n ? h(\n 'button',\n {\n type: 'button',\n class: ['lnb-btn', 'lnb-toggle', { active: item.expanded }],\n role: 'menuitem',\n 'aria-controls': `${uid}-lnbmenu-${index}`,\n 'aria-expanded': item.expanded ? 'true' : 'false',\n onClick: () => toggleSubmenu(index)\n },\n item.text\n )\n : h(\n 'a',\n {\n href: item.href || '#',\n class: ['lnb-btn', 'lnb-link'],\n role: 'menuitem',\n onClick: (event: MouseEvent) => handleItemClick(item, event)\n },\n item.text\n ),\n\n // 2depth 서브메뉴\n item.subItems\n ? h(\n 'div',\n {\n class: 'lnb-submenu'\n },\n [\n h(\n 'ul',\n {\n id: `${uid}-lnbmenu-${index}`,\n role: 'menu'\n },\n renderSubItems(item.subItems, index)\n )\n ]\n )\n : null\n ]\n )\n )\n }\n\n return () =>\n h('nav', { class: 'krds-side-navigation' }, [\n h('h2', { class: 'lnb-tit' }, props.title),\n h(\n 'ul',\n {\n class: 'lnb-list',\n role: 'menubar'\n },\n renderMenuItems()\n )\n ])\n }\n})\n","/**\n * KRDS SideNavigation 컴포넌트\n */\n\nimport KrdsSideNavigation from './KrdsSideNavigation'\nimport type { KrdsSideNavigationProps, KrdsSideNavigationEmits, SideNavItem, SideNavSubItem, SideNavPopupItem } from './KrdsSideNavigation'\n\nexport { KrdsSideNavigation }\nexport type { KrdsSideNavigationProps, KrdsSideNavigationEmits, SideNavItem, SideNavSubItem, SideNavPopupItem }\nexport default KrdsSideNavigation\n","import { defineComponent, h, SlotsType, type VNode } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS StructuredList 컴포넌트 속성\n */\nexport interface KrdsStructuredListProps extends BaseComponentProps {\n /** 전체 타입 여부 */\n full?: boolean\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsStructuredList',\n props: {\n /** 전체 타입 여부 */\n full: {\n type: Boolean,\n default: true\n }\n },\n slots: Object as SlotsType<{\n cardTop?: () => VNode[]\n cardBody?: () => VNode[]\n cardBtm?: () => VNode[]\n cardBtn?: () => VNode[]\n }>,\n setup(props, { slots }) {\n return () => {\n const cardTop = slots.cardTop?.()\n const cardBody = slots.cardBody?.()\n const cardBtm = slots.cardBtm?.()\n const cardBtn = slots.cardBtn?.()\n\n // 구조화된 슬롯들로 단일 아이템 생성\n const structuredItem = h('li', { class: 'structured-item' }, [\n h(\n 'div',\n { class: 'in' },\n [\n cardTop && h('div', { class: 'card-top' }, cardTop),\n cardBody && h('div', { class: 'card-body' }, cardBody),\n cardBtm && h('div', { class: 'card-btm' }, cardBtm),\n cardBtn && h('div', { class: 'card-btn' }, cardBtn)\n ].filter(Boolean)\n )\n ])\n\n return h(\n 'ul',\n {\n class: ['krds-structured-list', props.full ? 'type-full' : '']\n },\n [structuredItem]\n )\n }\n }\n})\n","/**\n * KRDS StructuredList 컴포넌트\n */\n\nimport KrdsStructuredList from './KrdsStructuredList'\nimport type { KrdsStructuredListProps } from './KrdsStructuredList'\n\nexport { KrdsStructuredList }\nexport type { KrdsStructuredListProps }\nexport default KrdsStructuredList\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS TextList 컴포넌트 속성\n */\nexport interface KrdsTextListProps extends BaseComponentProps {\n /** 리스트 타입 */\n type?: 'ul' | 'ol'\n /** 스타일 변형 */\n variant?: 'decimal' | 'dash' | 'hollow' | 'ordered'\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsTextList',\n props: {\n /** 리스트 타입 */\n type: {\n type: String as () => 'ul' | 'ol',\n default: 'ul'\n },\n /** 스타일 변형 */\n variant: {\n type: String as () => 'decimal' | 'dash' | 'hollow' | 'ordered',\n default: 'dash'\n }\n },\n setup(props, { slots }) {\n return () =>\n h(\n props.type as 'ul' | 'ol',\n {\n class: ['krds-info-list', props.variant]\n },\n slots.default?.()\n )\n }\n})\n","/**\n * KRDS TextList 컴포넌트\n */\n\nimport KrdsTextList from './KrdsTextList'\nimport type { KrdsTextListProps } from './KrdsTextList'\n\nexport { KrdsTextList }\nexport type { KrdsTextListProps }\nexport default KrdsTextList\n","import { defineComponent, h } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * 알림 타입\n */\nexport type AlertType = 'danger' | 'ok' | 'info'\n\n/**\n * KRDS Critical Alerts 컴포넌트 속성\n */\nexport interface KrdsCriticalAlertsProps extends BaseComponentProps {\n /** 알림 타입 */\n type: AlertType\n /** 알림 메시지 */\n message: string\n /** 링크 URL */\n linkHref?: string\n /** 링크 텍스트 */\n linkText?: string\n}\n\n/**\n * KRDS Critical Alerts 컴포넌트 이벤트\n */\nexport interface KrdsCriticalAlertsEmits {\n (e: 'link-click', event: MouseEvent): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsCriticalAlerts',\n props: {\n /** 알림 타입 */\n type: {\n type: String as () => AlertType,\n default: 'info'\n },\n /** 알림 메시지 */\n message: {\n type: String,\n required: true\n },\n /** 링크 URL */\n linkHref: {\n type: String,\n default: undefined\n },\n /** 링크 텍스트 */\n linkText: {\n type: String,\n default: '자세히 보기'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'link-click': (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit }) {\n /**\n * 알림 타입에 따른 배지 텍스트 반환\n */\n const getBadgeText = (type: AlertType): string => {\n const badgeTextMap: Record<AlertType, string> = {\n danger: '긴급',\n ok: '안전',\n info: '안내'\n }\n return badgeTextMap[type]\n }\n\n /**\n * 링크 클릭 핸들러\n */\n const handleLinkClick = (event: MouseEvent) => {\n // 상위로 이벤트 전달\n emit('link-click', event)\n }\n\n return () =>\n h('ul', { class: 'krds-critical-alerts' }, [\n h('li', [\n h('div', { class: 'critical-ban' }, [\n // 배지\n h('span', { class: ['critical-badge', props.type] }, getBadgeText(props.type)),\n\n // 메시지\n h('p', { class: 'critical-txt' }, props.message),\n\n // 링크 (옵션)\n props.linkHref &&\n h(\n 'a',\n {\n href: props.linkHref,\n class: 'krds-btn medium link basic',\n onClick: handleLinkClick\n },\n [h('span', { class: 'm-hide' }, props.linkText), h('i', { class: 'svg-icon ico-angle right' })]\n )\n ])\n ])\n ])\n }\n})\n","/**\n * KRDS Critical Alerts 컴포넌트\n */\n\nimport KrdsCriticalAlerts from './KrdsCriticalAlerts'\nimport type { KrdsCriticalAlertsProps, KrdsCriticalAlertsEmits, AlertType } from './KrdsCriticalAlerts'\n\nexport { KrdsCriticalAlerts }\nexport type { KrdsCriticalAlertsProps, KrdsCriticalAlertsEmits, AlertType }\nexport default KrdsCriticalAlerts\n","import {\n computed,\n defineComponent,\n h,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n Teleport,\n useId,\n watch,\n type ComponentPublicInstance,\n type PropType,\n type SlotsType,\n type VNode\n} from 'vue'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 메인 메뉴 렌더링 방식\n * - `pc`: 데스크탑 메가 메뉴 (`.krds-main-menu`)\n * - `mobile`: 모바일 드로어 메뉴 (`.krds-main-menu-mobile`)\n */\nexport type MainMenuVariant = 'pc' | 'mobile'\n\n/**\n * 서브 패널 레이아웃\n * - `default`: 배너 영역이 하단에 위치\n * - `between`: 배너 영역이 우측에 위치\n */\nexport type MainMenuLayout = 'default' | 'between'\n\n/**\n * 모바일 4depth 아이템 인터페이스\n */\nexport interface MainMenuDepth4Item {\n /** 텍스트 */\n text: string\n /** 링크 URL */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 링크 아이템 인터페이스\n *\n * PC에서는 서브 패널의 마지막 뎁스, 모바일에서는 3depth로 렌더링된다.\n */\nexport interface MainMenuLinkItem {\n /** 텍스트 */\n text: string\n /** 링크 URL (없으면 button으로 렌더링) */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 메뉴 설명 (PC에서 `type-description` 스타일로 렌더링) */\n description?: string\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 4depth 패널 제목 (모바일 전용, 기본값은 `text`) */\n panelTitle?: string\n /** 하위 아이템 (모바일 4depth 전용) */\n items?: MainMenuDepth4Item[]\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 2depth 아이템 인터페이스\n *\n * `items`가 있으면 서브 패널을 여는 트리거로, 없으면 바로가기 링크로 렌더링된다.\n */\nexport interface MainMenuSubItem {\n /** 텍스트 */\n text: string\n /** 링크 URL (`items`가 없을 때 바로가기 링크로 사용) */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 서브 패널 제목 (기본값은 `text`) */\n title?: string\n /** 서브 패널 제목 옆 바로가기 링크 (PC 전용) */\n titleLink?: { text?: string; href: string }\n /** 하위 아이템 (PC 마지막 뎁스 / 모바일 3depth) */\n items?: MainMenuLinkItem[]\n /** 배너 영역 표시 여부 (`banner` 슬롯 필요, PC 전용) */\n banner?: boolean\n /** 서브 패널 레이아웃 (PC 전용) */\n layout?: MainMenuLayout\n /** 모바일 3depth 초기 확장 상태 */\n expanded?: boolean\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/**\n * 1depth 메인 메뉴 아이템 인터페이스\n *\n * `subItems`가 있으면 2depth 목록을 가진 메가 패널을, `items`만 있으면\n * 2depth 목록 없이 링크만 나열하는 `single-list` 패널을 렌더링한다.\n * 둘 다 없으면 단순 링크(`is-link`)로 렌더링된다.\n */\nexport interface MainMenuItem {\n /** 텍스트 */\n text: string\n /** 링크 URL (하위 메뉴가 없을 때 단순 링크로 사용) */\n href?: string\n /** 새 창 열림 여부 */\n external?: boolean\n /** 2depth 아이템 목록 */\n subItems?: MainMenuSubItem[]\n /** 2depth 없이 바로 나열되는 링크 목록 (`single-list`) */\n items?: MainMenuLinkItem[]\n /** `single-list` 패널 제목 */\n title?: string\n /** `single-list` 배너 영역 표시 여부 (`banner` 슬롯 필요) */\n banner?: boolean\n /** `single-list` 패널 레이아웃 */\n layout?: MainMenuLayout\n /** 현재 페이지 여부 (강조 표시) */\n selected?: boolean\n /** 클릭 핸들러 */\n onClick?: (event: MouseEvent) => void\n}\n\n/** 클릭 이벤트로 전달되는 아이템 타입 */\nexport type MainMenuAnyItem = MainMenuItem | MainMenuSubItem | MainMenuLinkItem | MainMenuDepth4Item\n\n/**\n * KRDS MainMenu 컴포넌트 속성\n */\nexport interface KrdsMainMenuProps {\n /** 메뉴 아이템 배열 */\n items?: MainMenuItem[]\n /** 렌더링 방식 */\n variant?: MainMenuVariant\n /** 메뉴 영역 레이블 */\n ariaLabel?: string\n /** 모바일 드로어 열림 상태 (v-model:open) */\n open?: boolean\n /** 모바일 드로어 요소 id (외부 트리거의 `aria-controls` 대상) */\n mobileId?: string\n /** PC 메가 패널 배경 딤(backdrop) 사용 여부 */\n backdrop?: boolean\n /** 모바일 드로어 닫기 버튼 레이블 */\n closeLabel?: string\n}\n\n/**\n * KRDS MainMenu 컴포넌트 이벤트\n */\nexport interface KrdsMainMenuEmits {\n /** 모바일 드로어 열림 상태 변경 */\n (event: 'update:open', value: boolean): void\n /** PC 메가 패널 열림/닫힘 */\n (event: 'menu-toggle', index: number, expanded: boolean): void\n /** 메뉴 아이템 클릭 */\n (event: 'item-click', item: MainMenuAnyItem, mouseEvent: MouseEvent): void\n}\n\n// ========================\n// 상수\n// ========================\n\n/** 새 창으로 열리는 링크의 title 값 */\nconst NEW_WINDOW_TITLE = '새 창 열림'\n\n/** 드로어 전환(transition) 시간과 맞춘 지연 시간 (ms) */\nconst DRAWER_OPEN_DELAY = 100\nconst DRAWER_CLOSE_DELAY = 400\n\n/** 포커스 트랩 대상 셀렉터 */\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsMainMenu',\n props: {\n /** 메뉴 아이템 배열 */\n items: {\n type: Array as PropType<MainMenuItem[]>,\n default: () => []\n },\n /** 렌더링 방식 */\n variant: {\n type: String as PropType<MainMenuVariant>,\n default: 'pc'\n },\n /** 메뉴 영역 레이블 */\n ariaLabel: {\n type: String,\n default: '메인 메뉴'\n },\n /** 모바일 드로어 열림 상태 (v-model:open) */\n open: {\n type: Boolean,\n default: false\n },\n /** 모바일 드로어 요소 id (외부 트리거의 `aria-controls` 대상) */\n mobileId: {\n type: String,\n default: 'mobile-nav'\n },\n /** PC 메가 패널 배경 딤(backdrop) 사용 여부 */\n backdrop: {\n type: Boolean,\n default: true\n },\n /** 모바일 드로어 닫기 버튼 레이블 */\n closeLabel: {\n type: String,\n default: '전체메뉴 닫기'\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:open': (value: boolean) => true,\n 'menu-toggle': (index: number, expanded: boolean) => true,\n 'item-click': (item: MainMenuAnyItem, mouseEvent: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n slots: Object as SlotsType<{\n /** PC 서브 패널 배너 영역 */\n banner?(props: { item: MainMenuItem; subItem?: MainMenuSubItem; index: number; subIndex: number }): VNode[]\n /** 모바일 드로어 헤더 영역 (유틸리티, 로그인, 검색 등) */\n header?(): VNode[]\n /** 모바일 드로어 하단 영역 */\n bottom?(): VNode[]\n }>,\n setup(props, { emit, slots }) {\n const uid = useId()\n\n const rootRef = ref<HTMLElement | null>(null)\n const wrapRef = ref<HTMLElement | null>(null)\n const bodyRef = ref<HTMLElement | null>(null)\n\n const isPc = computed(() => props.variant === 'pc')\n\n // ========================\n // 고유 id 생성 (SSR 안전)\n // ========================\n\n const panelId = (index: number) => `${uid}-gnb-panel-${index}`\n const subPanelId = (index: number, subIndex: number) => `${uid}-gnb-sub-${index}-${subIndex}`\n const tabId = (index: number) => `${uid}-gnb-tab-${index}`\n const depth3Id = (index: number, subIndex: number) => `${uid}-gnb-depth3-${index}-${subIndex}`\n\n // ========================\n // 구조 판별 헬퍼\n // ========================\n\n /** 2depth 목록을 가진 메가 패널인지 */\n const hasSubColumns = (item?: MainMenuItem) => !!item?.subItems?.length\n /** 2depth 없이 링크만 나열하는 패널인지 */\n const hasSingleList = (item?: MainMenuItem) => !hasSubColumns(item) && !!item?.items?.length\n /** 펼칠 패널을 가지고 있는지 */\n const hasPanel = (item?: MainMenuItem) => hasSubColumns(item) || hasSingleList(item)\n /** 2depth가 서브 패널 없이 바로가기 링크로만 동작하는지 */\n const isSubLink = (subItem: MainMenuSubItem) => !subItem.items?.length\n\n /** 새 창 링크 속성 */\n const externalAttrs = (external?: boolean) =>\n external ? { target: '_blank', rel: 'noopener noreferrer', title: NEW_WINDOW_TITLE } : {}\n\n /**\n * 아이템 클릭 처리\n */\n const handleItemClick = (item: MainMenuAnyItem, event: MouseEvent) => {\n item.onClick?.(event)\n emit('item-click', item, event)\n }\n\n // ========================\n // PC 상태\n // ========================\n\n /** 열려 있는 1depth 인덱스 (-1이면 모두 닫힘) */\n const openIndex = ref(-1)\n /** 사용자가 선택한 2depth 인덱스 (1depth 인덱스별) */\n const subOverrides = ref<Record<number, number>>({})\n /** 활성 서브 패널 높이에 맞춘 `.gnb-main-list` 최소 높이 */\n const panelMinHeight = ref(0)\n\n const mainListEls = new Map<number, HTMLElement>()\n const mainTriggerEls = new Map<number, HTMLElement>()\n\n const setElRef = (map: Map<number, HTMLElement>, el: Element | ComponentPublicInstance | null, key: number) => {\n if (el) {\n map.set(key, el as HTMLElement)\n } else {\n map.delete(key)\n }\n }\n\n /**\n * 기본 활성 2depth 인덱스\n *\n * 원본 스크립트와 동일하게 링크가 아닌 첫 번째 2depth를 활성화한다.\n */\n const defaultSubIndex = (item?: MainMenuItem) => {\n const index = item?.subItems?.findIndex(subItem => !isSubLink(subItem))\n return index === undefined ? -1 : index\n }\n\n const activeSubIndex = (index: number) => {\n const override = subOverrides.value[index]\n return override === undefined ? defaultSubIndex(props.items[index]) : override\n }\n\n /**\n * body 상태 클래스 토글 (backdrop 노출 및 스크롤 잠금)\n */\n const setPcBodyState = (isOpen: boolean) => {\n if (typeof document === 'undefined') return\n document.body.classList.toggle('is-gnb-web', isOpen)\n const needsScroll = document.body.scrollHeight > window.innerHeight\n document.body.classList.toggle('hasScrollY', isOpen && needsScroll)\n }\n\n /**\n * 활성 서브 패널 높이에 맞춰 `.gnb-main-list` 최소 높이를 보정\n *\n * `.gnb-sub-list`가 absolute로 배치되므로 부모 높이를 직접 맞춰줘야 한다.\n */\n const adjustPanelHeight = async () => {\n await nextTick()\n const listEl = mainListEls.get(openIndex.value)\n const activeSubList = listEl?.querySelector<HTMLElement>('.gnb-sub-list.active')\n panelMinHeight.value = activeSubList?.scrollHeight ?? 0\n }\n\n /**\n * 메가 패널 닫기\n */\n const closeMainMenu = (restoreFocus = false) => {\n if (openIndex.value === -1) return\n const closedIndex = openIndex.value\n openIndex.value = -1\n panelMinHeight.value = 0\n setPcBodyState(false)\n emit('menu-toggle', closedIndex, false)\n if (restoreFocus) mainTriggerEls.get(closedIndex)?.focus()\n }\n\n /**\n * 메가 패널 토글\n */\n const toggleMainMenu = (index: number) => {\n if (!hasPanel(props.items[index])) return\n if (openIndex.value === index) {\n closeMainMenu()\n return\n }\n // 다른 패널이 열려 있으면 먼저 닫아 menu-toggle(이전, false)를 전달\n closeMainMenu()\n openIndex.value = index\n setPcBodyState(true)\n emit('menu-toggle', index, true)\n void adjustPanelHeight()\n }\n\n /**\n * 2depth 선택\n */\n const selectSubMenu = (index: number, subIndex: number) => {\n subOverrides.value = { ...subOverrides.value, [index]: subIndex }\n void adjustPanelHeight()\n }\n\n /**\n * 메뉴 외부 클릭 시 닫기 (backdrop 클릭 포함)\n */\n const handleDocumentClick = (event: MouseEvent) => {\n const root = rootRef.value\n if (!root || root.contains(event.target as Node)) return\n closeMainMenu()\n }\n\n /**\n * 포커스가 메뉴 밖으로 이동하면 닫기 (Tab 이탈)\n */\n const handlePcFocusout = (event: FocusEvent) => {\n const root = rootRef.value\n const nextTarget = event.relatedTarget as Node | null\n if (!root || !nextTarget || root.contains(nextTarget)) return\n closeMainMenu()\n }\n\n /**\n * PC 키보드 내비게이션 (ESC / Home / End / 방향키)\n */\n const handlePcKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n closeMainMenu(true)\n return\n }\n\n const target = event.target as HTMLElement | null\n if (!target?.dataset.trigger) return\n\n const focusSibling = (direction: 'next' | 'prev') => {\n const listItem = target.closest('li')\n const sibling = direction === 'next' ? listItem?.nextElementSibling : listItem?.previousElementSibling\n sibling?.querySelector<HTMLElement>('[data-trigger]')?.focus()\n }\n\n switch (event.key) {\n case 'Home':\n event.preventDefault()\n mainTriggerEls.get(0)?.focus()\n break\n case 'End':\n event.preventDefault()\n mainTriggerEls.get(props.items.length - 1)?.focus()\n break\n case 'ArrowRight':\n case 'ArrowDown':\n event.preventDefault()\n focusSibling('next')\n break\n case 'ArrowLeft':\n case 'ArrowUp':\n event.preventDefault()\n focusSibling('prev')\n break\n default:\n break\n }\n }\n\n // ========================\n // 모바일 상태\n // ========================\n\n /** 활성 1depth 탭 인덱스 */\n const activeTab = ref(0)\n /** 3depth 확장 상태 (`${index}-${subIndex}` 키) */\n const depth3Expanded = ref<Record<string, boolean>>({})\n /** 표시 중인 4depth 패널 키 (`display` 제어) */\n const depth4Displayed = ref<string | null>(null)\n /** 열려 있는 4depth 패널 키 (`is-open` 제어) */\n const depth4Opened = ref<string | null>(null)\n /** 드로어 DOM 표시 여부 */\n const drawerDisplayed = ref(props.open)\n /** 드로어 열림 상태 (`is-open` / `is-backdrop`) */\n const drawerOpened = ref(props.open)\n\n const panelEls = new Map<number, HTMLElement>()\n const depth3TriggerEls = new Map<string, HTMLElement>()\n const depth4Els = new Map<string, HTMLElement>()\n const depth4PrevEls = new Map<string, HTMLElement>()\n\n const setKeyedRef = (map: Map<string, HTMLElement>, el: Element | ComponentPublicInstance | null, key: string) => {\n if (el) {\n map.set(key, el as HTMLElement)\n } else {\n map.delete(key)\n }\n }\n\n let openTimer: ReturnType<typeof setTimeout> | undefined\n let closeTimer: ReturnType<typeof setTimeout> | undefined\n /** 드로어를 열기 전 포커스 요소 (닫을 때 복귀) */\n let previousActiveElement: HTMLElement | null = null\n\n const setMobileBodyState = (isOpen: boolean) => {\n if (typeof document === 'undefined') return\n document.body.classList.toggle('is-gnb-mobile', isOpen)\n }\n\n /**\n * 열린 드로어로 포커스 이동\n */\n const focusDrawer = () => {\n if (drawerOpened.value) wrapRef.value?.focus()\n }\n\n /**\n * 드로어 열기\n *\n * `display` 변경 직후에는 transition이 동작하지 않으므로,\n * 원본과 동일하게 지연을 두고 열림 클래스를 부여한다.\n * `visibility` 전환이 끝나기 전에는 포커스를 받을 수 없어 원본처럼 `transitionend` 이후에 이동한다.\n */\n const openDrawer = () => {\n if (closeTimer) clearTimeout(closeTimer)\n previousActiveElement = document.activeElement as HTMLElement | null\n drawerDisplayed.value = true\n openTimer = setTimeout(() => {\n drawerOpened.value = true\n setMobileBodyState(true)\n rootRef.value?.addEventListener('transitionend', focusDrawer, { once: true })\n // 전환이 없으면(transition: none 등) transitionend가 오지 않으므로 렌더 후 바로 포커스\n requestAnimationFrame(() => {\n if (!rootRef.value?.getAnimations().length) focusDrawer()\n })\n }, DRAWER_OPEN_DELAY)\n }\n\n /**\n * 드로어 닫기\n */\n const closeDrawer = () => {\n if (openTimer) clearTimeout(openTimer)\n drawerOpened.value = false\n previousActiveElement?.focus()\n previousActiveElement = null\n closeTimer = setTimeout(() => {\n drawerDisplayed.value = false\n setMobileBodyState(false)\n }, DRAWER_CLOSE_DELAY)\n }\n\n watch(\n () => props.open,\n isOpen => {\n if (isOpen) {\n openDrawer()\n } else {\n closeDrawer()\n }\n }\n )\n\n /**\n * 1depth 탭 클릭 시 해당 패널 위치로 스크롤\n */\n const handleTabClick = (event: MouseEvent, index: number) => {\n event.preventDefault()\n activeTab.value = index\n const body = bodyRef.value\n const panel = panelEls.get(index)\n if (body && panel) {\n body.scrollTo({ left: 0, top: panel.offsetTop, behavior: 'smooth' })\n }\n }\n\n /**\n * 스크롤 위치에 따라 활성 탭 갱신\n */\n const handleBodyScroll = () => {\n const body = bodyRef.value\n if (!body) return\n const { scrollTop, scrollHeight, clientHeight } = body\n let nextActive = activeTab.value\n panelEls.forEach((panel, index) => {\n if (scrollTop >= panel.offsetTop || scrollTop + clientHeight >= scrollHeight) {\n nextActive = index\n }\n })\n activeTab.value = nextActive\n }\n\n /**\n * 3depth 토글\n */\n const toggleDepth3 = (event: MouseEvent, key: string) => {\n event.preventDefault()\n depth3Expanded.value = { ...depth3Expanded.value, [key]: !depth3Expanded.value[key] }\n }\n\n /**\n * 4depth 패널 열기\n */\n const openDepth4 = async (event: MouseEvent, key: string) => {\n event.preventDefault()\n depth4Displayed.value = key\n await nextTick()\n depth4Opened.value = key\n await nextTick()\n depth4PrevEls.get(key)?.focus()\n }\n\n /**\n * 4depth 패널 닫기\n */\n const closeDepth4 = (key: string) => {\n depth4Opened.value = null\n depth3TriggerEls.get(key)?.focus()\n setTimeout(() => {\n if (!depth4Opened.value) depth4Displayed.value = null\n }, DRAWER_CLOSE_DELAY)\n }\n\n /**\n * 포커스 트랩\n */\n const trapFocus = (container: HTMLElement, event: KeyboardEvent) => {\n const focusable = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))\n if (!focusable.length) return\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n const active = document.activeElement\n\n if (event.shiftKey && (active === first || active === container)) {\n event.preventDefault()\n last.focus()\n } else if (!event.shiftKey && active === last) {\n event.preventDefault()\n first.focus()\n }\n }\n\n /**\n * 모바일 키보드 처리 (ESC 닫기 + 포커스 트랩)\n */\n const handleMobileKeydown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n if (depth4Opened.value) {\n closeDepth4(depth4Opened.value)\n } else {\n emit('update:open', false)\n }\n return\n }\n\n if (event.key !== 'Tab') return\n const container = depth4Opened.value ? depth4Els.get(depth4Opened.value) : wrapRef.value\n if (container) trapFocus(container, event)\n }\n\n // ========================\n // 라이프사이클\n // ========================\n\n onMounted(() => {\n if (isPc.value) {\n document.addEventListener('click', handleDocumentClick)\n return\n }\n if (props.open) {\n drawerDisplayed.value = true\n drawerOpened.value = true\n setMobileBodyState(true)\n }\n // 초기 확장 상태 반영\n const initialExpanded: Record<string, boolean> = {}\n props.items.forEach((item, index) => {\n item.subItems?.forEach((subItem, subIndex) => {\n if (subItem.expanded) initialExpanded[`${index}-${subIndex}`] = true\n })\n })\n depth3Expanded.value = initialExpanded\n })\n\n onBeforeUnmount(() => {\n if (typeof document !== 'undefined') {\n document.removeEventListener('click', handleDocumentClick)\n document.body.classList.remove('is-gnb-web', 'hasScrollY', 'is-gnb-mobile')\n }\n if (openTimer) clearTimeout(openTimer)\n if (closeTimer) clearTimeout(closeTimer)\n })\n\n // ========================\n // PC 렌더링\n // ========================\n\n /**\n * PC 마지막 뎁스 링크 목록 렌더링\n */\n const renderPcLinkList = (linkItems: MainMenuLinkItem[]): VNode => {\n const isDescription = linkItems.some(linkItem => !!linkItem.description)\n\n const children = linkItems.map((linkItem, linkIndex) => {\n const attrs = externalAttrs(linkItem.external)\n const icon = linkItem.external ? h('i', { class: 'svg-icon ico-go' }) : null\n\n if (isDescription) {\n return h('li', { key: `link-${linkIndex}` }, [\n h('h3', { class: 'tit' }, [\n h(\n 'a',\n {\n href: linkItem.href || '#',\n ...attrs,\n class: { active: linkItem.selected },\n onClick: (event: MouseEvent) => handleItemClick(linkItem, event)\n },\n [linkItem.text, icon]\n )\n ]),\n linkItem.description ? h('p', { class: 'txt' }, linkItem.description) : null\n ])\n }\n\n const tag = linkItem.href ? 'a' : 'button'\n return h('li', { key: `link-${linkIndex}` }, [\n h(\n tag,\n {\n ...(linkItem.href ? { href: linkItem.href, ...attrs } : { type: 'button' }),\n class: { active: linkItem.selected },\n onClick: (event: MouseEvent) => handleItemClick(linkItem, event)\n },\n [linkItem.text, icon]\n )\n ])\n })\n\n return h('ul', { class: isDescription ? 'type-description' : undefined }, children)\n }\n\n /**\n * PC 서브 패널(`.gnb-sub-list`) 렌더링\n */\n const renderPcSubList = (options: {\n id?: string\n title: string\n titleLink?: { text?: string; href: string }\n linkItems: MainMenuLinkItem[]\n layout?: MainMenuLayout\n single?: boolean\n active?: boolean\n banner: VNode | null\n }): VNode => {\n const titleChildren: (VNode | string)[] = options.titleLink\n ? [\n options.title,\n h('a', { href: options.titleLink.href, class: 'krds-btn link basic small' }, [\n h('span', { class: 'underline' }, options.titleLink.text || '바로가기'),\n h('i', { class: 'svg-icon ico-angle right' })\n ])\n ]\n : [h('span', options.title)]\n\n return h(\n 'div',\n {\n id: options.id,\n class: [\n 'gnb-sub-list',\n {\n active: options.active,\n between: options.layout === 'between',\n 'single-list': options.single\n }\n ]\n },\n [\n h('div', { class: 'gnb-sub-content' }, [h('h2', { class: 'sub-title' }, titleChildren), renderPcLinkList(options.linkItems)]),\n options.banner\n ]\n )\n }\n\n /**\n * PC 2depth 트리거 + 서브 패널 렌더링\n */\n const renderPcSubItems = (item: MainMenuItem, index: number): VNode[] => {\n return (item.subItems ?? []).map((subItem, subIndex) => {\n const linkOnly = isSubLink(subItem)\n\n // 서브 패널이 없는 2depth는 바로가기 링크로 렌더링\n if (linkOnly) {\n const tag = subItem.href ? 'a' : 'button'\n return h('li', { key: `sub-${subIndex}` }, [\n h(\n tag,\n {\n ...(subItem.href ? { href: subItem.href, ...externalAttrs(subItem.external) } : { type: 'button' }),\n class: ['gnb-sub-trigger', 'is-link', { 'external-link': subItem.external, selected: subItem.selected }],\n 'data-trigger': 'gnb',\n onClick: (event: MouseEvent) => handleItemClick(subItem, event)\n },\n subItem.text\n )\n ])\n }\n\n const isActive = activeSubIndex(index) === subIndex\n const banner =\n subItem.banner && slots.banner ? h('div', { class: 'gnb-sub-banner' }, slots.banner({ item, subItem, index, subIndex })) : null\n\n return h('li', { key: `sub-${subIndex}` }, [\n h(\n 'button',\n {\n type: 'button',\n class: ['gnb-sub-trigger', { active: isActive, selected: subItem.selected }],\n 'data-trigger': 'gnb',\n 'aria-controls': subPanelId(index, subIndex),\n 'aria-expanded': isActive ? 'true' : 'false',\n 'aria-haspopup': 'true',\n onClick: (event: MouseEvent) => {\n selectSubMenu(index, subIndex)\n handleItemClick(subItem, event)\n }\n },\n subItem.text\n ),\n renderPcSubList({\n id: subPanelId(index, subIndex),\n title: subItem.title || subItem.text,\n titleLink: subItem.titleLink,\n linkItems: subItem.items ?? [],\n layout: subItem.layout,\n active: isActive,\n banner\n })\n ])\n })\n }\n\n /**\n * PC 메가 패널(`.gnb-toggle-wrap`) 렌더링\n */\n const renderPcPanel = (item: MainMenuItem, index: number): VNode => {\n const isOpen = openIndex.value === index\n const withColumns = hasSubColumns(item)\n\n const mainListChildren = withColumns\n ? [h('ul', {}, renderPcSubItems(item, index))]\n : [\n renderPcSubList({\n title: item.title || item.text,\n linkItems: item.items ?? [],\n layout: item.layout,\n single: true,\n banner:\n item.banner && slots.banner ? h('div', { class: 'gnb-sub-banner' }, slots.banner({ item, index, subIndex: -1 })) : null\n })\n ]\n\n return h('div', { id: panelId(index), class: ['gnb-toggle-wrap', { 'is-open': isOpen }] }, [\n h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setElRef(mainListEls, el, index),\n class: 'gnb-main-list',\n ...(withColumns ? { 'data-has-submenu': 'true' } : {}),\n style: isOpen && panelMinHeight.value ? { minHeight: `${panelMinHeight.value}px` } : undefined\n },\n mainListChildren\n )\n ])\n }\n\n /**\n * PC 메인 메뉴 렌더링\n */\n const renderPc = (): VNode => {\n const menuItems = props.items.map((item, index) => {\n const withPanel = hasPanel(item)\n const isOpen = openIndex.value === index\n const tag = !withPanel && item.href ? 'a' : 'button'\n\n const trigger = h(\n tag,\n {\n ref: (el: Element | ComponentPublicInstance | null) => setElRef(mainTriggerEls, el, index),\n ...(tag === 'a' ? { href: item.href, ...externalAttrs(item.external) } : { type: 'button' }),\n class: ['gnb-main-trigger', { active: isOpen, 'is-link': !withPanel, selected: item.selected }],\n 'data-trigger': 'gnb',\n ...(withPanel\n ? {\n 'aria-controls': panelId(index),\n 'aria-expanded': isOpen ? 'true' : 'false',\n 'aria-haspopup': 'true'\n }\n : {}),\n onClick: (event: MouseEvent) => {\n if (withPanel) toggleMainMenu(index)\n handleItemClick(item, event)\n }\n },\n item.text\n )\n\n return h('li', { key: `main-${index}` }, [trigger, withPanel ? renderPcPanel(item, index) : null])\n })\n\n const backdrop =\n props.backdrop && openIndex.value !== -1\n ? h(Teleport, { to: 'body' }, [h('div', { class: 'gnb-backdrop active', 'aria-hidden': 'true' })])\n : null\n\n return h(\n 'nav',\n {\n ref: rootRef,\n class: 'krds-main-menu',\n 'aria-label': props.ariaLabel,\n onKeydown: handlePcKeydown,\n onFocusout: handlePcFocusout\n },\n [h('div', { class: 'inner' }, [h('ul', { class: 'gnb-menu', 'aria-label': props.ariaLabel }, menuItems)]), backdrop]\n )\n }\n\n // ========================\n // 모바일 렌더링\n // ========================\n\n /**\n * 모바일 4depth 패널 렌더링\n */\n const renderDepth4 = (linkItem: MainMenuLinkItem, key: string): VNode => {\n const closeDepth4Panel = () => closeDepth4(key)\n\n return h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setKeyedRef(depth4Els, el, key),\n class: ['depth4-wrap', { 'is-open': depth4Opened.value === key }],\n style: depth4Displayed.value === key ? { display: 'block' } : undefined\n },\n [\n h('div', { class: 'depth4-head' }, [\n h(\n 'button',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setKeyedRef(depth4PrevEls, el, key),\n type: 'button',\n class: 'krds-btn icon trigger-prev',\n onClick: closeDepth4Panel\n },\n [h('span', { class: 'sr-only' }, '이전화면'), h('i', { class: 'svg-icon ico-angle left' })]\n ),\n h('button', { type: 'button', class: 'krds-btn icon trigger-close', onClick: closeDepth4Panel }, [\n h('span', { class: 'sr-only' }, props.closeLabel),\n h('i', { class: 'svg-icon ico-popup-close' })\n ])\n ]),\n h('div', { class: 'depth4-body' }, [\n h('h4', { class: 'sub-title' }, linkItem.panelTitle || linkItem.text),\n h(\n 'ul',\n { class: 'depth4-ul' },\n (linkItem.items ?? []).map((depth4Item, depth4Index) =>\n h('li', { key: `depth4-${depth4Index}` }, [\n h(\n 'a',\n {\n href: depth4Item.href || '#',\n ...externalAttrs(depth4Item.external),\n class: { selected: depth4Item.selected },\n onClick: (event: MouseEvent) => handleItemClick(depth4Item, event)\n },\n depth4Item.text\n )\n ])\n )\n )\n ])\n ]\n )\n }\n\n /**\n * 모바일 3depth 목록 렌더링\n */\n const renderDepth3 = (subItem: MainMenuSubItem, index: number, subIndex: number): VNode => {\n const children = (subItem.items ?? []).map((linkItem, linkIndex) => {\n const key = `${index}-${subIndex}-${linkIndex}`\n const withDepth4 = !!linkItem.items?.length\n\n return h('li', { key: `depth3-${linkIndex}` }, [\n h(\n 'a',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setKeyedRef(depth3TriggerEls, el, key),\n href: linkItem.href || '#',\n ...(withDepth4 ? {} : externalAttrs(linkItem.external)),\n class: ['depth3-trigger', { 'has-depth4': withDepth4, selected: linkItem.selected }],\n ...(withDepth4 ? { 'aria-haspopup': 'true', 'aria-expanded': depth4Opened.value === key ? 'true' : 'false' } : {}),\n onClick: (event: MouseEvent) => {\n if (withDepth4) {\n void openDepth4(event, key)\n }\n handleItemClick(linkItem, event)\n }\n },\n linkItem.text\n ),\n withDepth4 ? renderDepth4(linkItem, key) : null\n ])\n })\n\n return h(\n 'div',\n { id: depth3Id(index, subIndex), class: ['depth3-wrap', { 'is-open': depth3Expanded.value[`${index}-${subIndex}`] }] },\n [h('ul', {}, children)]\n )\n }\n\n /**\n * 모바일 1depth 패널(`.gnb-sub-list`) 렌더링\n */\n const renderMobilePanel = (item: MainMenuItem, index: number): VNode => {\n const subItems = item.subItems ?? []\n\n const children = subItems.map((subItem, subIndex) => {\n const key = `${index}-${subIndex}`\n const withDepth3 = !!subItem.items?.length\n\n return h('li', { key: `sub-${subIndex}` }, [\n h(\n 'a',\n {\n href: subItem.href || '#',\n ...(withDepth3 ? {} : externalAttrs(subItem.external)),\n class: [\n 'gnb-sub-trigger',\n { 'has-depth3': withDepth3, active: withDepth3 && depth3Expanded.value[key], selected: subItem.selected }\n ],\n ...(withDepth3\n ? { 'aria-controls': depth3Id(index, subIndex), 'aria-expanded': depth3Expanded.value[key] ? 'true' : 'false' }\n : {}),\n onClick: (event: MouseEvent) => {\n if (withDepth3) toggleDepth3(event, key)\n handleItemClick(subItem, event)\n }\n },\n subItem.text\n ),\n withDepth3 ? renderDepth3(subItem, index, subIndex) : null\n ])\n })\n\n return h(\n 'div',\n {\n ref: (el: Element | ComponentPublicInstance | null) => setElRef(panelEls, el, index),\n id: panelId(index),\n class: 'gnb-sub-list',\n role: 'tabpanel',\n 'aria-labelledby': tabId(index)\n },\n [h('h2', { class: 'sub-title' }, item.title || item.text), h('ul', {}, children)]\n )\n }\n\n /**\n * 모바일 드로어 렌더링\n */\n const renderMobile = (): VNode => {\n const tabs = props.items.map((item, index) =>\n h('li', { key: `tab-${index}`, role: 'none' }, [\n h(\n 'a',\n {\n id: tabId(index),\n href: `#${panelId(index)}`,\n class: ['gnb-main-trigger', { active: activeTab.value === index }],\n role: 'tab',\n 'aria-controls': panelId(index),\n 'aria-selected': activeTab.value === index ? 'true' : 'false',\n onClick: (event: MouseEvent) => {\n handleTabClick(event, index)\n handleItemClick(item, event)\n }\n },\n item.text\n )\n ])\n )\n\n const bodyChildren: (VNode | null)[] = [\n h('div', { class: 'gnb-menu' }, [\n h('div', { class: 'menu-wrap' }, [h('ul', { role: 'tablist', 'aria-label': props.ariaLabel }, tabs)]),\n h('div', { class: 'submenu-wrap' }, props.items.map(renderMobilePanel))\n ]),\n slots.bottom ? h('div', { class: 'gnb-bottom' }, slots.bottom()) : null\n ]\n\n return h(\n 'div',\n {\n ref: rootRef,\n id: props.mobileId,\n class: ['krds-main-menu-mobile', { 'is-open': drawerOpened.value, 'is-backdrop': drawerOpened.value }],\n style: drawerDisplayed.value ? undefined : { display: 'none' },\n onKeydown: handleMobileKeydown\n },\n [\n h('div', { ref: wrapRef, class: 'gnb-wrap', tabindex: -1 }, [\n h('div', { class: 'gnb-header' }, slots.header ? slots.header() : []),\n h('div', { ref: bodyRef, class: 'gnb-body', onScroll: handleBodyScroll }, bodyChildren),\n h(\n 'button',\n {\n type: 'button',\n id: 'close-nav',\n class: 'krds-btn medium icon',\n onClick: () => emit('update:open', false)\n },\n [h('span', { class: 'sr-only' }, props.closeLabel), h('i', { class: 'svg-icon ico-popup-close' })]\n )\n ])\n ]\n )\n }\n\n return () => (isPc.value ? renderPc() : renderMobile())\n }\n})\n","/**\n * KRDS MainMenu 컴포넌트\n */\n\nimport KrdsMainMenu from './KrdsMainMenu'\nimport type {\n KrdsMainMenuProps,\n KrdsMainMenuEmits,\n MainMenuItem,\n MainMenuSubItem,\n MainMenuLinkItem,\n MainMenuDepth4Item,\n MainMenuAnyItem,\n MainMenuVariant,\n MainMenuLayout\n} from './KrdsMainMenu'\n\nexport { KrdsMainMenu }\nexport type {\n KrdsMainMenuProps,\n KrdsMainMenuEmits,\n MainMenuItem,\n MainMenuSubItem,\n MainMenuLinkItem,\n MainMenuDepth4Item,\n MainMenuAnyItem,\n MainMenuVariant,\n MainMenuLayout\n}\nexport default KrdsMainMenu\n","import {\n Comment,\n Fragment,\n Text,\n computed,\n defineComponent,\n getCurrentInstance,\n h,\n onBeforeUnmount,\n onMounted,\n ref,\n watch,\n type CSSProperties,\n type VNode\n} from 'vue'\n\n// ========================\n// 타입 정의\n// ========================\n\n/**\n * 캐러셀 형태\n * - `visual`: 비주얼 배너형 (원본 carousel.html, 이전/다음 버튼이 슬라이드 좌우에 겹쳐 배치)\n * - `banner`: 배너형 (원본 carousel_banner.html, 인디케이터 안에 페이지네이션·재생 제어·내비게이션 배치)\n */\nexport type KrdsCarouselVariant = 'visual' | 'banner'\n\n/**\n * 페이지네이션 표시 방식\n * - `bullets`: 불릿(점) 목록, 클릭으로 이동 가능\n * - `fraction`: `현재 / 전체` 분수 표기\n * - `none`: 표시하지 않음\n */\nexport type KrdsCarouselPaginationType = 'bullets' | 'fraction' | 'none'\n\n/** 프롭 기본값 — props 선언과 setup 양쪽에서 공유한다 */\nconst DEFAULT_SPEED = 400\nconst DEFAULT_AUTOPLAY_DELAY = 2500\nconst VISUAL_SPACE_BETWEEN = 0\nconst BANNER_SPACE_BETWEEN = 16\n\n/**\n * KRDS Carousel 컴포넌트 속성\n */\nexport interface KrdsCarouselProps {\n /** 캐러셀 형태 (기본값: visual) */\n variant?: KrdsCarouselVariant\n /** 현재 슬라이드 인덱스 (v-model:activeIndex) */\n activeIndex?: number\n /** 처음/마지막 슬라이드에서 순환 이동 여부 (기본값: true) */\n loop?: boolean\n /** 자동 재생 여부. true면 재생/정지 버튼을 노출하고 즉시 재생을 시작한다 (기본값: false) */\n autoplay?: boolean\n /** 자동 재생 간격 (ms, 기본값: 2500) */\n autoplayDelay?: number\n /** 마우스 오버 시 자동 재생 일시 정지 여부 (기본값: true). 포커스 진입 시에는 값과 무관하게 항상 정지한다 */\n pauseOnHover?: boolean\n /** 슬라이드 전환 속도 (ms, 기본값: 400) */\n speed?: number\n /** 슬라이드 사이 간격 (px, 기본값: visual 0 / banner 16) */\n spaceBetween?: number\n /** 페이지네이션 표시 방식 (기본값: visual bullets / banner fraction) */\n pagination?: KrdsCarouselPaginationType\n /** 이전/다음 버튼 표시 여부 (기본값: true) */\n navigation?: boolean\n /** 더 보기 링크 URL. 지정하면 더 보기 버튼을 표시한다 */\n moreHref?: string\n /** 캐러셀 영역 접근성 라벨 */\n ariaLabel?: string\n /** 이전 버튼 라벨 */\n prevLabel?: string\n /** 다음 버튼 라벨 */\n nextLabel?: string\n /** 재생 버튼 라벨 */\n playLabel?: string\n /** 정지 버튼 라벨 */\n stopLabel?: string\n /** 더 보기 버튼 라벨 */\n moreLabel?: string\n /** 엘리먼트 ID */\n id?: string\n}\n\n/**\n * KRDS Carousel 컴포넌트 이벤트\n */\nexport interface KrdsCarouselEmits {\n /** 현재 슬라이드 인덱스 업데이트 (v-model:activeIndex) */\n (e: 'update:activeIndex', value: number): void\n /** 슬라이드 변경 완료 */\n (e: 'change', value: number): void\n /** 자동 재생 시작 */\n (e: 'play'): void\n /** 자동 재생 정지 */\n (e: 'stop'): void\n /** 더 보기 클릭 */\n (e: 'more-click', event: MouseEvent): void\n}\n\n/**\n * 슬롯 자식에서 실제 슬라이드가 될 VNode만 골라낸다.\n * v-for/템플릿으로 전달된 Fragment는 펼치고, 주석·공백 텍스트는 제외한다.\n */\nconst flattenSlides = (nodes?: VNode[]): VNode[] => {\n if (!nodes) return []\n\n return nodes.flatMap(node => {\n if (node.type === Fragment) {\n return Array.isArray(node.children) ? flattenSlides(node.children as VNode[]) : []\n }\n if (node.type === Comment) return []\n if (node.type === Text && typeof node.children === 'string' && node.children.trim() === '') return []\n return [node]\n })\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsCarousel',\n props: {\n /** 캐러셀 형태 (기본값: visual) */\n variant: {\n type: String as () => KrdsCarouselVariant,\n default: 'visual'\n },\n /** 현재 슬라이드 인덱스 (v-model:activeIndex) */\n activeIndex: {\n type: Number,\n default: undefined\n },\n /** 처음/마지막 슬라이드에서 순환 이동 여부 (기본값: true) */\n loop: {\n type: Boolean,\n default: true\n },\n /** 자동 재생 여부. true면 재생/정지 버튼을 노출하고 즉시 재생을 시작한다 (기본값: false) */\n autoplay: {\n type: Boolean,\n default: false\n },\n /** 자동 재생 간격 (ms, 기본값: 2500) */\n autoplayDelay: {\n type: Number,\n default: DEFAULT_AUTOPLAY_DELAY\n },\n /** 마우스 오버 시 자동 재생 일시 정지 여부 (기본값: true). 포커스 진입 시에는 값과 무관하게 항상 정지한다 */\n pauseOnHover: {\n type: Boolean,\n default: true\n },\n /** 슬라이드 전환 속도 (ms, 기본값: 400) */\n speed: {\n type: Number,\n default: DEFAULT_SPEED\n },\n /** 슬라이드 사이 간격 (px, 기본값: visual 0 / banner 16) */\n spaceBetween: {\n type: Number,\n default: undefined\n },\n /** 페이지네이션 표시 방식 (기본값: visual bullets / banner fraction) */\n pagination: {\n type: String as () => KrdsCarouselPaginationType,\n default: undefined\n },\n /** 이전/다음 버튼 표시 여부 (기본값: true) */\n navigation: {\n type: Boolean,\n default: true\n },\n /** 더 보기 링크 URL. 지정하면 더 보기 버튼을 표시한다 */\n moreHref: {\n type: String,\n default: undefined\n },\n /** 캐러셀 영역 접근성 라벨 */\n ariaLabel: {\n type: String,\n default: '캐러셀'\n },\n /** 이전 버튼 라벨 */\n prevLabel: {\n type: String,\n default: '이전'\n },\n /** 다음 버튼 라벨 */\n nextLabel: {\n type: String,\n default: '다음'\n },\n /** 재생 버튼 라벨 */\n playLabel: {\n type: String,\n default: '슬라이드 재생'\n },\n /** 정지 버튼 라벨 */\n stopLabel: {\n type: String,\n default: '슬라이드 멈춤'\n },\n /** 더 보기 버튼 라벨 */\n moreLabel: {\n type: String,\n default: '더 보기'\n },\n /** 엘리먼트 ID */\n id: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:activeIndex': (value: number) => true,\n change: (value: number) => true,\n play: () => true,\n stop: () => true,\n 'more-click': (event: MouseEvent) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n const uid = getCurrentInstance()?.uid\n const wrapperId = computed(() => `${props.id ?? `krds-carousel-${uid}`}-wrapper`)\n\n /** 렌더 시점에 갱신되는 슬라이드 개수 — 이벤트 핸들러는 렌더 이후에 실행되므로 반응형일 필요가 없다 */\n let slideCount = 0\n\n const internalIndex = ref(props.activeIndex ?? 0)\n\n // ========================\n // Computed Properties\n // ========================\n\n /** 슬라이드 간격 — 원본 Swiper 옵션(visual 0 / banner 16)을 기본값으로 사용 */\n const spaceBetween = computed(() => props.spaceBetween ?? (props.variant === 'banner' ? BANNER_SPACE_BETWEEN : VISUAL_SPACE_BETWEEN))\n\n /** 페이지네이션 방식 — 원본 Swiper 옵션(visual bullets / banner fraction)을 기본값으로 사용 */\n const paginationType = computed<KrdsCarouselPaginationType>(\n () => props.pagination ?? (props.variant === 'banner' ? 'fraction' : 'bullets')\n )\n\n // ========================\n // 자동 재생\n // ========================\n\n const isPlaying = ref(false)\n const hoverPaused = ref(false)\n const focusPaused = ref(false)\n const isPaused = computed(() => hoverPaused.value || focusPaused.value)\n\n let autoplayTimer: ReturnType<typeof setInterval> | undefined\n\n const clearAutoplayTimer = () => {\n if (autoplayTimer === undefined) return\n clearInterval(autoplayTimer)\n autoplayTimer = undefined\n }\n\n /**\n * 슬라이드 이동\n */\n const goTo = (index: number) => {\n if (slideCount <= 0) return\n\n const next = props.loop ? ((index % slideCount) + slideCount) % slideCount : Math.min(Math.max(index, 0), slideCount - 1)\n\n if (next === internalIndex.value) return\n\n internalIndex.value = next\n emit('update:activeIndex', next)\n emit('change', next)\n }\n\n const goPrev = () => goTo(internalIndex.value - 1)\n const goNext = () => goTo(internalIndex.value + 1)\n\n const startAutoplay = () => {\n if (isPlaying.value) return\n isPlaying.value = true\n emit('play')\n }\n\n const stopAutoplay = () => {\n if (!isPlaying.value) return\n isPlaying.value = false\n emit('stop')\n }\n\n /**\n * 재생 상태·일시 정지 상태에 맞춰 타이머를 동기화한다\n */\n const syncAutoplayTimer = () => {\n clearAutoplayTimer()\n if (!isPlaying.value || isPaused.value) return\n\n autoplayTimer = setInterval(() => {\n // 순환하지 않는 캐러셀은 마지막 슬라이드에서 재생을 종료한다\n if (!props.loop && slideCount > 0 && internalIndex.value >= slideCount - 1) {\n stopAutoplay()\n return\n }\n goNext()\n }, props.autoplayDelay)\n }\n\n watch([isPlaying, isPaused, () => props.autoplayDelay], syncAutoplayTimer)\n\n watch(\n () => props.autoplay,\n value => {\n if (value) {\n startAutoplay()\n } else {\n stopAutoplay()\n }\n }\n )\n\n watch(\n () => props.activeIndex,\n value => {\n if (typeof value !== 'number' || value === internalIndex.value) return\n internalIndex.value = slideCount > 0 ? Math.min(Math.max(value, 0), slideCount - 1) : value\n }\n )\n\n // ========================\n // 모션 최소화 설정\n // ========================\n\n const reducedMotion = ref(false)\n let motionQuery: MediaQueryList | undefined\n\n const handleMotionChange = (event: MediaQueryListEvent) => {\n reducedMotion.value = event.matches\n }\n\n /** 전환 시간 — 모션 최소화 설정에서는 즉시 이동한다 */\n const transitionDuration = computed(() => (reducedMotion.value ? 0 : props.speed))\n\n onMounted(() => {\n if (typeof window !== 'undefined' && window.matchMedia) {\n motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n reducedMotion.value = motionQuery.matches\n motionQuery.addEventListener('change', handleMotionChange)\n }\n\n if (props.autoplay) startAutoplay()\n })\n\n onBeforeUnmount(() => {\n clearAutoplayTimer()\n motionQuery?.removeEventListener('change', handleMotionChange)\n })\n\n // ========================\n // Event Handlers\n // ========================\n\n const handlePointerEnter = () => {\n if (props.pauseOnHover) hoverPaused.value = true\n }\n\n const handlePointerLeave = () => {\n hoverPaused.value = false\n }\n\n const handleFocusIn = () => {\n focusPaused.value = true\n }\n\n const handleFocusOut = (event: FocusEvent) => {\n const root = event.currentTarget as HTMLElement | null\n if (root && root.contains(event.relatedTarget as Node | null)) return\n focusPaused.value = false\n }\n\n const handleMoreClick = (event: MouseEvent) => {\n emit('more-click', event)\n }\n\n // ========================\n // 인라인 스타일\n // ========================\n // 원본은 swiper-bundle.min.css가 제공하는 트랙 레이아웃에 의존하지만\n // 이 라이브러리에는 해당 CSS가 없으므로 최소한의 레이아웃만 인라인으로 지정한다.\n\n const swiperStyle: CSSProperties = {\n position: 'relative',\n overflow: 'hidden',\n width: '100%'\n }\n\n const slideStyle: CSSProperties = {\n flex: '0 0 100%',\n width: '100%'\n }\n\n const buildWrapperStyle = (current: number): CSSProperties => ({\n display: 'flex',\n width: '100%',\n gap: spaceBetween.value > 0 ? `${spaceBetween.value}px` : undefined,\n transform: `translate3d(calc(${-current} * (100% + ${spaceBetween.value}px)), 0, 0)`,\n transitionProperty: 'transform',\n transitionDuration: `${transitionDuration.value}ms`,\n transitionTimingFunction: 'ease-out',\n willChange: 'transform'\n })\n\n /** visual 형태의 이전/다음 버튼은 슬라이드 좌우에 겹쳐 배치된다 */\n const buildOverlayNavStyle = (isPrev: boolean): CSSProperties => ({\n position: 'absolute',\n top: '50%',\n left: isPrev ? '0' : undefined,\n right: isPrev ? undefined : '0',\n transform: 'translateY(-50%)',\n zIndex: 10\n })\n\n // ========================\n // 렌더 함수\n // ========================\n\n /**\n * 슬라이드 렌더링 — 현재 슬라이드 외에는 보조기기·포커스 대상에서 제외한다\n *\n * 원본 마크업(li)의 목록 의미를 유지하기 위해 role=\"group\"으로 덮어쓰지 않고\n * aria-roledescription으로만 슬라이드임을 알린다. li에 role=\"group\"을 지정하면\n * axe(aria-allowed-role)에 위배된다.\n */\n const renderSlides = (slides: VNode[], current: number): VNode[] =>\n slides.map((slide, index) => {\n const isActive = index === current\n\n return h(\n 'li',\n {\n key: slide.key ?? `krds-carousel-slide-${index}`,\n class: ['swiper-slide', { 'swiper-slide-active': isActive }],\n style: slideStyle,\n 'aria-roledescription': 'slide',\n 'aria-label': `${index + 1} / ${slides.length}`,\n 'aria-hidden': isActive ? undefined : 'true',\n inert: isActive ? undefined : true\n },\n [slide]\n )\n })\n\n /**\n * 이전/다음 버튼 렌더링\n */\n const renderNavigationButton = (direction: 'prev' | 'next', current: number, overlay: boolean): VNode => {\n const isPrev = direction === 'prev'\n const disabled = !props.loop && (isPrev ? current <= 0 : current >= slideCount - 1)\n\n return h(\n 'button',\n {\n type: 'button',\n class: [`swiper-button-${direction}`, { 'swiper-button-disabled': disabled }],\n style: overlay ? buildOverlayNavStyle(isPrev) : undefined,\n disabled,\n 'aria-controls': wrapperId.value,\n onClick: isPrev ? goPrev : goNext\n },\n [h('span', { class: 'sr-only' }, isPrev ? props.prevLabel : props.nextLabel)]\n )\n }\n\n /**\n * 더 보기 링크 렌더링\n */\n const renderMoreLink = (): VNode =>\n h(\n 'a',\n {\n href: props.moreHref,\n class: 'swiper-button-more',\n onClick: handleMoreClick\n },\n [h('span', { class: 'sr-only' }, props.moreLabel)]\n )\n\n /**\n * 페이지네이션 렌더링 (불릿 / 분수)\n */\n const renderPagination = (total: number, current: number): VNode => {\n if (paginationType.value === 'fraction') {\n return h('div', { class: 'swiper-pagination swiper-pagination-fraction' }, [\n h('span', { class: 'swiper-pagination-current' }, String(current + 1)),\n h('span', { 'aria-hidden': 'true' }, '/'),\n h('span', { class: 'swiper-pagination-total' }, String(total))\n ])\n }\n\n return h(\n 'div',\n { class: 'swiper-pagination' },\n Array.from({ length: total }, (_, index) =>\n h('button', {\n key: `krds-carousel-bullet-${index}`,\n type: 'button',\n class: ['swiper-pagination-bullet', { 'swiper-pagination-bullet-active': index === current }],\n 'aria-label': `${index + 1}번째 슬라이드로 이동`,\n 'aria-current': index === current ? 'true' : undefined,\n 'aria-controls': wrapperId.value,\n onClick: () => goTo(index)\n })\n )\n )\n }\n\n /**\n * 재생/정지 컨트롤 렌더링 — 원본 스크립트와 같이 현재 상태의 버튼만 노출한다\n */\n const renderController = (): VNode =>\n h('div', { class: 'swiper-controller' }, [\n h(\n 'button',\n {\n type: 'button',\n class: 'swiper-button-play',\n style: isPlaying.value ? { display: 'none' } : undefined,\n 'aria-controls': wrapperId.value,\n onClick: startAutoplay\n },\n [h('span', { class: 'sr-only' }, props.playLabel)]\n ),\n h(\n 'button',\n {\n type: 'button',\n class: 'swiper-button-stop',\n style: isPlaying.value ? undefined : { display: 'none' },\n 'aria-controls': wrapperId.value,\n onClick: stopAutoplay\n },\n [h('span', { class: 'sr-only' }, props.stopLabel)]\n )\n ])\n\n /**\n * 인디케이터 영역 렌더링 — 형태에 따라 구성 요소와 배치가 달라진다\n */\n const renderIndicator = (total: number, current: number): VNode | null => {\n const isBanner = props.variant === 'banner'\n const showPagination = paginationType.value !== 'none'\n const showMore = Boolean(props.moreHref)\n const children: (VNode | null)[] = []\n\n if (showPagination) children.push(renderPagination(total, current))\n if (props.autoplay) children.push(renderController())\n\n if (isBanner) {\n const navigationChildren: VNode[] = []\n if (props.navigation) {\n navigationChildren.push(renderNavigationButton('prev', current, false), renderNavigationButton('next', current, false))\n }\n if (showMore) navigationChildren.push(renderMoreLink())\n if (navigationChildren.length > 0) children.push(h('div', { class: 'swiper-navigation' }, navigationChildren))\n } else if (showMore) {\n children.push(renderMoreLink())\n }\n\n if (children.length === 0) return null\n\n return h('div', { class: ['swiper-indicator', { 'text-center': !isBanner }] }, children)\n }\n\n return () => {\n const slides = flattenSlides(slots.default?.())\n const total = slides.length\n slideCount = total\n\n const current = total > 0 ? Math.min(Math.max(internalIndex.value, 0), total - 1) : 0\n const isBanner = props.variant === 'banner'\n\n return h(\n 'div',\n {\n id: props.id,\n class: ['krds-carousel', isBanner ? 'main-d-ban-swiper' : 'vb-swiper'],\n style: { position: 'relative' } as CSSProperties,\n role: 'region',\n 'aria-roledescription': 'carousel',\n 'aria-label': props.ariaLabel,\n onMouseenter: handlePointerEnter,\n onMouseleave: handlePointerLeave,\n onFocusin: handleFocusIn,\n onFocusout: handleFocusOut\n },\n [\n // 슬라이드 트랙\n h(\n 'div',\n {\n class: 'swiper',\n style: swiperStyle,\n 'aria-live': isPlaying.value ? 'off' : 'polite'\n },\n [\n h(\n 'ul',\n {\n id: wrapperId.value,\n class: 'swiper-wrapper',\n style: buildWrapperStyle(current)\n },\n renderSlides(slides, current)\n )\n ]\n ),\n\n // visual 형태의 이전/다음 버튼은 슬라이드 위에 겹쳐 배치한다\n !isBanner && props.navigation && total > 0 ? renderNavigationButton('prev', current, true) : null,\n !isBanner && props.navigation && total > 0 ? renderNavigationButton('next', current, true) : null,\n\n // 인디케이터 (페이지네이션 / 재생 제어 / 내비게이션 / 더 보기)\n total > 0 ? renderIndicator(total, current) : null\n ]\n )\n }\n }\n})\n","/**\n * KRDS Carousel 컴포넌트\n */\n\nimport KrdsCarousel from './KrdsCarousel'\nimport type { KrdsCarouselProps, KrdsCarouselEmits, KrdsCarouselVariant, KrdsCarouselPaginationType } from './KrdsCarousel'\n\nexport { KrdsCarousel }\nexport type { KrdsCarouselProps, KrdsCarouselEmits, KrdsCarouselVariant, KrdsCarouselPaginationType }\nexport default KrdsCarousel\n","import { computed, defineComponent, h, ref, useId } from 'vue'\nimport type { PropType } from 'vue'\nimport type { BaseComponentProps } from '@/types'\n\n/**\n * KRDS Tabs 탭 아이템\n */\nexport interface KrdsTabItem {\n /** 탭 고유 식별자 (패널 슬롯 이름으로 사용) */\n id: string\n /** 탭 버튼 레이블 */\n label: string\n /** 비활성화 여부 */\n disabled?: boolean\n}\n\n/**\n * 탭 스타일 변형 (line: 라인형, fill: 버튼형)\n */\nexport type KrdsTabsVariant = 'line' | 'fill'\n\n/**\n * KRDS Tabs 컴포넌트 속성\n */\nexport interface KrdsTabsProps extends BaseComponentProps {\n /** 탭 아이템 목록 */\n tabs: KrdsTabItem[]\n /** 활성 탭 id (v-model) */\n modelValue?: string\n /** 탭 스타일 변형 */\n variant?: KrdsTabsVariant\n /** 풀사이즈 레이아웃 여부 */\n full?: boolean\n /** 선택된 탭의 스크린 리더 대체 텍스트 */\n selectedText?: string\n}\n\n/**\n * KRDS Tabs 컴포넌트 이벤트\n */\nexport interface KrdsTabsEmits {\n (e: 'update:modelValue', id: string): void\n (e: 'change', id: string): void\n}\n\nexport default /* @__PURE__ */ defineComponent({\n name: 'KrdsTabs',\n props: {\n /** 탭 아이템 목록 */\n tabs: {\n type: Array as PropType<KrdsTabItem[]>,\n required: true\n },\n /** 활성 탭 id (v-model) */\n modelValue: {\n type: String,\n default: undefined\n },\n /** 탭 스타일 변형 */\n variant: {\n type: String as PropType<KrdsTabsVariant>,\n default: 'line'\n },\n /** 풀사이즈 레이아웃 여부 */\n full: {\n type: Boolean,\n default: false\n },\n /** 선택된 탭의 스크린 리더 대체 텍스트 */\n selectedText: {\n type: String,\n default: '선택됨'\n },\n /** CSS 클래스 */\n class: {\n type: String,\n default: undefined\n }\n },\n /* eslint-disable @typescript-eslint/no-unused-vars -- 검증 함수 시그니처는 이벤트 타입 문서화용 */\n emits: {\n 'update:modelValue': (id: string) => true,\n change: (id: string) => true\n },\n /* eslint-enable @typescript-eslint/no-unused-vars */\n setup(props, { emit, slots }) {\n /**\n * 컴포넌트 고유 ID (탭-패널 ARIA 연결용)\n */\n const uid = useId()\n const tabId = (id: string): string => `tab-${uid}-${id}`\n const panelId = (id: string): string => `panel-${uid}-${id}`\n\n /**\n * 비제어 모드에서 사용하는 내부 활성 탭 상태\n */\n const internalActiveId = ref(props.tabs.find(tab => !tab.disabled)?.id)\n\n /**\n * 현재 활성 탭 id (modelValue 우선)\n */\n const activeId = computed(() => props.modelValue ?? internalActiveId.value)\n\n const selectTab = (tab: KrdsTabItem): void => {\n if (tab.disabled || tab.id === activeId.value) return\n internalActiveId.value = tab.id\n emit('update:modelValue', tab.id)\n emit('change', tab.id)\n }\n\n /**\n * 좌우 방향키로 탭 버튼 간 초점 이동 (원본 krds_tab 키보드 동작)\n */\n const handleKeydown = (event: KeyboardEvent): void => {\n if (event.key !== 'ArrowRight' && event.key !== 'ArrowLeft') return\n event.preventDefault()\n const currentTab = event.currentTarget as HTMLElement\n const sibling = event.key === 'ArrowRight' ? currentTab.nextElementSibling : currentTab.previousElementSibling\n sibling?.querySelector('button')?.focus()\n }\n\n return () =>\n h('div', { class: ['krds-tab-area', 'layer', props.class] }, [\n // 탭 목록\n h('div', { class: ['tab', props.variant, { full: props.full }] }, [\n h(\n 'ul',\n { role: 'tablist' },\n props.tabs.map(tab =>\n h(\n 'li',\n {\n key: tab.id,\n id: tabId(tab.id),\n role: 'tab',\n 'aria-selected': tab.id === activeId.value,\n 'aria-controls': panelId(tab.id),\n class: { active: tab.id === activeId.value },\n onKeydown: handleKeydown\n },\n [\n h(\n 'button',\n {\n type: 'button',\n class: 'btn-tab',\n disabled: tab.disabled || undefined,\n onClick: () => selectTab(tab)\n },\n [tab.label, tab.id === activeId.value ? h('i', { class: 'sr-only' }, ` ${props.selectedText}`) : null]\n )\n ]\n )\n )\n )\n ]),\n // 탭 콘텐츠\n h(\n 'div',\n { class: 'tab-conts-wrap' },\n props.tabs.map(tab =>\n h(\n 'section',\n {\n key: tab.id,\n id: panelId(tab.id),\n role: 'tabpanel',\n 'aria-labelledby': tabId(tab.id),\n class: ['tab-conts', { active: tab.id === activeId.value }]\n },\n slots[tab.id]?.()\n )\n )\n )\n ])\n }\n})\n","/**\n * KRDS Tabs 컴포넌트\n */\n\nimport KrdsTabs from './KrdsTabs'\nimport type { KrdsTabsProps, KrdsTabsEmits, KrdsTabItem, KrdsTabsVariant } from './KrdsTabs'\n\nexport { KrdsTabs }\nexport type { KrdsTabsProps, KrdsTabsEmits, KrdsTabItem, KrdsTabsVariant }\nexport default KrdsTabs\n","/**\n * KRDS Vue 컴포넌트 진입점\n */\n\n// Button 컴포넌트\nexport { default as KrdsButton } from './KrdsButton'\nexport type { KrdsButtonProps, KrdsButtonEmits } from './KrdsButton'\n\n// ButtonGroup 컴포넌트\nexport { default as KrdsButtonGroup } from './KrdsButtonGroup'\nexport type { KrdsButtonGroupProps } from './KrdsButtonGroup'\n\n// Icon 컴포넌트\nexport { default as KrdsIcon } from './KrdsIcon'\nexport type { KrdsIconProps } from './KrdsIcon'\n\n// Link 컴포넌트\nexport { default as KrdsLink } from './KrdsLink'\nexport type { KrdsLinkProps, KrdsLinkEmits, KrdsLinkSize } from './KrdsLink'\n\n// Input 컴포넌트\nexport { default as KrdsInput } from './KrdsInput'\nexport type { KrdsInputProps, KrdsInputEmits } from './KrdsInput'\n\n// FormLabel 컴포넌트\nexport { default as KrdsFormLabel } from './KrdsFormLabel'\nexport type { KrdsFormLabelProps, KrdsFormLabelEmits } from './KrdsFormLabel'\n\n// FormHint 컴포넌트\nexport { default as KrdsFormHint } from './KrdsFormHint'\nexport type { KrdsFormHintProps, KrdsFormHintEmits } from './KrdsFormHint'\n\n// FormGroup 컴포넌트\nexport { default as KrdsFormGroup } from './KrdsFormGroup'\nexport type { KrdsFormGroupProps } from './KrdsFormGroup'\n\n// DateInput 컴포넌트\nexport { default as KrdsDateInput } from './KrdsDateInput'\nexport type { KrdsDateInputProps, KrdsDateInputEmits } from './KrdsDateInput'\n\n// Textarea 컴포넌트\nexport { default as KrdsTextarea } from './KrdsTextarea'\nexport type { KrdsTextareaProps, KrdsTextareaEmits } from './KrdsTextarea'\n\n// Select 컴포넌트\nexport { default as KrdsSelect } from './KrdsSelect'\nexport type { KrdsSelectProps, KrdsSelectEmits, SelectOption } from './KrdsSelect'\n\n// FileUpload 컴포넌트\nexport { default as KrdsFileUpload } from './KrdsFileUpload'\nexport type { KrdsFileUploadProps, KrdsFileUploadEmits, FileInfo } from './KrdsFileUpload'\n\n// Badge 컴포넌트\nexport { default as KrdsBadge } from './KrdsBadge'\nexport type { KrdsBadgeProps, KrdsBadgeEmits } from './KrdsBadge'\n\n// Tag 컴포넌트\nexport { default as KrdsTag } from './KrdsTag'\nexport type { KrdsTagProps, KrdsTagEmits } from './KrdsTag'\n\n// TagGroup 컴포넌트\nexport { default as KrdsTagGroup } from './KrdsTagGroup'\nexport type { KrdsTagGroupProps, KrdsTagGroupSize } from './KrdsTagGroup'\n\n// Masthead 컴포넌트\nexport { default as KrdsMasthead } from './KrdsMasthead'\nexport type { KrdsMastheadProps, KrdsMastheadEmits } from './KrdsMasthead'\n\n// ToggleSwitch 컴포넌트\nexport { default as KrdsToggleSwitch } from './KrdsToggleSwitch'\nexport type { KrdsToggleSwitchProps, KrdsToggleSwitchEmits } from './KrdsToggleSwitch'\n\n// CheckArea 컴포넌트\nexport { default as KrdsCheckArea } from './KrdsCheckArea'\nexport type { KrdsCheckAreaProps } from './KrdsCheckArea'\n\n// Checkbox 컴포넌트\nexport { default as KrdsCheckbox } from './KrdsCheckbox'\nexport type { KrdsCheckboxProps, KrdsCheckboxEmits } from './KrdsCheckbox'\n\n// Radio 컴포넌트\nexport { default as KrdsRadio } from './KrdsRadio'\nexport type { KrdsRadioProps, KrdsRadioEmits } from './KrdsRadio'\n\n// Spinner 컴포넌트\nexport { default as KrdsSpinner } from './KrdsSpinner'\n\n// StepIndicator 컴포넌트\nexport { default as KrdsStepIndicator } from './KrdsStepIndicator'\nexport type { KrdsStepIndicatorProps, KrdsStepIndicatorEmits } from './KrdsStepIndicator'\n\n// Step 컴포넌트\nexport { default as KrdsStep } from './KrdsStep'\nexport type { KrdsStepProps, KrdsStepEmits } from './KrdsStep'\n\n// SkipLink 컴포넌트\nexport { default as KrdsSkipLink } from './KrdsSkipLink'\nexport type { KrdsSkipLinkProps } from './KrdsSkipLink'\n\n// Breadcrumb 컴포넌트\nexport { default as KrdsBreadcrumb } from './KrdsBreadcrumb'\nexport type { KrdsBreadcrumbProps, KrdsBreadcrumbEmits, BreadcrumbItem } from './KrdsBreadcrumb'\n\n// InPageNavigation 컴포넌트\nexport { default as KrdsInPageNavigation } from './KrdsInPageNavigation'\nexport type { KrdsInPageNavigationProps, KrdsInPageNavigationEmits, NavigationItem } from './KrdsInPageNavigation'\n\n// Pagination 컴포넌트\nexport { default as KrdsPagination } from './KrdsPagination'\nexport type { KrdsPaginationProps, KrdsPaginationEmits } from './KrdsPagination'\n\n// Panel 컴포넌트\nexport { default as KrdsPanel } from './KrdsPanel'\nexport type { KrdsPanelProps, KrdsPanelEmits } from './KrdsPanel'\n\n// ContextualHelp 컴포넌트\nexport { default as KrdsContextualHelp } from './KrdsContextualHelp'\nexport type { KrdsContextualHelpProps } from './KrdsContextualHelp'\n\n// CoachMark 컴포넌트\nexport { default as KrdsCoachMark } from './KrdsCoachMark'\nexport type { KrdsCoachMarkProps, KrdsCoachMarkEmits } from './KrdsCoachMark'\n\n// Tooltip 컴포넌트\nexport { default as KrdsTooltip } from './KrdsTooltip'\nexport type { KrdsTooltipProps } from './KrdsTooltip'\n\n// LanguageSwitcher 컴포넌트\nexport { default as KrdsLanguageSwitcher } from './KrdsLanguageSwitcher'\nexport type { KrdsLanguageSwitcherProps, KrdsLanguageSwitcherEmits, DropdownPosition } from './KrdsLanguageSwitcher'\n\n// Resize 컴포넌트\nexport { default as KrdsResize } from './KrdsResize'\nexport type { KrdsResizeEmits } from './KrdsResize'\n\n// Modal 컴포넌트\nexport { default as KrdsModal } from './KrdsModal'\nexport type { KrdsModalProps, KrdsModalSize } from './KrdsModal'\n\n// AccordionGroup 컴포넌트\nexport { default as KrdsAccordionGroup } from './KrdsAccordionGroup'\nexport type { KrdsAccordionGroupProps } from './KrdsAccordionGroup'\n\n// AccordionItem 컴포넌트\nexport { default as KrdsAccordionItem } from './KrdsAccordionItem'\nexport type { KrdsAccordionItemProps, KrdsAccordionItemEmits } from './KrdsAccordionItem'\n\n// Tts 컴포넌트\nexport { default as KrdsTts } from './KrdsTts'\nexport type { KrdsTtsProps, KrdsTtsEmits, TtsSize, TtsIcon } from './KrdsTts'\n\n// Table 컴포넌트\nexport { default as KrdsTable } from './KrdsTable'\nexport type { KrdsTableProps, KrdsTableEmits, TableColumn, TableRow } from './KrdsTable'\n\n// Header 컴포넌트\nexport { default as KrdsHeader } from './KrdsHeader'\nexport type { KrdsHeaderProps } from './KrdsHeader'\n\n// Footer 컴포넌트\nexport { default as KrdsFooter } from './KrdsFooter'\nexport type { KrdsFooterProps } from './KrdsFooter'\n\n// Disclosure 컴포넌트\nexport { default as KrdsDisclosure } from './KrdsDisclosure'\nexport type { KrdsDisclosureProps, KrdsDisclosureEmits } from './KrdsDisclosure'\n\n// Identifier 컴포넌트\nexport { default as KrdsIdentifier } from './KrdsIdentifier'\nexport type { KrdsIdentifierProps, KrdsIdentifierEmits } from './KrdsIdentifier'\n\n// Layout 컴포넌트\nexport { default as KrdsLayout } from './KrdsLayout'\nexport type { KrdsLayoutProps, KrdsLayoutEmits, ScrollDetails, LayoutSize } from './KrdsLayout'\n\n// SideNavigation 컴포넌트\nexport { default as KrdsSideNavigation } from './KrdsSideNavigation'\nexport type { KrdsSideNavigationProps, KrdsSideNavigationEmits, SideNavItem, SideNavSubItem, SideNavPopupItem } from './KrdsSideNavigation'\n\n// StructuredList 컴포넌트\nexport { default as KrdsStructuredList } from './KrdsStructuredList'\nexport type { KrdsStructuredListProps } from './KrdsStructuredList'\n\n// TextList 컴포넌트\nexport { default as KrdsTextList } from './KrdsTextList'\nexport type { KrdsTextListProps } from './KrdsTextList'\n\n// CriticalAlerts 컴포넌트\nexport { default as KrdsCriticalAlerts } from './KrdsCriticalAlerts'\nexport type { KrdsCriticalAlertsProps, KrdsCriticalAlertsEmits, AlertType } from './KrdsCriticalAlerts'\n\n// MainMenu 컴포넌트\nexport { default as KrdsMainMenu } from './KrdsMainMenu'\nexport type {\n KrdsMainMenuProps,\n KrdsMainMenuEmits,\n MainMenuItem,\n MainMenuSubItem,\n MainMenuLinkItem,\n MainMenuDepth4Item,\n MainMenuAnyItem,\n MainMenuVariant,\n MainMenuLayout\n} from './KrdsMainMenu'\n\n// Carousel 컴포넌트\nexport { default as KrdsCarousel } from './KrdsCarousel'\nexport type { KrdsCarouselProps, KrdsCarouselEmits, KrdsCarouselVariant, KrdsCarouselPaginationType } from './KrdsCarousel'\n\n// Tabs 컴포넌트\nexport { default as KrdsTabs } from './KrdsTabs'\nexport type { KrdsTabsProps, KrdsTabsEmits, KrdsTabItem, KrdsTabsVariant } from './KrdsTabs'\n","/**\n * KRDS Vue 디자인 시스템\n * 대한민국 정부 표준 디자인 시스템 Vue 3 구현체\n *\n * @packageDocumentation\n */\n\nimport type { App, Plugin } from 'vue'\n\ndeclare const __KRDS_VERSION__: string\n\nconst krdsVersion = __KRDS_VERSION__\n\n// 컴포넌트 imports\nimport * as components from './components'\n\n// 디렉티브 imports\nimport { installDirectives } 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// 개별 컴포넌트 export (Tree-shaking 지원)\nexport * from './components'\n\n/** 전역 등록 가능한 컴포넌트 이름 */\nexport type KrdsComponentName = keyof typeof components\n\n/**\n * KRDS Vue 플러그인 설정 옵션\n */\nexport interface KrdsVueOptions {\n /** 설치할 컴포넌트 목록 (비어있으면 전체 설치). 이름은 자동완성되며 임의 문자열도 허용 */\n components?: (KrdsComponentName | (string & {}))[]\n}\n\n/**\n * KRDS Vue 플러그인\n */\nconst KrdsVue: Plugin<[KrdsVueOptions?]> = {\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 installDirectives(app)\n\n // 전역 속성 추가\n app.config.globalProperties.$krds = {\n version: krdsVersion\n }\n\n // 개발 모드에서 설치 로그\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.log(`[KRDS Vue] v${krdsVersion} 설치 완료 - 컴포넌트: ${componentsToInstall.length}개`)\n }\n }\n}\n\nexport default KrdsVue\n\n// 버전 정보\nexport const version = krdsVersion\n"],"mappings":"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"}