@krds.ui/angular 0.0.0-stage → 0.1.0

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.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -2
  3. package/fesm2022/krds.ui-angular.mjs +11456 -0
  4. package/fesm2022/krds.ui-angular.mjs.map +1 -0
  5. package/fonts/PretendardGOV-Bold.subset.woff2 +0 -0
  6. package/fonts/PretendardGOV-Medium.subset.woff2 +0 -0
  7. package/fonts/PretendardGOV-Regular.subset.woff2 +0 -0
  8. package/img/component/icon/head_ico_font_sample.svg +3 -0
  9. package/img/component/icon/head_ico_font_sample_white.svg +3 -0
  10. package/img/component/icon/ico_all.svg +3 -0
  11. package/img/component/icon/ico_angle.svg +3 -0
  12. package/img/component/icon/ico_angle_disabled.svg +3 -0
  13. package/img/component/icon/ico_angle_disabled_inverse.svg +3 -0
  14. package/img/component/icon/ico_angle_inverse.svg +3 -0
  15. package/img/component/icon/ico_arrow_dropdown.svg +3 -0
  16. package/img/component/icon/ico_blog.svg +6 -0
  17. package/img/component/icon/ico_bread_home.svg +3 -0
  18. package/img/component/icon/ico_calendar.svg +3 -0
  19. package/img/component/icon/ico_call.svg +3 -0
  20. package/img/component/icon/ico_checkbox.svg +5 -0
  21. package/img/component/icon/ico_checkbox_checked.svg +5 -0
  22. package/img/component/icon/ico_close.svg +3 -0
  23. package/img/component/icon/ico_complete_fill.svg +4 -0
  24. package/img/component/icon/ico_delete.svg +3 -0
  25. package/img/component/icon/ico_delete_fill.svg +4 -0
  26. package/img/component/icon/ico_download.svg +3 -0
  27. package/img/component/icon/ico_ellipsis.svg +3 -0
  28. package/img/component/icon/ico_email.svg +3 -0
  29. package/img/component/icon/ico_error_fill.svg +4 -0
  30. package/img/component/icon/ico_expand.svg +3 -0
  31. package/img/component/icon/ico_facebook.svg +3 -0
  32. package/img/component/icon/ico_faq.svg +3 -0
  33. package/img/component/icon/ico_file.svg +3 -0
  34. package/img/component/icon/ico_file_figma.svg +13 -0
  35. package/img/component/icon/ico_file_html.svg +13 -0
  36. package/img/component/icon/ico_file_hwp.svg +13 -0
  37. package/img/component/icon/ico_file_pdf.svg +13 -0
  38. package/img/component/icon/ico_file_sketch.svg +13 -0
  39. package/img/component/icon/ico_file_xd.svg +16 -0
  40. package/img/component/icon/ico_filter.svg +5 -0
  41. package/img/component/icon/ico_flag.svg +29 -0
  42. package/img/component/icon/ico_flow_arrow.svg +3 -0
  43. package/img/component/icon/ico_foldable.svg +3 -0
  44. package/img/component/icon/ico_global.svg +3 -0
  45. package/img/component/icon/ico_go.svg +3 -0
  46. package/img/component/icon/ico_go_top.svg +5 -0
  47. package/img/component/icon/ico_help.svg +4 -0
  48. package/img/component/icon/ico_help_fill.svg +4 -0
  49. package/img/component/icon/ico_information.svg +5 -0
  50. package/img/component/icon/ico_information_fill.svg +4 -0
  51. package/img/component/icon/ico_information_fill_high_contrast.svg +5 -0
  52. package/img/component/icon/ico_instagram.svg +3 -0
  53. package/img/component/icon/ico_join.svg +3 -0
  54. package/img/component/icon/ico_like.svg +3 -0
  55. package/img/component/icon/ico_login.svg +3 -0
  56. package/img/component/icon/ico_login_certify_go.svg +4 -0
  57. package/img/component/icon/ico_login_certify_type_01.svg +3 -0
  58. package/img/component/icon/ico_login_certify_type_02.svg +3 -0
  59. package/img/component/icon/ico_login_certify_type_03.svg +3 -0
  60. package/img/component/icon/ico_login_certify_type_04.svg +5 -0
  61. package/img/component/icon/ico_login_certify_type_05.svg +3 -0
  62. package/img/component/icon/ico_login_certify_type_06.svg +3 -0
  63. package/img/component/icon/ico_logo_krds.svg +10 -0
  64. package/img/component/icon/ico_logo_krds_high_contrast.svg +10 -0
  65. package/img/component/icon/ico_logout.svg +3 -0
  66. package/img/component/icon/ico_minus.svg +3 -0
  67. package/img/component/icon/ico_more.svg +3 -0
  68. package/img/component/icon/ico_my.svg +3 -0
  69. package/img/component/icon/ico_notice_fill.svg +5 -0
  70. package/img/component/icon/ico_notice_fill_blue.svg +5 -0
  71. package/img/component/icon/ico_notice_fill_high_contrast.svg +5 -0
  72. package/img/component/icon/ico_play.svg +3 -0
  73. package/img/component/icon/ico_plus.svg +3 -0
  74. package/img/component/icon/ico_print.svg +3 -0
  75. package/img/component/icon/ico_pw_visible_off.svg +3 -0
  76. package/img/component/icon/ico_pw_visible_on.svg +5 -0
  77. package/img/component/icon/ico_reset.svg +3 -0
  78. package/img/component/icon/ico_sch.svg +3 -0
  79. package/img/component/icon/ico_sch_plus.svg +3 -0
  80. package/img/component/icon/ico_scrap.svg +3 -0
  81. package/img/component/icon/ico_setting.svg +3 -0
  82. package/img/component/icon/ico_share.svg +3 -0
  83. package/img/component/icon/ico_sns_x.svg +3 -0
  84. package/img/component/icon/ico_step_done.svg +3 -0
  85. package/img/component/icon/ico_stop.svg +3 -0
  86. package/img/component/icon/ico_success_fill.svg +4 -0
  87. package/img/component/icon/ico_swiper_play.svg +3 -0
  88. package/img/component/icon/ico_swiper_stop.svg +3 -0
  89. package/img/component/icon/ico_switch_off.svg +6 -0
  90. package/img/component/icon/ico_switch_on.svg +5 -0
  91. package/img/component/icon/ico_tooltip.svg +3 -0
  92. package/img/component/icon/ico_upload.svg +3 -0
  93. package/img/component/icon/ico_urgent_badge_danger.svg +5 -0
  94. package/img/component/icon/ico_urgent_badge_info.svg +7 -0
  95. package/img/component/icon/ico_urgent_badge_ok.svg +5 -0
  96. package/img/component/icon/ico_view_mode.svg +3 -0
  97. package/img/component/icon/ico_volume.svg +3 -0
  98. package/img/component/icon/ico_warning_fill.svg +9 -0
  99. package/img/component/icon/ico_youtube.svg +3 -0
  100. package/package.json +51 -3
  101. package/style.css +1 -0
  102. package/types/krds.ui-angular.d.ts +3088 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"krds.ui-angular.mjs","names":["nextId","nextId","nextId","nextId","i1.KrdsControl","nextId","nextId","nextId","nextId","i1.KrdsDropdown","FOCUSABLE","nextId","nextId","nextId","nextId","i1.KrdsDropdown","i1.KrdsControl","nextId","nextId","nextId"],"sources":["../../../projects/krds-angular/src/lib/accordion/accordion.ts","../../../projects/krds-angular/src/lib/badge/badge.ts","../../../projects/krds-angular/src/lib/breadcrumb/breadcrumb.ts","../../../projects/krds-angular/src/lib/button/button.ts","../../../projects/krds-angular/src/lib/carousel/carousel.ts","../../../projects/krds-angular/src/lib/control/control.ts","../../../projects/krds-angular/src/lib/checkbox/checkbox.ts","../../../projects/krds-angular/src/lib/coach-mark/coach-mark.ts","../../../projects/krds-angular/src/lib/contextual-help/contextual-help.ts","../../../projects/krds-angular/src/lib/critical-alerts/critical-alerts.ts","../../../projects/krds-angular/src/lib/input/input.ts","../../../projects/krds-angular/src/lib/date-input/date-input.ts","../../../projects/krds-angular/src/lib/disclosure/disclosure.ts","../../../projects/krds-angular/src/lib/dropdown/dropdown.ts","../../../projects/krds-angular/src/lib/file-upload/file-upload.ts","../../../projects/krds-angular/src/lib/floating-button/floating-button.ts","../../../projects/krds-angular/src/lib/footer/footer.ts","../../../projects/krds-angular/src/lib/spinner/spinner.ts","../../../projects/krds-angular/src/lib/form-group/form-group.ts","../../../projects/krds-angular/src/lib/header/header.ts","../../../projects/krds-angular/src/lib/identifier/identifier.ts","../../../projects/krds-angular/src/lib/image/image.ts","../../../projects/krds-angular/src/lib/in-page-navigation/in-page-navigation.ts","../../../projects/krds-angular/src/lib/link/link.ts","../../../projects/krds-angular/src/lib/language-switcher/language-switcher.ts","../../../projects/krds-angular/src/lib/layout/layout.ts","../../../projects/krds-angular/src/lib/main-menu/main-menu.ts","../../../projects/krds-angular/src/lib/masthead/masthead.ts","../../../projects/krds-angular/src/lib/media/media.ts","../../../projects/krds-angular/src/lib/modal/modal.ts","../../../projects/krds-angular/src/lib/pagination/pagination.ts","../../../projects/krds-angular/src/lib/panel/panel.ts","../../../projects/krds-angular/src/lib/quantity-toggle/quantity-toggle.ts","../../../projects/krds-angular/src/lib/range-slider/range-slider.ts","../../../projects/krds-angular/src/lib/resize/resize.ts","../../../projects/krds-angular/src/lib/select/select.ts","../../../projects/krds-angular/src/lib/side-navigation/side-navigation.ts","../../../projects/krds-angular/src/lib/skip-link/skip-link.ts","../../../projects/krds-angular/src/lib/snackbar/snackbar.ts","../../../projects/krds-angular/src/lib/step-indicator/step-indicator.ts","../../../projects/krds-angular/src/lib/structured-list/structured-list.ts","../../../projects/krds-angular/src/lib/tab-bar/tab-bar.ts","../../../projects/krds-angular/src/lib/table/table.ts","../../../projects/krds-angular/src/lib/tabs/tabs.ts","../../../projects/krds-angular/src/lib/tag/tag.ts","../../../projects/krds-angular/src/lib/text-list/text-list.ts","../../../projects/krds-angular/src/lib/textarea/textarea.ts","../../../projects/krds-angular/src/lib/toast/toast.ts","../../../projects/krds-angular/src/lib/toggle-switch/toggle-switch.ts","../../../projects/krds-angular/src/lib/tooltip/tooltip.ts","../../../projects/krds-angular/src/lib/tts/tts.ts"],"sourcesContent":["import { Component, Directive, booleanAttribute, computed, inject, input, model, numberAttribute } from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\n\nlet nextId = 0\n\n/**\n * KRDS 아코디언 묶음. 한 번에 한 항목만 펼치고, 펼친 항목의 value를 `[(open)]`으로 주고받는다\n *\n * @example\n * <div krdsAccordion [(open)]=\"openItem\">\n * <krds-accordion-item value=\"fee\" label=\"수수료가 있나요?\">수수료는 없습니다.</krds-accordion-item>\n * <krds-accordion-item value=\"time\" label=\"처리 기간은?\">3일 이내입니다.</krds-accordion-item>\n * </div>\n */\n@Directive({\n selector: '[krdsAccordion]',\n host: {\n class: 'krds-accordion',\n '[class.type-line]': 'typeLine()'\n }\n})\nexport class KrdsAccordion {\n /** 펼친 항목의 value (없으면 모두 접힘) */\n readonly open = model<string | null>(null)\n /** 라인 스타일 */\n readonly typeLine = input(false, { transform: booleanAttribute })\n /** 항목 제목의 수준 (2~6). 페이지의 제목 구조에 맞춰, 바로 위 제목보다 한 단계 아래로 둔다 */\n readonly headingLevel = input(5, { transform: numberAttribute })\n\n /** 펼친 항목을 다시 누르면 접고, 다른 항목을 누르면 그 항목만 펼친다 */\n toggle(value: string) {\n this.open.set(this.open() === value ? null : value)\n }\n}\n\n/**\n * 아코디언 항목. 제목은 label로, 풍부한 제목은 `[krdsAccordionLabel]` 요소로 넣는다\n */\n@Component({\n selector: 'krds-accordion-item',\n imports: [NgTemplateOutlet],\n host: {\n class: 'accordion-item',\n '[class.active]': 'isOpen()'\n },\n template: `\n <ng-template #button>\n <button\n type=\"button\"\n class=\"btn-accordion\"\n [class.active]=\"isOpen()\"\n [id]=\"headerId\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-controls]=\"collapseId\"\n (click)=\"accordion?.toggle(value())\"\n >\n {{ label() }}<ng-content select=\"[krdsAccordionLabel]\" />\n </button>\n </ng-template>\n <!-- 요소 이름은 바인딩할 수 없어 수준마다 둔다 (KRDS reset이 제목 수준과 관계없이 같은 모양으로 맞춤) -->\n @switch (accordion?.headingLevel()) {\n @case (2) {\n <h2 class=\"accordion-header\"><ng-container [ngTemplateOutlet]=\"button\" /></h2>\n }\n @case (3) {\n <h3 class=\"accordion-header\"><ng-container [ngTemplateOutlet]=\"button\" /></h3>\n }\n @case (4) {\n <h4 class=\"accordion-header\"><ng-container [ngTemplateOutlet]=\"button\" /></h4>\n }\n @case (6) {\n <h6 class=\"accordion-header\"><ng-container [ngTemplateOutlet]=\"button\" /></h6>\n }\n @default {\n <h5 class=\"accordion-header\"><ng-container [ngTemplateOutlet]=\"button\" /></h5>\n }\n }\n <div class=\"accordion-collapse collapse\" role=\"region\" [id]=\"collapseId\" [attr.aria-labelledby]=\"headerId\">\n <div class=\"accordion-body\"><ng-content /></div>\n </div>\n `\n})\nexport class KrdsAccordionItem {\n private readonly uid = nextId++\n\n /** 항목 값 (없으면 자동 생성) */\n readonly value = input(`krds-accordion-${this.uid}`)\n /** 제목 */\n readonly label = input<string>()\n\n protected readonly accordion = inject(KrdsAccordion, { optional: true })\n protected readonly headerId = `krds-accordion-header-${this.uid}`\n protected readonly collapseId = `krds-accordion-collapse-${this.uid}`\n protected readonly isOpen = computed(() => this.accordion?.open() === this.value())\n}\n","import { Directive, booleanAttribute, computed, input } from '@angular/core'\n\n/** 배지 형태 */\nexport type KrdsBadgeType = 'outline' | 'bg' | 'bg-light'\n\n/** 배지 색 */\nexport type KrdsBadgeColor = 'primary' | 'secondary' | 'gray' | 'point' | 'danger' | 'warning' | 'success' | 'information' | 'disabled'\n\n/** 배지 크기 */\nexport type KrdsBadgeSize = 'small' | 'medium' | 'large'\n\n/**\n * KRDS 배지. 기본 요소(보통 `<span>`)에 KRDS 클래스만 붙인다\n *\n * @example <span krdsBadge type=\"bg\" color=\"danger\" size=\"small\">마감</span>\n */\n@Directive({\n selector: '[krdsBadge]',\n host: { '[class]': 'classes()' }\n})\nexport class KrdsBadge {\n /** 형태 */\n readonly type = input<KrdsBadgeType>('outline')\n /** 색 */\n readonly color = input<KrdsBadgeColor>('primary')\n /** 크기 */\n readonly size = input<KrdsBadgeSize>('large')\n /** 숫자 배지 */\n readonly number = input(false, { transform: booleanAttribute })\n\n protected readonly classes = computed(() =>\n ['krds-badge', `${this.type()}-${this.color()}`, this.size(), this.number() && 'number'].filter(Boolean).join(' ')\n )\n}\n","import { Component, booleanAttribute, input, output } from '@angular/core'\n\n/** 브레드크럼 항목 */\nexport interface KrdsBreadcrumbItem {\n /** 문구 */\n text: string\n /** 링크 주소 */\n href?: string\n}\n\n/** 브레드크럼 항목 클릭 이벤트 (라우터로 이동하려면 event.preventDefault()) */\nexport interface KrdsBreadcrumbClick {\n item: KrdsBreadcrumbItem\n event: MouseEvent\n}\n\n/**\n * KRDS 브레드크럼. 마지막 항목이 현재 페이지(aria-current=\"page\")이고, 첫 항목은 홈 아이콘으로 보인다\n *\n * @example <nav krdsBreadcrumb [items]=\"[{ text: '홈', href: '/' }, { text: '민원 안내', href: '/guide' }, { text: '전입 신고' }]\"></nav>\n */\n@Component({\n selector: 'nav[krdsBreadcrumb]',\n host: {\n class: 'krds-breadcrumb-wrap',\n '[attr.aria-label]': 'label()'\n },\n template: `\n <ol class=\"breadcrumb\">\n @for (item of items(); track $index; let first = $first; let last = $last) {\n <li [class.home]=\"first && showHomeIcon()\">\n <a\n class=\"txt\"\n [href]=\"item.href || '#'\"\n [attr.aria-current]=\"last ? 'page' : null\"\n (click)=\"itemClick.emit({ item, event: $event })\"\n >\n <span>{{ item.text }}</span>\n </a>\n </li>\n }\n </ol>\n `\n})\nexport class KrdsBreadcrumb {\n /** 항목 (마지막이 현재 페이지) */\n readonly items = input.required<KrdsBreadcrumbItem[]>()\n /** 내비게이션 이름 */\n readonly label = input('현재 경로')\n /** 첫 항목을 홈 아이콘으로 */\n readonly showHomeIcon = input(true, { transform: booleanAttribute })\n\n /** 항목을 클릭했을 때 */\n readonly itemClick = output<KrdsBreadcrumbClick>()\n}\n","import { Directive, booleanAttribute, computed, input } from '@angular/core'\n\n/** 버튼 크기 (KRDS 실제 규격) */\nexport type KrdsButtonSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge'\n\n/** 버튼 변형 */\nexport type KrdsButtonVariant = 'primary' | 'secondary' | 'tertiary'\n\n/**\n * KRDS 버튼. 기본 `<button>`에 KRDS 클래스만 붙이므로 type·disabled·폼 제출·접근성은 기본 버튼 동작 그대로다\n *\n * @example <button krdsButton variant=\"secondary\" size=\"large\">확인</button>\n */\n@Directive({\n selector: 'button[krdsButton]',\n host: {\n class: 'krds-btn',\n '[class]': 'classes()'\n }\n})\nexport class KrdsButton {\n /** 버튼 변형 */\n readonly variant = input<KrdsButtonVariant>('primary')\n /** 버튼 크기 */\n readonly size = input<KrdsButtonSize>()\n /** 아이콘 전용 버튼 */\n readonly icon = input(false, { transform: booleanAttribute })\n /** 테두리 스타일 (아이콘 버튼용) */\n readonly border = input(false, { transform: booleanAttribute })\n /** Pure 버튼 여부 (가상클래스 상태 시 컬러 유지) */\n readonly pure = input(false, { transform: booleanAttribute })\n /** 텍스트 버튼 스타일 */\n readonly text = input(false, { transform: booleanAttribute })\n\n protected readonly classes = computed(() =>\n [\n this.icon() && 'icon',\n this.border() && 'border',\n this.pure() && 'pure',\n this.text() && 'text',\n !this.icon() && this.variant(),\n this.size()\n ]\n .filter(Boolean)\n .join(' ')\n )\n}\n","import {\n Component,\n DestroyRef,\n Directive,\n afterNextRender,\n booleanAttribute,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n model,\n numberAttribute,\n output,\n signal,\n untracked\n} from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\n\n/**\n * 캐러셀 형태\n * - `visual`: 비주얼 배너형 (이전/다음 버튼이 슬라이드 좌우에 겹침)\n * - `banner`: 배너형 (인디케이터 안에 페이지네이션·재생 제어·내비게이션)\n */\nexport type KrdsCarouselVariant = 'visual' | 'banner'\n\n/** 페이지네이션 표시 방식 */\nexport type KrdsCarouselPagination = 'bullets' | 'fraction' | 'none'\n\n/**\n * 캐러셀의 슬라이드. 현재 슬라이드가 아니면 보조기기·초점에서 뺀다 (aria-hidden, inert)\n */\n@Directive({\n selector: 'li[krdsSlide]',\n host: {\n class: 'swiper-slide',\n style: 'flex: 0 0 100%; width: 100%',\n 'aria-roledescription': 'slide',\n '[class.swiper-slide-active]': 'active()',\n '[attr.aria-label]': 'position()',\n '[attr.aria-hidden]': \"active() ? null : 'true'\",\n '[inert]': '!active()'\n }\n})\nexport class KrdsSlide {\n private readonly carousel = inject(KrdsCarousel)\n\n protected readonly active = computed(() => this.carousel.indexOf(this) === this.carousel.current())\n protected readonly position = computed(() => `${this.carousel.indexOf(this) + 1} / ${this.carousel.total()}`)\n}\n\nlet nextId = 0\n\n/**\n * KRDS 캐러셀. 슬라이드는 `<li krdsSlide>`로 넣는다. 현재 위치는 `[(active)]`(0부터)로 주고받고,\n * 자동 재생은 마우스를 올리거나 안에 초점이 있으면 멈춘다. 모션 최소화 설정이면 이동 효과를 없앤다\n *\n * @example\n * <krds-carousel label=\"주요 서비스 안내\" moreHref=\"/services\">\n * @for (item of banners; track item.id) {\n * <li krdsSlide><div class=\"in\">...</div></li>\n * }\n * </krds-carousel>\n */\n@Component({\n selector: 'krds-carousel',\n host: {\n style: 'position: relative',\n role: 'region',\n 'aria-roledescription': 'carousel',\n '[class]': \"variant() === 'banner' ? 'krds-carousel main-d-ban-swiper' : 'krds-carousel vb-swiper'\",\n '[attr.aria-label]': 'label()',\n '(mouseenter)': 'hoverPaused.set(pauseOnHover())',\n '(mouseleave)': 'hoverPaused.set(false)',\n '(focusin)': 'focusPaused.set(true)',\n '(focusout)': 'onFocusout($event)'\n },\n template: `\n <div class=\"swiper\" style=\"position: relative; overflow: hidden; width: 100%\" [attr.aria-live]=\"playing() ? 'off' : 'polite'\">\n <ul\n class=\"swiper-wrapper\"\n style=\"display: flex; width: 100%; transition-property: transform; transition-timing-function: ease-out; will-change: transform\"\n [id]=\"wrapperId\"\n [style.gap.px]=\"gap() || null\"\n [style.transform]=\"'translate3d(calc(' + -current() + ' * (100% + ' + gap() + 'px)), 0, 0)'\"\n [style.transition-duration.ms]=\"reducedMotion() ? 0 : speed()\"\n >\n <ng-content />\n </ul>\n </div>\n\n @if (variant() === 'visual' && navigation() && total()) {\n <ng-container *ngTemplateOutlet=\"nav; context: { $implicit: 'prev', overlay: true }\" />\n <ng-container *ngTemplateOutlet=\"nav; context: { $implicit: 'next', overlay: true }\" />\n }\n\n @if (total() && (paginationType() !== 'none' || autoplay() || moreHref() || (variant() === 'banner' && navigation()))) {\n <div class=\"swiper-indicator\" [class.text-center]=\"variant() === 'visual'\">\n @if (paginationType() === 'fraction') {\n <div class=\"swiper-pagination swiper-pagination-fraction\">\n <span class=\"swiper-pagination-current\">{{ current() + 1 }}</span>\n <span aria-hidden=\"true\">/</span>\n <span class=\"swiper-pagination-total\">{{ total() }}</span>\n </div>\n } @else if (paginationType() === 'bullets') {\n <div class=\"swiper-pagination\">\n @for (slide of slides(); track $index) {\n <button\n type=\"button\"\n class=\"swiper-pagination-bullet\"\n [class.swiper-pagination-bullet-active]=\"$index === current()\"\n [attr.aria-label]=\"$index + 1 + '번째 슬라이드로 이동'\"\n [attr.aria-current]=\"$index === current() ? 'true' : null\"\n [attr.aria-controls]=\"wrapperId\"\n (click)=\"goTo($index)\"\n ></button>\n }\n </div>\n }\n @if (autoplay()) {\n <!-- 원본처럼 현재 상태의 버튼만 보인다 -->\n <div class=\"swiper-controller\">\n <button\n type=\"button\"\n class=\"swiper-button-play\"\n [style.display]=\"playing() ? 'none' : null\"\n [attr.aria-controls]=\"wrapperId\"\n (click)=\"setPlaying(true)\"\n >\n <span class=\"sr-only\">{{ playLabel() }}</span>\n </button>\n <button\n type=\"button\"\n class=\"swiper-button-stop\"\n [style.display]=\"playing() ? null : 'none'\"\n [attr.aria-controls]=\"wrapperId\"\n (click)=\"setPlaying(false)\"\n >\n <span class=\"sr-only\">{{ stopLabel() }}</span>\n </button>\n </div>\n }\n @if (variant() === 'banner') {\n @if (navigation() || moreHref()) {\n <div class=\"swiper-navigation\">\n @if (navigation()) {\n <ng-container *ngTemplateOutlet=\"nav; context: { $implicit: 'prev' }\" />\n <ng-container *ngTemplateOutlet=\"nav; context: { $implicit: 'next' }\" />\n }\n <ng-container *ngTemplateOutlet=\"more\" />\n </div>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"more\" />\n }\n </div>\n }\n\n <ng-template #nav let-direction let-overlay=\"overlay\">\n <button\n type=\"button\"\n [class]=\"'swiper-button-' + direction\"\n [class.swiper-button-disabled]=\"navDisabled(direction)\"\n [style]=\"overlay ? overlayStyle(direction) : null\"\n [disabled]=\"navDisabled(direction)\"\n [attr.aria-controls]=\"wrapperId\"\n (click)=\"goTo(current() + (direction === 'prev' ? -1 : 1))\"\n >\n <span class=\"sr-only\">{{ direction === 'prev' ? prevLabel() : nextLabel() }}</span>\n </button>\n </ng-template>\n\n <ng-template #more>\n @if (moreHref(); as href) {\n <a class=\"swiper-button-more\" [href]=\"href\"\n ><span class=\"sr-only\">{{ moreLabel() }}</span></a\n >\n }\n </ng-template>\n `,\n imports: [NgTemplateOutlet]\n})\nexport class KrdsCarousel {\n /** 형태 */\n readonly variant = input<KrdsCarouselVariant>('visual')\n /** 현재 슬라이드 위치 (0부터) */\n readonly active = model(0)\n /** 처음·끝에서 이어서 순환 */\n readonly loop = input(true, { transform: booleanAttribute })\n /** 자동 재생 (재생·멈춤 버튼 표시) */\n readonly autoplay = input(false, { transform: booleanAttribute })\n /** 자동 재생 간격 (ms) */\n readonly autoplayDelay = input(2500, { transform: numberAttribute })\n /** 마우스를 올리면 자동 재생을 멈춤 */\n readonly pauseOnHover = input(true, { transform: booleanAttribute })\n /** 이동 시간 (ms) */\n readonly speed = input(400, { transform: numberAttribute })\n /** 슬라이드 간격 (px, 기본: 비주얼 0, 배너 16) */\n readonly spaceBetween = input<number>()\n /** 페이지네이션 (기본: 비주얼 bullets, 배너 fraction) */\n readonly pagination = input<KrdsCarouselPagination>()\n /** 이전/다음 버튼 */\n readonly navigation = input(true, { transform: booleanAttribute })\n /** 더 보기 링크 주소 */\n readonly moreHref = input<string>()\n /** 캐러셀 이름 (aria-label) */\n readonly label = input('캐러셀')\n readonly prevLabel = input('이전')\n readonly nextLabel = input('다음')\n readonly playLabel = input('슬라이드 재생')\n readonly stopLabel = input('슬라이드 멈춤')\n readonly moreLabel = input('더 보기')\n\n /** 자동 재생을 시작했을 때 */\n readonly play = output<void>()\n /** 자동 재생을 멈췄을 때 */\n readonly stop = output<void>()\n\n protected readonly wrapperId = `krds-carousel-${nextId++}-wrapper`\n protected readonly slides = contentChildren(KrdsSlide)\n readonly total = computed(() => this.slides().length)\n /** 슬라이드 수에 맞춘 현재 위치 */\n readonly current = computed(() => Math.min(Math.max(this.active(), 0), Math.max(this.total() - 1, 0)))\n protected readonly gap = computed(() => this.spaceBetween() ?? (this.variant() === 'banner' ? 16 : 0))\n protected readonly paginationType = computed(() => this.pagination() ?? (this.variant() === 'banner' ? 'fraction' : 'bullets'))\n\n protected readonly playing = signal(false)\n protected readonly hoverPaused = signal(false)\n protected readonly focusPaused = signal(false)\n protected readonly reducedMotion = signal(false)\n private readonly browser = signal(false)\n\n constructor() {\n const destroyRef = inject(DestroyRef)\n afterNextRender(() => {\n const query = window.matchMedia?.('(prefers-reduced-motion: reduce)')\n if (query) {\n this.reducedMotion.set(query.matches)\n const onChange = (event: MediaQueryListEvent) => this.reducedMotion.set(event.matches)\n query.addEventListener('change', onChange)\n destroyRef.onDestroy(() => query.removeEventListener('change', onChange))\n }\n this.browser.set(true)\n })\n // autoplay 입력을 따라 재생을 시작·멈춘다 (타이머는 브라우저에서만).\n // playing은 추적하지 않아야 사용자가 멈춘 뒤 다시 켜지지 않는다\n effect(() => {\n const autoplay = this.autoplay()\n if (this.browser()) untracked(() => this.setPlaying(autoplay))\n })\n // 재생 중이고 멈춤 조건(마우스·초점)이 없을 때만 타이머를 돈다\n effect(onCleanup => {\n if (!this.playing() || this.hoverPaused() || this.focusPaused()) return\n const timer = setInterval(() => {\n // 순환하지 않으면 마지막 슬라이드에서 재생을 끝낸다\n if (!this.loop() && this.current() >= this.total() - 1) this.setPlaying(false)\n else this.goTo(this.current() + 1)\n }, this.autoplayDelay())\n onCleanup(() => clearInterval(timer))\n })\n }\n\n /** 슬라이드의 위치 (없으면 -1) */\n indexOf(slide: KrdsSlide) {\n return this.slides().indexOf(slide)\n }\n\n protected goTo(index: number) {\n const total = this.total()\n if (!total) return\n const next = this.loop() ? ((index % total) + total) % total : Math.min(Math.max(index, 0), total - 1)\n if (next !== this.current()) this.active.set(next)\n }\n\n protected setPlaying(playing: boolean) {\n if (playing === this.playing()) return\n this.playing.set(playing)\n if (playing) this.play.emit()\n else this.stop.emit()\n }\n\n protected navDisabled(direction: 'prev' | 'next') {\n return !this.loop() && (direction === 'prev' ? this.current() <= 0 : this.current() >= this.total() - 1)\n }\n\n protected overlayStyle(direction: 'prev' | 'next') {\n const side = direction === 'prev' ? 'left: 0' : 'right: 0'\n return `position: absolute; top: 50%; ${side}; transform: translateY(-50%); z-index: 10`\n }\n\n protected onFocusout(event: FocusEvent) {\n const host = event.currentTarget as HTMLElement\n if (!host.contains(event.relatedTarget as Node | null)) this.focusPaused.set(false)\n }\n}\n","import { Directive, InjectionToken, type Signal, inject, input } from '@angular/core'\n\n/** 안쪽 입력 요소에 도움말·오류 상태를 연결하는 부모 (폼 그룹) */\nexport interface KrdsField {\n /** 도움말 요소 id (없으면 null) */\n readonly describedBy: Signal<string | null>\n /** 오류 상태 여부 */\n readonly invalid: Signal<boolean>\n}\n\nexport const KRDS_FIELD = new InjectionToken<KrdsField>('KRDS_FIELD')\n\nlet nextId = 0\n\n/**\n * KRDS 폼 컴포넌트(체크박스·라디오·토글 스위치·폼 그룹 등)에 넣는 기본 입력 요소 표시.\n * 감싸는 컴포넌트가 이 요소의 id로 label을 연결하고, 입력 요소 자체는 기본 동작(ngModel·폼 검증 포함) 그대로 쓴다.\n * 폼 그룹 안에서는 도움말을 aria-describedby로, 오류 상태를 aria-invalid로 연결한다\n *\n * @example <krds-checkbox><input type=\"checkbox\" krdsControl [(ngModel)]=\"agree\" />동의합니다</krds-checkbox>\n */\n@Directive({\n selector: '[krdsControl]',\n host: {\n '[id]': 'id()',\n '[attr.aria-describedby]': 'field?.describedBy()',\n '[attr.aria-invalid]': \"field?.invalid() ? 'true' : null\"\n }\n})\nexport class KrdsControl {\n /** 요소 id (없으면 자동 생성) */\n readonly id = input(`krds-control-${nextId++}`)\n\n protected readonly field = inject(KRDS_FIELD, { optional: true })\n}\n","import { Component, Directive, booleanAttribute, contentChild, input } from '@angular/core'\nimport { KrdsControl } from '../control/control'\n\n/** 체크박스·라디오 버튼 크기 */\nexport type KrdsCheckboxSize = 'medium' | 'large'\n\n/**\n * KRDS 체크박스·라디오 버튼. 안에 넣은 `<input krdsControl>` 뒤에 label을 붙여 연결한다.\n * 선택 상태·name·value·disabled는 기본 input에 그대로 쓴다 (`[(ngModel)]`, `formControlName` 포함)\n *\n * @example\n * <krds-checkbox description=\"부가 설명\">\n * <input type=\"checkbox\" krdsControl [(ngModel)]=\"agree\" />\n * 개인정보 수집에 동의합니다\n * </krds-checkbox>\n * <krds-radio><input type=\"radio\" krdsControl name=\"method\" value=\"email\" [(ngModel)]=\"method\" />이메일</krds-radio>\n */\n@Component({\n selector: 'krds-checkbox, krds-radio',\n host: {\n '[class]': \"(chip() ? 'krds-form-chip ' : 'krds-form-check ') + size()\"\n },\n template: `\n <ng-content select=\"[krdsControl]\" />\n <label [for]=\"control().id()\"><ng-content /></label>\n @if (description() && !chip()) {\n <div class=\"krds-form-check-cnt\">\n <p class=\"krds-form-check-p\">{{ description() }}</p>\n </div>\n }\n `\n})\nexport class KrdsCheckbox {\n /** 크기 */\n readonly size = input<KrdsCheckboxSize>('medium')\n /** Chip 스타일 */\n readonly chip = input(false, { transform: booleanAttribute })\n /** 레이블 아래 부가 설명 (Chip 스타일에서는 표시하지 않음) */\n readonly description = input<string>()\n\n protected readonly control = contentChild.required(KrdsControl)\n}\n\n/** 라디오 버튼 (마크업이 체크박스와 같아 같은 컴포넌트) */\nexport const KrdsRadio = KrdsCheckbox\n\n/**\n * 체크박스·라디오 버튼 묶음. 기본은 가로, `column`이면 세로로 배치한다\n *\n * @example <fieldset krdsCheckArea column><legend>수신 방법</legend>...</fieldset>\n */\n@Directive({\n selector: '[krdsCheckArea]',\n host: {\n class: 'krds-check-area',\n '[class.chk-column]': 'column()'\n }\n})\nexport class KrdsCheckArea {\n /** 세로(컬럼) 배치 */\n readonly column = input(false, { transform: booleanAttribute })\n}\n","import { Component, DOCUMENT, ElementRef, afterRenderEffect, computed, inject, input, model, output, viewChild } from '@angular/core'\n\n/** 코치마크 단계 */\nexport interface KrdsCoachMarkStep {\n id: number\n title: string\n description: string\n}\n\n/**\n * KRDS 코치마크. 화면의 한 단계 옆에 두고, 현재 단계(`[(current)]`)가 이 코치마크의 단계(`step`)이면 안내 말풍선을 보인다.\n * 말풍선의 이전으로·다음으로가 current를 바꾸고(새 단계의 말풍선 제목으로 초점을 옮김), 그만보기는 `(closed)`로 알린다\n *\n * @example\n * <krds-coach-mark [steps]=\"steps\" [step]=\"1\" [(current)]=\"current\" (closed)=\"current.set(null)\">\n * <div class=\"coach-box\">안내할 영역</div>\n * </krds-coach-mark>\n */\n@Component({\n selector: 'krds-coach-mark',\n host: { class: 'krds-coach-mark' },\n template: `\n @if (current() === step() && stepData(); as data) {\n <div class=\"coach-balloon\">\n <h5 class=\"sr-only\">따라하기 가이드</h5>\n <h6 #title class=\"coach-tit\" tabindex=\"-1\">{{ step() }}단계 : {{ data.title }}</h6>\n <p class=\"desc\">{{ data.description }}</p>\n <div class=\"coach-controls\">\n <div class=\"num\">\n <span class=\"sr-only\">현재 단계</span>\n <strong>{{ step() }}</strong>\n <span class=\"sr-only\">총 단계</span>\n <span>{{ steps().length }}</span>\n </div>\n <div class=\"btn-wrap\">\n <button type=\"button\" class=\"krds-btn small text\" (click)=\"closed.emit()\">그만보기</button>\n @if (step() !== 1) {\n <button type=\"button\" class=\"krds-btn small text\" (click)=\"current.set(step() - 1)\">이전으로</button>\n }\n @if (step() !== steps().length) {\n <button type=\"button\" class=\"krds-btn small tertiary\" (click)=\"current.set(step() + 1)\">다음으로</button>\n }\n </div>\n </div>\n </div>\n }\n <ng-content />\n `\n})\nexport class KrdsCoachMark {\n /** 전체 단계 */\n readonly steps = input.required<KrdsCoachMarkStep[]>()\n /** 이 코치마크가 맡은 단계 번호 (1부터) */\n readonly step = input.required<number>()\n /** 지금 보이는 단계 번호 (없으면 null) */\n readonly current = model<number | null>(null)\n\n /** 그만보기를 눌렀을 때 */\n readonly closed = output<void>()\n\n private readonly document = inject(DOCUMENT)\n private readonly title = viewChild<ElementRef<HTMLElement>>('title')\n\n constructor() {\n // 이전으로·다음으로를 누르면 그 버튼이 든 말풍선이 사라져 초점이 body로 빠진다. 새로 열린 단계의 제목으로 옮긴다\n // (처음 열 때처럼 다른 요소에 초점이 있으면 그대로 둔다)\n afterRenderEffect(() => {\n const title = this.title()?.nativeElement\n const focused = this.document.activeElement\n if (title && (!focused || focused === this.document.body)) title.focus()\n })\n }\n\n protected readonly stepData = computed(() => this.steps()[this.step() - 1] ?? null)\n}\n","import {\n Component,\n DOCUMENT,\n DestroyRef,\n ElementRef,\n Injector,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n signal,\n viewChild\n} from '@angular/core'\n\n/** 맥락적 도움말이 펼쳐지는 위치 */\nexport type KrdsContextualHelpPosition = 'top left' | 'top center' | 'top right' | 'bottom left' | 'bottom center' | 'bottom right'\n\n/** 열린 도움말의 닫기 함수 (원본처럼 하나를 열면 다른 도움말은 닫는다) */\nconst openHelps = new Set<() => void>()\n\nlet nextId = 0\n\n/**\n * KRDS 맥락적 도움말. 도움말 버튼을 누르면 제목·설명·링크가 있는 팝오버를 열고 그 안의 첫 조작 요소로 초점을 옮긴다.\n * 닫기 버튼·Esc는 닫고 초점을 도움말 버튼으로 돌려주며, 바깥을 누르면 닫는다\n *\n * @example\n * <krds-contextual-help heading=\"신청 자격\" position=\"bottom left\">\n * <p>만 19세 이상 국민이면 신청할 수 있습니다.</p>\n * <div class=\"btn-wrap\"><a class=\"krds-btn xsmall link basic\" href=\"/guide\">바로가기</a></div>\n * </krds-contextual-help>\n */\n@Component({\n selector: 'krds-contextual-help',\n host: {\n '[class]': \"'krds-contextual-help ' + position()\",\n '(document:keydown.escape)': 'open() && close(true)',\n '(document:click)': 'onDocumentClick($event)',\n '(window:resize)': 'open() && adjustPosition()'\n },\n template: `\n <div #action class=\"tooltip-action\">\n <button\n #trigger\n type=\"button\"\n class=\"krds-btn medium icon tooltip-btn\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"popoverId\"\n (click)=\"toggle()\"\n >\n <span class=\"sr-only\">도움말</span>\n <i class=\"svg-icon\" [class]=\"helpIcon() ? 'ico-help' : 'ico-tooltip'\"></i>\n </button>\n <!-- KRDS 원본은 role=\"tooltip\"이지만 안에 버튼·링크가 있으므로 제목으로 이름 붙인 비모달 대화 상자로 둔다 -->\n <div\n #popover\n class=\"tooltip-popover\"\n role=\"dialog\"\n [id]=\"popoverId\"\n [attr.aria-labelledby]=\"popoverId + '-title'\"\n [style.display]=\"open() ? 'block' : 'none'\"\n >\n <h4 class=\"tooltip-title\" [id]=\"popoverId + '-title'\">{{ heading() }}</h4>\n <div class=\"tooltip-contents\"><ng-content /></div>\n <button type=\"button\" class=\"krds-btn xsmall icon tooltip-close\" (click)=\"close(true)\">\n <span class=\"sr-only\">닫기</span>\n <i class=\"svg-icon ico-modal-close\"></i>\n </button>\n </div>\n </div>\n `\n})\nexport class KrdsContextualHelp {\n /** 도움말 제목 (title 속성은 기본 툴팁이 되므로 heading으로 받음) */\n readonly heading = input.required<string>()\n /** 물음표 모양 도움 아이콘 (기본은 정보 아이콘) */\n readonly helpIcon = input(false, { transform: booleanAttribute })\n /** 펼쳐지는 위치 */\n readonly position = input<KrdsContextualHelpPosition>('top left')\n\n protected readonly open = signal(false)\n protected readonly popoverId = `krds-contextual-help-${nextId++}`\n private readonly trigger = viewChild.required<ElementRef<HTMLButtonElement>>('trigger')\n private readonly popover = viewChild.required<ElementRef<HTMLElement>>('popover')\n private readonly action = viewChild.required<ElementRef<HTMLElement>>('action')\n private readonly document = inject(DOCUMENT)\n private readonly injector = inject(Injector)\n private readonly closeOthers = () => this.close(false)\n\n constructor() {\n inject(DestroyRef).onDestroy(() => openHelps.delete(this.closeOthers))\n }\n\n protected toggle() {\n if (this.open()) return this.close(false)\n openHelps.forEach(close => close())\n openHelps.add(this.closeOthers)\n this.open.set(true)\n afterNextRender(\n () => {\n this.popover().nativeElement.querySelector<HTMLElement>('a, button, [tabindex=\"0\"], input, textarea, select')?.focus()\n this.adjustPosition()\n },\n { injector: this.injector }\n )\n }\n\n /** 닫기. 닫기 버튼·Esc는 초점을 도움말 버튼으로 돌려준다 (팝오버가 숨으며 초점을 잃지 않게) */\n protected close(returnFocus: boolean) {\n if (!this.open()) return\n const focusInside = this.popover().nativeElement.contains(this.document.activeElement)\n this.open.set(false)\n openHelps.delete(this.closeOthers)\n if (returnFocus || focusInside) this.trigger().nativeElement.focus()\n }\n\n protected onDocumentClick(event: MouseEvent) {\n if (this.open() && !this.action().nativeElement.contains(event.target as Node)) this.close(false)\n }\n\n /** 모바일에서는 화면 폭에 맞춰 펼친다 */\n protected adjustPosition() {\n const popover = this.popover().nativeElement\n if (window.innerWidth > 768) {\n popover.style.left = ''\n popover.style.right = ''\n popover.style.width = '360px'\n return\n }\n const paddingX = parseInt(getComputedStyle(this.document.documentElement).getPropertyValue('--krds-contents-padding-x')) || 0\n popover.style.left = `-${this.action().nativeElement.getBoundingClientRect().left - paddingX}px`\n popover.style.width = `${this.document.body.clientWidth - paddingX * 2}px`\n }\n}\n","import { Component, computed, input } from '@angular/core'\n\n/** 긴급 공지 종류 */\nexport type KrdsCriticalAlertType = 'danger' | 'ok' | 'info'\n\nconst BADGE_TEXT: Record<KrdsCriticalAlertType, string> = { danger: '긴급', ok: '안전', info: '안내' }\n\n/**\n * KRDS 긴급 공지. 종류 배지(긴급·안전·안내), 문구, 자세히 보기 링크를 보여 준다 (링크 클릭은 기본 click으로 받음)\n *\n * @example <krds-critical-alerts type=\"danger\" message=\"폭우로 일부 지역 도로가 통제됩니다.\" linkHref=\"/notice/1\" />\n */\n@Component({\n selector: 'krds-critical-alerts',\n template: `\n <ul class=\"krds-critical-alerts\">\n <li>\n <div class=\"critical-ban\">\n <span class=\"critical-badge\" [class]=\"type()\">{{ badgeText() }}</span>\n <p class=\"critical-txt\">{{ message() }}</p>\n @if (linkHref(); as href) {\n <!-- 문구가 모바일에서 숨겨져도(m-hide) 링크 이름이 남도록 aria-label로 준다 -->\n <a class=\"krds-btn medium link basic\" [href]=\"href\" [attr.aria-label]=\"linkText()\">\n <span class=\"m-hide\">{{ linkText() }}</span>\n <i class=\"svg-icon ico-angle right\"></i>\n </a>\n }\n </div>\n </li>\n </ul>\n `\n})\nexport class KrdsCriticalAlerts {\n /** 종류 */\n readonly type = input<KrdsCriticalAlertType>('info')\n /** 공지 문구 */\n readonly message = input.required<string>()\n /** 자세히 보기 링크 주소 */\n readonly linkHref = input<string>()\n /** 자세히 보기 링크 문구 (모바일에서는 숨김) */\n readonly linkText = input('자세히 보기')\n\n protected readonly badgeText = computed(() => BADGE_TEXT[this.type()])\n}\n","import { Directive, InjectionToken, computed, inject, input } from '@angular/core'\nimport { KrdsControl } from '../control/control'\n\n/** 입력 필드 크기 (KRDS 실제 규격) */\nexport type KrdsInputSize = 'small' | 'medium' | 'large' | 'xlarge'\n\n/** 감싸는 컴포넌트가 입력 요소에 더 붙일 클래스 (날짜 입력 필드의 'datepicker cal' 등) */\nexport const KRDS_INPUT_CLASS = new InjectionToken<string>('KRDS_INPUT_CLASS')\n\n/**\n * KRDS 텍스트 입력 필드·텍스트 영역. 기본 `<input>`·`<textarea>`에 KRDS 클래스만 붙이므로\n * 값·type·placeholder·maxlength·required·disabled는 기본 요소 그대로 쓴다 (`[(ngModel)]`, `formControlName` 포함).\n * `krdsControl`을 함께 적용하므로 폼 그룹 안에서는 label·도움말이 자동으로 연결된다\n *\n * @example\n * <krds-form-group label=\"이름\" hint=\"실명을 입력하세요\">\n * <input krdsInput [(ngModel)]=\"name\" />\n * </krds-form-group>\n */\n@Directive({\n selector: 'input[krdsInput], textarea[krdsInput]',\n hostDirectives: [{ directive: KrdsControl, inputs: ['id'] }],\n host: {\n '[class]': 'classes()'\n }\n})\nexport class KrdsInput {\n /** 크기 */\n readonly size = input<KrdsInputSize>()\n\n private readonly extraClass = inject(KRDS_INPUT_CLASS, { optional: true })\n\n protected readonly classes = computed(() => ['krds-input', this.extraClass, this.size()].filter(Boolean).join(' '))\n}\n","import {\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n afterNextRender,\n computed,\n contentChild,\n inject,\n input,\n linkedSignal,\n signal,\n viewChild\n} from '@angular/core'\nimport { KrdsButton } from '../button/button'\nimport { KRDS_INPUT_CLASS, KrdsInput } from '../input/input'\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}\n\ntype SwitchType = 'year' | 'month'\n\nconst WEEKDAY_LABELS = ['일', '월', '화', '수', '목', '금', '토']\nconst pad = (n: number) => String(n).padStart(2, '0')\nconst formatDate = (date: Date) => `${date.getFullYear()}.${pad(date.getMonth() + 1)}.${pad(date.getDate())}`\nconst toTime = (dateString: string) => new Date(dateString.replace(/\\./g, '-')).getTime()\n\n/** 열린 달력의 닫기 함수 (원본처럼 달력을 열면 다른 달력은 모두 닫는다) */\nconst openCalendars = new Set<() => void>()\n\n/**\n * KRDS 날짜 입력 필드. 안에 넣은 `<input krdsInput>` 옆에 달력 버튼과 달력을 붙인다.\n * 직접 입력은 기본 input 그대로이고, 달력에서 고른 날짜(기간이면 'YYYY.MM.DD ~ YYYY.MM.DD')는 input에 넣고 input 이벤트로 알리므로\n * `[(ngModel)]`·`formControlName`이 그대로 값을 받는다\n *\n * @example\n * <krds-form-group label=\"신청일\">\n * <krds-date-input [holidays]=\"['2025.03.01']\">\n * <input krdsInput placeholder=\"YYYY.MM.DD\" [(ngModel)]=\"date\" />\n * </krds-date-input>\n * </krds-form-group>\n */\n@Component({\n selector: 'krds-date-input',\n imports: [KrdsButton],\n providers: [{ provide: KRDS_INPUT_CLASS, useValue: 'datepicker cal' }],\n host: {\n class: 'form-conts calendar-conts',\n '(document:click)': 'onDocumentClick($event)'\n },\n template: `\n <div class=\"calendar-input\">\n <ng-content />\n <button\n #toggle\n type=\"button\"\n class=\"krds-btn icon form-btn-datepicker\"\n [class]=\"buttonSize()\"\n [disabled]=\"disabled()\"\n [attr.aria-expanded]=\"open()\"\n (click)=\"open() ? close(true) : openCalendar()\"\n >\n <span class=\"sr-only\">달력 열기</span>\n <i class=\"svg-icon ico-calendar\"></i>\n </button>\n </div>\n <div class=\"krds-calendar-area\" [class.active]=\"open()\">\n <div\n #wrap\n class=\"calendar-wrap\"\n [class.bottom]=\"openUpward()\"\n aria-label=\"달력\"\n tabindex=\"0\"\n [style.display]=\"open() ? null : 'none'\"\n (keydown.escape)=\"onEscape()\"\n >\n <div class=\"calendar-head\">\n <button type=\"button\" class=\"btn-cal-move prev\" (click)=\"moveMonth(-1)\"><span class=\"sr-only\">이전 달</span></button>\n <div class=\"calendar-switch-wrap\">\n @for (type of switchTypes; track type) {\n <div class=\"calendar-drop-down\">\n <button\n #switchButton\n type=\"button\"\n class=\"btn-cal-switch\"\n [class]=\"type\"\n [attr.aria-label]=\"format(type, current(type)) + (type === 'year' ? ' 연도 선택' : ' 월 선택')\"\n [attr.aria-expanded]=\"dropdown() === type\"\n (click)=\"dropdown.set(dropdown() === type ? null : type)\"\n >\n {{ format(type, current(type)) }}\n </button>\n <div\n class=\"calendar-select\"\n [class]=\"type === 'year' ? 'calendar-year-wrap' : 'calendar-mon-wrap'\"\n [class.active]=\"dropdown() === type\"\n [style.display]=\"dropdown() === type ? null : 'none'\"\n >\n <ul class=\"sel\" [class]=\"type\">\n @for (option of options(type); track option) {\n <li>\n <button type=\"button\" [class.active]=\"option === current(type)\" (click)=\"pick(type, option, switchButton)\">\n {{ format(type, option) }}\n </button>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n <button type=\"button\" class=\"btn-cal-move next\" (click)=\"moveMonth(1)\"><span class=\"sr-only\">다음 달</span></button>\n </div>\n <div class=\"calendar-body\">\n <div class=\"calendar-table-wrap\">\n <table class=\"calendar-tbl\">\n <caption>\n {{\n year()\n }}년\n {{\n pad(month())\n }}월\n </caption>\n <thead>\n <tr>\n @for (label of weekdays; track label) {\n <th>{{ label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (week of grid(); track $index) {\n <tr>\n @for (day of week; track day.dateString) {\n <td [class]=\"cellClasses(day)\" [attr.data-date]=\"day.dateString\">\n <button\n type=\"button\"\n class=\"btn-set-date\"\n [attr.aria-pressed]=\"range(day.dateString).isInRange\"\n (click)=\"selectDate(day.dateString)\"\n >\n <span>{{ day.day }}</span>\n </button>\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n <div class=\"calendar-footer\">\n <div class=\"calendar-btn-wrap\">\n <button krdsButton text size=\"small\" (click)=\"selectDate(todayString, true)\">오늘</button>\n <button krdsButton variant=\"tertiary\" size=\"small\" (click)=\"close(true)\">취소</button>\n <button krdsButton size=\"small\" (click)=\"confirm()\">확인</button>\n </div>\n </div>\n </div>\n </div>\n `\n})\nexport class KrdsDateInput {\n /** 일정이 있는 날짜 (YYYY.MM.DD) */\n readonly eventDates = input<string[]>([])\n /** 휴일 (YYYY.MM.DD, 일요일은 기본으로 휴일 표시) */\n readonly holidays = input<string[]>([])\n /** 처음 보여 줄 연도 (기본: 올해) */\n readonly initialYear = input<number>()\n /** 처음 보여 줄 월 1~12 (기본: 이번 달) */\n readonly initialMonth = input<number>()\n\n protected readonly weekdays = WEEKDAY_LABELS\n protected readonly switchTypes: SwitchType[] = ['year', 'month']\n protected readonly pad = pad\n\n private readonly today = new Date()\n protected readonly todayString = formatDate(this.today)\n\n protected readonly open = signal(false)\n protected readonly dropdown = signal<SwitchType | null>(null)\n // 원본처럼 위로 여는 것이 기본이고, 위 공간이 모자라고 아래가 더 넓으면 아래로 연다\n protected readonly openUpward = signal(true)\n protected readonly disabled = signal(false)\n protected readonly year = linkedSignal(() => this.initialYear() ?? this.today.getFullYear())\n protected readonly month = linkedSignal(() => this.initialMonth() ?? this.today.getMonth() + 1)\n private readonly start = signal<string | null>(null)\n private readonly end = signal<string | null>(null)\n\n private readonly control = contentChild.required(KrdsInput)\n private readonly controlEl = contentChild.required(KrdsInput, { read: ElementRef })\n private readonly toggle = viewChild.required<ElementRef<HTMLButtonElement>>('toggle')\n private readonly wrap = viewChild.required<ElementRef<HTMLElement>>('wrap')\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef)\n private readonly injector = inject(Injector)\n private readonly destroyRef = inject(DestroyRef)\n\n protected readonly buttonSize = computed(() => this.control().size() ?? 'medium')\n\n protected readonly grid = computed<CalendarDay[][]>(() => {\n const year = this.year()\n const month = this.month()\n const firstDate = new Date(year, month - 1, 1)\n // 첫 번째 날의 요일만큼 이전 달 날짜부터 6주\n const date = new Date(year, month - 1, 1 - firstDate.getDay())\n return Array.from({ length: 6 }, () =>\n Array.from({ length: 7 }, () => {\n const day: CalendarDay = {\n day: date.getDate(),\n dateString: formatDate(date),\n isCurrentMonth: date.getMonth() === month - 1,\n isToday: date.toDateString() === this.today.toDateString(),\n isPrevMonth: date < firstDate,\n isNextMonth: date.getMonth() !== month - 1 && date > firstDate,\n isSunday: date.getDay() === 0\n }\n date.setDate(date.getDate() + 1)\n return day\n })\n )\n })\n\n private readonly closeOthers = () => this.close(false)\n\n constructor() {\n // 기본 input의 disabled(ngModel·reactive forms가 바꾸는 것 포함)를 따라 달력 버튼도 비활성화한다\n afterNextRender(() => {\n const el = this.controlEl().nativeElement as HTMLInputElement\n const sync = () => this.disabled.set(el.disabled)\n sync()\n const observer = new MutationObserver(sync)\n observer.observe(el, { attributes: true, attributeFilter: ['disabled'] })\n this.destroyRef.onDestroy(() => observer.disconnect())\n })\n this.destroyRef.onDestroy(() => openCalendars.delete(this.closeOthers))\n }\n\n protected current(type: SwitchType) {\n return type === 'year' ? this.year() : this.month()\n }\n\n protected options(type: SwitchType) {\n const year = this.today.getFullYear()\n return type === 'year' ? Array.from({ length: 21 }, (_, i) => year - 10 + i) : Array.from({ length: 12 }, (_, i) => i + 1)\n }\n\n protected format(type: SwitchType, value: number) {\n return type === 'year' ? `${value}년` : `${pad(value)}월`\n }\n\n protected pick(type: SwitchType, value: number, switchButton: HTMLButtonElement) {\n if (type === 'year') this.year.set(value)\n else this.month.set(value)\n this.dropdown.set(null)\n // 목록이 숨겨질 때 초점을 잃지 않게 연/월 버튼으로 옮긴다\n switchButton.focus()\n }\n\n protected openCalendar() {\n openCalendars.forEach(close => close())\n openCalendars.add(this.closeOthers)\n this.open.set(true)\n this.dropdown.set(null)\n afterNextRender(\n () => {\n this.updatePlacement()\n this.wrap().nativeElement.focus()\n },\n { injector: this.injector }\n )\n }\n\n /** 닫기. 취소·확인·Esc·달력 버튼은 초점을 달력 버튼으로 돌려주고, 바깥 클릭과 다른 달력 열기는 초점을 그대로 둔다 */\n protected close(returnFocus: boolean) {\n if (returnFocus && this.open()) this.toggle().nativeElement.focus()\n this.open.set(false)\n this.dropdown.set(null)\n openCalendars.delete(this.closeOthers)\n }\n\n protected onEscape() {\n const type = this.dropdown()\n if (!type) return this.close(true)\n this.dropdown.set(null)\n this.host.nativeElement.querySelector<HTMLElement>(`.btn-cal-switch.${type}`)?.focus()\n }\n\n protected onDocumentClick(event: MouseEvent) {\n if (this.open() && !this.host.nativeElement.contains(event.target as Node)) this.close(false)\n }\n\n protected moveMonth(delta: number) {\n const date = new Date(this.year(), this.month() - 1 + delta, 1)\n this.year.set(date.getFullYear())\n this.month.set(date.getMonth() + 1)\n }\n\n /** 첫 클릭은 시작일, 다음 클릭은 종료일 (시작일보다 앞이면 시작일을 다시 정함) */\n protected selectDate(dateString: string, single = false) {\n const start = this.start()\n if (single) {\n this.start.set(dateString)\n this.end.set(dateString)\n } else if (!start || this.end() || toTime(dateString) < toTime(start)) {\n this.start.set(dateString)\n this.end.set(null)\n } else {\n this.end.set(dateString)\n }\n }\n\n protected range(dateString: string) {\n const start = this.start()\n const end = this.end()\n const isStart = dateString === start\n if (!start || !end) return { isInRange: isStart, isStart, isEnd: false }\n const time = toTime(dateString)\n return { isInRange: time >= toTime(start) && time <= toTime(end), isStart, isEnd: dateString === end }\n }\n\n protected cellClasses(day: CalendarDay) {\n const range = day.isCurrentMonth ? this.range(day.dateString) : undefined\n return [\n day.isPrevMonth && 'old',\n day.isNextMonth && 'new',\n day.isToday && 'today',\n (day.isSunday || this.holidays().includes(day.dateString)) && 'day-off',\n this.eventDates().includes(day.dateString) && 'day-event',\n range?.isInRange && 'period',\n range?.isInRange && range.isStart && 'start',\n range?.isInRange && range.isEnd && 'end'\n ]\n .filter(Boolean)\n .join(' ')\n }\n\n protected confirm() {\n const start = this.start()\n if (!start) return\n const end = this.end()\n const el = this.controlEl().nativeElement as HTMLInputElement\n el.value = end && end !== start ? `${start} ~ ${end}` : start\n el.dispatchEvent(new Event('input', { bubbles: true }))\n el.dispatchEvent(new Event('change', { bubbles: true }))\n this.close(true)\n }\n\n private updatePlacement() {\n const rect = this.toggle().nativeElement.parentElement?.getBoundingClientRect()\n if (!rect) return\n const spaceAbove = rect.top\n const spaceBelow = window.innerHeight - rect.bottom\n this.openUpward.set(spaceAbove >= this.wrap().nativeElement.offsetHeight || spaceAbove >= spaceBelow)\n }\n}\n","import { Component, input, model } from '@angular/core'\n\nlet nextId = 0\n\n/**\n * KRDS 디스클로저. 버튼으로 내용을 펼치고 접는다. 접힌 내용은 inert로 초점과 화면낭독기에서 뺀다\n *\n * @example <krds-disclosure label=\"신청 자격 자세히 보기\" [(expanded)]=\"open\">만 19세 이상...</krds-disclosure>\n */\n@Component({\n selector: 'krds-disclosure',\n host: {\n class: 'krds-disclosure conts-expand-area',\n '[class.active]': 'expanded()'\n },\n template: `\n <button\n type=\"button\"\n class=\"btn-conts-expand\"\n [attr.aria-expanded]=\"expanded()\"\n [attr.aria-controls]=\"contentId\"\n (click)=\"expanded.set(!expanded())\"\n >\n {{ label() }}\n </button>\n <div class=\"expand-wrap\" [id]=\"contentId\" [inert]=\"!expanded()\">\n <div class=\"expand-in\"><ng-content /></div>\n </div>\n `\n})\nexport class KrdsDisclosure {\n /** 펼침 버튼 문구 (title 속성은 기본 툴팁이 되므로 label로 받음) */\n readonly label = input.required<string>()\n /** 펼침 여부 */\n readonly expanded = model(false)\n\n protected readonly contentId = `krds-disclosure-${nextId++}`\n}\n","import { Directive, ElementRef, afterRenderEffect, computed, inject, input, model, signal, untracked } from '@angular/core'\n\n/** 드롭다운 메뉴 위치 (center는 넘치면 자동으로 좌우를 맞춤) */\nexport type KrdsDropdownPosition = 'center' | 'left' | 'right'\n\n/**\n * KRDS 드롭다운. KRDS 마크업(.drop-btn 버튼과 .drop-menu)에 붙이면 버튼으로 열고 닫고(aria-expanded),\n * Esc는 닫고 버튼으로 초점을 돌려주며, 바깥 클릭·초점 이탈로 닫는다. 메뉴가 화면 밖으로 넘치면 좌우 위치를 맞춘다\n *\n * @example\n * <div krdsDropdown>\n * <button type=\"button\" class=\"krds-btn small text drop-btn\">메뉴명 <i class=\"svg-icon ico-toggle\"></i></button>\n * <div class=\"drop-menu\"><div class=\"drop-in\"><ul class=\"drop-list\"><li><a href=\"/a\" class=\"item-link\">메뉴</a></li></ul></div></div>\n * </div>\n */\n@Directive({\n selector: '[krdsDropdown]',\n exportAs: 'krdsDropdown',\n host: {\n class: 'krds-drop-wrap',\n '[class.active]': 'open()',\n '[class.drop-left]': \"side() === 'left'\",\n '[class.drop-right]': \"side() === 'right'\",\n '(click)': 'onClick($event)',\n '(focusin)': 'onFocusin($event)',\n '(focusout)': 'onFocusout($event)',\n '(document:click)': 'onDocumentClick($event)',\n '(document:keydown.escape)': 'open() && close(true)'\n }\n})\nexport class KrdsDropdown {\n /** 열림 */\n readonly open = model(false)\n /** 메뉴 위치 */\n readonly position = input<KrdsDropdownPosition>('center')\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement\n private readonly autoSide = signal<'left' | 'right' | null>(null)\n protected readonly side = computed(() => (this.position() === 'center' ? this.autoSide() : this.position()))\n\n constructor() {\n // KRDS CSS는 .drop-menu를 숨겨 두기만 하므로 열림에 맞춰 보이고, 버튼 상태를 맞춘다 (브라우저에서만)\n afterRenderEffect(() => {\n const open = this.open()\n untracked(() => {\n const menu = this.host.querySelector<HTMLElement>('.drop-menu')\n const button = this.button()\n if (menu) menu.style.display = open ? 'block' : 'none'\n button?.setAttribute('aria-expanded', String(open))\n button?.classList.toggle('active', open)\n if (!open || !menu || this.position() !== 'center') return\n const rect = menu.getBoundingClientRect()\n this.autoSide.set(rect.left < 0 ? 'left' : window.innerWidth < rect.right ? 'right' : null)\n })\n })\n }\n\n private button() {\n return this.host.querySelector<HTMLElement>('.drop-btn')\n }\n\n /** 열고 닫기 */\n toggle() {\n this.open.set(!this.open())\n }\n\n /** 닫기 (returnFocus면 버튼으로 초점) */\n close(returnFocus = false) {\n this.open.set(false)\n if (returnFocus) this.button()?.focus()\n }\n\n protected onClick(event: MouseEvent) {\n const button = (event.target as Element).closest('.drop-btn')\n if (button && this.host.contains(button)) this.toggle()\n }\n\n /** 원본처럼 초점을 받은 항목을 위로 올려 초점 테두리가 이웃 항목에 가리지 않게 한다 */\n protected onFocusin(event: FocusEvent) {\n const item = (event.target as Element).closest<HTMLElement>('.drop-list .item-link')\n if (!item) return\n this.host.querySelectorAll<HTMLElement>('.drop-list .item-link').forEach(link => {\n link.style.position = 'relative'\n link.style.zIndex = link === item ? '1' : '0'\n })\n }\n\n /** 초점이 밖으로 옮겨 가면 닫는다. 갈 곳 없이 빠진 초점(다른 창으로 전환 등)은 무시하고, 빈 곳 클릭은 문서 클릭으로 닫는다 */\n protected onFocusout(event: FocusEvent) {\n const next = event.relatedTarget as Node | null\n if (this.open() && next && !this.host.contains(next)) this.close()\n }\n\n protected onDocumentClick(event: MouseEvent) {\n if (this.open() && !this.host.contains(event.target as Node)) this.close()\n }\n}\n","import { Component, booleanAttribute, computed, input, model, output, signal } from '@angular/core'\n\n/** 파일 업로드 목록의 파일 */\nexport interface KrdsFileInfo {\n /** 파일 id */\n id: string\n /** 파일 객체 */\n file: File\n /** 파일명 */\n name: string\n /** 파일 크기 (bytes) */\n size: number\n /** 파일 타입 (MIME) */\n type: string\n /** 업로드 상태 (업로드는 사용하는 쪽에서 처리하고 상태만 바꿔 넘긴다) */\n status: 'pending' | 'uploading' | 'completed' | 'error'\n /** 오류 문구 */\n errorMessage?: string\n /** 다운로드 주소 (있으면 다운로드·바로보기 버튼) */\n downloadUrl?: string\n}\n\n/** 파일 검사 실패 이벤트 */\nexport interface KrdsFileError {\n file: KrdsFileInfo\n error: string\n}\n\n/** 파일 선택 버튼 크기 */\nexport type KrdsFileUploadSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge'\n\nlet nextId = 0\n\nconst formatFileSize = (bytes: number) => {\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\nconst extensionOf = (name: string) => {\n const parts = name.split('.')\n return parts.length > 1 ? parts.pop()!.toLowerCase() : ''\n}\n\n/**\n * KRDS 파일 업로드. 파일을 끌어다 놓거나 파일선택 버튼으로 고르면 크기·형식·개수를 검사해 목록(`[(files)]`)에 넣는다.\n * 실제 업로드는 사용하는 쪽에서 처리하고, 파일의 status·downloadUrl을 바꿔 넘기면 상태별 버튼을 보여 준다\n *\n * @example <krds-file-upload heading=\"증빙 서류\" accept=\".pdf,.jpg\" [maxFiles]=\"3\" [(files)]=\"files\" />\n */\n@Component({\n selector: 'krds-file-upload',\n host: { class: 'krds-file-upload line' },\n template: `\n @if (heading() || description()) {\n <div class=\"file-head\">\n <!-- 제목 없이 설명만 주면 빈 제목(h3)을 그리지 않는다 -->\n @if (heading()) {\n <h3 class=\"tit\">{{ heading() }}</h3>\n }\n @if (description()) {\n <div>\n <p>{{ description() }}</p>\n </div>\n }\n </div>\n }\n @if (!readonly()) {\n <div\n class=\"file-upload\"\n [class.active]=\"dragOver()\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"dragOver.set(false)\"\n (drop)=\"onDrop($event)\"\n >\n <p class=\"txt\">{{ placeholder() }}</p>\n <div class=\"file-upload-btn-wrap\">\n <input\n #fileInput\n type=\"file\"\n hidden\n [id]=\"inputId\"\n [name]=\"name()\"\n [attr.accept]=\"accept() || null\"\n [multiple]=\"multiple()\"\n (change)=\"onFileChange(fileInput)\"\n />\n <label [for]=\"inputId\">\n <button type=\"button\" class=\"krds-btn\" [class]=\"size()\" [disabled]=\"disabled()\" (click)=\"fileInput.click()\">\n <i class=\"svg-icon ico-upload\"></i>파일선택\n </button>\n </label>\n </div>\n </div>\n }\n @if (files().length) {\n <div class=\"file-list\">\n <div class=\"total\">\n <span class=\"current\">{{ validCount() }}개</span>\n / {{ maxFiles() }}개\n </div>\n <ul class=\"upload-list\">\n @for (file of files(); track file.id) {\n <li [class.is-error]=\"file.status === 'error'\">\n <div class=\"file-info\" [class.m-column]=\"!!file.downloadUrl\">\n <div class=\"file-name\">{{ fileName(file) }}</div>\n <div class=\"btn-wrap\">\n @if (file.status === 'uploading') {\n <span class=\"krds-spinner\" role=\"status\"><span class=\"sr-only\">업로드 중</span></span>\n } @else if (file.downloadUrl) {\n @if (showDownload()) {\n <button type=\"button\" class=\"krds-btn medium text\" (click)=\"download.emit(file)\">\n 다운로드 <i class=\"svg-icon ico-down\"></i>\n </button>\n }\n @if (showPreviewButton()) {\n <button type=\"button\" class=\"krds-btn medium text\" (click)=\"preview.emit(file)\">\n 바로보기 <i class=\"svg-icon ico-angle right\"></i>\n </button>\n }\n } @else if (file.status === 'completed') {\n <span class=\"ico-invalid complete\"><em class=\"sr-only\">업로드 완료</em></span>\n } @else if (!readonly()) {\n <button type=\"button\" class=\"krds-btn medium text\" [disabled]=\"disabled()\" (click)=\"removeFile(file.id)\">\n 삭제 <i class=\"svg-icon ico-delete-fill\"></i>\n </button>\n }\n </div>\n </div>\n @if (file.status === 'error' && file.errorMessage) {\n <p class=\"file-hint-invalid\">\n @for (line of lines(file.errorMessage); track $index) {\n @if (!$first) {\n <br />\n }\n {{ line }}\n }\n </p>\n }\n </li>\n }\n </ul>\n @if (showClearAll() && !readonly()) {\n <div class=\"upload-delete-btn\">\n <button type=\"button\" class=\"krds-btn xsmall tertiary\" [disabled]=\"disabled()\" (click)=\"clearAll()\">\n 전체 파일 삭제<i class=\"svg-icon ico-angle right\"></i>\n </button>\n </div>\n }\n </div>\n }\n `\n})\nexport class KrdsFileUpload {\n /** 파일 목록 */\n readonly files = model<KrdsFileInfo[]>([])\n /** 제목 (기본 title 속성과 겹쳐 툴팁이 뜨지 않게 heading으로 받음) */\n readonly heading = input<string>()\n /** 설명 */\n readonly description = input<string>()\n /** 끌어다 놓는 영역의 안내 문구 */\n readonly placeholder = input('첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.')\n /** 파일선택 버튼 크기 */\n readonly size = input<KrdsFileUploadSize>('medium')\n /** 허용 파일 형식 (예: '.jpg,.png,.pdf', 'image/*') */\n readonly accept = input<string>()\n /** 최대 파일 개수 (오류 항목은 세지 않음) */\n readonly maxFiles = input(10)\n /** 최대 파일 크기 (bytes, 이 크기 이상이면 오류) */\n readonly maxFileSize = input(20 * 1024 * 1024)\n /** 여러 파일 선택 (끄면 새 파일이 기존 파일을 대체) */\n readonly multiple = input(true, { transform: booleanAttribute })\n /** 비활성화 */\n readonly disabled = input(false, { transform: booleanAttribute })\n /** 읽기 전용 (추가·삭제 없이 다운로드·바로보기만) */\n readonly readonly = input(false, { transform: booleanAttribute })\n /** 끌어다 놓기 */\n readonly dragAndDrop = input(true, { transform: booleanAttribute })\n /** 다운로드 버튼 표시 */\n readonly showDownload = input(true, { transform: booleanAttribute })\n /** 바로보기 버튼 표시 */\n readonly showPreviewButton = input(true, { transform: booleanAttribute })\n /** 전체 파일 삭제 버튼 표시 */\n readonly showClearAll = input(true, { transform: booleanAttribute })\n /** 파일 input의 name */\n readonly name = input('myFile')\n\n /** 파일을 추가했을 때 */\n readonly fileAdded = output<KrdsFileInfo>()\n /** 파일을 삭제했을 때 (파일 id) */\n readonly fileRemoved = output<string>()\n /** 추가한 파일이 검사(크기·형식)에 실패했을 때 */\n readonly fileError = output<KrdsFileError>()\n /** 전체 파일 삭제 버튼을 눌렀을 때 */\n readonly cleared = output<void>()\n /** 파일의 다운로드 버튼을 눌렀을 때 */\n readonly download = output<KrdsFileInfo>()\n /** 파일의 바로보기 버튼을 눌렀을 때 */\n readonly preview = output<KrdsFileInfo>()\n\n protected readonly inputId = `krds-file-upload-${nextId++}`\n protected readonly dragOver = signal(false)\n protected readonly validCount = computed(() => this.files().filter(file => file.status !== 'error').length)\n\n private get locked() {\n return this.disabled() || this.readonly()\n }\n\n protected lines(message: string) {\n return message.split('\\n')\n }\n\n protected fileName(file: KrdsFileInfo) {\n const ext = extensionOf(file.name)\n return ext\n ? `${file.name.slice(0, -(ext.length + 1))} [${ext}, ${formatFileSize(file.size)}]`\n : `${file.name} [${formatFileSize(file.size)}]`\n }\n\n private validate(file: File): string | null {\n const maxFileSize = this.maxFileSize()\n if (maxFileSize && file.size >= maxFileSize) {\n return `등록 가능한 파일 용량을 초과하였습니다.\\n${formatFileSize(maxFileSize)} 미만의 파일만 등록할 수 있습니다.`\n }\n const accept = this.accept()\n if (accept) {\n const ext = `.${extensionOf(file.name)}`\n const accepted = accept.split(',').map(type => type.trim().toLowerCase())\n const ok = accepted.some(type =>\n type.startsWith('.') ? ext === type : type.endsWith('/*') ? file.type.startsWith(type.slice(0, -1)) : file.type === type\n )\n if (!ok) return '허용되지 않는 파일 형식입니다.'\n }\n return null\n }\n\n private addFiles(fileList: FileList) {\n if (this.locked) return\n // 단일 파일은 기존 파일을 대체하고 첫 파일만 쓴다 (기본 input과 같음)\n const current = this.multiple() ? this.files() : []\n const picked = this.multiple() ? Array.from(fileList) : Array.from(fileList).slice(0, 1)\n let validCount = current.filter(file => file.status !== 'error').length\n const added: KrdsFileInfo[] = []\n for (const file of picked) {\n if (validCount >= this.maxFiles()) break\n const error = this.validate(file)\n if (!error) validCount++\n const info: KrdsFileInfo = {\n id: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,\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 added.push(info)\n }\n if (!added.length) return\n // 목록에 넣은 뒤 알린다: 처리기에서 files를 바꾸면(업로드 시작으로 status를 uploading으로 등) 그대로 남는다\n this.files.set([...current, ...added])\n for (const info of added) {\n if (info.errorMessage) this.fileError.emit({ file: info, error: info.errorMessage })\n else this.fileAdded.emit(info)\n }\n }\n\n protected onFileChange(input: HTMLInputElement) {\n if (!input.files?.length) return\n this.addFiles(input.files)\n // 같은 파일을 다시 고를 수 있게 비운다\n input.value = ''\n }\n\n protected onDragOver(event: DragEvent) {\n if (this.locked || !this.dragAndDrop()) return\n event.preventDefault()\n this.dragOver.set(true)\n }\n\n protected onDrop(event: DragEvent) {\n event.preventDefault()\n this.dragOver.set(false)\n if (this.locked || !this.dragAndDrop() || !event.dataTransfer?.files) return\n this.addFiles(event.dataTransfer.files)\n }\n\n protected removeFile(id: string) {\n if (this.locked) return\n this.files.set(this.files().filter(file => file.id !== id))\n this.fileRemoved.emit(id)\n }\n\n protected clearAll() {\n if (this.locked) return\n this.files.set([])\n this.cleared.emit()\n }\n}\n","import { Component, DOCUMENT, ElementRef, booleanAttribute, computed, inject, input, output, signal, viewChild } from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\n\n/** 플로팅 버튼 항목 (단일형 버튼·확장형 항목 공통) */\nexport interface KrdsFloatingButtonItem {\n /** 버튼 이름 (레이블) */\n label: string\n /** 아이콘 클래스 (예: 'ico-faq') */\n icon: string\n /** 링크 주소 (없으면 버튼으로 렌더링) */\n href?: string\n /** 링크를 새 창으로 열기 ('새 창 열림' 안내 포함) */\n external?: boolean\n}\n\n/** 확장형 항목 선택 이벤트 (링크 항목은 event.preventDefault()로 라우터 이동 가능) */\nexport interface KrdsFloatingButtonSelect {\n item: KrdsFloatingButtonItem\n index: number\n event: MouseEvent\n}\n\nlet nextId = 0\n\n/**\n * KRDS 플로팅 버튼. 화면에서 가장 자주 쓰는 중요한 작업을 화면 오른쪽 아래에 고정해 보여 준다.\n * `items`가 없으면 단일형(아이콘 + 레이블, 클릭은 기본 `(click)`으로 받음),\n * 있으면 확장형(+ 버튼으로 항목을 펼치고 X로 닫음, 선택은 `(itemSelect)`)이다\n *\n * @example\n * <krds-floating-button label=\"채팅 상담\" icon=\"ico-faq\" (click)=\"openChat()\" />\n * <krds-floating-button label=\"상담 메뉴\" [items]=\"items\" (itemSelect)=\"onSelect($event)\" />\n */\n@Component({\n selector: 'krds-floating-button',\n imports: [NgTemplateOutlet],\n host: {\n class: 'krds-floating-button',\n '[class.expand]': '!!items()',\n '[class.active]': 'open()',\n '(focusout)': 'onFocusout($event)',\n // Safari 등은 버튼을 클릭해도 초점을 주지 않으므로 Esc는 문서 전체에서 받는다\n '(document:keydown.escape)': 'open() && close(true)'\n },\n template: `\n @if (items(); as items) {\n @if (open()) {\n <div class=\"floating-dim\" aria-hidden=\"true\" (click)=\"close()\"></div>\n }\n <button\n #toggle\n type=\"button\"\n class=\"floating-toggle\"\n [attr.aria-expanded]=\"open()\"\n [attr.aria-controls]=\"listId\"\n (click)=\"open.set(!open())\"\n >\n <span class=\"floating-icon\"><i class=\"svg-icon ico-plus\" aria-hidden=\"true\"></i></span>\n <span class=\"sr-only\">{{ label() }}</span>\n </button>\n <!-- .floating-list가 display: flex라 hidden 속성 대신 인라인 display로 숨긴다 -->\n <ul class=\"floating-list\" [id]=\"listId\" [style.display]=\"open() ? null : 'none'\">\n @for (item of items; track $index) {\n <li>\n <ng-container *ngTemplateOutlet=\"action; context: { $implicit: item, index: $index }\" />\n </li>\n }\n </ul>\n } @else {\n <ng-container *ngTemplateOutlet=\"action; context: { $implicit: single(), hideLabel: hideLabel() }\" />\n }\n\n <ng-template #action let-item let-index=\"index\" let-hideLabel=\"hideLabel\">\n @if (item.href) {\n <a\n class=\"floating-action\"\n [href]=\"item.href\"\n [attr.target]=\"item.external ? '_blank' : null\"\n [attr.rel]=\"item.external ? 'noopener noreferrer' : null\"\n [attr.title]=\"item.external ? '새 창 열림' : null\"\n (click)=\"onAction(item, index, $event)\"\n >\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item, hideLabel }\" />\n </a>\n } @else {\n <button type=\"button\" class=\"floating-action\" (click)=\"onAction(item, index, $event)\">\n <ng-container *ngTemplateOutlet=\"content; context: { $implicit: item, hideLabel }\" />\n </button>\n }\n </ng-template>\n\n <ng-template #content let-item let-hideLabel=\"hideLabel\">\n <span class=\"floating-icon\"><i class=\"svg-icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i></span>\n <span [class]=\"hideLabel ? 'sr-only' : 'floating-label'\">{{ item.label }}</span>\n </ng-template>\n `\n})\nexport class KrdsFloatingButton {\n /** 단일형 버튼의 레이블, 확장형은 확장 버튼의 이름 (화면에는 숨김) */\n readonly label = input.required<string>()\n /** 단일형 버튼의 아이콘 클래스 */\n readonly icon = input('ico-plus')\n /** 단일형 버튼의 링크 주소 */\n readonly href = input<string>()\n /** 단일형 링크를 새 창으로 열기 ('새 창 열림' 안내 포함) */\n readonly external = input(false, { transform: booleanAttribute })\n /** 단일형 레이블을 화면에서 숨김 (아이콘만 표시, 화면낭독기는 읽음) */\n readonly hideLabel = input(false, { transform: booleanAttribute })\n /** 확장형 항목 (지정하면 확장형, 3개 이하 권장) */\n readonly items = input<KrdsFloatingButtonItem[]>()\n\n /** 확장형 항목을 선택했을 때 */\n readonly itemSelect = output<KrdsFloatingButtonSelect>()\n\n protected readonly open = signal(false)\n protected readonly listId = `krds-floating-list-${nextId++}`\n protected readonly single = computed<KrdsFloatingButtonItem>(() => ({\n label: this.label(),\n icon: this.icon(),\n href: this.href(),\n external: this.external()\n }))\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef)\n private readonly document = inject(DOCUMENT)\n private readonly toggle = viewChild<ElementRef<HTMLButtonElement>>('toggle')\n\n // 초점은 바로 옮긴다: itemSelect 핸들러가 모달을 열거나 다른 곳으로 초점을 옮기면 그쪽이 이긴다\n protected close(returnFocus = false) {\n this.open.set(false)\n if (returnFocus) this.toggle()?.nativeElement.focus()\n }\n\n // Tab으로 초점이 바깥으로 나가면 닫는다 (relatedTarget이 없는 클릭은 가림막 클릭으로 처리)\n protected onFocusout(event: FocusEvent) {\n const next = event.relatedTarget as Node | null\n if (next && !this.host.nativeElement.contains(next)) this.close()\n }\n\n protected onAction(item: KrdsFloatingButtonItem, index: number | undefined, event: MouseEvent) {\n // 단일형 클릭은 기본 click 이벤트가 그대로 바깥으로 전달된다\n if (index === undefined) return\n\n // 먼저 초점을 확장 버튼으로 돌려준 뒤 알린다 (tel:·mailto:처럼 페이지에 남는 링크 포함)\n this.close(true)\n this.itemSelect.emit({ item, index, event })\n\n // 같은 페이지의 실제 대상(#id)으로 이동하는 링크면 초점을 놓아, 브라우저가 대상 위치에서 탐색을 잇게 한다.\n // 핸들러가 이동을 취소했거나(preventDefault) 대상이 없거나(#/route 등) 초점을 다른 곳으로 옮겼으면 그대로 둔다\n const toggle = this.toggle()?.nativeElement\n const hash = item.href?.startsWith('#') ? decodeURIComponent(item.href.slice(1)) : ''\n if (hash && !event.defaultPrevented && this.document.getElementById(hash) && this.document.activeElement === toggle) {\n toggle?.blur()\n }\n }\n}\n","import { Component, Directive, input } from '@angular/core'\n\n/** 푸터 위쪽 관련 사이트 영역 (`<div krdsFooterTop>`) */\n@Component({\n selector: '[krdsFooterTop]',\n host: { class: 'foot-quick' },\n template: '<div class=\"inner\"><ng-content /></div>'\n})\nexport class KrdsFooterTop {}\n\n/** 푸터 로고 영역 */\n@Directive({\n selector: '[krdsFooterLogo]',\n host: { class: 'f-logo' }\n})\nexport class KrdsFooterLogo {}\n\n/** 푸터 기관 정보·링크 영역 */\n@Directive({\n selector: '[krdsFooterContent]',\n host: { class: 'f-cnt' }\n})\nexport class KrdsFooterContent {}\n\n/** 푸터 아래쪽 정책 링크·저작권 영역 */\n@Directive({\n selector: '[krdsFooterBottom]',\n host: { class: 'f-btm' }\n})\nexport class KrdsFooterBottom {}\n\n/**\n * KRDS 푸터. 기본 `<footer>`(contentinfo 랜드마크)에 붙여 영역을 KRDS 구조로 배치한다\n *\n * @example\n * <footer krdsFooter>\n * <div krdsFooterTop>...</div>\n * <div krdsFooterLogo><span class=\"sr-only\">기관명</span></div>\n * <div krdsFooterContent>...</div>\n * <div krdsFooterBottom>...</div>\n * </footer>\n */\n@Component({\n selector: 'footer[krdsFooter]',\n host: { '[id]': 'id()' },\n template: `\n <ng-content select=\"[krdsFooterTop]\" />\n <div class=\"inner\">\n <ng-content select=\"[krdsFooterLogo]\" />\n <ng-content select=\"[krdsFooterContent]\" />\n <ng-content select=\"[krdsFooterBottom]\" />\n </div>\n `\n})\nexport class KrdsFooter {\n /** id (KRDS CSS 기준 krds-footer) */\n readonly id = input('krds-footer')\n}\n","import { Component, input } from '@angular/core'\n\n/**\n * KRDS 스피너. 화면낭독기에는 '로딩 중'을 알리고(role=\"status\"), label이 있으면 화면에도 보인다\n *\n * @example <krds-spinner label=\"불러오는 중입니다\" />\n */\n@Component({\n selector: 'krds-spinner',\n host: { class: 'krds-spinner', role: 'status' },\n template: `\n <span class=\"sr-only\">로딩 중</span>\n @if (label()) {\n <span>{{ label() }}</span>\n }\n `\n})\nexport class KrdsSpinner {\n /** 화면에 보이는 안내 문구 */\n readonly label = input<string>()\n}\n","import { Component, booleanAttribute, computed, contentChild, input } from '@angular/core'\nimport { KRDS_FIELD, KrdsControl, type KrdsField } from '../control/control'\nimport { KrdsSpinner } from '../spinner/spinner'\n\n/** 입력 상태 (도움말 문구 색과 입력 필드 테두리) */\nexport type KrdsFormGroupState = 'default' | 'error' | 'success' | 'information'\n\nlet nextId = 0\n\n/**\n * KRDS 폼 그룹. 레이블, 입력 영역(.form-conts), 도움말을 묶고, 안에 든 입력 요소(`krdsInput`·`krdsSelect`·`krdsControl`)에\n * label `for`, 도움말 `aria-describedby`, 오류 상태 `aria-invalid`를 자동으로 연결한다.\n * 입력 요소 하나를 위한 묶음이다. 체크박스·라디오 여러 개는 `<fieldset krdsCheckArea>`와 legend로 묶는다\n *\n * @example\n * <krds-form-group label=\"이메일\" hint=\"이메일 형식이 올바르지 않습니다\" state=\"error\">\n * <input krdsInput type=\"email\" [(ngModel)]=\"email\" />\n * </krds-form-group>\n */\n@Component({\n selector: 'krds-form-group',\n imports: [KrdsSpinner],\n host: { class: 'form-group' },\n providers: [{ provide: KRDS_FIELD, useExisting: KrdsFormGroup }],\n template: `\n @if (label()) {\n <div class=\"form-tit\">\n <label [attr.for]=\"control()?.id()\">{{ label() }}</label>\n </div>\n }\n <div\n class=\"form-conts\"\n [class.btn-ico-wrap]=\"withButton()\"\n [class]=\"state() === 'default' ? '' : 'is-' + state()\"\n [attr.data-delete]=\"deleteButton() ? 'true' : null\"\n >\n <!-- 로딩 중이 아니면 묶음 상자를 없애(display: contents) 입력 영역 구조를 그대로 둔다 -->\n <div [class.form-spinner]=\"loading()\" [style.display]=\"loading() ? null : 'contents'\">\n <ng-content />\n @if (loading()) {\n <krds-spinner />\n }\n </div>\n </div>\n @if (hint()) {\n <p [id]=\"hintId\" [class]=\"hintClass()\">{{ hint() }}</p>\n }\n `\n})\nexport class KrdsFormGroup implements KrdsField {\n /** 레이블 */\n readonly label = input<string>()\n /** 도움말 (state에 따라 오류·성공·안내 문구) */\n readonly hint = input<string>()\n /** 입력 상태 */\n readonly state = input<KrdsFormGroupState>('default')\n /** 입력 필드 안에 버튼을 둠 (비밀번호 보기·내용 삭제 등) */\n readonly withButton = input(false, { transform: booleanAttribute })\n /** 값이 있을 때만 내용 삭제 버튼(.btn-delete-input)을 보임 */\n readonly deleteButton = input(false, { transform: booleanAttribute })\n /** 입력 필드 안에 로딩 스피너 표시 (데이터를 불러오거나 검증하는 중) */\n readonly loading = input(false, { transform: booleanAttribute })\n\n protected readonly control = contentChild(KrdsControl, { descendants: true })\n protected readonly hintId = `krds-form-hint-${nextId++}`\n protected readonly hintClass = computed(() => {\n const state = this.state()\n return state === 'error' ? 'form-hint-invalid' : state === 'default' ? 'form-hint' : `form-hint-${state}`\n })\n\n readonly describedBy = computed(() => (this.hint() ? this.hintId : null))\n readonly invalid = computed(() => this.state() === 'error')\n}\n","import { Component, Directive, input } from '@angular/core'\n\n/** 헤더 위쪽 유틸리티 영역 (`<div krdsHeaderUtility>`) */\n@Directive({\n selector: '[krdsHeaderUtility]',\n host: { class: 'header-utility' }\n})\nexport class KrdsHeaderUtility {}\n\n/** 헤더 로고·주요 버튼 영역 (`<div krdsHeaderBranding>`) */\n@Directive({\n selector: '[krdsHeaderBranding]',\n host: { class: 'header-branding' }\n})\nexport class KrdsHeaderBranding {}\n\n/**\n * KRDS 헤더. 기본 `<header>`(banner 랜드마크)에 붙여 KRDS 구조로 배치한다.\n * 유틸리티·브랜딩은 `[krdsHeaderUtility]`·`[krdsHeaderBranding]`, PC 메뉴는 그냥 넣고, 모바일 드로어는 `krdsHeaderMobile` 속성을 붙여 넣는다\n *\n * @example\n * <header krdsHeader>\n * <div krdsHeaderUtility>...</div>\n * <div krdsHeaderBranding><h2 class=\"logo\">...</h2></div>\n * <krds-main-menu [items]=\"menu\" />\n * <krds-main-menu krdsHeaderMobile variant=\"mobile\" [items]=\"menu\" [(open)]=\"menuOpen\" />\n * </header>\n */\n@Component({\n selector: 'header[krdsHeader]',\n host: { '[id]': 'id()' },\n template: `\n <div class=\"header-in\">\n <div class=\"header-container\">\n <div class=\"inner\">\n <ng-content select=\"[krdsHeaderUtility]\" />\n <ng-content select=\"[krdsHeaderBranding]\" />\n </div>\n </div>\n <ng-content />\n </div>\n <ng-content select=\"[krdsHeaderMobile]\" />\n `\n})\nexport class KrdsHeader {\n /** id (KRDS CSS 기준 krds-header) */\n readonly id = input('krds-header')\n}\n","import { Component, input } from '@angular/core'\n\n/**\n * KRDS 운영기관 식별자. 누리집을 운영하는 기관을 알린다\n *\n * @example <div krdsIdentifier>이 누리집은 보건복지부 누리집입니다.</div>\n */\n@Component({\n selector: '[krdsIdentifier]',\n host: { class: 'krds-identifier' },\n template: `\n <span class=\"logo\"\n ><span class=\"sr-only\">{{ logoLabel() }}</span></span\n >\n <span class=\"ban-txt\"><ng-content /></span>\n `\n})\nexport class KrdsIdentifier {\n /** 로고 이름 (화면낭독기) */\n readonly logoLabel = input('KRDS - Korea Design System')\n}\n","import { Directive, ElementRef, afterNextRender, inject, input, isDevMode } from '@angular/core'\n\nconst roleWords = /(이미지|사진|그림|그래픽|image|photo|picture)[\\s.]*$/i\n\n/**\n * KRDS 이미지. 기본 `<img>`에 KRDS 클래스를 붙이고 기본으로 지연 로딩한다.\n * 개발 모드에서는 대체 텍스트(alt)가 역할을 되풀이하거나('…사진') 옆 설명(figcaption)과 같으면 경고한다\n *\n * @example\n * <figure krdsFigure>\n * <img krdsImage src=\"/office.jpg\" alt=\"정부서울청사 정문\" />\n * <figcaption>정부서울청사</figcaption>\n * </figure>\n */\n@Directive({\n selector: 'img[krdsImage]',\n host: {\n class: 'krds-image',\n '[attr.loading]': 'loading()'\n }\n})\nexport class KrdsImage {\n /** 로딩 방식 (화면 위쪽의 중요한 이미지는 eager) */\n readonly loading = input<'lazy' | 'eager'>('lazy')\n\n constructor() {\n if (!isDevMode()) return\n const img = inject<ElementRef<HTMLImageElement>>(ElementRef).nativeElement\n afterNextRender(() => {\n const alt = img.alt.trim()\n if (!alt) return\n // oxlint-disable-next-line no-console -- 개발 모드 접근성 경고\n if (roleWords.test(alt)) console.warn(`krdsImage: 대체 텍스트에 '이미지'·'사진'처럼 역할과 겹치는 말을 넣지 않습니다. (alt=\"${alt}\")`)\n if (alt === img.closest('figure')?.querySelector('figcaption')?.textContent?.trim()) {\n // oxlint-disable-next-line no-console -- 개발 모드 접근성 경고\n console.warn(`krdsImage: 대체 텍스트를 옆 설명(figcaption)과 같게 쓰지 않습니다. (alt=\"${alt}\")`)\n }\n })\n }\n}\n\n/** 설명이 있는 이미지 묶음 (`<figure>`) */\n@Directive({\n selector: 'figure[krdsFigure]',\n host: { class: 'krds-figure' }\n})\nexport class KrdsFigure {}\n","import { Component, DOCUMENT, DestroyRef, Directive, afterNextRender, booleanAttribute, inject, input, output, signal } from '@angular/core'\n\n/** 콘텐츠 내 탐색 항목 */\nexport interface KrdsInPageNavItem {\n /** 같은 페이지의 #id (또는 다른 주소) */\n href: string\n text: string\n /** 처음 활성 항목 (autoActive가 아니면 계속 활성 표시) */\n active?: boolean\n}\n\n/** 콘텐츠 내 탐색 항목 클릭 이벤트 */\nexport interface KrdsInPageNavClick {\n item: KrdsInPageNavItem\n event: MouseEvent | KeyboardEvent\n}\n\n/** 콘텐츠 내 탐색 아래쪽 버튼 영역 (`<div krdsInPageAction>`) */\n@Directive({\n selector: '[krdsInPageAction]',\n host: { class: 'in-page-navigation-action' }\n})\nexport class KrdsInPageAction {}\n\n/**\n * KRDS 콘텐츠 내 탐색. #id 항목을 누르면 고정 헤더 높이만큼 비켜 부드럽게 스크롤하고, 키보드로 누르면 그 섹션의 제목으로 초점을 옮긴다.\n * autoActive면 스크롤 위치에 따라 현재 섹션을 표시한다 (aria-current). 아래쪽 버튼 등은 `[krdsInPageAction]` 요소로 넣는다\n *\n * @example <krds-in-page-navigation heading=\"전입 신고\" [items]=\"[{ href: '#target', text: '신청 대상' }, { href: '#docs', text: '구비 서류' }]\" />\n */\n@Component({\n selector: 'krds-in-page-navigation',\n host: { class: 'krds-in-page-navigation-type' },\n template: `\n <div class=\"krds-in-page-navigation-area\">\n @if (caption() || heading()) {\n <div class=\"in-page-navigation-header\">\n @if (caption()) {\n <p class=\"quick-caption\">{{ caption() }}</p>\n }\n @if (heading()) {\n <p class=\"quick-title\">{{ heading() }}</p>\n }\n </div>\n }\n <nav class=\"in-page-navigation-list\" [attr.aria-label]=\"caption() || heading()\">\n <ul>\n @for (item of items(); track item.href) {\n <li>\n <a\n [href]=\"item.href\"\n [class.active]=\"isActive(item)\"\n [attr.aria-current]=\"isActive(item) ? 'true' : null\"\n (click)=\"select(item, $event)\"\n (keydown.enter)=\"onKey(item, $event)\"\n (keydown.space)=\"onKey(item, $event)\"\n >\n {{ item.text }}\n </a>\n </li>\n }\n </ul>\n </nav>\n <ng-content select=\"[krdsInPageAction]\" />\n </div>\n `\n})\nexport class KrdsInPageNavigation {\n /** 페이지 제목 (title 속성은 기본 툴팁이 되므로 heading으로 받음) */\n readonly heading = input<string>()\n /** 머리 문구 */\n readonly caption = input('이 페이지의 구성')\n /** 항목 */\n readonly items = input<KrdsInPageNavItem[]>([])\n /** 스크롤 위치에 따라 현재 섹션 표시 */\n readonly autoActive = input(true, { transform: booleanAttribute })\n /** 스크롤할 때 비켜 갈 고정 헤더 요소들 */\n readonly headerTopSelector = input('#krds-masthead')\n readonly headerInnerSelector = input('#krds-header .header-in')\n\n /** 항목을 눌렀을 때 */\n readonly itemClick = output<KrdsInPageNavClick>()\n\n private readonly document = inject(DOCUMENT)\n private readonly activeHref = signal('')\n\n constructor() {\n const destroyRef = inject(DestroyRef)\n afterNextRender(() => {\n const items = this.items()\n this.activeHref.set((items.find(item => item.active) ?? items[0])?.href ?? '')\n if (!this.autoActive()) return\n const onScroll = () => this.updateActive()\n this.updateActive()\n window.addEventListener('scroll', onScroll, { passive: true })\n destroyRef.onDestroy(() => window.removeEventListener('scroll', onScroll))\n })\n }\n\n protected isActive(item: KrdsInPageNavItem) {\n return this.activeHref() === item.href || (!this.autoActive() && !!item.active)\n }\n\n protected onKey(item: KrdsInPageNavItem, event: Event) {\n event.preventDefault()\n this.select(item, event as KeyboardEvent)\n }\n\n protected select(item: KrdsInPageNavItem, event: MouseEvent | KeyboardEvent) {\n this.itemClick.emit({ item, event })\n if (!item.href.startsWith('#')) return\n event.preventDefault()\n const target = this.document.querySelector(item.href)\n if (!target) return\n const headerHeight = [this.headerTopSelector(), this.headerInnerSelector()].reduce(\n (sum, selector) => sum + (this.document.querySelector<HTMLElement>(selector)?.clientHeight ?? 0),\n 0\n )\n window.scrollTo({ left: 0, top: target.getBoundingClientRect().top + window.scrollY - headerHeight, behavior: 'smooth' })\n this.activeHref.set(item.href)\n // 키보드로 이동하면 섹션 제목으로 초점을 옮겨 이어서 읽게 한다\n if (event instanceof KeyboardEvent) {\n const heading = target.querySelector<HTMLElement>('.sec-tit, h1, h2, h3, h4, h5, h6')\n heading?.setAttribute('tabindex', '-1')\n heading?.focus({ preventScroll: true })\n }\n }\n\n /** 스크롤 위치로 현재 섹션 (끝까지 내리면 마지막, 첫 섹션 위면 첫 섹션) */\n private updateActive() {\n const sections = this.items()\n .filter(item => item.href.startsWith('#'))\n .map(item => ({ href: item.href, el: this.document.querySelector<HTMLElement>(item.href) }))\n .filter((section): section is { href: string; el: HTMLElement } => !!section.el)\n if (!sections.length) return\n const { scrollY, innerHeight } = window\n const topOffset = Math.ceil(innerHeight / 5)\n let active = ''\n if (scrollY + innerHeight >= this.document.body.scrollHeight) active = sections[sections.length - 1].href\n else if (scrollY <= sections[0].el.offsetTop) active = sections[0].href\n else\n active =\n sections.find(({ el }) => scrollY > el.offsetTop - topOffset && scrollY <= el.offsetTop - topOffset + el.offsetHeight)?.href ?? ''\n if (active) this.activeHref.set(active)\n }\n}\n","import { Directive, booleanAttribute, computed, input } from '@angular/core'\n\n/** 링크 크기 (링크는 small, medium, large만 지원) */\nexport type KrdsLinkSize = 'small' | 'medium' | 'large'\n\n/**\n * KRDS 링크. 기본 `<a>`에 KRDS 클래스만 붙이므로 href·target·title·rel은 기본 속성 그대로 쓴다.\n * 새 창 링크는 `title=\"새 창 열림\"`으로 그 사실을 알린다\n *\n * @example <a krdsLink href=\"https://www.krds.go.kr\" target=\"_blank\" title=\"새 창 열림\" size=\"small\">KRDS</a>\n */\n@Directive({\n selector: 'a[krdsLink]',\n host: {\n class: 'krds-btn',\n '[class]': 'classes()'\n }\n})\nexport class KrdsLink {\n /** 링크 크기 */\n readonly size = input<KrdsLinkSize>()\n /** link 클래스 적용 여부 */\n readonly link = input(true, { transform: booleanAttribute })\n /** 본문 텍스트 컬러 링크 */\n readonly basic = input(false, { transform: booleanAttribute })\n /** Pure 링크 여부 (가상클래스 상태 시 컬러 유지) */\n readonly pure = input(false, { transform: booleanAttribute })\n\n protected readonly classes = computed(() =>\n [this.size(), this.link() && 'link', this.basic() && 'basic', this.pure() && 'pure'].filter(Boolean).join(' ')\n )\n}\n\n/**\n * 새 창 링크. target·rel과 '새 창 열림' 안내(title)를 붙인다 (`[krdsExternal]=\"false\"`면 붙이지 않음)\n *\n * @example <a href=\"https://www.gov.kr\" krdsExternal>정부24</a>\n */\n@Directive({\n selector: 'a[krdsExternal]',\n host: {\n '[attr.target]': \"krdsExternal() ? '_blank' : null\",\n '[attr.rel]': \"krdsExternal() ? 'noopener noreferrer' : null\",\n '[attr.title]': \"krdsExternal() ? '새 창 열림' : null\"\n }\n})\nexport class KrdsExternalLink {\n /** 새 창으로 열기 */\n readonly krdsExternal = input(true, { transform: booleanAttribute })\n}\n","import { Component, Directive, inject, input, model, output } from '@angular/core'\nimport { KrdsDropdown } from '../dropdown/dropdown'\nimport { KrdsExternalLink } from '../link/link'\n\n/** 언어 */\nexport interface KrdsLanguage {\n /** 언어 코드 (lang 속성) */\n code: string\n /** 그 언어로 쓴 이름 */\n name: string\n /** 다른 누리집으로 가는 주소 (type=\"external\") */\n url?: string\n}\n\n/** 언어 목록 위쪽 영역 (현재 언어 안내 등, `<div krdsLanguageTop>`) */\n@Directive({\n selector: '[krdsLanguageTop]',\n host: { class: 'drop-top' }\n})\nexport class KrdsLanguageTop {}\n\n/**\n * KRDS 언어 변경. 버튼으로 언어 목록을 열고, 고르면 `[(language)]`를 바꾸고 닫은 뒤 버튼으로 초점을 돌려준다.\n * type=\"external\"이면 언어별 누리집으로 가는 새 창 링크 목록이다. 버튼 글자는 내용으로 넣는다\n *\n * @example\n * <krds-language-switcher [languages]=\"languages\" [(language)]=\"lang\">\n * 언어변경\n * <div krdsLanguageTop><p class=\"current-laguage\"><span>현재 언어</span><strong>한국어</strong></p></div>\n * </krds-language-switcher>\n */\n@Component({\n selector: 'krds-language-switcher',\n imports: [KrdsExternalLink],\n hostDirectives: [{ directive: KrdsDropdown, inputs: ['position: dropPosition'] }],\n host: { class: 'krds-language' },\n template: `\n <!-- 공백만 있는 글자는 템플릿에서 지워지므로 &ngsp;로 아이콘과 내용 사이를 띄운다 -->\n <button type=\"button\" class=\"krds-btn small text drop-btn\">\n <i class=\"svg-icon ico-global\" aria-hidden=\"true\"></i>&ngsp;<ng-content />&ngsp;<i class=\"svg-icon ico-toggle\" aria-hidden=\"true\"></i>\n </button>\n <div class=\"drop-menu\">\n <div class=\"drop-in\">\n <ng-content select=\"[krdsLanguageTop]\" />\n <ul class=\"drop-list\">\n @for (item of languages(); track item.code) {\n <li>\n @if (type() === 'external') {\n <a class=\"item-link\" krdsExternal [href]=\"item.url || '#'\" [lang]=\"item.code\"\n >{{ item.name }} <i class=\"svg-icon ico-go\" aria-hidden=\"true\"></i\n ></a>\n } @else {\n <!-- KRDS 원본의 aria-selected는 링크에 쓸 수 없으므로 현재 언어는 aria-current로 알린다 -->\n <a\n href=\"#\"\n class=\"item-link\"\n [class.active]=\"item.code === language()\"\n [lang]=\"item.code\"\n [attr.aria-current]=\"item.code === language() ? 'true' : null\"\n (click)=\"select($event, item.code)\"\n >\n {{ item.name }}\n @if (item.code === language()) {\n <span class=\"sr-only\">선택됨</span>\n }\n </a>\n }\n </li>\n }\n </ul>\n </div>\n </div>\n `\n})\nexport class KrdsLanguageSwitcher {\n /** 언어 목록 */\n readonly languages = input.required<KrdsLanguage[]>()\n /** 고른 언어 코드 */\n readonly language = model('')\n /** default는 언어 선택, external은 언어별 누리집 링크 */\n readonly type = input<'default' | 'external'>('default')\n\n /** 언어를 골라 목록을 닫았을 때 */\n readonly closed = output<void>()\n\n private readonly dropdown = inject(KrdsDropdown)\n\n protected select(event: MouseEvent, code: string) {\n event.preventDefault()\n this.language.set(code)\n this.dropdown.close(true)\n this.closed.emit()\n }\n}\n","import {\n DOCUMENT,\n DestroyRef,\n Directive,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n inject,\n input,\n output,\n signal\n} from '@angular/core'\n\n/** 레이아웃 크기 */\nexport interface KrdsLayoutSize {\n width: number\n height: number\n}\n\n/** 스크롤 정보 */\nexport interface KrdsLayoutScroll {\n scrollY: number\n scrollHeight: number\n /** 본문(#container) 위쪽에서 50px 넘게 내려온 뒤의 스크롤 방향 (그 위에서는 null) */\n direction: 'up' | 'down' | null\n}\n\n/** 본문 위쪽에서 이만큼 내려온 뒤부터 스크롤 방향을 본다 */\nconst SCROLL_OFFSET = 50\n\n/**\n * KRDS 페이지 레이아웃(.g-wrap). 본문(#container) 아래로 스크롤하면 방향에 따라 scroll-down·scroll-up 클래스를 붙여\n * KRDS CSS가 내려갈 때 헤더를 숨기고 올라올 때 보이게 한다 (도움 패널도 이 클래스를 보고 위치를 맞춤)\n *\n * @example\n * <div krdsLayout>\n * <div krdsSkipLink>...</div>\n * <header krdsHeader>...</header>\n * <div id=\"container\">...</div>\n * </div>\n */\n@Directive({\n selector: '[krdsLayout]',\n host: {\n class: 'g-wrap',\n '[id]': 'id()',\n '[class.scroll-down]': \"direction() === 'down'\",\n '[class.scroll-up]': \"direction() === 'up'\"\n }\n})\nexport class KrdsLayout {\n /** id (KRDS 기준 wrap) */\n readonly id = input('wrap')\n /** 스크롤 방향 감지 */\n readonly scrollDetection = input(true, { transform: booleanAttribute })\n\n /** 스크롤할 때 (resize·scroll은 기본 DOM 이벤트와 겹쳐 쓰지 않음) */\n readonly scrolled = output<KrdsLayoutScroll>()\n /** 레이아웃 크기가 바뀔 때 */\n readonly resized = output<KrdsLayoutSize>()\n /** 문서 높이가 바뀔 때 */\n readonly scrollHeightChange = output<number>()\n\n protected readonly direction = signal<'up' | 'down' | null>(null)\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement\n private readonly document = inject(DOCUMENT)\n private lastScrollY = 0\n private scrollHeight = 0\n\n constructor() {\n const destroyRef = inject(DestroyRef)\n afterNextRender(() => {\n const observer = new ResizeObserver(entries =>\n entries.forEach(({ contentRect: { width, height } }) => this.resized.emit({ width, height }))\n )\n observer.observe(this.host)\n destroyRef.onDestroy(() => observer.disconnect())\n if (!this.scrollDetection()) return\n this.scrollHeight = this.document.body.scrollHeight\n this.lastScrollY = window.scrollY\n const onScroll = () => this.onScroll()\n window.addEventListener('scroll', onScroll, { passive: true })\n destroyRef.onDestroy(() => window.removeEventListener('scroll', onScroll))\n })\n }\n\n private onScroll() {\n const { scrollY } = window\n const height = this.document.body.scrollHeight\n if (height !== this.scrollHeight) {\n this.scrollHeight = height\n this.scrollHeightChange.emit(height)\n }\n const container = this.document.querySelector<HTMLElement>('#container')\n if (container && scrollY > container.offsetTop + SCROLL_OFFSET) {\n if (scrollY > this.lastScrollY) this.direction.set('down')\n else if (scrollY < this.lastScrollY) this.direction.set('up')\n } else {\n this.direction.set(null)\n }\n this.lastScrollY = scrollY\n this.scrolled.emit({ scrollY, scrollHeight: height, direction: this.direction() })\n }\n}\n","import {\n Component,\n DOCUMENT,\n DestroyRef,\n Directive,\n ElementRef,\n Injector,\n TemplateRef,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n contentChild,\n inject,\n input,\n model,\n output,\n signal,\n untracked\n} from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\nimport { KrdsExternalLink } from '../link/link'\n\n/** 메인 메뉴 렌더링 방식: PC 메가 메뉴 또는 모바일 드로어 */\nexport type KrdsMainMenuVariant = 'pc' | 'mobile'\n\n/** 서브 패널 배치: default는 배너가 아래, between은 배너가 오른쪽 */\nexport type KrdsMainMenuLayout = 'default' | 'between'\n\n/** 모바일 4단계 항목 */\nexport interface KrdsMainMenuDepth4Item {\n text: string\n href?: string\n /** 새 창 열림 */\n external?: boolean\n /** 현재 페이지 */\n selected?: boolean\n}\n\n/** 링크 항목 (PC 서브 패널의 마지막 단계, 모바일 3단계) */\nexport interface KrdsMainMenuLinkItem {\n text: string\n /** 링크 주소 (없으면 button) */\n href?: string\n external?: boolean\n /** 메뉴 설명 (PC type-description) */\n description?: string\n selected?: boolean\n /** 모바일 4단계 패널 제목 (기본: text) */\n panelTitle?: string\n /** 모바일 4단계 항목 */\n items?: KrdsMainMenuDepth4Item[]\n}\n\n/** 2단계 항목 (items가 있으면 서브 패널을 여는 버튼, 없으면 바로가기 링크) */\nexport interface KrdsMainMenuSubItem {\n text: string\n href?: string\n external?: boolean\n /** 서브 패널 제목 (기본: text) */\n title?: string\n /** 서브 패널 제목 옆 바로가기 링크 (PC) */\n titleLink?: { text?: string; href: string }\n items?: KrdsMainMenuLinkItem[]\n /** 배너 영역 표시 (krdsMainMenuBanner 템플릿, PC) */\n banner?: boolean\n layout?: KrdsMainMenuLayout\n /** 모바일 3단계 처음 펼침 */\n expanded?: boolean\n selected?: boolean\n}\n\n/** 1단계 항목 (subItems가 있으면 2단계 목록이 있는 패널, items만 있으면 링크만 나열하는 single-list 패널, 둘 다 없으면 링크) */\nexport interface KrdsMainMenuItem {\n text: string\n href?: string\n external?: boolean\n subItems?: KrdsMainMenuSubItem[]\n items?: KrdsMainMenuLinkItem[]\n /** single-list 패널 제목 */\n title?: string\n banner?: boolean\n layout?: KrdsMainMenuLayout\n selected?: boolean\n}\n\n/** 메뉴 항목 클릭 이벤트 (라우터로 이동하려면 event.preventDefault()) */\nexport interface KrdsMainMenuClick {\n item: KrdsMainMenuItem | KrdsMainMenuSubItem | KrdsMainMenuLinkItem | KrdsMainMenuDepth4Item\n event: MouseEvent\n}\n\n/** PC 패널 열림 이벤트 */\nexport interface KrdsMainMenuToggle {\n index: number\n expanded: boolean\n}\n\n/** PC 서브 패널 배너 템플릿 컨텍스트 */\nexport interface KrdsMainMenuBannerContext {\n $implicit: KrdsMainMenuItem\n item: KrdsMainMenuItem\n subItem?: KrdsMainMenuSubItem\n index: number\n subIndex: number\n}\n\n/** PC 서브 패널 배너 (`<ng-template krdsMainMenuBanner let-item let-subItem=\"subItem\">`) */\n@Directive({ selector: 'ng-template[krdsMainMenuBanner]' })\nexport class KrdsMainMenuBanner {\n readonly template = inject<TemplateRef<KrdsMainMenuBannerContext>>(TemplateRef)\n\n static ngTemplateContextGuard(_dir: KrdsMainMenuBanner, _ctx: unknown): _ctx is KrdsMainMenuBannerContext {\n return true\n }\n}\n\n/** 모바일 드로어 아래쪽 영역 (`<div krdsMainMenuBottom>`) */\n@Directive({\n selector: '[krdsMainMenuBottom]',\n host: { class: 'gnb-bottom' }\n})\nexport class KrdsMainMenuBottom {}\n\nconst DRAWER_OPEN_DELAY = 100\nconst DRAWER_CLOSE_DELAY = 400\nconst FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n\nlet nextId = 0\n\n/**\n * KRDS 메인 메뉴. variant=\"pc\"는 메가 메뉴, variant=\"mobile\"은 드로어다.\n * - PC: 1단계 버튼으로 패널을 열고 닫고, Esc·바깥 클릭·초점 이탈로 닫는다. 1·2단계 버튼은 Home·End·방향키로 옮긴다. 열리면 배경을 어둡게 한다\n * - 모바일: `[(open)]`으로 드로어를 열고 닫고, 열리면 드로어로 초점을 옮겨 Tab을 가두며 닫히면 연 요소로 돌려준다. 1단계 탭은 해당 패널로 스크롤하고, 3단계는 펼치고, 4단계는 패널로 연다\n *\n * @example\n * <krds-main-menu [items]=\"menu\" (itemClick)=\"navigate($event)\" />\n * <krds-main-menu variant=\"mobile\" [items]=\"menu\" [(open)]=\"menuOpen\">\n * <div krdsMainMenuHeader>로그인</div>\n * </krds-main-menu>\n */\n@Component({\n selector: 'krds-main-menu',\n imports: [NgTemplateOutlet, KrdsExternalLink],\n host: {\n // 헤더의 flex 배치에 메뉴 요소가 그대로 들어가도록 이 요소의 상자는 없앤다\n style: 'display: contents',\n '(document:click)': 'onDocumentClick($event)'\n },\n template: `\n @if (variant() === 'pc') {\n <nav #root class=\"krds-main-menu\" [attr.aria-label]=\"label()\" (keydown)=\"onPcKeydown($event)\" (focusout)=\"onPcFocusout($event, root)\">\n <div class=\"inner\">\n <ul class=\"gnb-menu\" [attr.aria-label]=\"label()\">\n @for (item of items(); track $index; let i = $index) {\n <li>\n @if (hasPanel(item)) {\n <button\n type=\"button\"\n class=\"gnb-main-trigger\"\n data-trigger=\"gnb\"\n aria-haspopup=\"true\"\n [class.active]=\"openIndex() === i\"\n [class.selected]=\"item.selected\"\n [attr.aria-controls]=\"panelId(i)\"\n [attr.aria-expanded]=\"openIndex() === i ? 'true' : 'false'\"\n (click)=\"toggleMain(i); onItemClick(item, $event)\"\n >\n {{ item.text }}\n </button>\n <div class=\"gnb-toggle-wrap\" [id]=\"panelId(i)\" [class.is-open]=\"openIndex() === i\">\n <div\n class=\"gnb-main-list\"\n [attr.data-has-submenu]=\"item.subItems?.length ? 'true' : null\"\n [style.min-height.px]=\"openIndex() === i && panelMinHeight() ? panelMinHeight() : null\"\n >\n @if (item.subItems?.length) {\n <ul>\n @for (sub of item.subItems; track $index; let j = $index) {\n <li>\n @if (sub.items?.length) {\n <button\n type=\"button\"\n class=\"gnb-sub-trigger\"\n data-trigger=\"gnb\"\n aria-haspopup=\"true\"\n [class.active]=\"activeSub(i) === j\"\n [class.selected]=\"sub.selected\"\n [attr.aria-controls]=\"subPanelId(i, j)\"\n [attr.aria-expanded]=\"activeSub(i) === j ? 'true' : 'false'\"\n (click)=\"selectSub(i, j); onItemClick(sub, $event)\"\n >\n {{ sub.text }}\n </button>\n <ng-container\n *ngTemplateOutlet=\"\n subList;\n context: {\n id: subPanelId(i, j),\n title: sub.title || sub.text,\n titleLink: sub.titleLink,\n links: sub.items,\n layout: sub.layout,\n single: false,\n active: activeSub(i) === j,\n banner: sub.banner,\n bannerContext: { $implicit: item, item, subItem: sub, index: i, subIndex: j }\n }\n \"\n />\n } @else if (sub.href) {\n <a\n class=\"gnb-sub-trigger is-link\"\n data-trigger=\"gnb\"\n [href]=\"sub.href\"\n [krdsExternal]=\"!!sub.external\"\n [class.external-link]=\"sub.external\"\n [class.selected]=\"sub.selected\"\n (click)=\"onItemClick(sub, $event)\"\n >\n {{ sub.text }}\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"gnb-sub-trigger is-link\"\n data-trigger=\"gnb\"\n [class.selected]=\"sub.selected\"\n (click)=\"onItemClick(sub, $event)\"\n >\n {{ sub.text }}\n </button>\n }\n </li>\n }\n </ul>\n } @else {\n <ng-container\n *ngTemplateOutlet=\"\n subList;\n context: {\n id: null,\n title: item.title || item.text,\n links: item.items,\n layout: item.layout,\n single: true,\n active: false,\n banner: item.banner,\n bannerContext: { $implicit: item, item, index: i, subIndex: -1 }\n }\n \"\n />\n }\n </div>\n </div>\n } @else if (item.href) {\n <a\n class=\"gnb-main-trigger is-link\"\n data-trigger=\"gnb\"\n [href]=\"item.href\"\n [krdsExternal]=\"!!item.external\"\n [class.selected]=\"item.selected\"\n (click)=\"onItemClick(item, $event)\"\n >\n {{ item.text }}\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"gnb-main-trigger is-link\"\n data-trigger=\"gnb\"\n [class.selected]=\"item.selected\"\n (click)=\"onItemClick(item, $event)\"\n >\n {{ item.text }}\n </button>\n }\n </li>\n }\n </ul>\n </div>\n </nav>\n } @else {\n <div\n class=\"krds-main-menu-mobile\"\n [id]=\"mobileId()\"\n [class.is-open]=\"drawerOpened()\"\n [class.is-backdrop]=\"drawerOpened()\"\n [style.display]=\"drawerDisplayed() ? null : 'none'\"\n (keydown)=\"onMobileKeydown($event, wrap)\"\n >\n <div #wrap class=\"gnb-wrap\" tabindex=\"-1\">\n <div class=\"gnb-header\"><ng-content select=\"[krdsMainMenuHeader]\" /></div>\n <div #body class=\"gnb-body\" (scroll)=\"onBodyScroll(body)\">\n <div class=\"gnb-menu\">\n <div class=\"menu-wrap\">\n <ul role=\"tablist\" [attr.aria-label]=\"label()\">\n @for (item of items(); track $index; let i = $index) {\n <li role=\"none\">\n <a\n class=\"gnb-main-trigger\"\n role=\"tab\"\n [id]=\"tabId(i)\"\n [href]=\"'#' + panelId(i)\"\n [class.active]=\"activeTab() === i\"\n [attr.aria-controls]=\"panelId(i)\"\n [attr.aria-selected]=\"activeTab() === i ? 'true' : 'false'\"\n (click)=\"onTabClick($event, i, body); onItemClick(item, $event)\"\n >\n {{ item.text }}\n </a>\n </li>\n }\n </ul>\n </div>\n <div class=\"submenu-wrap\">\n @for (item of items(); track $index; let i = $index) {\n <div class=\"gnb-sub-list\" role=\"tabpanel\" [id]=\"panelId(i)\" [attr.aria-labelledby]=\"tabId(i)\">\n <h2 class=\"sub-title\">{{ item.title || item.text }}</h2>\n <ul>\n @for (sub of mobileSubItems(item); track $index; let j = $index) {\n @let key = i + '-' + j;\n @let withDepth3 = !!sub.items?.length;\n <li>\n <a\n class=\"gnb-sub-trigger\"\n [href]=\"sub.href || '#'\"\n [krdsExternal]=\"!withDepth3 && !!sub.external\"\n [class.has-depth3]=\"withDepth3\"\n [class.active]=\"withDepth3 && depth3Open(key)\"\n [class.selected]=\"sub.selected\"\n [attr.aria-controls]=\"withDepth3 ? depth3Id(i, j) : null\"\n [attr.aria-expanded]=\"withDepth3 ? (depth3Open(key) ? 'true' : 'false') : null\"\n (click)=\"withDepth3 && toggleDepth3($event, key); onItemClick(sub, $event)\"\n >\n {{ sub.text }}\n </a>\n @if (withDepth3) {\n <div class=\"depth3-wrap\" [id]=\"depth3Id(i, j)\" [class.is-open]=\"depth3Open(key)\">\n <ul>\n @for (link of sub.items; track $index; let k = $index) {\n @let key4 = key + '-' + k;\n @let withDepth4 = !!link.items?.length;\n <li>\n <a\n #depth3Trigger\n class=\"depth3-trigger\"\n [href]=\"link.href || '#'\"\n [krdsExternal]=\"!withDepth4 && !!link.external\"\n [class.has-depth4]=\"withDepth4\"\n [class.selected]=\"link.selected\"\n [attr.aria-haspopup]=\"withDepth4 ? 'true' : null\"\n [attr.aria-expanded]=\"withDepth4 ? (depth4Opened() === key4 ? 'true' : 'false') : null\"\n (click)=\"withDepth4 && openDepth4($event, key4, depth3Trigger); onItemClick(link, $event)\"\n >\n {{ link.text }}\n </a>\n @if (withDepth4) {\n <div\n class=\"depth4-wrap\"\n [class.is-open]=\"depth4Opened() === key4\"\n [style.display]=\"depth4Displayed() === key4 ? 'block' : null\"\n >\n <div class=\"depth4-head\">\n <button type=\"button\" class=\"krds-btn icon trigger-prev\" (click)=\"closeDepth4()\">\n <span class=\"sr-only\">이전화면</span><i class=\"svg-icon ico-angle left\"></i>\n </button>\n <button type=\"button\" class=\"krds-btn icon trigger-close\" (click)=\"closeDepth4()\">\n <span class=\"sr-only\">{{ closeLabel() }}</span\n ><i class=\"svg-icon ico-popup-close\"></i>\n </button>\n </div>\n <div class=\"depth4-body\">\n <!-- 2단계 패널 제목(h2) 바로 아래 수준 (KRDS 원본은 h4라 h3을 건너뜀) -->\n <h3 class=\"sub-title\">{{ link.panelTitle || link.text }}</h3>\n <ul class=\"depth4-ul\">\n @for (depth4 of link.items; track $index) {\n <li>\n <a\n [href]=\"depth4.href || '#'\"\n [krdsExternal]=\"!!depth4.external\"\n [class.selected]=\"depth4.selected\"\n (click)=\"onItemClick(depth4, $event)\"\n >\n {{ depth4.text }}\n </a>\n </li>\n }\n </ul>\n </div>\n </div>\n }\n </li>\n }\n </ul>\n </div>\n }\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </div>\n <ng-content select=\"[krdsMainMenuBottom]\" />\n </div>\n <button type=\"button\" id=\"close-nav\" class=\"krds-btn medium icon\" (click)=\"open.set(false)\">\n <span class=\"sr-only\">{{ closeLabel() }}</span\n ><i class=\"svg-icon ico-popup-close\"></i>\n </button>\n </div>\n </div>\n }\n\n <ng-template\n #subList\n let-id=\"id\"\n let-title=\"title\"\n let-titleLink=\"titleLink\"\n let-links=\"links\"\n let-layout=\"layout\"\n let-single=\"single\"\n let-active=\"active\"\n let-banner=\"banner\"\n let-bannerContext=\"bannerContext\"\n >\n @let described = hasDescription(links);\n <div class=\"gnb-sub-list\" [attr.id]=\"id\" [class.active]=\"active\" [class.between]=\"layout === 'between'\" [class.single-list]=\"single\">\n <div class=\"gnb-sub-content\">\n <h2 class=\"sub-title\">\n @if (titleLink) {\n {{ title }}\n <a class=\"krds-btn link basic small\" [href]=\"titleLink.href\">\n <span class=\"underline\">{{ titleLink.text || '바로가기' }}</span\n ><i class=\"svg-icon ico-angle right\"></i>\n </a>\n } @else {\n <span>{{ title }}</span>\n }\n </h2>\n <ul [class.type-description]=\"described\">\n @for (link of links; track $index) {\n <li>\n @if (described) {\n <h3 class=\"tit\">\n <a\n [href]=\"link.href || '#'\"\n [krdsExternal]=\"!!link.external\"\n [class.active]=\"link.selected\"\n (click)=\"onItemClick(link, $event)\"\n >\n {{ link.text }}\n @if (link.external) {\n <i class=\"svg-icon ico-go\"></i>\n }\n </a>\n </h3>\n @if (link.description) {\n <p class=\"txt\">{{ link.description }}</p>\n }\n } @else if (link.href) {\n <a [href]=\"link.href\" [krdsExternal]=\"!!link.external\" [class.active]=\"link.selected\" (click)=\"onItemClick(link, $event)\">\n {{ link.text }}\n @if (link.external) {\n <i class=\"svg-icon ico-go\"></i>\n }\n </a>\n } @else {\n <button type=\"button\" [class.active]=\"link.selected\" (click)=\"onItemClick(link, $event)\">{{ link.text }}</button>\n }\n </li>\n }\n </ul>\n </div>\n @if (banner && bannerTemplate(); as template) {\n <div class=\"gnb-sub-banner\">\n <ng-container *ngTemplateOutlet=\"template.template; context: bannerContext\" />\n </div>\n }\n </div>\n </ng-template>\n `\n})\nexport class KrdsMainMenu {\n /** 메뉴 항목 */\n readonly items = input<KrdsMainMenuItem[]>([])\n /** 렌더링 방식 */\n readonly variant = input<KrdsMainMenuVariant>('pc')\n /** 메뉴 이름 */\n readonly label = input('메인 메뉴')\n /** 모바일 드로어 열림 */\n readonly open = model(false)\n /** 모바일 드로어 id (바깥 열기 버튼의 aria-controls 대상) */\n readonly mobileId = input('mobile-nav')\n /** PC 패널이 열리면 배경을 어둡게 */\n readonly backdrop = input(true, { transform: booleanAttribute })\n /** 모바일 닫기 버튼 문구 */\n readonly closeLabel = input('전체메뉴 닫기')\n\n /** PC 패널을 열거나 닫았을 때 */\n readonly menuToggle = output<KrdsMainMenuToggle>()\n /** 메뉴 항목을 클릭했을 때 */\n readonly itemClick = output<KrdsMainMenuClick>()\n\n protected readonly bannerTemplate = contentChild(KrdsMainMenuBanner)\n\n private readonly uid = nextId++\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement\n private readonly document = inject(DOCUMENT)\n private readonly injector = inject(Injector)\n\n // PC 상태\n protected readonly openIndex = signal(-1)\n private readonly subOverrides = signal<Record<number, number>>({})\n protected readonly panelMinHeight = signal(0)\n private backdropEl: HTMLElement | null = null\n\n // 모바일 상태\n protected readonly activeTab = signal(0)\n private readonly depth3Expanded = signal<Record<string, boolean>>({})\n protected readonly depth4Displayed = signal<string | null>(null)\n protected readonly depth4Opened = signal<string | null>(null)\n protected readonly drawerDisplayed = signal(false)\n protected readonly drawerOpened = signal(false)\n private depth4Trigger: HTMLElement | null = null\n private previousFocus: HTMLElement | null = null\n private drawerTimer?: ReturnType<typeof setTimeout>\n private drawerInitialized = false\n\n constructor() {\n // 모바일 드로어: 처음에는 전환 없이 상태를 맞추고, 이후에는 원본처럼 전환 시간에 맞춰 연다·닫는다 (브라우저에서만)\n afterRenderEffect(() => {\n const open = this.open()\n untracked(() => {\n if (this.variant() !== 'mobile') return\n if (!this.drawerInitialized) {\n this.drawerInitialized = true\n this.depth3Expanded.set(this.initialDepth3())\n if (!open) return\n this.drawerDisplayed.set(true)\n this.drawerOpened.set(true)\n this.document.body.classList.add('is-gnb-mobile')\n return\n }\n if (open) this.openDrawer()\n else this.closeDrawer()\n })\n })\n // PC: 패널이 열리면 body 상태 클래스(스크롤 잠금)와 배경 딤을 맞춘다\n afterRenderEffect(() => {\n const isOpen = this.openIndex() !== -1\n untracked(() => {\n const body = this.document.body\n body.classList.toggle('is-gnb-web', isOpen)\n body.classList.toggle('hasScrollY', isOpen && body.scrollHeight > window.innerHeight)\n if (isOpen && this.backdrop() && !this.backdropEl) {\n // 쌓임 순서에 가리지 않게 body에 둔다 (Vue의 Teleport)\n this.backdropEl = this.document.createElement('div')\n this.backdropEl.className = 'gnb-backdrop active'\n this.backdropEl.setAttribute('aria-hidden', 'true')\n body.appendChild(this.backdropEl)\n } else if (!isOpen) {\n this.removeBackdrop()\n }\n })\n })\n inject(DestroyRef).onDestroy(() => {\n clearTimeout(this.drawerTimer)\n this.removeBackdrop()\n this.document.body.classList.remove('is-gnb-web', 'hasScrollY', 'is-gnb-mobile')\n })\n }\n\n protected panelId(i: number) {\n return `krds-gnb-${this.uid}-panel-${i}`\n }\n\n protected subPanelId(i: number, j: number) {\n return `krds-gnb-${this.uid}-sub-${i}-${j}`\n }\n\n protected tabId(i: number) {\n return `krds-gnb-${this.uid}-tab-${i}`\n }\n\n protected depth3Id(i: number, j: number) {\n return `krds-gnb-${this.uid}-depth3-${i}-${j}`\n }\n\n protected hasPanel(item: KrdsMainMenuItem) {\n return !!item.subItems?.length || !!item.items?.length\n }\n\n protected hasDescription(links?: KrdsMainMenuLinkItem[]) {\n return !!links?.some(link => link.description)\n }\n\n protected onItemClick(item: KrdsMainMenuClick['item'], event: MouseEvent) {\n this.itemClick.emit({ item, event })\n // 라우터처럼 페이지를 새로 읽지 않는 이동에서도 패널이 남지 않게 닫고 초점을 1단계 버튼으로 돌려준다 (패널 전환 버튼은 제외)\n if ((event.currentTarget as Element | null)?.tagName === 'A') this.closeMain(true)\n }\n\n // ===== PC =====\n\n /** 원본처럼 링크가 아닌 첫 2단계를 기본으로 연다 */\n protected activeSub(i: number) {\n return this.subOverrides()[i] ?? this.items()[i]?.subItems?.findIndex(sub => !!sub.items?.length) ?? -1\n }\n\n private mainTriggers() {\n return [...this.host.querySelectorAll<HTMLElement>('.gnb-menu > li > .gnb-main-trigger')]\n }\n\n protected toggleMain(i: number) {\n if (this.openIndex() === i) return this.closeMain()\n this.closeMain()\n this.openIndex.set(i)\n this.menuToggle.emit({ index: i, expanded: true })\n this.adjustPanelHeight()\n }\n\n protected closeMain(restoreFocus = false) {\n const index = this.openIndex()\n if (index === -1) return\n this.openIndex.set(-1)\n this.panelMinHeight.set(0)\n this.menuToggle.emit({ index, expanded: false })\n if (restoreFocus) this.mainTriggers()[index]?.focus()\n }\n\n protected selectSub(i: number, j: number) {\n this.subOverrides.update(overrides => ({ ...overrides, [i]: j }))\n this.adjustPanelHeight()\n }\n\n /** 서브 패널이 absolute라 열린 패널 높이에 맞춰 목록 최소 높이를 맞춘다 */\n private adjustPanelHeight() {\n afterNextRender(\n () => {\n const active = this.host.querySelectorAll('.gnb-main-list')[this.openIndex()]?.querySelector<HTMLElement>('.gnb-sub-list.active')\n this.panelMinHeight.set(active?.scrollHeight ?? 0)\n },\n { injector: this.injector }\n )\n }\n\n private removeBackdrop() {\n this.backdropEl?.remove()\n this.backdropEl = null\n }\n\n protected onDocumentClick(event: MouseEvent) {\n if (this.variant() === 'pc' && !this.host.contains(event.target as Node)) this.closeMain()\n }\n\n protected onPcFocusout(event: FocusEvent, root: HTMLElement) {\n const next = event.relatedTarget as Node | null\n if (next && !root.contains(next)) this.closeMain()\n }\n\n protected onPcKeydown(event: KeyboardEvent) {\n if (event.key === 'Escape') return this.closeMain(true)\n const target = event.target as HTMLElement\n if (!target.dataset['trigger']) return\n const triggers = this.mainTriggers()\n const sibling = (direction: 'next' | 'prev') => {\n const li = target.closest('li')\n return (direction === 'next' ? li?.nextElementSibling : li?.previousElementSibling)?.querySelector<HTMLElement>('[data-trigger]')\n }\n const next = {\n Home: triggers[0],\n End: triggers[triggers.length - 1],\n ArrowRight: sibling('next'),\n ArrowDown: sibling('next'),\n ArrowLeft: sibling('prev'),\n ArrowUp: sibling('prev')\n }[event.key]\n if (next === undefined && !['Home', 'End', 'ArrowRight', 'ArrowDown', 'ArrowLeft', 'ArrowUp'].includes(event.key)) return\n event.preventDefault()\n next?.focus()\n }\n\n // ===== 모바일 =====\n\n /** PC와 같은 메뉴 데이터로 쓰도록 single-list(items)와 하위 메뉴 없는 링크도 패널에 링크로 보여 준다 */\n protected mobileSubItems(item: KrdsMainMenuItem): KrdsMainMenuSubItem[] {\n if (item.subItems) return item.subItems\n const links = item.items ?? (item.href ? [item] : [])\n return links.map(({ text, href, external, selected }) => ({ text, href, external, selected }))\n }\n\n private initialDepth3() {\n const expanded: Record<string, boolean> = {}\n this.items().forEach((item, i) => item.subItems?.forEach((sub, j) => sub.expanded && (expanded[`${i}-${j}`] = true)))\n return expanded\n }\n\n protected depth3Open(key: string) {\n return !!this.depth3Expanded()[key]\n }\n\n protected toggleDepth3(event: MouseEvent, key: string) {\n event.preventDefault()\n this.depth3Expanded.update(expanded => ({ ...expanded, [key]: !expanded[key] }))\n }\n\n /** 4단계 패널: 먼저 보이게 한 뒤 열림 클래스를 붙이고(전환), 이전화면 버튼으로 초점 */\n protected openDepth4(event: MouseEvent, key: string, trigger: HTMLElement) {\n event.preventDefault()\n this.depth4Trigger = trigger\n this.depth4Displayed.set(key)\n afterNextRender(\n () => {\n this.depth4Opened.set(key)\n afterNextRender(() => this.host.querySelector<HTMLElement>('.depth4-wrap.is-open .trigger-prev')?.focus(), {\n injector: this.injector\n })\n },\n { injector: this.injector }\n )\n }\n\n protected closeDepth4() {\n this.depth4Opened.set(null)\n this.depth4Trigger?.focus()\n this.depth4Trigger = null\n setTimeout(() => !this.depth4Opened() && this.depth4Displayed.set(null), DRAWER_CLOSE_DELAY)\n }\n\n /** 1단계 탭을 누르면 해당 패널 위치로 스크롤 */\n protected onTabClick(event: MouseEvent, i: number, body: HTMLElement) {\n event.preventDefault()\n this.activeTab.set(i)\n const panel = body.querySelectorAll<HTMLElement>('.gnb-sub-list')[i]\n if (panel) body.scrollTo({ left: 0, top: panel.offsetTop, behavior: 'smooth' })\n }\n\n /** 스크롤 위치에 따라 활성 탭 */\n protected onBodyScroll(body: HTMLElement) {\n const { scrollTop, scrollHeight, clientHeight } = body\n let active = this.activeTab()\n body.querySelectorAll<HTMLElement>('.gnb-sub-list').forEach((panel, i) => {\n if (scrollTop >= panel.offsetTop || scrollTop + clientHeight >= scrollHeight) active = i\n })\n this.activeTab.set(active)\n }\n\n private openDrawer() {\n clearTimeout(this.drawerTimer)\n this.previousFocus = this.document.activeElement as HTMLElement | null\n this.drawerDisplayed.set(true)\n // display를 바꾼 직후에는 전환이 동작하지 않으므로 원본처럼 조금 뒤에 열림 클래스를 붙인다\n this.drawerTimer = setTimeout(() => {\n this.drawerOpened.set(true)\n this.document.body.classList.add('is-gnb-mobile')\n const root = this.host.querySelector<HTMLElement>('.krds-main-menu-mobile')\n const focusDrawer = () => this.drawerOpened() && this.host.querySelector<HTMLElement>('.gnb-wrap')?.focus()\n // visibility 전환이 끝나야 초점을 받을 수 있다. 전환이 없으면 그린 뒤 바로\n root?.addEventListener('transitionend', focusDrawer, { once: true })\n requestAnimationFrame(() => !root?.getAnimations().length && focusDrawer())\n }, DRAWER_OPEN_DELAY)\n }\n\n private closeDrawer() {\n clearTimeout(this.drawerTimer)\n this.drawerOpened.set(false)\n this.previousFocus?.focus()\n this.previousFocus = null\n this.drawerTimer = setTimeout(() => {\n this.drawerDisplayed.set(false)\n this.document.body.classList.remove('is-gnb-mobile')\n }, DRAWER_CLOSE_DELAY)\n }\n\n protected onMobileKeydown(event: KeyboardEvent, wrap: HTMLElement) {\n if (event.key === 'Escape') {\n if (this.depth4Opened()) this.closeDepth4()\n else this.open.set(false)\n return\n }\n if (event.key !== 'Tab') return\n const container = this.host.querySelector<HTMLElement>('.depth4-wrap.is-open') ?? wrap\n const focusable = [...container.querySelectorAll<HTMLElement>(FOCUSABLE)]\n if (!focusable.length) return\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n const active = this.document.activeElement\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","import { Component, input } from '@angular/core'\n\n/**\n * KRDS 공식 배너. 페이지 맨 위에 대한민국 공식 전자정부 누리집임을 알린다 (KRDS CSS가 id #krds-masthead로 스타일을 줌)\n *\n * @example <div krdsMasthead>이 누리집은 대한민국 공식 전자정부 누리집입니다.</div>\n */\n@Component({\n selector: '[krdsMasthead]',\n host: { '[id]': 'id()' },\n template: `\n <div class=\"toggle-wrap\">\n <div class=\"toggle-head\">\n <div class=\"inner\">\n <span class=\"nuri-txt\"><ng-content /></span>\n </div>\n </div>\n </div>\n `\n})\nexport class KrdsMasthead {\n /** id (KRDS CSS 기준 krds-masthead) */\n readonly id = input('krds-masthead')\n}\n","import { Component, Directive, ElementRef, afterNextRender, booleanAttribute, contentChild, inject, input, isDevMode } from '@angular/core'\nimport { KrdsDisclosure } from '../disclosure/disclosure'\n\n/** 원고(설명적 원고): 화면과 소리의 정보를 글로 옮긴 내용 (`<div krdsMediaTranscript>`, '원고 보기'로 펼침) */\n@Directive({ selector: '[krdsMediaTranscript]' })\nexport class KrdsMediaTranscript {}\n\n/**\n * KRDS 접근 가능한 미디어. 기본 `<figure>`에 붙여 제목·재생기·원고를 묶는다.\n * 재생기는 기본 `<video controls>`·`<audio controls>`(자막 track 포함)나 외부 재생기(유튜브 iframe 등)를 그대로 넣는다.\n * 개발 모드에서는 자막·원고가 모두 없거나(오디오·외부 재생기는 원고가 없으면) 자동 재생이면 경고한다\n *\n * @example\n * <figure krdsMedia heading=\"민원 신청 안내 영상\">\n * <video controls preload=\"metadata\" src=\"/guide.mp4\">\n * <track kind=\"captions\" src=\"/guide.ko.vtt\" srclang=\"ko\" label=\"한국어\" default />\n * </video>\n * <div krdsMediaTranscript><p>민원 신청은 세 단계로 진행됩니다.</p></div>\n * </figure>\n */\n@Component({\n selector: 'figure[krdsMedia]',\n imports: [KrdsDisclosure],\n host: { class: 'krds-media' },\n template: `\n <figcaption [class]=\"hideHeading() ? 'sr-only' : 'media-title'\">{{ heading() }}</figcaption>\n <div class=\"media-player\"><ng-content /></div>\n @if (transcript()) {\n <krds-disclosure label=\"원고 보기\"><ng-content select=\"[krdsMediaTranscript]\" /></krds-disclosure>\n }\n `\n})\nexport class KrdsMedia {\n /** 미디어 제목 (화면낭독기가 미디어 영역 이름으로 읽음, title 속성은 기본 툴팁이 되므로 heading으로 받음) */\n readonly heading = input.required<string>()\n /** 제목을 화면에서 숨김 (화면낭독기는 읽음) */\n readonly hideHeading = input(false, { transform: booleanAttribute })\n\n protected readonly transcript = contentChild(KrdsMediaTranscript)\n\n constructor() {\n if (!isDevMode()) return\n const figure = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement\n afterNextRender(() => {\n const media = figure.querySelector<HTMLMediaElement>('.media-player video, .media-player audio')\n const title = this.heading()\n // 오디오·외부 재생기는 자막이 화면에 보이지 않아(또는 확인할 수 없어) 원고만 대체 정보가 된다\n const captioned =\n media instanceof HTMLVideoElement &&\n [...media.querySelectorAll('track')].some(track => ['captions', 'subtitles'].includes(track.kind))\n if (!this.transcript() && !captioned) {\n // oxlint-disable-next-line no-console -- 개발 모드 접근성 경고\n console.warn(\n media instanceof HTMLVideoElement\n ? `krdsMedia: 자막(track)이나 원고(krdsMediaTranscript) 중 하나 이상을 제공합니다. 어렵다면 원고를 제공합니다. (heading=\"${title}\")`\n : `krdsMedia: 오디오·외부 재생기는 자막을 확인할 수 없으므로 원고(krdsMediaTranscript)를 제공합니다. (heading=\"${title}\")`\n )\n }\n if (media?.autoplay) {\n // oxlint-disable-next-line no-console -- 개발 모드 접근성 경고\n console.warn(`krdsMedia: 미디어를 자동 재생하지 않습니다. 사용자가 직접 재생하게 합니다. (heading=\"${title}\")`)\n }\n })\n }\n}\n","import {\n Component,\n DOCUMENT,\n DestroyRef,\n Directive,\n ElementRef,\n afterNextRender,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n model\n} from '@angular/core'\n\n/** 모달 크기 */\nexport type KrdsModalSize = 'small' | 'medium' | 'large'\n\nconst SIZE_CLASS: Record<KrdsModalSize, string> = { small: 'modal-sm', medium: 'modal-md', large: 'modal-lg' }\nconst FOCUSABLE = 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n\nlet nextId = 0\n\n/** 모달 아래쪽 버튼 영역 (`<div krdsModalFooter>`) */\n@Directive({\n selector: '[krdsModalFooter]',\n host: { class: 'modal-btn btn-wrap' }\n})\nexport class KrdsModalFooter {}\n\n/**\n * KRDS 모달. `[(open)]`으로 열고 닫고, 브라우저에서는 body 끝으로 옮겨 다른 요소의 쌓임 순서에 가리지 않게 한다.\n * 열리면 내용으로 초점을 옮기고 Tab 초점을 모달 안에 가두며 배경 스크롤을 막고, 닫히면 연 요소로 초점을 돌려준다.\n * Esc·배경 클릭으로 닫히고 `persistent`면 닫기·버튼으로만 닫힌다\n *\n * @example\n * <krds-modal heading=\"신청을 취소할까요?\" [(open)]=\"confirmOpen\">\n * <p>취소하면 입력한 내용이 사라집니다.</p>\n * <div krdsModalFooter>\n * <button krdsButton variant=\"tertiary\" (click)=\"confirmOpen.set(false)\">아니요</button>\n * <button krdsButton (click)=\"cancel()\">예</button>\n * </div>\n * </krds-modal>\n */\n@Component({\n selector: 'krds-modal',\n host: {\n '(document:keydown)': 'onKeydown($event)'\n },\n template: `\n @if (open()) {\n <section\n class=\"krds-modal fade in shown\"\n role=\"dialog\"\n aria-modal=\"true\"\n [id]=\"id()\"\n [attr.aria-labelledby]=\"titleId()\"\n [attr.data-type]=\"full() ? 'full' : bottomSheet() ? 'bottom-sheet' : null\"\n >\n <div class=\"modal-dialog\" [class]=\"sizeClass()\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h2 class=\"modal-title\" [id]=\"titleId()\">{{ heading() }}</h2>\n </div>\n <div class=\"modal-conts\" tabindex=\"-1\">\n <div class=\"conts-area\"><ng-content /></div>\n </div>\n <ng-content select=\"[krdsModalFooter]\" />\n <button type=\"button\" class=\"krds-btn medium icon btn-close close-modal\" (click)=\"open.set(false)\">\n <span class=\"sr-only\">닫기</span>\n <i class=\"svg-icon ico-popup-close\"></i>\n </button>\n </div>\n </div>\n <div class=\"modal-back\" [class.in]=\"backdrop()\" (click)=\"persistent() || open.set(false)\"></div>\n </section>\n }\n `\n})\nexport class KrdsModal {\n /** 열림 여부 */\n readonly open = model(false)\n /** 제목 (대화 상자의 이름) */\n readonly heading = input.required<string>()\n /** 대화 상자 id (없으면 자동 생성) */\n readonly modalId = input<string>()\n /** 배경을 어둡게 */\n readonly backdrop = input(true, { transform: booleanAttribute })\n /** 크기 */\n readonly size = input<KrdsModalSize>('medium')\n /** 화면 전체 */\n readonly full = input(false, { transform: booleanAttribute })\n /** 바텀시트 (모바일 아래에서 올라옴) */\n readonly bottomSheet = input(false, { transform: booleanAttribute })\n /** Esc·배경 클릭으로 닫지 않음 */\n readonly persistent = input(false, { transform: booleanAttribute })\n\n private readonly uid = nextId++\n protected readonly id = computed(() => this.modalId() ?? `krds-modal-${this.uid}`)\n protected readonly titleId = computed(() => `${this.id()}-title`)\n protected readonly sizeClass = computed(() => SIZE_CLASS[this.size()])\n\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement\n private readonly document = inject(DOCUMENT)\n private opened = false\n private originalOverflow = ''\n private previousFocus: HTMLElement | null = null\n\n constructor() {\n // 다른 요소의 쌓임 순서(z-index·transform)에 가리지 않게 body 끝으로 옮긴다 (Vue의 Teleport)\n afterNextRender(() => this.document.body.appendChild(this.host))\n inject(DestroyRef).onDestroy(() => {\n if (this.opened) this.restore()\n this.host.remove()\n })\n // 열림이 바뀐 뒤 그려진 화면 기준으로 초점·스크롤을 맞춘다 (브라우저에서만 실행)\n afterRenderEffect(() => {\n const open = this.open()\n if (open && !this.opened) {\n this.opened = true\n this.originalOverflow = this.document.body.style.overflow\n this.document.body.style.overflow = 'hidden'\n this.previousFocus = this.document.activeElement as HTMLElement | null\n this.host.querySelector<HTMLElement>('.modal-conts')?.focus()\n } else if (!open && this.opened) {\n this.restore()\n }\n })\n }\n\n private restore() {\n this.opened = false\n this.document.body.style.overflow = this.originalOverflow\n this.previousFocus?.focus()\n this.previousFocus = null\n }\n\n protected onKeydown(event: KeyboardEvent) {\n if (!this.open()) return\n if (event.key === 'Escape' && !this.persistent()) {\n this.open.set(false)\n return\n }\n if (event.key !== 'Tab') return\n const dialog = this.host.querySelector<HTMLElement>('.krds-modal')!\n const focusable = [...dialog.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(el => !el.hasAttribute('disabled'))\n if (!focusable.length) return event.preventDefault()\n const active = this.document.activeElement as HTMLElement | null\n const index = active ? focusable.indexOf(active) : -1\n // 처음 초점을 받는 .modal-conts(목록에 없음)에서 Shift+Tab, 모달 밖으로 나간 초점도 모달 안으로 돌린다\n const wrap = event.shiftKey ? index <= 0 : index === focusable.length - 1 || !dialog.contains(active)\n if (wrap) {\n event.preventDefault()\n ;(event.shiftKey ? focusable[focusable.length - 1] : focusable[0]).focus()\n }\n }\n}\n","import { Component, computed, input, model, numberAttribute } from '@angular/core'\n\ntype PageItem = { type: 'page'; page: number } | { type: 'ellipsis'; key: string }\n\n/**\n * KRDS 페이지네이션. 현재 페이지는 `[(page)]`로 주고받는다. 처음·끝 페이지는 늘 보이고, 나머지는 현재 페이지 주변 pageRange개만 보이며 그 밖은 생략(…)으로 줄인다.\n * 링크를 눌러도 주소는 바뀌지 않는다 (기본 동작을 막고 page만 바꿈).\n * 첫·끝 페이지의 이전·다음은 비활성 링크(href 없이 aria-disabled)로 남겨, 화면낭독기가 \"이전, 링크, 사용 불가\"로 읽는다\n *\n * @example <nav krdsPagination [max]=\"20\" [(page)]=\"page\"></nav>\n */\n@Component({\n selector: 'nav[krdsPagination]',\n host: {\n class: 'krds-pagination',\n '[attr.aria-label]': 'label()'\n },\n template: `\n @if (current() <= minPage()) {\n <a class=\"page-navi prev disabled\" role=\"link\" aria-disabled=\"true\">이전</a>\n } @else {\n <a href=\"#\" class=\"page-navi prev\" (click)=\"go($event, current() - 1)\">이전</a>\n }\n <div class=\"page-links\">\n @for (item of pages(); track item.type === 'page' ? item.page : item.key) {\n @if (item.type === 'page') {\n <a\n href=\"#\"\n class=\"page-link\"\n [class.active]=\"item.page === current()\"\n [attr.aria-current]=\"item.page === current() ? 'page' : null\"\n (click)=\"go($event, item.page)\"\n >\n @if (item.page === current()) {\n <span class=\"sr-only\">현재페이지</span>\n }\n {{ item.page }}\n </a>\n } @else {\n <span class=\"page-link link-dot\"></span>\n }\n }\n </div>\n @if (current() >= max()) {\n <a class=\"page-navi next disabled\" role=\"link\" aria-disabled=\"true\">다음</a>\n } @else {\n <a href=\"#\" class=\"page-navi next\" (click)=\"go($event, current() + 1)\">다음</a>\n }\n `\n})\nexport class KrdsPagination {\n /** 현재 페이지 */\n readonly page = model(1)\n /** 첫 페이지 */\n readonly min = input(1, { transform: numberAttribute })\n /** 마지막 페이지 */\n readonly max = input.required({ transform: numberAttribute })\n /** 가운데에 보일 페이지 수 */\n readonly pageRange = input(8, { transform: numberAttribute })\n /** 내비게이션 이름 */\n readonly label = input('페이지 내비게이션')\n\n protected readonly minPage = computed(() => Math.max(1, this.min()))\n protected readonly current = computed(() => this.page() ?? this.minPage())\n\n protected readonly pages = computed<PageItem[]>(() => {\n const first = this.minPage()\n const last = this.max()\n const range = this.pageRange()\n const pageItems = (from: number, to: number) =>\n Array.from({ length: Math.max(to - from + 1, 0) }, (_, i): PageItem => ({ type: 'page', page: from + i }))\n // 처음·끝 페이지와 가운데 range개를 모두 보일 수 있으면 생략하지 않는다\n if (last - first + 1 <= range + 2) return pageItems(first, last)\n\n const rangeEnd = Math.min(last, Math.max(first, this.current() - Math.floor(range / 2)) + range - 1)\n const rangeStart = Math.max(first, rangeEnd - range + 1)\n return [\n ...pageItems(first, first),\n ...(rangeStart > first + 1 ? [{ type: 'ellipsis', key: 'left' } as const] : []),\n ...pageItems(Math.max(rangeStart, first + 1), Math.min(rangeEnd, last - 1)),\n ...(rangeEnd < last - 1 ? [{ type: 'ellipsis', key: 'right' } as const] : []),\n ...pageItems(last, last)\n ]\n })\n\n protected go(event: MouseEvent, page: number) {\n event.preventDefault()\n if (page !== this.current()) this.page.set(page)\n }\n}\n","import { Component, DOCUMENT, DestroyRef, ElementRef, afterNextRender, inject, input, model, signal, viewChild } from '@angular/core'\n\n/** 콘텐츠 내 탐색 위치에 쓰는 버튼 아래쪽 끝 값을 마지막으로 쓴 패널 */\nlet buttonBottomOwner: symbol | null = null\n\n/**\n * KRDS 도움 패널. 도움말 버튼으로 오른쪽 패널을 열고, 접어두기로 닫는다 (`[(open)]`).\n * 원본처럼 보이는 공식 배너·헤더 높이만큼 버튼과 패널 내용을 내려 헤더에 가려지지 않게 하고,\n * 같은 오른쪽에 고정되는 콘텐츠 내 탐색이 버튼 아래에 서도록 버튼 아래쪽 끝을 CSS 변수로 알린다\n *\n * @example <krds-panel [(open)]=\"helpOpen\"><krds-tabs [tabs]=\"tabs\">...</krds-tabs></krds-panel>\n */\n@Component({\n selector: 'krds-panel',\n host: {\n class: 'inner help-panel-flexible',\n '[style.--krds-help-panel--header-offset]': \"headerOffset() + 'px'\"\n },\n template: `\n <button\n #expand\n type=\"button\"\n class=\"krds-btn small tertiary btn-help-panel expand btn-help-exec\"\n (transitionend)=\"updateOffset()\"\n (click)=\"open.set(true)\"\n >\n <i class=\"svg-icon ico-fold\"></i> 도움말\n </button>\n <div class=\"krds-help-panel\" [class.expand]=\"open()\">\n <div class=\"help-panel-wrap\">\n <div class=\"help-conts-area\">\n <ng-content />\n <button type=\"button\" class=\"krds-btn small tertiary btn-help-panel fold\" (click)=\"close()\">\n <span class=\"sr-only\">도움말</span> 접어두기 <i class=\"svg-icon ico-angle right\"></i>\n </button>\n </div>\n </div>\n </div>\n `\n})\nexport class KrdsPanel {\n /** 열림 */\n readonly open = model(false)\n /** 높이만큼 비켜 갈 공식 배너·헤더 */\n readonly headerTopSelector = input('#krds-masthead')\n readonly headerInnerSelector = input('#krds-header .header-in')\n\n protected readonly headerOffset = signal(0)\n private readonly expand = viewChild.required<ElementRef<HTMLButtonElement>>('expand')\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement\n private readonly document = inject(DOCUMENT)\n private readonly owner = Symbol('KrdsPanel')\n private frame = 0\n\n constructor() {\n const destroyRef = inject(DestroyRef)\n afterNextRender(() => {\n const update = () => this.updateOffset()\n update()\n window.addEventListener('scroll', update, { passive: true })\n window.addEventListener('resize', update)\n destroyRef.onDestroy(() => {\n cancelAnimationFrame(this.frame)\n window.removeEventListener('scroll', update)\n window.removeEventListener('resize', update)\n // 다른 패널이 쓴 값은 남겨 둔다\n if (buttonBottomOwner === this.owner) this.document.documentElement.style.removeProperty('--krds-help-panel--button-bottom')\n })\n })\n }\n\n /** 닫고, 패널 안에 있던 초점은 도움말 버튼으로 돌려준다 */\n protected close() {\n const focusInside = this.host.querySelector('.krds-help-panel')?.contains(this.document.activeElement)\n this.open.set(false)\n if (focusInside) this.expand().nativeElement.focus()\n }\n\n protected updateOffset() {\n cancelAnimationFrame(this.frame)\n // 레이아웃이 같은 스크롤 이벤트에서 붙이는 scroll-down 클래스를 반영한 뒤 잰다\n this.frame = requestAnimationFrame(() => {\n const masthead = this.document.querySelector<HTMLElement>(this.headerTopSelector())\n const header = this.document.querySelector<HTMLElement>(this.headerInnerSelector())\n const mastheadShown = !!masthead && masthead.getBoundingClientRect().bottom > 0\n const headerHidden = !!this.document.querySelector('.g-wrap.scroll-down')\n const offset = !header ? 0 : mastheadShown ? masthead.offsetHeight + header.offsetHeight : headerHidden ? 0 : header.offsetHeight\n this.headerOffset.set(offset)\n const button = this.expand().nativeElement\n const bottom = parseFloat(getComputedStyle(button).top) + offset + button.offsetHeight\n if (Number.isFinite(bottom)) {\n this.document.documentElement.style.setProperty('--krds-help-panel--button-bottom', `${bottom}px`)\n buttonBottomOwner = this.owner\n }\n })\n }\n}\n","import { Component, ElementRef, booleanAttribute, computed, input, model, numberAttribute, viewChild } from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\n\nlet nextId = 0\n\n/**\n * KRDS 수량 토글. 수량 값은 spinbutton(↑/↓ 1씩, Home/End 최솟값/최댓값)이고, −/+ 버튼은 탭 순서에서 빼고 누르면 초점을 수량 값으로 옮긴다\n * (끝값에서 버튼이 비활성화돼도 초점을 잃지 않고 화면낭독기가 바뀐 값을 읽음). 값은 `[(value)]`(Signal Forms `[formField]` 포함)\n *\n * @example <krds-quantity-toggle label=\"인원\" [min]=\"1\" [max]=\"9\" [(value)]=\"count\" />\n */\n@Component({\n selector: 'krds-quantity-toggle',\n host: {\n class: 'krds-quantity-toggle',\n '[class.vertical]': 'vertical()',\n '[class.disabled]': 'disabled()'\n },\n template: `\n <span [id]=\"labelId\" [class]=\"hideLabel() ? 'sr-only' : 'quantity-label'\">{{ label() }}</span>\n <div class=\"quantity-control\">\n <!-- 세로형은 + 버튼이 위 (KRDS 가이드 모범 사례). 읽는 순서도 화면과 같게 DOM 순서를 뒤집는다 -->\n @if (vertical()) {\n <ng-container *ngTemplateOutlet=\"button; context: { $implicit: 1 }\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"button; context: { $implicit: -1 }\" />\n }\n <span\n #spin\n class=\"quantity-value\"\n role=\"spinbutton\"\n [attr.id]=\"id()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [attr.aria-labelledby]=\"labelId\"\n [attr.aria-valuenow]=\"current()\"\n [attr.aria-valuemin]=\"min()\"\n [attr.aria-valuemax]=\"max()\"\n [attr.aria-disabled]=\"disabled() || null\"\n (keydown)=\"onKeydown($event)\"\n >\n {{ current() }}\n </span>\n @if (vertical()) {\n <ng-container *ngTemplateOutlet=\"button; context: { $implicit: -1 }\" />\n } @else {\n <ng-container *ngTemplateOutlet=\"button; context: { $implicit: 1 }\" />\n }\n </div>\n\n <ng-template #button let-delta>\n <button\n type=\"button\"\n class=\"krds-btn tertiary small btn-quantity\"\n tabindex=\"-1\"\n [disabled]=\"disabled() || (delta < 0 ? current() <= min() : current() >= max())\"\n (click)=\"stepBy(delta)\"\n >\n <i class=\"svg-icon\" [class]=\"delta < 0 ? 'ico-minus' : 'ico-plus'\" aria-hidden=\"true\"></i>\n <span class=\"sr-only\">{{ label() }} {{ delta < 0 ? '감소' : '증가' }}</span>\n </button>\n </ng-template>\n `,\n imports: [NgTemplateOutlet]\n})\nexport class KrdsQuantityToggle {\n /** 수량 (없으면 min) */\n readonly value = model<number>()\n /** 레이블 */\n readonly label = input.required<string>()\n /** 레이블을 화면에서 숨김 (화면낭독기는 읽음) */\n readonly hideLabel = input(false, { transform: booleanAttribute })\n readonly min = input(0, { transform: numberAttribute })\n readonly max = input(10, { transform: numberAttribute })\n /** 세로형 (+ 버튼이 위) */\n readonly vertical = input(false, { transform: booleanAttribute })\n readonly disabled = input(false, { transform: booleanAttribute })\n /** 수량 값 요소의 id */\n readonly id = input<string>()\n\n protected readonly labelId = `krds-quantity-label-${nextId++}`\n protected readonly current = computed(() => this.value() ?? this.min())\n private readonly spin = viewChild.required<ElementRef<HTMLElement>>('spin')\n\n private update(next: number) {\n const value = Math.min(this.max(), Math.max(this.min(), next))\n if (this.disabled() || value === this.current()) return\n this.value.set(value)\n }\n\n protected stepBy(delta: number) {\n this.update(this.current() + delta)\n this.spin().nativeElement.focus()\n }\n\n protected onKeydown(event: KeyboardEvent) {\n const next = { ArrowUp: this.current() + 1, ArrowDown: this.current() - 1, Home: this.min(), End: this.max() }[event.key]\n if (next === undefined) return\n event.preventDefault()\n this.update(next)\n }\n}\n","import { Component, booleanAttribute, computed, input, model, numberAttribute, output } from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\n\n/** 선택 값을 보일 자리: handle은 손잡이 위, end는 슬라이더 끝 */\nexport type KrdsRangeSliderValuePosition = 'handle' | 'end'\n\n/** 눈금을 그리는 최대 단계 수 (이보다 많으면 눈금 없음) */\nconst MAX_TICKS = 20\n\nlet nextId = 0\n\n/**\n * KRDS 범위슬라이드. 기본 `<input type=\"range\">`(키보드·화면낭독기 지원)를 KRDS 모양으로 그리고 값은 `[(value)]`로 주고받는다.\n * Signal Forms의 `[formField]`로도 연결된다. 화면의 값 글자는 valueText로 바꿀 수 있고 화면낭독기는 aria-valuetext로 같은 글을 읽는다\n *\n * @example <krds-range-slider label=\"글자 크기\" [min]=\"12\" [max]=\"24\" [step]=\"2\" [valueText]=\"px\" [(value)]=\"size\" />\n */\n@Component({\n selector: 'krds-range-slider',\n host: {\n '[class]': \"'krds-range-slider value-' + valuePosition()\",\n '[style.--krds-range-slider--percent]': 'percent()'\n },\n template: `\n <label [for]=\"inputId()\" [class]=\"hideLabel() ? 'sr-only' : 'range-label'\">{{ label() }}</label>\n @if (valuePosition() === 'end') {\n <div class=\"range-body\">\n <ng-container *ngTemplateOutlet=\"field\" />\n <span class=\"range-value\" aria-hidden=\"true\">{{ text(current()) }}</span>\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"field\" />\n }\n\n <ng-template #field>\n <div class=\"range-field\">\n <div class=\"range-track\">\n <span class=\"range-fill\"></span>\n @for (tick of ticks(); track $index) {\n <span class=\"range-tick\" [style.--krds-range-slider--tick]=\"tick\"></span>\n }\n </div>\n @if (valuePosition() === 'handle') {\n <span class=\"range-value\" aria-hidden=\"true\">{{ text(current()) }}</span>\n }\n <input\n class=\"range-input\"\n type=\"range\"\n [id]=\"inputId()\"\n [min]=\"min()\"\n [max]=\"max()\"\n [step]=\"step()\"\n [value]=\"current()\"\n [attr.aria-valuetext]=\"valueText() ? text(current()) : null\"\n (input)=\"value.set(read($event))\"\n (change)=\"valueCommit.emit(read($event))\"\n />\n <div class=\"range-limits\" aria-hidden=\"true\">\n <span>{{ text(min()) }}</span>\n <span>{{ text(max()) }}</span>\n </div>\n </div>\n </ng-template>\n `,\n imports: [NgTemplateOutlet]\n})\nexport class KrdsRangeSlider {\n /** 값 (없으면 min) */\n readonly value = model<number>()\n /** 레이블 */\n readonly label = input.required<string>()\n /** 레이블을 화면에서 숨김 (화면낭독기는 읽음) */\n readonly hideLabel = input(false, { transform: booleanAttribute })\n readonly min = input(0, { transform: numberAttribute })\n readonly max = input(100, { transform: numberAttribute })\n readonly step = input(1, { transform: numberAttribute })\n /** 값을 글자로 (예: v => v + 'px') */\n readonly valueText = input<(value: number) => string>()\n /** 선택 값을 보일 자리 */\n readonly valuePosition = input<KrdsRangeSliderValuePosition>('handle')\n /** input의 id (없으면 자동 생성) */\n readonly id = input<string>()\n\n /** 값을 확정했을 때 (손을 뗄 때, change는 안쪽 input의 기본 이벤트와 겹쳐 쓰지 않음) */\n readonly valueCommit = output<number>()\n\n private readonly uid = `krds-range-slider-${nextId++}`\n protected readonly inputId = computed(() => this.id() ?? this.uid)\n protected readonly current = computed(() => this.value() ?? this.min())\n protected readonly percent = computed(() => (this.max() > this.min() ? (this.current() - this.min()) / (this.max() - this.min()) : 0))\n /** 양 끝을 뺀 단계 눈금 위치 (0~1) */\n protected readonly ticks = computed(() => {\n const count = Math.round((this.max() - this.min()) / this.step())\n return count > 1 && count <= MAX_TICKS ? Array.from({ length: count - 1 }, (_, i) => (i + 1) / count) : []\n })\n\n protected text(value: number) {\n return this.valueText()?.(value) ?? String(value)\n }\n\n protected read(event: Event) {\n return Number((event.target as HTMLInputElement).value)\n }\n}\n","import { Component, DOCUMENT, afterRenderEffect, inject, model, output } from '@angular/core'\nimport { KrdsDropdown } from '../dropdown/dropdown'\n\n/** 화면 크기 단계 */\nexport type KrdsResizeScale = 'sm' | 'md' | 'lg' | 'xlg' | 'xxlg'\n\nconst SCALES: { key: KrdsResizeScale; label: string; zoom: string }[] = [\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/**\n * KRDS 화면 크기 조정. 목록에서 크기를 고르면 화면(body)을 확대·축소하고 `[(scale)]`를 바꾼 뒤 닫고 버튼으로 초점을 돌려준다\n *\n * @example <krds-resize [(scale)]=\"scale\" />\n */\n@Component({\n selector: 'krds-resize',\n hostDirectives: [KrdsDropdown],\n host: { class: 'krds-resize', 'data-adjust': 'scale' },\n template: `\n <button type=\"button\" class=\"krds-btn small text drop-btn\">화면크기 <i class=\"svg-icon ico-toggle\" aria-hidden=\"true\"></i></button>\n <div class=\"drop-menu\">\n <div class=\"drop-in\">\n <ul class=\"drop-list\">\n @for (item of scales; track item.key) {\n <li>\n <button\n type=\"button\"\n class=\"item-link\"\n [class]=\"item.key\"\n [class.active]=\"item.key === (scale() ?? 'md')\"\n [attr.data-adjust-scale]=\"item.key\"\n [attr.aria-pressed]=\"item.key === (scale() ?? 'md')\"\n (click)=\"select(item.key)\"\n >\n {{ item.label }}\n </button>\n </li>\n }\n </ul>\n <div class=\"drop-bottom\">\n <button type=\"button\" class=\"krds-btn medium text\" data-adjust-scale=\"md\" (click)=\"select('md')\">\n <i class=\"svg-icon ico-reset\" aria-hidden=\"true\"></i> 초기화\n </button>\n </div>\n </div>\n </div>\n `\n})\nexport class KrdsResize {\n /** 화면 크기 (넘기거나 고르기 전에는 화면을 바꾸지 않고 '보통'으로 표시) */\n readonly scale = model<KrdsResizeScale>()\n\n /** 크기를 골라 목록을 닫았을 때 */\n readonly closed = output<void>()\n\n protected readonly scales = SCALES\n private readonly dropdown = inject(KrdsDropdown)\n private readonly document = inject(DOCUMENT)\n\n constructor() {\n // 고른 크기를 화면에 적용한다 (바깥에서 바꾼 값 포함, 브라우저에서만)\n afterRenderEffect(() => {\n const zoom = SCALES.find(item => item.key === this.scale())?.zoom\n if (zoom) this.document.body.style.zoom = zoom\n })\n }\n\n protected select(key: KrdsResizeScale) {\n this.scale.set(key)\n this.dropdown.close(true)\n this.closed.emit()\n }\n}\n","import { Directive, booleanAttribute, computed, input } from '@angular/core'\nimport { KrdsControl } from '../control/control'\n\n/** 셀렉트 크기 (KRDS 셀렉트 스타일에 있는 small·medium·large) */\nexport type KrdsSelectSize = 'small' | 'medium' | 'large'\n\n/** 셀렉트 입력 상태 */\nexport type KrdsSelectState = 'default' | 'error' | 'success' | 'information'\n\n/**\n * KRDS 셀렉트. 기본 `<select>`에 KRDS 클래스만 붙이므로 option·선택 값·disabled는 기본 요소 그대로 쓴다.\n * 선택 전 안내 문구는 `<option value=\"\" disabled>선택</option>`으로 넣고, 이름은 label(보이는 레이블이 없으면 aria-label)로 준다.\n * `krdsControl`을 함께 적용하므로 폼 그룹 안에서는 label·도움말이 자동으로 연결된다\n *\n * @example\n * <krds-form-group label=\"지역\">\n * <select krdsSelect [(ngModel)]=\"region\">\n * <option value=\"\" disabled>선택</option>\n * <option value=\"seoul\">서울</option>\n * </select>\n * </krds-form-group>\n */\n@Directive({\n selector: 'select[krdsSelect]',\n hostDirectives: [{ directive: KrdsControl, inputs: ['id'] }],\n host: {\n '[class]': 'classes()'\n }\n})\nexport class KrdsSelect {\n /** 크기 */\n readonly size = input<KrdsSelectSize>('medium')\n /** 입력 상태 */\n readonly state = input<KrdsSelectState>('default')\n /** 정렬 스타일 (목록 정렬 기준 선택용) */\n readonly sort = input(false, { transform: booleanAttribute })\n\n protected readonly classes = computed(() =>\n [this.sort() ? 'krds-form-select-sort' : 'krds-form-select', this.size(), this.state() !== 'default' && `is-${this.state()}`]\n .filter(Boolean)\n .join(' ')\n )\n}\n","import { Component, input, model, output } from '@angular/core'\n\n/** 사이드 메뉴 4단계(팝업 안) 항목 */\nexport interface KrdsSideNavPopupItem {\n text: string\n href?: string\n}\n\n/** 사이드 메뉴 3단계 항목 (subItems가 있으면 팝업을 여는 버튼) */\nexport interface KrdsSideNavSubItem {\n text: string\n href?: string\n /** 팝업 열림 */\n expanded?: boolean\n /** 팝업 제목 (기본: text) */\n popupTitle?: string\n subItems?: KrdsSideNavPopupItem[]\n}\n\n/** 사이드 메뉴 2단계 항목 (subItems가 있으면 펼침 버튼) */\nexport interface KrdsSideNavItem {\n text: string\n href?: string\n /** 펼침 */\n expanded?: boolean\n subItems?: KrdsSideNavSubItem[]\n}\n\n/** 사이드 메뉴 링크 클릭 이벤트 (라우터로 이동하려면 event.preventDefault()) */\nexport interface KrdsSideNavClick {\n item: KrdsSideNavItem | KrdsSideNavSubItem | KrdsSideNavPopupItem\n event: MouseEvent\n}\n\nlet nextId = 0\n\n/**\n * KRDS 사이드 메뉴. 펼침 상태는 항목의 expanded로 `[(items)]`에 담아 주고받는다.\n * 2단계를 접으면 그 안의 팝업도 닫힌다. 3단계 팝업은 열면 제목 버튼으로 초점을 옮기고, 제목 버튼으로 닫으면 연 버튼으로 초점을 돌려주며, 초점이 밖으로 나가면 닫는다\n *\n * @example <nav krdsSideNavigation heading=\"민원 안내\" [(items)]=\"menu\"></nav>\n */\n@Component({\n selector: 'nav[krdsSideNavigation]',\n host: {\n class: 'krds-side-navigation',\n '(document:click)': 'onDocumentClick($event)'\n },\n template: `\n <h2 class=\"lnb-tit\">{{ heading() }}</h2>\n <ul class=\"lnb-list\" role=\"menubar\">\n @for (item of items(); track $index; let i = $index) {\n <li class=\"lnb-item\" role=\"none\" [class.active]=\"item.expanded\">\n @if (item.subItems) {\n <button\n type=\"button\"\n class=\"lnb-btn lnb-toggle\"\n role=\"menuitem\"\n [class.active]=\"item.expanded\"\n [attr.aria-controls]=\"menuId(i)\"\n [attr.aria-expanded]=\"item.expanded ? 'true' : 'false'\"\n (click)=\"toggleItem(i)\"\n >\n {{ item.text }}\n </button>\n <div class=\"lnb-submenu\">\n <ul role=\"menu\" [id]=\"menuId(i)\">\n @for (sub of item.subItems; track $index; let j = $index) {\n <li class=\"lnb-subitem\" role=\"none\" [class.active]=\"sub.expanded\" [attr.data-lnb]=\"i + '-' + j\">\n @if (sub.subItems) {\n <button\n #trigger\n type=\"button\"\n class=\"lnb-btn lnb-toggle-popup\"\n role=\"menuitem\"\n aria-haspopup=\"true\"\n [attr.aria-controls]=\"menuId(i, j)\"\n [attr.aria-expanded]=\"sub.expanded ? 'true' : 'false'\"\n (click)=\"togglePopup(i, j, popup, title)\"\n >\n {{ sub.text }}\n </button>\n <!-- KRDS 원본은 이 div가 role=\"menu\"라 제목 버튼·ul이 메뉴 안에 섞인다.\n div는 바깥 메뉴 안에 둘 수 있는 group으로, 메뉴는 ul로 옮겨 항목이 메뉴에 바로 속하게 한다 -->\n <div\n #popup\n class=\"lnb-submenu-lv2\"\n role=\"group\"\n [attr.aria-label]=\"sub.popupTitle || sub.text\"\n [class.active]=\"sub.expanded\"\n (focusout)=\"onPopupFocusout($event, i, j, popup)\"\n >\n <button #title type=\"button\" class=\"lnb-btn-tit\" role=\"menuitem\" (click)=\"closePopup(i, j, trigger)\">\n {{ sub.popupTitle || sub.text }}\n </button>\n <ul role=\"menu\" [id]=\"menuId(i, j)\" [attr.aria-label]=\"sub.popupTitle || sub.text\">\n @for (link of sub.subItems; track $index) {\n <li role=\"none\">\n <a\n class=\"lnb-btn\"\n role=\"menuitem\"\n [href]=\"link.href || '#'\"\n (click)=\"itemClick.emit({ item: link, event: $event })\"\n >\n {{ link.text }}\n </a>\n </li>\n }\n </ul>\n </div>\n } @else {\n <a\n class=\"lnb-btn lnb-link\"\n role=\"menuitem\"\n [href]=\"sub.href || '#'\"\n (click)=\"itemClick.emit({ item: sub, event: $event })\"\n >\n {{ sub.text }}\n </a>\n }\n </li>\n }\n </ul>\n </div>\n } @else {\n <a class=\"lnb-btn lnb-link\" role=\"menuitem\" [href]=\"item.href || '#'\" (click)=\"itemClick.emit({ item, event: $event })\">\n {{ item.text }}\n </a>\n }\n </li>\n }\n </ul>\n `\n})\nexport class KrdsSideNavigation {\n /** 메뉴 제목 (title 속성은 기본 툴팁이 되므로 heading으로 받음) */\n readonly heading = input.required<string>()\n /** 메뉴 항목 (expanded로 펼침 상태) */\n readonly items = model<KrdsSideNavItem[]>([])\n\n /** 링크를 클릭했을 때 */\n readonly itemClick = output<KrdsSideNavClick>()\n\n private readonly uid = nextId++\n\n protected menuId(i: number, j?: number) {\n return j === undefined ? `krds-lnb-${this.uid}-${i}` : `krds-lnb-${this.uid}-${i}-${j}`\n }\n\n private updateSub(i: number, j: number, update: (sub: KrdsSideNavSubItem) => KrdsSideNavSubItem) {\n this.items.update(items =>\n items.map((item, index) =>\n index === i && item.subItems\n ? { ...item, subItems: item.subItems.map((sub, subIndex) => (subIndex === j ? update(sub) : sub)) }\n : item\n )\n )\n }\n\n /** 2단계 펼치고 접기 (접으면 그 안의 팝업도 닫음) */\n protected toggleItem(i: number) {\n this.items.update(items =>\n items.map((item, index) => {\n if (index !== i || !item.subItems) return item\n const expanded = !item.expanded\n return { ...item, expanded, subItems: expanded ? item.subItems : item.subItems.map(sub => ({ ...sub, expanded: false })) }\n })\n )\n }\n\n private isOpen(i: number, j: number) {\n return !!this.items()[i]?.subItems?.[j]?.expanded\n }\n\n /** 3단계 팝업 열고 닫기 (열면 전환이 끝난 뒤 제목 버튼으로 초점) */\n protected togglePopup(i: number, j: number, popup: HTMLElement, title: HTMLElement) {\n const opening = !this.isOpen(i, j)\n this.updateSub(i, j, sub => ({ ...sub, expanded: opening }))\n if (!opening) return\n // visibility 전환이 끝나야 초점을 받을 수 있다. 그 사이 닫혔으면 옮기지 않는다\n const focusTitle = () => this.isOpen(i, j) && title.focus()\n popup.addEventListener('transitionend', focusTitle, { once: true })\n // 전환이 없으면(transition: none 등) transitionend가 오지 않으므로 그린 뒤 바로\n requestAnimationFrame(() => !popup.getAnimations({ subtree: true }).length && focusTitle())\n }\n\n /** 제목 버튼으로 닫으면 연 버튼으로 초점을 돌려준다 */\n protected closePopup(i: number, j: number, trigger?: HTMLElement) {\n if (!this.isOpen(i, j)) return\n this.updateSub(i, j, sub => ({ ...sub, expanded: false }))\n trigger?.focus()\n }\n\n /**\n * 초점이 팝업 밖의 다른 요소로 옮겨 가면 닫고, 옮겨 간 초점은 그대로 둔다 (WAI-ARIA 메뉴 패턴).\n * 갈 곳 없이 빠진 초점(다른 창으로 전환 등)은 무시하고, 빈 곳 클릭은 문서 클릭으로 닫는다\n */\n protected onPopupFocusout(event: FocusEvent, i: number, j: number, popup: HTMLElement) {\n const next = event.relatedTarget as Node | null\n if (next && !popup.contains(next)) this.closePopup(i, j)\n }\n\n /** 팝업 밖을 누르면 누른 항목의 팝업만 남기고 닫는다 */\n protected onDocumentClick(event: MouseEvent) {\n const keep = (event.target as Element).closest?.('.lnb-subitem')?.getAttribute('data-lnb')\n const stale = (i: number, j: number, sub: KrdsSideNavSubItem) => sub.expanded && `${i}-${j}` !== keep\n if (!this.items().some((item, i) => item.subItems?.some((sub, j) => stale(i, j, sub)))) return\n this.items.update(items =>\n items.map((item, i) =>\n item.subItems ? { ...item, subItems: item.subItems.map((sub, j) => (stale(i, j, sub) ? { ...sub, expanded: false } : sub)) } : item\n )\n )\n }\n}\n","import { Directive, input } from '@angular/core'\n\n/**\n * KRDS 건너뛰기 링크 묶음. KRDS CSS가 id(#krds-skip-link)로 스타일을 주므로 id만 붙이고, 링크는 기본 `<a>`로 넣는다.\n * 페이지 맨 앞에 두고 href는 같은 페이지의 #id로 쓴다\n *\n * @example\n * <div krdsSkipLink>\n * <a href=\"#main-content\">본문 바로가기</a>\n * <a href=\"#main-menu\">주메뉴 바로가기</a>\n * </div>\n */\n@Directive({\n selector: '[krdsSkipLink]',\n host: { '[id]': 'id()' }\n})\nexport class KrdsSkipLink {\n /** id (KRDS CSS 기준 krds-skip-link) */\n readonly id = input('krds-skip-link')\n}\n","import {\n Component,\n DOCUMENT,\n ElementRef,\n Injectable,\n PLATFORM_ID,\n afterNextRender,\n afterRenderEffect,\n computed,\n inject,\n signal,\n untracked\n} from '@angular/core'\nimport { isPlatformBrowser } from '@angular/common'\n\n/** 스낵바 옵션 */\nexport interface KrdsSnackbarOptions {\n /** 제목 */\n title: string\n /** 본문 */\n message?: string\n /** 아이콘 클래스 (예: 'ico-success-fill') */\n icon?: string\n /** 작업 버튼 이름 (되돌리기·다시 시도 등 1개) */\n action?: string\n /** 작업 버튼을 눌렀을 때. 스낵바를 닫은 뒤 부르므로 안에서 다시 show()할 수 있다 */\n onAction?: () => void\n /** 노출 시간(ms). 기본 0으로 닫기 버튼을 누를 때까지 둔다 */\n duration?: number\n}\n\n/**\n * 어디서든 스낵바를 띄우는 서비스. 앱에 `<krds-snackbar />`를 한 번 두고 쓴다 (서버 렌더링에서는 띄우지 않음)\n *\n * @example this.snackbar.show({ title: '삭제 완료', message: '항목을 삭제했습니다.', action: '되돌리기', onAction: () => this.restore() })\n */\n@Injectable({ providedIn: 'root' })\nexport class KrdsSnackbarService {\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID))\n private readonly state = signal<{ id: number; options: KrdsSnackbarOptions } | null>(null)\n private seq = 0\n private timer?: ReturnType<typeof setTimeout>\n\n /** 지금 띄운 스낵바 (show()마다 id가 바뀜) */\n readonly current = this.state.asReadonly()\n\n /** 스낵바 표시 (이미 떠 있으면 내용을 바꾼다. 한 페이지에 하나만 둔다) */\n show(options: KrdsSnackbarOptions) {\n if (!this.browser) return\n const duration = options.duration ?? 0\n clearTimeout(this.timer)\n this.state.set({ id: ++this.seq, options })\n if (duration > 0 && duration < 2 ** 31) this.timer = setTimeout(() => this.hide(), duration)\n }\n\n /** 스낵바 닫기 */\n hide() {\n clearTimeout(this.timer)\n this.state.set(null)\n }\n}\n\n/**\n * KRDS 스낵바 영역. role=\"status\" 영역은 늘 두고 KrdsSnackbarService로 띄운 내용을 넣는다.\n * 버튼으로 닫으면 초점을 스낵바로 들어오기 전 요소로 돌려준다\n *\n * @example <krds-snackbar />\n */\n@Component({\n selector: 'krds-snackbar',\n host: {\n class: 'krds-snackbar',\n role: 'status',\n '[class.active]': 'shown()',\n '(focusin)': 'onFocusin($event)'\n },\n template: `\n @if (shown() && service.current(); as snackbar) {\n <div class=\"snackbar-in\">\n @if (snackbar.options.icon) {\n <i class=\"svg-icon snackbar-icon\" [class]=\"snackbar.options.icon\" aria-hidden=\"true\"></i>\n }\n <!-- show()마다 바뀌는 id로 새로 그려 같은 내용도 다시 읽는다 -->\n @for (body of [snackbar]; track body.id) {\n <div class=\"snackbar-body\">\n <strong class=\"snackbar-title\">{{ body.options.title }}</strong>\n @if (body.options.message) {\n <p class=\"snackbar-text\">{{ body.options.message }}</p>\n }\n </div>\n }\n @if (snackbar.options.action) {\n <!-- 가이드의 텍스트 버튼: KRDS 버튼의 link 스타일 -->\n <button type=\"button\" class=\"krds-btn medium link snackbar-action\" (click)=\"act(snackbar.options)\">\n {{ snackbar.options.action }}\n </button>\n }\n <button type=\"button\" class=\"krds-btn small icon snackbar-close\" (click)=\"service.hide()\">\n <span class=\"sr-only\">닫기</span>\n <i class=\"svg-icon ico-popup-close\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n `\n})\nexport class KrdsSnackbar {\n protected readonly service = inject(KrdsSnackbarService)\n private readonly ready = signal(false)\n protected readonly shown = computed(() => this.ready() && !!this.service.current())\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement\n private readonly document = inject(DOCUMENT)\n private returnFocus: HTMLElement | null = null\n private hadFocus = false\n\n constructor() {\n afterNextRender(() => setTimeout(() => this.ready.set(true)))\n // 닫히면서 초점이 있던 버튼이 사라지면 body로 빠지므로, 스낵바로 들어오기 전 요소로 초점을 돌려준다\n afterRenderEffect(() => {\n const shown = this.shown()\n untracked(() => {\n if (shown) return\n if (this.hadFocus) this.returnFocus?.focus()\n this.hadFocus = false\n })\n })\n }\n\n protected onFocusin(event: FocusEvent) {\n const from = event.relatedTarget as HTMLElement | null\n if (!this.host.contains(from)) this.returnFocus = from\n this.hadFocus = true\n }\n\n /** 먼저 닫고 부른다: onAction 안에서 다시 show()한 스낵바(다시 시도 → 결과)가 남는다 */\n protected act(options: KrdsSnackbarOptions) {\n this.hadFocus = this.host.contains(this.document.activeElement)\n this.service.hide()\n options.onAction?.()\n }\n}\n","import { Component, Directive, computed, contentChildren, inject, input, numberAttribute } from '@angular/core'\n\n/** 단계 상태 */\nexport type KrdsStepStatus = 'done' | 'active' | 'pending'\n\n/**\n * 단계 표시기의 단계. 단계 제목은 내용으로 넣는다 (title 속성은 기본 툴팁이 되므로 쓰지 않음)\n */\n@Component({\n selector: 'li[krdsStep]',\n host: { '[class]': 'state()' },\n template: `\n <span>\n @if (state() === 'active') {\n <em class=\"sr-only\">현재단계</em>\n }\n <i class=\"step\">{{ step() }}</i>\n <span class=\"step-tit\"><ng-content /></span>\n </span>\n `\n})\nexport class KrdsStep {\n /** 단계 번호 (예: '1단계') */\n readonly step = input.required<string | number>()\n /** 상태를 직접 정함 (지정하지 않으면 단계 표시기 안의 순서로 정함) */\n readonly status = input<KrdsStepStatus | ''>()\n\n private readonly indicator = inject(KrdsStepIndicator, { optional: true })\n\n protected readonly state = computed(() => this.status() || this.indicator?.statusOf(this) || 'pending')\n}\n\n/**\n * KRDS 단계 표시기. 진행 상태를 보여 주기만 한다 (KRDS 원본처럼 단계를 눌러 이동하지 않음).\n * 안에 든 `<li krdsStep>`의 실제 순서로 현재 단계 앞은 완료, 뒤는 대기로 표시하므로 단계를 @if·@for로 바꿔도 맞게 표시된다\n *\n * @example\n * <ol krdsStepIndicator [current]=\"1\">\n * <li krdsStep step=\"1단계\">약관 동의</li>\n * <li krdsStep step=\"2단계\">정보 입력</li>\n * </ol>\n */\n@Directive({\n selector: 'ol[krdsStepIndicator]',\n host: { class: 'krds-step-wrap' }\n})\nexport class KrdsStepIndicator {\n /** 현재 단계 위치 (0부터, 숫자가 아니면 첫 단계) */\n readonly current = input(0, { transform: (value: unknown) => numberAttribute(value, 0) })\n\n private readonly steps = contentChildren(KrdsStep)\n\n /** 단계의 위치에 따른 상태 */\n statusOf(step: KrdsStep): KrdsStepStatus {\n const index = this.steps().indexOf(step)\n const current = this.current()\n // 아직 쿼리에 잡히지 않은 단계(-1)는 대기로 둔다\n return index < 0 || index > current ? 'pending' : index < current ? 'done' : 'active'\n }\n}\n","import { Component, Directive, booleanAttribute, input } from '@angular/core'\n\n/**\n * KRDS 구조화 목록. 항목(`<li krdsStructuredItem>`) 안에 KRDS 영역 클래스(card-top·card-body·card-btm·card-btn)로 내용을 나눈다\n *\n * @example\n * <ul krdsStructuredList>\n * <li krdsStructuredItem>\n * <div class=\"card-top\"><span krdsBadge>접수중</span></div>\n * <div class=\"card-body\"><p class=\"c-tit\">청년 주거 지원</p></div>\n * <div class=\"card-btn\"><a krdsLink href=\"/apply\">신청하기</a></div>\n * </li>\n * </ul>\n */\n@Directive({\n selector: 'ul[krdsStructuredList]',\n host: {\n class: 'krds-structured-list',\n '[class.type-full]': 'full()'\n }\n})\nexport class KrdsStructuredList {\n /** 한 줄에 항목 하나 (전체 폭) */\n readonly full = input(true, { transform: booleanAttribute })\n}\n\n/** 구조화 목록의 항목 */\n@Component({\n selector: 'li[krdsStructuredItem]',\n host: { class: 'structured-item' },\n template: '<div class=\"in\"><ng-content /></div>'\n})\nexport class KrdsStructuredItem {}\n","import { Component, input, output } from '@angular/core'\n\n/** 탭바 항목 */\nexport interface KrdsTabBarItem {\n text: string\n /** 아이콘 클래스 (예: 'ico-bread-home') */\n icon: string\n /** 링크 주소 (없으면 버튼) */\n href?: string\n /** 현재 페이지 (aria-current) */\n selected?: boolean\n}\n\n/** 탭바 항목 클릭 이벤트 */\nexport interface KrdsTabBarClick {\n item: KrdsTabBarItem\n event: MouseEvent\n}\n\n/**\n * KRDS 탭바. 좁은 화면 아래쪽에 고정되는 주요 메뉴 내비게이션 (넓은 화면에서는 KRDS CSS가 숨김).\n * 현재 페이지는 aria-current=\"page\", href 없는 항목은 버튼이다\n *\n * @example <nav krdsTabBar [items]=\"[{ text: '홈', icon: 'ico-bread-home', href: '/', selected: true }]\"></nav>\n */\n@Component({\n selector: 'nav[krdsTabBar]',\n host: {\n class: 'krds-tab-bar',\n '[attr.aria-label]': 'label()'\n },\n template: `\n <ul>\n @for (item of items(); track $index) {\n <li>\n @if (item.href) {\n <a\n class=\"tab-bar-item\"\n [class.active]=\"item.selected\"\n [href]=\"item.href\"\n [attr.aria-current]=\"item.selected ? 'page' : null\"\n (click)=\"itemClick.emit({ item, event: $event })\"\n >\n <i class=\"svg-icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i><span class=\"tab-bar-label\">{{ item.text }}</span>\n </a>\n } @else {\n <button\n type=\"button\"\n class=\"tab-bar-item\"\n [class.active]=\"item.selected\"\n [attr.aria-current]=\"item.selected ? 'page' : null\"\n (click)=\"itemClick.emit({ item, event: $event })\"\n >\n <i class=\"svg-icon\" [class]=\"item.icon\" aria-hidden=\"true\"></i><span class=\"tab-bar-label\">{{ item.text }}</span>\n </button>\n }\n </li>\n }\n </ul>\n `\n})\nexport class KrdsTabBar {\n /** 항목 */\n readonly items = input.required<KrdsTabBarItem[]>()\n /** 내비게이션 이름 */\n readonly label = input('하단 메뉴')\n\n /** 항목을 눌렀을 때 */\n readonly itemClick = output<KrdsTabBarClick>()\n}\n","import {\n Component,\n Directive,\n TemplateRef,\n booleanAttribute,\n computed,\n contentChild,\n contentChildren,\n inject,\n input,\n output\n} from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\n\n/** 표의 열 */\nexport interface KrdsTableColumn<T = object> {\n /** 열 이름 (셀·머리글 템플릿을 고를 때 씀) */\n name: string\n /** 머리글 */\n label: string\n /** 셀 값: 행의 속성 이름 또는 행에서 값을 만드는 함수 */\n field?: (keyof T & string) | ((row: T) => unknown)\n /** 정렬 */\n align?: 'left' | 'center' | 'right'\n /** 셀 스타일 */\n style?: string | ((row: T) => string)\n /** 셀 클래스 */\n classes?: string | ((row: T) => string)\n /** 머리글 스타일 (width가 있으면 colgroup 너비로도 씀) */\n headerStyle?: string\n /** 머리글 클래스 */\n headerClasses?: string\n}\n\n/** 셀 템플릿 컨텍스트 */\nexport interface KrdsTableCellContext<T = object> {\n $implicit: T\n row: T\n column: KrdsTableColumn<T>\n value: unknown\n index: number\n}\n\n/** 행 클릭 이벤트 */\nexport interface KrdsTableRowClick<T = object> {\n row: T\n index: number\n}\n\n/**\n * 열 이름별 셀 템플릿 (`<ng-template krdsCell=\"status\" let-row let-value=\"value\">`).\n * `[krdsCellOf]=\"rows\"`를 주면 템플릿의 row가 행 타입이 된다 (strictTemplates에서 row.title 같은 접근을 검사)\n */\n@Directive({ selector: 'ng-template[krdsCell]' })\nexport class KrdsTableCell<T extends object = object> {\n readonly name = input.required<string>({ alias: 'krdsCell' })\n /** 행 목록 (템플릿의 row 타입을 정하는 데만 씀) */\n readonly rows = input<readonly T[]>(undefined, { alias: 'krdsCellOf' })\n readonly template = inject<TemplateRef<KrdsTableCellContext<T>>>(TemplateRef)\n\n static ngTemplateContextGuard<T extends object>(_dir: KrdsTableCell<T>, _ctx: unknown): _ctx is KrdsTableCellContext<T> {\n return true\n }\n}\n\n/** 머리글 템플릿 컨텍스트 */\nexport interface KrdsTableHeaderContext {\n $implicit: KrdsTableColumn\n}\n\n/** 열 이름별 머리글 템플릿 (`<ng-template krdsHeader=\"status\" let-column>`) */\n@Directive({ selector: 'ng-template[krdsHeader]' })\nexport class KrdsTableHeader {\n readonly name = input.required<string>({ alias: 'krdsHeader' })\n readonly template = inject<TemplateRef<KrdsTableHeaderContext>>(TemplateRef)\n\n static ngTemplateContextGuard(_dir: KrdsTableHeader, _ctx: unknown): _ctx is KrdsTableHeaderContext {\n return true\n }\n}\n\n/** 행이 없을 때 보여 줄 내용 (`<ng-template krdsNoData>`) */\n@Directive({ selector: 'ng-template[krdsNoData]' })\nexport class KrdsTableNoData {\n readonly template = inject(TemplateRef)\n}\n\nconst CONTROLS = 'a, button, input, select, textarea, label'\n\n/**\n * KRDS 표. 열(`columns`)과 행(`rows`)으로 그리고, 첫 열은 행 머리글(th scope=\"row\")이 된다.\n * 셀·머리글·빈 목록은 `<ng-template krdsCell=\"열 이름\">` 등으로 바꿔 넣는다.\n * `clickable`이면 행을 클릭·Enter·Space로 고를 수 있다 (셀 안의 버튼·링크 클릭은 행 선택으로 보지 않음)\n *\n * @example\n * <krds-table caption=\"신청 내역\" tableClass=\"col data\" [columns]=\"columns\" [rows]=\"rows\" clickable (rowClick)=\"open($event.row)\">\n * <ng-template krdsCell=\"status\" let-value=\"value\"><span krdsBadge>{{ value }}</span></ng-template>\n * </krds-table>\n */\n@Component({\n selector: 'krds-table',\n imports: [NgTemplateOutlet],\n host: { class: 'krds-table-wrap' },\n template: `\n <table class=\"tbl\" [class]=\"tableClass()\">\n @if (caption()) {\n <caption>\n {{\n caption()\n }}\n </caption>\n }\n @if (colWidths(); as widths) {\n <colgroup>\n @for (width of widths; track $index) {\n <col [style.width]=\"width\" />\n }\n </colgroup>\n }\n <thead>\n <tr>\n @for (column of columns(); track column.name) {\n <th scope=\"col\" [class]=\"headerClass(column)\" [style]=\"column.headerStyle ?? null\">\n @if (headerOf(column.name); as template) {\n <ng-container [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ $implicit: column }\" />\n } @else {\n {{ column.label }}\n }\n </th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of rows(); track $index; let index = $index) {\n <tr\n [attr.tabindex]=\"clickable() ? 0 : null\"\n (click)=\"onRowClick($event, row, index)\"\n (keydown)=\"onRowKeydown($event, row, index)\"\n >\n @for (column of columns(); track column.name; let first = $first) {\n @if (first) {\n <th scope=\"row\" [class]=\"cellClass(row, column)\" [style]=\"cellStyle(row, column)\">\n <ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ row, column, index }\" />\n </th>\n } @else {\n <td [class]=\"cellClass(row, column)\" [style]=\"cellStyle(row, column)\">\n <ng-container [ngTemplateOutlet]=\"cell\" [ngTemplateOutletContext]=\"{ row, column, index }\" />\n </td>\n }\n }\n </tr>\n } @empty {\n <tr>\n <td class=\"text-center\" [attr.colspan]=\"columns().length || 1\">\n @if (noData(); as empty) {\n <ng-container [ngTemplateOutlet]=\"empty.template\" />\n } @else {\n 데이터가 없습니다.\n }\n </td>\n </tr>\n }\n </tbody>\n </table>\n\n <ng-template #cell let-row=\"row\" let-column=\"column\" let-index=\"index\">\n @if (cellOf(column.name); as template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: row, row, column, value: valueOf(row, column), index }\"\n />\n } @else {\n {{ valueOf(row, column) }}\n }\n </ng-template>\n `\n})\nexport class KrdsTable<T extends object> {\n /** 표 제목 (caption) */\n readonly caption = input<string>()\n /** 열 */\n readonly columns = input.required<KrdsTableColumn<T>[]>()\n /** 행 */\n readonly rows = input.required<T[]>()\n /** table 요소에 더 붙일 KRDS 클래스 (예: 'col data') */\n readonly tableClass = input<string>()\n /** 행을 클릭·Enter·Space로 고를 수 있게 함 */\n readonly clickable = input(false, { transform: booleanAttribute })\n\n /** 행을 골랐을 때 (clickable일 때) */\n readonly rowClick = output<KrdsTableRowClick<T>>()\n\n private readonly cells = contentChildren(KrdsTableCell)\n private readonly headers = contentChildren(KrdsTableHeader)\n protected readonly noData = contentChild(KrdsTableNoData)\n\n /** 머리글 스타일의 width를 colgroup 너비로 (하나도 없으면 colgroup 없음) */\n protected readonly colWidths = computed(() => {\n const widths = this.columns().map(column => column.headerStyle?.match(/width\\s*:\\s*([^;]+)/i)?.[1].trim() ?? null)\n return widths.some(Boolean) ? widths : null\n })\n\n protected cellOf(name: string) {\n return this.cells().find(cell => cell.name() === name)?.template ?? null\n }\n\n protected headerOf(name: string) {\n return this.headers().find(header => header.name() === name)?.template ?? null\n }\n\n protected valueOf(row: T, column: KrdsTableColumn<T>) {\n const { field } = column\n return typeof field === 'function' ? field(row) : field === undefined ? undefined : row[field]\n }\n\n protected headerClass(column: KrdsTableColumn<T>) {\n return [column.align && `text-${column.align}`, column.headerClasses].filter(Boolean).join(' ')\n }\n\n protected cellClass(row: T, column: KrdsTableColumn<T>) {\n const classes = typeof column.classes === 'function' ? column.classes(row) : column.classes\n return [column.align && `text-${column.align}`, classes].filter(Boolean).join(' ')\n }\n\n protected cellStyle(row: T, column: KrdsTableColumn<T>) {\n return (typeof column.style === 'function' ? column.style(row) : column.style) ?? null\n }\n\n protected onRowClick(event: MouseEvent, row: T, index: number) {\n if (!this.clickable()) return\n // 셀 안 컨트롤(체크박스·버튼 등) 클릭은 행 선택으로 보지 않는다\n const control = (event.target as Element).closest(CONTROLS)\n if (control && (event.currentTarget as Element).contains(control)) return\n this.rowClick.emit({ row, index })\n }\n\n protected onRowKeydown(event: KeyboardEvent, row: T, index: number) {\n if (!this.clickable() || event.target !== event.currentTarget || (event.key !== 'Enter' && event.key !== ' ')) return\n // Space의 페이지 스크롤 방지\n event.preventDefault()\n this.rowClick.emit({ row, index })\n }\n}\n","import { Component, Directive, TemplateRef, booleanAttribute, computed, contentChildren, inject, input, model } from '@angular/core'\nimport { NgTemplateOutlet } from '@angular/common'\n\n/** 탭 */\nexport interface KrdsTabItem {\n /** 탭 id (패널의 krdsTabPanel과 같게) */\n id: string\n /** 탭 이름 */\n label: string\n /** 비활성화 */\n disabled?: boolean\n}\n\n/** 탭 스타일 */\nexport type KrdsTabsVariant = 'line' | 'fill'\n\n/** 탭 패널 내용 (`<ng-template krdsTabPanel=\"탭 id\">`) */\n@Directive({ selector: 'ng-template[krdsTabPanel]' })\nexport class KrdsTabPanel {\n /** 패널이 속한 탭 id */\n readonly id = input.required<string>({ alias: 'krdsTabPanel' })\n readonly template = inject(TemplateRef)\n}\n\nlet nextId = 0\n\n/**\n * KRDS 탭. 탭 목록은 `tabs`로, 패널 내용은 탭 id별 `<ng-template krdsTabPanel>`으로 넣는다.\n * 선택한 탭 id는 `[(selected)]`로 주고받고(없으면 첫 활성 탭), 방향키(←·→)로 탭 사이 초점을 옮긴다.\n * 방향키는 비활성 탭을 건너뛰고 끝에서 처음으로 돌아가며, Home·End는 첫·마지막 탭으로 간다 (WAI-ARIA 탭 패턴)\n *\n * @example\n * <krds-tabs [tabs]=\"[{ id: 'notice', label: '공지' }, { id: 'faq', label: '자주 묻는 질문' }]\" [(selected)]=\"tab\">\n * <ng-template krdsTabPanel=\"notice\">공지 목록</ng-template>\n * <ng-template krdsTabPanel=\"faq\">질문 목록</ng-template>\n * </krds-tabs>\n */\n@Component({\n selector: 'krds-tabs',\n imports: [NgTemplateOutlet],\n host: { class: 'krds-tab-area layer' },\n template: `\n <div class=\"tab\" [class]=\"variant()\" [class.full]=\"full()\">\n <ul role=\"tablist\">\n @for (tab of tabs(); track tab.id) {\n <!-- KRDS 원본은 li에 role=\"tab\"을 두지만, 초점을 받는 button에 두어야 탭 안에 버튼이 겹치지 않는다 (WAI-ARIA 탭 패턴) -->\n <li role=\"presentation\" [class.active]=\"tab.id === active()\">\n <button\n type=\"button\"\n class=\"btn-tab\"\n role=\"tab\"\n [id]=\"tabId(tab.id)\"\n [attr.aria-selected]=\"tab.id === active()\"\n [attr.aria-controls]=\"panelId(tab.id)\"\n [disabled]=\"tab.disabled\"\n (click)=\"select(tab)\"\n (keydown)=\"onKeydown($event)\"\n >\n {{ tab.label }}\n @if (tab.id === active()) {\n <i class=\"sr-only\"> {{ selectedText() }}</i>\n }\n </button>\n </li>\n }\n </ul>\n </div>\n <div class=\"tab-conts-wrap\">\n @for (tab of tabs(); track tab.id) {\n <section\n class=\"tab-conts\"\n role=\"tabpanel\"\n [class.active]=\"tab.id === active()\"\n [id]=\"panelId(tab.id)\"\n [attr.aria-labelledby]=\"tabId(tab.id)\"\n >\n <ng-container [ngTemplateOutlet]=\"panelOf(tab.id)\" />\n </section>\n }\n </div>\n `\n})\nexport class KrdsTabs {\n /** 탭 목록 */\n readonly tabs = input.required<KrdsTabItem[]>()\n /** 선택한 탭 id */\n readonly selected = model<string>()\n /** 스타일 */\n readonly variant = input<KrdsTabsVariant>('line')\n /** 탭을 전체 폭으로 나눔 */\n readonly full = input(false, { transform: booleanAttribute })\n /** 선택한 탭을 화면낭독기에 알리는 문구 */\n readonly selectedText = input('선택됨')\n\n private readonly uid = nextId++\n private readonly panels = contentChildren(KrdsTabPanel)\n\n protected readonly active = computed(() => this.selected() ?? this.tabs().find(tab => !tab.disabled)?.id)\n\n protected tabId(id: string) {\n return `krds-tab-${this.uid}-${id}`\n }\n\n protected panelId(id: string) {\n return `krds-tab-panel-${this.uid}-${id}`\n }\n\n protected panelOf(id: string) {\n return this.panels().find(panel => panel.id() === id)?.template ?? null\n }\n\n protected select(tab: KrdsTabItem) {\n if (!tab.disabled && tab.id !== this.active()) this.selected.set(tab.id)\n }\n\n protected onKeydown(event: KeyboardEvent) {\n const tab = event.currentTarget as HTMLButtonElement\n const tabs = [...tab.closest('[role=\"tablist\"]')!.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]:not(:disabled)')]\n const index = tabs.indexOf(tab)\n const next = { ArrowRight: index + 1, ArrowLeft: index - 1, Home: 0, End: tabs.length - 1 }[event.key]\n if (next === undefined) return\n event.preventDefault()\n tabs[(next + tabs.length) % tabs.length].focus()\n }\n}\n","import { Component, Directive, ElementRef, inject, input, output } from '@angular/core'\n\n/** 태그 묶음 크기 */\nexport type KrdsTagGroupSize = 'small' | 'medium' | 'large'\n\nlet nextId = 0\n\n/**\n * KRDS 태그. `<krds-tag>`는 삭제 버튼이 있는 태그, `<a krdsTag>`는 링크 태그다.\n * 삭제 버튼 이름은 \"태그 내용 삭제\"로 읽혀 어느 태그를 지우는지 알 수 있다. 태그 크기와 색은 감싸는 `[krdsTagGroup]`이 정한다\n *\n * @example\n * <div krdsTagGroup>\n * <krds-tag (remove)=\"remove(tag)\">{{ tag }}</krds-tag>\n * <a krdsTag href=\"/search?q=정책\">#정책</a>\n * </div>\n */\n@Component({\n selector: 'krds-tag, a[krdsTag]',\n host: {\n class: 'krds-btn-tag',\n '[class.link]': 'isLink'\n },\n template: `\n <!-- ng-content는 한 곳에만 투영되므로 분기 밖에 둔다 -->\n <span [id]=\"labelId\"><ng-content /></span>\n @if (!isLink) {\n <button type=\"button\" class=\"btn-delete\" [attr.aria-labelledby]=\"labelId + ' ' + labelId + '-delete'\" (click)=\"remove.emit($event)\">\n <span class=\"sr-only\" [id]=\"labelId + '-delete'\">삭제</span>\n </button>\n }\n `\n})\nexport class KrdsTag {\n /** 삭제 버튼을 클릭했을 때 */\n readonly remove = output<MouseEvent>()\n\n protected readonly isLink = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement.tagName === 'A'\n protected readonly labelId = `krds-tag-${nextId++}`\n}\n\n/**\n * 태그 묶음. 안에 든 태그의 크기와 색을 정한다\n */\n@Directive({\n selector: '[krdsTagGroup]',\n host: {\n '[class]': \"'krds-tag-wrap ' + size()\"\n }\n})\nexport class KrdsTagGroup {\n /** 태그 크기 */\n readonly size = input<KrdsTagGroupSize>('medium')\n}\n","import { Directive, input } from '@angular/core'\n\n/** 텍스트 목록 스타일 */\nexport type KrdsTextListVariant = 'decimal' | 'dash' | 'hollow' | 'ordered'\n\n/**\n * KRDS 텍스트 목록. 기본 `<ul>`·`<ol>`에 KRDS 클래스만 붙인다\n *\n * @example <ol krdsTextList variant=\"decimal\"><li>신청서를 작성합니다.</li></ol>\n */\n@Directive({\n selector: 'ul[krdsTextList], ol[krdsTextList]',\n host: { '[class]': \"'krds-info-list ' + variant()\" }\n})\nexport class KrdsTextList {\n /** 스타일 */\n readonly variant = input<KrdsTextListVariant>('dash')\n}\n","import { Component, input } from '@angular/core'\n\n/**\n * KRDS 텍스트 영역의 글자 수 표시. 안에 `<textarea krdsInput>`을 넣고 현재 글자 수를 `count`로 넘긴다.\n * 글자 수 표시가 없으면 이 묶음 없이 `<textarea krdsInput>`만 쓴다\n *\n * @example\n * <krds-form-group label=\"문의 내용\">\n * <krds-textarea [count]=\"content.length\" [max]=\"500\">\n * <textarea krdsInput [(ngModel)]=\"content\" maxlength=\"500\"></textarea>\n * </krds-textarea>\n * </krds-form-group>\n */\n@Component({\n selector: 'krds-textarea',\n host: { class: 'textarea-wrap' },\n template: `\n <ng-content />\n @if (count() !== undefined) {\n <p class=\"textarea-count\">\n <span class=\"count-now\">{{ count() }}</span>\n <span class=\"count-total\">{{ max() ? '/' + max() : '' }}</span>\n </p>\n }\n `\n})\nexport class KrdsTextarea {\n /** 현재 글자 수 (지정하면 글자 수 표시) */\n readonly count = input<number>()\n /** 최대 글자 수 */\n readonly max = input<number>()\n}\n","import { Component, Injectable, PLATFORM_ID, afterNextRender, computed, inject, signal } from '@angular/core'\nimport { isPlatformBrowser } from '@angular/common'\n\n/** 토스트 유형 (기본 노출 시간을 정함) */\nexport type KrdsToastType = 'info' | 'warning'\n\n/** 토스트 옵션 */\nexport interface KrdsToastOptions {\n /** 유형 (info 3초, warning 4초) */\n type?: KrdsToastType\n /** 노출 시간(ms). 0이면 자동으로 닫지 않는다 */\n duration?: number\n}\n\n/** 유형별 기본 노출 시간(ms). KRDS 가이드: 정보형 2~3초, 주의·경고형 3~4초 */\nconst DEFAULT_DURATION: Record<KrdsToastType, number> = { info: 3000, warning: 4000 }\n\n/**\n * 어디서든 토스트를 띄우는 서비스. 앱에 `<krds-toast />`를 한 번 두고 쓴다 (서버 렌더링에서는 띄우지 않음)\n *\n * @example\n * private readonly toast = inject(KrdsToastService)\n * save() { this.toast.info('저장되었습니다.') }\n */\n@Injectable({ providedIn: 'root' })\nexport class KrdsToastService {\n private readonly browser = isPlatformBrowser(inject(PLATFORM_ID))\n private readonly state = signal<{ id: number; message: string } | null>(null)\n private seq = 0\n private timer?: ReturnType<typeof setTimeout>\n\n /** 지금 띄운 토스트 (show()마다 id가 바뀜) */\n readonly current = this.state.asReadonly()\n\n /** 토스트 표시 (떠 있으면 메시지를 바꾸고 노출 시간을 다시 센다) */\n show(message: string, options: KrdsToastOptions = {}) {\n if (!this.browser) return\n const duration = options.duration ?? DEFAULT_DURATION[options.type ?? 'info']\n clearTimeout(this.timer)\n this.state.set({ id: ++this.seq, message })\n // 2^31ms 이상(Infinity 포함)은 setTimeout이 바로 실행하므로 닫지 않음으로 본다\n if (duration > 0 && duration < 2 ** 31) this.timer = setTimeout(() => this.hide(), duration)\n }\n\n /** 정보형 토스트 (3초): 인증·저장·업로드 완료 등 */\n info(message: string, duration?: number) {\n this.show(message, { type: 'info', duration })\n }\n\n /** 주의·경고형 토스트 (4초): 인증·저장·업로드 실패 등 */\n warning(message: string, duration?: number) {\n this.show(message, { type: 'warning', duration })\n }\n\n /** 토스트 닫기 */\n hide() {\n clearTimeout(this.timer)\n this.state.set(null)\n }\n}\n\n/**\n * KRDS 토스트 영역. 화면낭독기가 읽는 role=\"status\" 영역은 늘 두고, KrdsToastService로 띄운 메시지를 넣는다\n *\n * @example <krds-toast />\n */\n@Component({\n selector: 'krds-toast',\n host: {\n class: 'krds-toast',\n role: 'status',\n '[class.active]': 'shown()'\n },\n template: `\n <!-- show()마다 바뀌는 id로 새로 그려 같은 메시지도 다시 읽고 등장 효과도 다시 나온다 -->\n @for (toast of shown() ? [service.current()!] : []; track toast.id) {\n <p class=\"toast-text\">{{ toast.message }}</p>\n }\n `\n})\nexport class KrdsToast {\n protected readonly service = inject(KrdsToastService)\n // 빈 영역을 먼저 문서에 넣고 다음 task부터 내용을 넣는다 (처음 그리기 전에 띄운 메시지도 화면낭독기가 읽게)\n private readonly ready = signal(false)\n protected readonly shown = computed(() => this.ready() && !!this.service.current())\n\n constructor() {\n afterNextRender(() => setTimeout(() => this.ready.set(true)))\n }\n}\n","import { Component, contentChild, input } from '@angular/core'\nimport { KrdsControl } from '../control/control'\n\n/** 토글 스위치 크기 */\nexport type KrdsToggleSwitchSize = 'medium' | 'large'\n\n/**\n * KRDS 토글 스위치. 안에 넣은 `<input type=\"checkbox\" krdsControl>` 뒤에 스위치 모양 label을 붙여 연결한다.\n * 켜짐 상태·disabled는 기본 input에 그대로 쓴다 (`[(ngModel)]`, `formControlName` 포함)\n *\n * @example <krds-toggle-switch><input type=\"checkbox\" krdsControl [(ngModel)]=\"alarm\" />알림</krds-toggle-switch>\n */\n@Component({\n selector: 'krds-toggle-switch',\n host: {\n '[class]': \"'krds-form-toggle-switch ' + size()\"\n },\n template: `\n <ng-content select=\"[krdsControl]\" />\n <label [for]=\"control().id()\">\n <span class=\"switch-toggle\"><i></i></span>\n <ng-content />\n </label>\n `\n})\nexport class KrdsToggleSwitch {\n /** 크기 */\n readonly size = input<KrdsToggleSwitchSize>('medium')\n\n protected readonly control = contentChild.required(KrdsControl)\n}\n","import {\n Component,\n ElementRef,\n afterNextRender,\n booleanAttribute,\n computed,\n inject,\n input,\n signal,\n viewChild,\n Injector\n} from '@angular/core'\n\n/** 툴팁 버튼 형태: default는 작은 텍스트 버튼, icon은 아이콘 버튼, button은 일반 버튼 */\nexport type KrdsTooltipType = 'default' | 'icon' | 'button'\n\nlet nextId = 0\n\n/**\n * KRDS 툴팁. 버튼에 마우스를 올리거나 초점을 주면 설명을 보여 주고, 떠나거나 Esc·스크롤·화면 크기 변경이면 숨긴다.\n * 버튼 이름은 버튼 글자와 설명을 합친 것(aria-labelledby)이라 아이콘 버튼도 설명으로 이름을 얻는다\n *\n * @example <krds-tooltip content=\"신청 후 3일 안에 처리됩니다\">처리 기간 <i class=\"svg-icon ico-angle right\"></i></krds-tooltip>\n */\n@Component({\n selector: 'krds-tooltip',\n host: {\n '(document:keydown.escape)': 'hide()',\n '(window:scroll)': 'hide()',\n '(window:resize)': 'hide()'\n },\n template: `\n <button\n #button\n type=\"button\"\n [class]=\"buttonClass()\"\n [disabled]=\"disabled()\"\n [attr.aria-labelledby]=\"popoverId\"\n (mouseover)=\"show()\"\n (mouseout)=\"hide()\"\n (focusin)=\"show()\"\n (focusout)=\"hide()\"\n >\n <ng-content />\n </button>\n <div\n #popover\n class=\"krds-tooltip-popover\"\n role=\"tooltip\"\n [id]=\"popoverId\"\n [class]=\"popoverClass()\"\n [style]=\"popoverStyle()\"\n [attr.aria-hidden]=\"!visible()\"\n >\n <span class=\"sr-only\">{{ buttonText() }}</span> {{ content() }}\n </div>\n `\n})\nexport class KrdsTooltip {\n /** 설명 */\n readonly content = input.required<string>()\n /** 버튼 형태 */\n readonly type = input<KrdsTooltipType>('default')\n /** 위아래로 펼침 */\n readonly vertical = input(false, { transform: booleanAttribute })\n /** 상자형 */\n readonly box = input(false, { transform: booleanAttribute })\n /** 비활성화 */\n readonly disabled = input(false, { transform: booleanAttribute })\n\n protected readonly popoverId = `krds-tooltip-${nextId++}`\n protected readonly visible = signal(false)\n protected readonly buttonText = signal('')\n private readonly position = signal<{ style: Record<string, string>; classes: string[] }>({ style: {}, classes: [] })\n private readonly button = viewChild.required<ElementRef<HTMLButtonElement>>('button')\n private readonly popover = viewChild.required<ElementRef<HTMLElement>>('popover')\n private readonly injector = inject(Injector)\n\n protected readonly buttonClass = computed(() => {\n const type = this.type()\n return [\n 'krds-btn krds-tooltip',\n type === 'default' ? 'small text' : type === 'icon' ? 'icon' : '',\n !this.box() && this.vertical() && 'tooltip-vertical',\n this.box() && !this.vertical() && 'tooltip-box'\n ]\n .filter(Boolean)\n .join(' ')\n })\n\n protected readonly popoverClass = computed(() =>\n [\n 'krds-tooltip-popover',\n ...this.position().classes,\n this.box() && 'tooltip-box',\n this.vertical() && 'tooltip-vertical',\n this.visible() && 'active'\n ]\n .filter(Boolean)\n .join(' ')\n )\n\n protected readonly popoverStyle = computed(() => ({ ...this.position().style, display: this.visible() ? null : 'none' }))\n\n constructor() {\n // 설명 앞에 버튼 글자를 붙여 버튼 이름이 '글자 + 설명'이 되게 한다\n afterNextRender(() => this.buttonText.set(this.button().nativeElement.textContent?.trim() ?? ''))\n }\n\n protected show() {\n if (this.disabled() || !this.content()) return\n this.visible.set(true)\n afterNextRender(() => this.updatePosition(), { injector: this.injector })\n }\n\n protected hide() {\n if (!this.visible()) return\n this.visible.set(false)\n this.position.set({ style: {}, classes: [] })\n }\n\n /** 버튼 위치와 화면 가운데를 기준으로 위·아래·좌·우를 정한다 (모바일·상자형·세로형은 위아래) */\n private updatePosition() {\n const gap = 12\n const { clientHeight: height, clientWidth: width } = this.popover().nativeElement\n const { top, left, right, height: itemHeight, width: itemWidth } = this.button().nativeElement.getBoundingClientRect()\n const halfWidth = window.innerWidth / 2\n const classes: string[] = []\n let tooltipTop: number\n let tooltipLeft: number\n if (window.innerWidth <= 768 || this.box() || this.vertical()) {\n if (top + itemHeight > window.innerHeight / 2) {\n tooltipTop = top - height - gap\n classes.push('top')\n } else {\n tooltipTop = top + itemHeight + gap\n classes.push('bottom')\n }\n if (left + itemWidth > halfWidth) {\n tooltipLeft = right - width\n if (window.innerWidth - (left + itemWidth) > width / 2) tooltipLeft = left + (itemWidth - width) / 2\n else classes.push('right')\n } else {\n tooltipLeft = left + (itemWidth - width) / 2\n if (tooltipLeft < 0) {\n tooltipLeft = left\n classes.push('left')\n }\n }\n } else {\n tooltipTop = top + (itemHeight - height) / 2\n if (left + itemWidth > halfWidth) {\n tooltipLeft = left - width - gap\n classes.push('right')\n } else {\n tooltipLeft = right + gap\n }\n }\n const small = window.innerWidth <= 420\n this.position.set({\n style: { top: `${tooltipTop}px`, left: small ? '50%' : `${tooltipLeft}px`, transform: small ? 'translateX(-50%)' : 'none' },\n classes\n })\n }\n}\n","import { Component, DestroyRef, booleanAttribute, computed, inject, input, output, signal } from '@angular/core'\n\n/** 음성 지원 버튼 크기 */\nexport type KrdsTtsSize = 'xsmall' | 'small' | 'medium'\n\n/** 음성 지원 아이콘 */\nexport type KrdsTtsIcon = 'volume' | 'play'\n\n/**\n * KRDS 음성 지원. 기본 `<button>`에 붙여, 누르면 text를 한국어 음성으로 읽고(SpeechSynthesis) 다시 누르면 멈춘다.\n * label이 없으면 aria-label로 이름을 준다\n *\n * @example <button krdsTts text=\"신청 방법을 안내합니다.\" label=\"듣기\"></button>\n */\n@Component({\n selector: 'button[krdsTts]',\n host: {\n type: 'button',\n '[class]': 'classes()',\n '[disabled]': 'disabled()',\n '(click)': 'toggle()'\n },\n template: `\n <span class=\"krds-tts-icon\" aria-hidden=\"true\"><i class=\"svg-icon\" [class]=\"icon()\"></i></span>\n @if (label()) {\n <span class=\"krds-tts-text\">{{ label() }}</span>\n }\n `\n})\nexport class KrdsTts {\n /** 읽을 글 */\n readonly text = input.required<string>()\n /** 화면에 보이는 버튼 글자 */\n readonly label = input<string>()\n /** 크기 */\n readonly size = input<KrdsTtsSize>('medium')\n /** 아이콘 */\n readonly iconType = input<KrdsTtsIcon>('volume', { alias: 'icon' })\n /** 비활성화 (기본 disabled도 그대로 쓸 수 있음) */\n readonly disabled = input(false, { transform: booleanAttribute })\n\n /** 읽기 시작했을 때 */\n readonly play = output<string>()\n /** 눌러서 멈췄을 때 */\n readonly pause = output<void>()\n /** 끝까지 읽었을 때 */\n readonly end = output<void>()\n /** 읽지 못했을 때 (SpeechSynthesis 미지원 포함) */\n readonly error = output<Error>()\n\n protected readonly playing = signal(false)\n\n protected readonly classes = computed(() =>\n ['krds-tts', this.size(), this.playing() ? 'pause' : this.iconType() === 'play' && 'play'].filter(Boolean).join(' ')\n )\n protected readonly icon = computed(() => (this.playing() ? 'ico-stop' : this.iconType() === 'play' ? 'ico-play' : 'ico-volume'))\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.stop())\n }\n\n private stop() {\n if (typeof window !== 'undefined') window.speechSynthesis?.cancel()\n this.playing.set(false)\n }\n\n protected toggle() {\n if (this.disabled()) return\n if (this.playing()) {\n this.stop()\n this.pause.emit()\n return\n }\n const synth = typeof window === 'undefined' ? undefined : window.speechSynthesis\n if (!synth) {\n this.error.emit(new Error('SpeechSynthesis API is not supported'))\n return\n }\n synth.cancel()\n const utterance = new SpeechSynthesisUtterance(this.text())\n utterance.lang = 'ko-KR'\n utterance.onstart = () => this.playing.set(true)\n utterance.onend = () => {\n this.playing.set(false)\n this.end.emit()\n }\n utterance.onerror = event => {\n this.playing.set(false)\n if (event.error !== 'canceled' && event.error !== 'interrupted') this.error.emit(new Error(event.error))\n }\n synth.speak(utterance)\n this.play.emit(this.text())\n }\n}\n"],"mappings":"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"}