@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,3088 @@
1
+ import * as i0 from "@angular/core";
2
+ import { InjectionToken, Signal, TemplateRef } from "@angular/core";
3
+ /**
4
+ * KRDS 아코디언 묶음. 한 번에 한 항목만 펼치고, 펼친 항목의 value를 `[(open)]`으로 주고받는다
5
+ *
6
+ * @example
7
+ * <div krdsAccordion [(open)]="openItem">
8
+ * <krds-accordion-item value="fee" label="수수료가 있나요?">수수료는 없습니다.</krds-accordion-item>
9
+ * <krds-accordion-item value="time" label="처리 기간은?">3일 이내입니다.</krds-accordion-item>
10
+ * </div>
11
+ */
12
+ export declare class KrdsAccordion {
13
+ /** 펼친 항목의 value (없으면 모두 접힘) */
14
+ readonly open: import("@angular/core").ModelSignal<string | null>;
15
+ /** 라인 스타일 */
16
+ readonly typeLine: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
17
+ /** 항목 제목의 수준 (2~6). 페이지의 제목 구조에 맞춰, 바로 위 제목보다 한 단계 아래로 둔다 */
18
+ readonly headingLevel: import("@angular/core").InputSignalWithTransform<number, unknown>;
19
+ /** 펼친 항목을 다시 누르면 접고, 다른 항목을 누르면 그 항목만 펼친다 */
20
+ toggle(value: string): void;
21
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsAccordion, never>;
22
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsAccordion, "[krdsAccordion]", never, {
23
+ "open": {
24
+ "alias": "open";
25
+ "required": false;
26
+ "isSignal": true;
27
+ };
28
+ "typeLine": {
29
+ "alias": "typeLine";
30
+ "required": false;
31
+ "isSignal": true;
32
+ };
33
+ "headingLevel": {
34
+ "alias": "headingLevel";
35
+ "required": false;
36
+ "isSignal": true;
37
+ };
38
+ }, {
39
+ "open": "openChange";
40
+ }, never, never, true, never>;
41
+ }
42
+ /**
43
+ * 아코디언 항목. 제목은 label로, 풍부한 제목은 `[krdsAccordionLabel]` 요소로 넣는다
44
+ */
45
+ export declare class KrdsAccordionItem {
46
+ private readonly uid;
47
+ /** 항목 값 (없으면 자동 생성) */
48
+ readonly value: import("@angular/core").InputSignal<string>;
49
+ /** 제목 */
50
+ readonly label: import("@angular/core").InputSignal<string | undefined>;
51
+ protected readonly accordion: KrdsAccordion | null;
52
+ protected readonly headerId: string;
53
+ protected readonly collapseId: string;
54
+ protected readonly isOpen: import("@angular/core").Signal<boolean>;
55
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsAccordionItem, never>;
56
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsAccordionItem, "krds-accordion-item", never, {
57
+ "value": {
58
+ "alias": "value";
59
+ "required": false;
60
+ "isSignal": true;
61
+ };
62
+ "label": {
63
+ "alias": "label";
64
+ "required": false;
65
+ "isSignal": true;
66
+ };
67
+ }, {}, never, ["[krdsAccordionLabel]", "*"], true, never>;
68
+ }
69
+ /** 배지 형태 */
70
+ export type KrdsBadgeType = 'outline' | 'bg' | 'bg-light';
71
+ /** 배지 색 */
72
+ export type KrdsBadgeColor = 'primary' | 'secondary' | 'gray' | 'point' | 'danger' | 'warning' | 'success' | 'information' | 'disabled';
73
+ /** 배지 크기 */
74
+ export type KrdsBadgeSize = 'small' | 'medium' | 'large';
75
+ /**
76
+ * KRDS 배지. 기본 요소(보통 `<span>`)에 KRDS 클래스만 붙인다
77
+ *
78
+ * @example <span krdsBadge type="bg" color="danger" size="small">마감</span>
79
+ */
80
+ export declare class KrdsBadge {
81
+ /** 형태 */
82
+ readonly type: import("@angular/core").InputSignal<KrdsBadgeType>;
83
+ /** 색 */
84
+ readonly color: import("@angular/core").InputSignal<KrdsBadgeColor>;
85
+ /** 크기 */
86
+ readonly size: import("@angular/core").InputSignal<KrdsBadgeSize>;
87
+ /** 숫자 배지 */
88
+ readonly number: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
89
+ protected readonly classes: import("@angular/core").Signal<string>;
90
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsBadge, never>;
91
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsBadge, "[krdsBadge]", never, {
92
+ "type": {
93
+ "alias": "type";
94
+ "required": false;
95
+ "isSignal": true;
96
+ };
97
+ "color": {
98
+ "alias": "color";
99
+ "required": false;
100
+ "isSignal": true;
101
+ };
102
+ "size": {
103
+ "alias": "size";
104
+ "required": false;
105
+ "isSignal": true;
106
+ };
107
+ "number": {
108
+ "alias": "number";
109
+ "required": false;
110
+ "isSignal": true;
111
+ };
112
+ }, {}, never, never, true, never>;
113
+ }
114
+ /** 브레드크럼 항목 */
115
+ export interface KrdsBreadcrumbItem {
116
+ /** 문구 */
117
+ text: string;
118
+ /** 링크 주소 */
119
+ href?: string;
120
+ }
121
+ /** 브레드크럼 항목 클릭 이벤트 (라우터로 이동하려면 event.preventDefault()) */
122
+ export interface KrdsBreadcrumbClick {
123
+ item: KrdsBreadcrumbItem;
124
+ event: MouseEvent;
125
+ }
126
+ /**
127
+ * KRDS 브레드크럼. 마지막 항목이 현재 페이지(aria-current="page")이고, 첫 항목은 홈 아이콘으로 보인다
128
+ *
129
+ * @example <nav krdsBreadcrumb [items]="[{ text: '홈', href: '/' }, { text: '민원 안내', href: '/guide' }, { text: '전입 신고' }]"></nav>
130
+ */
131
+ export declare class KrdsBreadcrumb {
132
+ /** 항목 (마지막이 현재 페이지) */
133
+ readonly items: import("@angular/core").InputSignal<KrdsBreadcrumbItem[]>;
134
+ /** 내비게이션 이름 */
135
+ readonly label: import("@angular/core").InputSignal<string>;
136
+ /** 첫 항목을 홈 아이콘으로 */
137
+ readonly showHomeIcon: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
138
+ /** 항목을 클릭했을 때 */
139
+ readonly itemClick: import("@angular/core").OutputEmitterRef<KrdsBreadcrumbClick>;
140
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsBreadcrumb, never>;
141
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsBreadcrumb, "nav[krdsBreadcrumb]", never, {
142
+ "items": {
143
+ "alias": "items";
144
+ "required": true;
145
+ "isSignal": true;
146
+ };
147
+ "label": {
148
+ "alias": "label";
149
+ "required": false;
150
+ "isSignal": true;
151
+ };
152
+ "showHomeIcon": {
153
+ "alias": "showHomeIcon";
154
+ "required": false;
155
+ "isSignal": true;
156
+ };
157
+ }, {
158
+ "itemClick": "itemClick";
159
+ }, never, never, true, never>;
160
+ }
161
+ /** 버튼 크기 (KRDS 실제 규격) */
162
+ export type KrdsButtonSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
163
+ /** 버튼 변형 */
164
+ export type KrdsButtonVariant = 'primary' | 'secondary' | 'tertiary';
165
+ /**
166
+ * KRDS 버튼. 기본 `<button>`에 KRDS 클래스만 붙이므로 type·disabled·폼 제출·접근성은 기본 버튼 동작 그대로다
167
+ *
168
+ * @example <button krdsButton variant="secondary" size="large">확인</button>
169
+ */
170
+ export declare class KrdsButton {
171
+ /** 버튼 변형 */
172
+ readonly variant: import("@angular/core").InputSignal<KrdsButtonVariant>;
173
+ /** 버튼 크기 */
174
+ readonly size: import("@angular/core").InputSignal<KrdsButtonSize | undefined>;
175
+ /** 아이콘 전용 버튼 */
176
+ readonly icon: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
177
+ /** 테두리 스타일 (아이콘 버튼용) */
178
+ readonly border: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
179
+ /** Pure 버튼 여부 (가상클래스 상태 시 컬러 유지) */
180
+ readonly pure: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
181
+ /** 텍스트 버튼 스타일 */
182
+ readonly text: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
183
+ protected readonly classes: import("@angular/core").Signal<string>;
184
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsButton, never>;
185
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsButton, "button[krdsButton]", never, {
186
+ "variant": {
187
+ "alias": "variant";
188
+ "required": false;
189
+ "isSignal": true;
190
+ };
191
+ "size": {
192
+ "alias": "size";
193
+ "required": false;
194
+ "isSignal": true;
195
+ };
196
+ "icon": {
197
+ "alias": "icon";
198
+ "required": false;
199
+ "isSignal": true;
200
+ };
201
+ "border": {
202
+ "alias": "border";
203
+ "required": false;
204
+ "isSignal": true;
205
+ };
206
+ "pure": {
207
+ "alias": "pure";
208
+ "required": false;
209
+ "isSignal": true;
210
+ };
211
+ "text": {
212
+ "alias": "text";
213
+ "required": false;
214
+ "isSignal": true;
215
+ };
216
+ }, {}, never, never, true, never>;
217
+ }
218
+ /**
219
+ * 캐러셀 형태
220
+ * - `visual`: 비주얼 배너형 (이전/다음 버튼이 슬라이드 좌우에 겹침)
221
+ * - `banner`: 배너형 (인디케이터 안에 페이지네이션·재생 제어·내비게이션)
222
+ */
223
+ export type KrdsCarouselVariant = 'visual' | 'banner';
224
+ /** 페이지네이션 표시 방식 */
225
+ export type KrdsCarouselPagination = 'bullets' | 'fraction' | 'none';
226
+ /**
227
+ * 캐러셀의 슬라이드. 현재 슬라이드가 아니면 보조기기·초점에서 뺀다 (aria-hidden, inert)
228
+ */
229
+ export declare class KrdsSlide {
230
+ private readonly carousel;
231
+ protected readonly active: import("@angular/core").Signal<boolean>;
232
+ protected readonly position: import("@angular/core").Signal<string>;
233
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsSlide, never>;
234
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsSlide, "li[krdsSlide]", never, {}, {}, never, never, true, never>;
235
+ }
236
+ /**
237
+ * KRDS 캐러셀. 슬라이드는 `<li krdsSlide>`로 넣는다. 현재 위치는 `[(active)]`(0부터)로 주고받고,
238
+ * 자동 재생은 마우스를 올리거나 안에 초점이 있으면 멈춘다. 모션 최소화 설정이면 이동 효과를 없앤다
239
+ *
240
+ * @example
241
+ * <krds-carousel label="주요 서비스 안내" moreHref="/services">
242
+ * @for (item of banners; track item.id) {
243
+ * <li krdsSlide><div class="in">...</div></li>
244
+ * }
245
+ * </krds-carousel>
246
+ */
247
+ export declare class KrdsCarousel {
248
+ /** 형태 */
249
+ readonly variant: import("@angular/core").InputSignal<KrdsCarouselVariant>;
250
+ /** 현재 슬라이드 위치 (0부터) */
251
+ readonly active: import("@angular/core").ModelSignal<number>;
252
+ /** 처음·끝에서 이어서 순환 */
253
+ readonly loop: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
254
+ /** 자동 재생 (재생·멈춤 버튼 표시) */
255
+ readonly autoplay: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
256
+ /** 자동 재생 간격 (ms) */
257
+ readonly autoplayDelay: import("@angular/core").InputSignalWithTransform<number, unknown>;
258
+ /** 마우스를 올리면 자동 재생을 멈춤 */
259
+ readonly pauseOnHover: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
260
+ /** 이동 시간 (ms) */
261
+ readonly speed: import("@angular/core").InputSignalWithTransform<number, unknown>;
262
+ /** 슬라이드 간격 (px, 기본: 비주얼 0, 배너 16) */
263
+ readonly spaceBetween: import("@angular/core").InputSignal<number | undefined>;
264
+ /** 페이지네이션 (기본: 비주얼 bullets, 배너 fraction) */
265
+ readonly pagination: import("@angular/core").InputSignal<KrdsCarouselPagination | undefined>;
266
+ /** 이전/다음 버튼 */
267
+ readonly navigation: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
268
+ /** 더 보기 링크 주소 */
269
+ readonly moreHref: import("@angular/core").InputSignal<string | undefined>;
270
+ /** 캐러셀 이름 (aria-label) */
271
+ readonly label: import("@angular/core").InputSignal<string>;
272
+ readonly prevLabel: import("@angular/core").InputSignal<string>;
273
+ readonly nextLabel: import("@angular/core").InputSignal<string>;
274
+ readonly playLabel: import("@angular/core").InputSignal<string>;
275
+ readonly stopLabel: import("@angular/core").InputSignal<string>;
276
+ readonly moreLabel: import("@angular/core").InputSignal<string>;
277
+ /** 자동 재생을 시작했을 때 */
278
+ readonly play: import("@angular/core").OutputEmitterRef<void>;
279
+ /** 자동 재생을 멈췄을 때 */
280
+ readonly stop: import("@angular/core").OutputEmitterRef<void>;
281
+ protected readonly wrapperId: string;
282
+ protected readonly slides: import("@angular/core").Signal<readonly KrdsSlide[]>;
283
+ readonly total: import("@angular/core").Signal<number>;
284
+ /** 슬라이드 수에 맞춘 현재 위치 */
285
+ readonly current: import("@angular/core").Signal<number>;
286
+ protected readonly gap: import("@angular/core").Signal<number>;
287
+ protected readonly paginationType: import("@angular/core").Signal<KrdsCarouselPagination>;
288
+ protected readonly playing: import("@angular/core").WritableSignal<boolean>;
289
+ protected readonly hoverPaused: import("@angular/core").WritableSignal<boolean>;
290
+ protected readonly focusPaused: import("@angular/core").WritableSignal<boolean>;
291
+ protected readonly reducedMotion: import("@angular/core").WritableSignal<boolean>;
292
+ private readonly browser;
293
+ constructor();
294
+ /** 슬라이드의 위치 (없으면 -1) */
295
+ indexOf(slide: KrdsSlide): number;
296
+ protected goTo(index: number): void;
297
+ protected setPlaying(playing: boolean): void;
298
+ protected navDisabled(direction: 'prev' | 'next'): boolean;
299
+ protected overlayStyle(direction: 'prev' | 'next'): string;
300
+ protected onFocusout(event: FocusEvent): void;
301
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsCarousel, never>;
302
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsCarousel, "krds-carousel", never, {
303
+ "variant": {
304
+ "alias": "variant";
305
+ "required": false;
306
+ "isSignal": true;
307
+ };
308
+ "active": {
309
+ "alias": "active";
310
+ "required": false;
311
+ "isSignal": true;
312
+ };
313
+ "loop": {
314
+ "alias": "loop";
315
+ "required": false;
316
+ "isSignal": true;
317
+ };
318
+ "autoplay": {
319
+ "alias": "autoplay";
320
+ "required": false;
321
+ "isSignal": true;
322
+ };
323
+ "autoplayDelay": {
324
+ "alias": "autoplayDelay";
325
+ "required": false;
326
+ "isSignal": true;
327
+ };
328
+ "pauseOnHover": {
329
+ "alias": "pauseOnHover";
330
+ "required": false;
331
+ "isSignal": true;
332
+ };
333
+ "speed": {
334
+ "alias": "speed";
335
+ "required": false;
336
+ "isSignal": true;
337
+ };
338
+ "spaceBetween": {
339
+ "alias": "spaceBetween";
340
+ "required": false;
341
+ "isSignal": true;
342
+ };
343
+ "pagination": {
344
+ "alias": "pagination";
345
+ "required": false;
346
+ "isSignal": true;
347
+ };
348
+ "navigation": {
349
+ "alias": "navigation";
350
+ "required": false;
351
+ "isSignal": true;
352
+ };
353
+ "moreHref": {
354
+ "alias": "moreHref";
355
+ "required": false;
356
+ "isSignal": true;
357
+ };
358
+ "label": {
359
+ "alias": "label";
360
+ "required": false;
361
+ "isSignal": true;
362
+ };
363
+ "prevLabel": {
364
+ "alias": "prevLabel";
365
+ "required": false;
366
+ "isSignal": true;
367
+ };
368
+ "nextLabel": {
369
+ "alias": "nextLabel";
370
+ "required": false;
371
+ "isSignal": true;
372
+ };
373
+ "playLabel": {
374
+ "alias": "playLabel";
375
+ "required": false;
376
+ "isSignal": true;
377
+ };
378
+ "stopLabel": {
379
+ "alias": "stopLabel";
380
+ "required": false;
381
+ "isSignal": true;
382
+ };
383
+ "moreLabel": {
384
+ "alias": "moreLabel";
385
+ "required": false;
386
+ "isSignal": true;
387
+ };
388
+ }, {
389
+ "active": "activeChange";
390
+ "play": "play";
391
+ "stop": "stop";
392
+ }, ["slides"], ["*"], true, never>;
393
+ }
394
+ /** 안쪽 입력 요소에 도움말·오류 상태를 연결하는 부모 (폼 그룹) */
395
+ export interface KrdsField {
396
+ /** 도움말 요소 id (없으면 null) */
397
+ readonly describedBy: Signal<string | null>;
398
+ /** 오류 상태 여부 */
399
+ readonly invalid: Signal<boolean>;
400
+ }
401
+ export declare const KRDS_FIELD: InjectionToken<KrdsField>;
402
+ /**
403
+ * KRDS 폼 컴포넌트(체크박스·라디오·토글 스위치·폼 그룹 등)에 넣는 기본 입력 요소 표시.
404
+ * 감싸는 컴포넌트가 이 요소의 id로 label을 연결하고, 입력 요소 자체는 기본 동작(ngModel·폼 검증 포함) 그대로 쓴다.
405
+ * 폼 그룹 안에서는 도움말을 aria-describedby로, 오류 상태를 aria-invalid로 연결한다
406
+ *
407
+ * @example <krds-checkbox><input type="checkbox" krdsControl [(ngModel)]="agree" />동의합니다</krds-checkbox>
408
+ */
409
+ export declare class KrdsControl {
410
+ /** 요소 id (없으면 자동 생성) */
411
+ readonly id: import("@angular/core").InputSignal<string>;
412
+ protected readonly field: KrdsField | null;
413
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsControl, never>;
414
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsControl, "[krdsControl]", never, {
415
+ "id": {
416
+ "alias": "id";
417
+ "required": false;
418
+ "isSignal": true;
419
+ };
420
+ }, {}, never, never, true, never>;
421
+ }
422
+ /** 체크박스·라디오 버튼 크기 */
423
+ export type KrdsCheckboxSize = 'medium' | 'large';
424
+ /**
425
+ * KRDS 체크박스·라디오 버튼. 안에 넣은 `<input krdsControl>` 뒤에 label을 붙여 연결한다.
426
+ * 선택 상태·name·value·disabled는 기본 input에 그대로 쓴다 (`[(ngModel)]`, `formControlName` 포함)
427
+ *
428
+ * @example
429
+ * <krds-checkbox description="부가 설명">
430
+ * <input type="checkbox" krdsControl [(ngModel)]="agree" />
431
+ * 개인정보 수집에 동의합니다
432
+ * </krds-checkbox>
433
+ * <krds-radio><input type="radio" krdsControl name="method" value="email" [(ngModel)]="method" />이메일</krds-radio>
434
+ */
435
+ export declare class KrdsCheckbox {
436
+ /** 크기 */
437
+ readonly size: import("@angular/core").InputSignal<KrdsCheckboxSize>;
438
+ /** Chip 스타일 */
439
+ readonly chip: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
440
+ /** 레이블 아래 부가 설명 (Chip 스타일에서는 표시하지 않음) */
441
+ readonly description: import("@angular/core").InputSignal<string | undefined>;
442
+ protected readonly control: import("@angular/core").Signal<KrdsControl>;
443
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsCheckbox, never>;
444
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsCheckbox, "krds-checkbox, krds-radio", never, {
445
+ "size": {
446
+ "alias": "size";
447
+ "required": false;
448
+ "isSignal": true;
449
+ };
450
+ "chip": {
451
+ "alias": "chip";
452
+ "required": false;
453
+ "isSignal": true;
454
+ };
455
+ "description": {
456
+ "alias": "description";
457
+ "required": false;
458
+ "isSignal": true;
459
+ };
460
+ }, {}, ["control"], ["[krdsControl]", "*"], true, never>;
461
+ }
462
+ /** 라디오 버튼 (마크업이 체크박스와 같아 같은 컴포넌트) */
463
+ export declare const KrdsRadio: typeof KrdsCheckbox;
464
+ /**
465
+ * 체크박스·라디오 버튼 묶음. 기본은 가로, `column`이면 세로로 배치한다
466
+ *
467
+ * @example <fieldset krdsCheckArea column><legend>수신 방법</legend>...</fieldset>
468
+ */
469
+ export declare class KrdsCheckArea {
470
+ /** 세로(컬럼) 배치 */
471
+ readonly column: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
472
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsCheckArea, never>;
473
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsCheckArea, "[krdsCheckArea]", never, {
474
+ "column": {
475
+ "alias": "column";
476
+ "required": false;
477
+ "isSignal": true;
478
+ };
479
+ }, {}, never, never, true, never>;
480
+ }
481
+ /** 코치마크 단계 */
482
+ export interface KrdsCoachMarkStep {
483
+ id: number;
484
+ title: string;
485
+ description: string;
486
+ }
487
+ /**
488
+ * KRDS 코치마크. 화면의 한 단계 옆에 두고, 현재 단계(`[(current)]`)가 이 코치마크의 단계(`step`)이면 안내 말풍선을 보인다.
489
+ * 말풍선의 이전으로·다음으로가 current를 바꾸고(새 단계의 말풍선 제목으로 초점을 옮김), 그만보기는 `(closed)`로 알린다
490
+ *
491
+ * @example
492
+ * <krds-coach-mark [steps]="steps" [step]="1" [(current)]="current" (closed)="current.set(null)">
493
+ * <div class="coach-box">안내할 영역</div>
494
+ * </krds-coach-mark>
495
+ */
496
+ export declare class KrdsCoachMark {
497
+ /** 전체 단계 */
498
+ readonly steps: import("@angular/core").InputSignal<KrdsCoachMarkStep[]>;
499
+ /** 이 코치마크가 맡은 단계 번호 (1부터) */
500
+ readonly step: import("@angular/core").InputSignal<number>;
501
+ /** 지금 보이는 단계 번호 (없으면 null) */
502
+ readonly current: import("@angular/core").ModelSignal<number | null>;
503
+ /** 그만보기를 눌렀을 때 */
504
+ readonly closed: import("@angular/core").OutputEmitterRef<void>;
505
+ private readonly document;
506
+ private readonly title;
507
+ constructor();
508
+ protected readonly stepData: import("@angular/core").Signal<KrdsCoachMarkStep>;
509
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsCoachMark, never>;
510
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsCoachMark, "krds-coach-mark", never, {
511
+ "steps": {
512
+ "alias": "steps";
513
+ "required": true;
514
+ "isSignal": true;
515
+ };
516
+ "step": {
517
+ "alias": "step";
518
+ "required": true;
519
+ "isSignal": true;
520
+ };
521
+ "current": {
522
+ "alias": "current";
523
+ "required": false;
524
+ "isSignal": true;
525
+ };
526
+ }, {
527
+ "current": "currentChange";
528
+ "closed": "closed";
529
+ }, never, ["*"], true, never>;
530
+ }
531
+ /** 맥락적 도움말이 펼쳐지는 위치 */
532
+ export type KrdsContextualHelpPosition = 'top left' | 'top center' | 'top right' | 'bottom left' | 'bottom center' | 'bottom right';
533
+ /**
534
+ * KRDS 맥락적 도움말. 도움말 버튼을 누르면 제목·설명·링크가 있는 팝오버를 열고 그 안의 첫 조작 요소로 초점을 옮긴다.
535
+ * 닫기 버튼·Esc는 닫고 초점을 도움말 버튼으로 돌려주며, 바깥을 누르면 닫는다
536
+ *
537
+ * @example
538
+ * <krds-contextual-help heading="신청 자격" position="bottom left">
539
+ * <p>만 19세 이상 국민이면 신청할 수 있습니다.</p>
540
+ * <div class="btn-wrap"><a class="krds-btn xsmall link basic" href="/guide">바로가기</a></div>
541
+ * </krds-contextual-help>
542
+ */
543
+ export declare class KrdsContextualHelp {
544
+ /** 도움말 제목 (title 속성은 기본 툴팁이 되므로 heading으로 받음) */
545
+ readonly heading: import("@angular/core").InputSignal<string>;
546
+ /** 물음표 모양 도움 아이콘 (기본은 정보 아이콘) */
547
+ readonly helpIcon: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
548
+ /** 펼쳐지는 위치 */
549
+ readonly position: import("@angular/core").InputSignal<KrdsContextualHelpPosition>;
550
+ protected readonly open: import("@angular/core").WritableSignal<boolean>;
551
+ protected readonly popoverId: string;
552
+ private readonly trigger;
553
+ private readonly popover;
554
+ private readonly action;
555
+ private readonly document;
556
+ private readonly injector;
557
+ private readonly closeOthers;
558
+ constructor();
559
+ protected toggle(): void;
560
+ /** 닫기. 닫기 버튼·Esc는 초점을 도움말 버튼으로 돌려준다 (팝오버가 숨으며 초점을 잃지 않게) */
561
+ protected close(returnFocus: boolean): void;
562
+ protected onDocumentClick(event: MouseEvent): void;
563
+ /** 모바일에서는 화면 폭에 맞춰 펼친다 */
564
+ protected adjustPosition(): void;
565
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsContextualHelp, never>;
566
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsContextualHelp, "krds-contextual-help", never, {
567
+ "heading": {
568
+ "alias": "heading";
569
+ "required": true;
570
+ "isSignal": true;
571
+ };
572
+ "helpIcon": {
573
+ "alias": "helpIcon";
574
+ "required": false;
575
+ "isSignal": true;
576
+ };
577
+ "position": {
578
+ "alias": "position";
579
+ "required": false;
580
+ "isSignal": true;
581
+ };
582
+ }, {}, never, ["*"], true, never>;
583
+ }
584
+ /** 긴급 공지 종류 */
585
+ export type KrdsCriticalAlertType = 'danger' | 'ok' | 'info';
586
+ /**
587
+ * KRDS 긴급 공지. 종류 배지(긴급·안전·안내), 문구, 자세히 보기 링크를 보여 준다 (링크 클릭은 기본 click으로 받음)
588
+ *
589
+ * @example <krds-critical-alerts type="danger" message="폭우로 일부 지역 도로가 통제됩니다." linkHref="/notice/1" />
590
+ */
591
+ export declare class KrdsCriticalAlerts {
592
+ /** 종류 */
593
+ readonly type: import("@angular/core").InputSignal<KrdsCriticalAlertType>;
594
+ /** 공지 문구 */
595
+ readonly message: import("@angular/core").InputSignal<string>;
596
+ /** 자세히 보기 링크 주소 */
597
+ readonly linkHref: import("@angular/core").InputSignal<string | undefined>;
598
+ /** 자세히 보기 링크 문구 (모바일에서는 숨김) */
599
+ readonly linkText: import("@angular/core").InputSignal<string>;
600
+ protected readonly badgeText: import("@angular/core").Signal<string>;
601
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsCriticalAlerts, never>;
602
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsCriticalAlerts, "krds-critical-alerts", never, {
603
+ "type": {
604
+ "alias": "type";
605
+ "required": false;
606
+ "isSignal": true;
607
+ };
608
+ "message": {
609
+ "alias": "message";
610
+ "required": true;
611
+ "isSignal": true;
612
+ };
613
+ "linkHref": {
614
+ "alias": "linkHref";
615
+ "required": false;
616
+ "isSignal": true;
617
+ };
618
+ "linkText": {
619
+ "alias": "linkText";
620
+ "required": false;
621
+ "isSignal": true;
622
+ };
623
+ }, {}, never, never, true, never>;
624
+ }
625
+ interface CalendarDay {
626
+ day: number;
627
+ dateString: string;
628
+ isCurrentMonth: boolean;
629
+ isToday: boolean;
630
+ isPrevMonth: boolean;
631
+ isNextMonth: boolean;
632
+ isSunday: boolean;
633
+ }
634
+ type SwitchType = 'year' | 'month';
635
+ /**
636
+ * KRDS 날짜 입력 필드. 안에 넣은 `<input krdsInput>` 옆에 달력 버튼과 달력을 붙인다.
637
+ * 직접 입력은 기본 input 그대로이고, 달력에서 고른 날짜(기간이면 'YYYY.MM.DD ~ YYYY.MM.DD')는 input에 넣고 input 이벤트로 알리므로
638
+ * `[(ngModel)]`·`formControlName`이 그대로 값을 받는다
639
+ *
640
+ * @example
641
+ * <krds-form-group label="신청일">
642
+ * <krds-date-input [holidays]="['2025.03.01']">
643
+ * <input krdsInput placeholder="YYYY.MM.DD" [(ngModel)]="date" />
644
+ * </krds-date-input>
645
+ * </krds-form-group>
646
+ */
647
+ export declare class KrdsDateInput {
648
+ /** 일정이 있는 날짜 (YYYY.MM.DD) */
649
+ readonly eventDates: import("@angular/core").InputSignal<string[]>;
650
+ /** 휴일 (YYYY.MM.DD, 일요일은 기본으로 휴일 표시) */
651
+ readonly holidays: import("@angular/core").InputSignal<string[]>;
652
+ /** 처음 보여 줄 연도 (기본: 올해) */
653
+ readonly initialYear: import("@angular/core").InputSignal<number | undefined>;
654
+ /** 처음 보여 줄 월 1~12 (기본: 이번 달) */
655
+ readonly initialMonth: import("@angular/core").InputSignal<number | undefined>;
656
+ protected readonly weekdays: string[];
657
+ protected readonly switchTypes: SwitchType[];
658
+ protected readonly pad: (n: number) => string;
659
+ private readonly today;
660
+ protected readonly todayString: string;
661
+ protected readonly open: import("@angular/core").WritableSignal<boolean>;
662
+ protected readonly dropdown: import("@angular/core").WritableSignal<SwitchType | null>;
663
+ protected readonly openUpward: import("@angular/core").WritableSignal<boolean>;
664
+ protected readonly disabled: import("@angular/core").WritableSignal<boolean>;
665
+ protected readonly year: import("@angular/core").WritableSignal<number>;
666
+ protected readonly month: import("@angular/core").WritableSignal<number>;
667
+ private readonly start;
668
+ private readonly end;
669
+ private readonly control;
670
+ private readonly controlEl;
671
+ private readonly toggle;
672
+ private readonly wrap;
673
+ private readonly host;
674
+ private readonly injector;
675
+ private readonly destroyRef;
676
+ protected readonly buttonSize: import("@angular/core").Signal<import("@krds.ui/angular").KrdsInputSize>;
677
+ protected readonly grid: import("@angular/core").Signal<CalendarDay[][]>;
678
+ private readonly closeOthers;
679
+ constructor();
680
+ protected current(type: SwitchType): number;
681
+ protected options(type: SwitchType): number[];
682
+ protected format(type: SwitchType, value: number): string;
683
+ protected pick(type: SwitchType, value: number, switchButton: HTMLButtonElement): void;
684
+ protected openCalendar(): void;
685
+ /** 닫기. 취소·확인·Esc·달력 버튼은 초점을 달력 버튼으로 돌려주고, 바깥 클릭과 다른 달력 열기는 초점을 그대로 둔다 */
686
+ protected close(returnFocus: boolean): void;
687
+ protected onEscape(): void;
688
+ protected onDocumentClick(event: MouseEvent): void;
689
+ protected moveMonth(delta: number): void;
690
+ /** 첫 클릭은 시작일, 다음 클릭은 종료일 (시작일보다 앞이면 시작일을 다시 정함) */
691
+ protected selectDate(dateString: string, single?: boolean): void;
692
+ protected range(dateString: string): {
693
+ isInRange: boolean;
694
+ isStart: boolean;
695
+ isEnd: boolean;
696
+ };
697
+ protected cellClasses(day: CalendarDay): string;
698
+ protected confirm(): void;
699
+ private updatePlacement;
700
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsDateInput, never>;
701
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsDateInput, "krds-date-input", never, {
702
+ "eventDates": {
703
+ "alias": "eventDates";
704
+ "required": false;
705
+ "isSignal": true;
706
+ };
707
+ "holidays": {
708
+ "alias": "holidays";
709
+ "required": false;
710
+ "isSignal": true;
711
+ };
712
+ "initialYear": {
713
+ "alias": "initialYear";
714
+ "required": false;
715
+ "isSignal": true;
716
+ };
717
+ "initialMonth": {
718
+ "alias": "initialMonth";
719
+ "required": false;
720
+ "isSignal": true;
721
+ };
722
+ }, {}, ["control", "controlEl"], ["*"], true, never>;
723
+ }
724
+ /**
725
+ * KRDS 디스클로저. 버튼으로 내용을 펼치고 접는다. 접힌 내용은 inert로 초점과 화면낭독기에서 뺀다
726
+ *
727
+ * @example <krds-disclosure label="신청 자격 자세히 보기" [(expanded)]="open">만 19세 이상...</krds-disclosure>
728
+ */
729
+ export declare class KrdsDisclosure {
730
+ /** 펼침 버튼 문구 (title 속성은 기본 툴팁이 되므로 label로 받음) */
731
+ readonly label: import("@angular/core").InputSignal<string>;
732
+ /** 펼침 여부 */
733
+ readonly expanded: import("@angular/core").ModelSignal<boolean>;
734
+ protected readonly contentId: string;
735
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsDisclosure, never>;
736
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsDisclosure, "krds-disclosure", never, {
737
+ "label": {
738
+ "alias": "label";
739
+ "required": true;
740
+ "isSignal": true;
741
+ };
742
+ "expanded": {
743
+ "alias": "expanded";
744
+ "required": false;
745
+ "isSignal": true;
746
+ };
747
+ }, {
748
+ "expanded": "expandedChange";
749
+ }, never, ["*"], true, never>;
750
+ }
751
+ /** 드롭다운 메뉴 위치 (center는 넘치면 자동으로 좌우를 맞춤) */
752
+ export type KrdsDropdownPosition = 'center' | 'left' | 'right';
753
+ /**
754
+ * KRDS 드롭다운. KRDS 마크업(.drop-btn 버튼과 .drop-menu)에 붙이면 버튼으로 열고 닫고(aria-expanded),
755
+ * Esc는 닫고 버튼으로 초점을 돌려주며, 바깥 클릭·초점 이탈로 닫는다. 메뉴가 화면 밖으로 넘치면 좌우 위치를 맞춘다
756
+ *
757
+ * @example
758
+ * <div krdsDropdown>
759
+ * <button type="button" class="krds-btn small text drop-btn">메뉴명 <i class="svg-icon ico-toggle"></i></button>
760
+ * <div class="drop-menu"><div class="drop-in"><ul class="drop-list"><li><a href="/a" class="item-link">메뉴</a></li></ul></div></div>
761
+ * </div>
762
+ */
763
+ export declare class KrdsDropdown {
764
+ /** 열림 */
765
+ readonly open: import("@angular/core").ModelSignal<boolean>;
766
+ /** 메뉴 위치 */
767
+ readonly position: import("@angular/core").InputSignal<KrdsDropdownPosition>;
768
+ private readonly host;
769
+ private readonly autoSide;
770
+ protected readonly side: import("@angular/core").Signal<KrdsDropdownPosition | null>;
771
+ constructor();
772
+ private button;
773
+ /** 열고 닫기 */
774
+ toggle(): void;
775
+ /** 닫기 (returnFocus면 버튼으로 초점) */
776
+ close(returnFocus?: boolean): void;
777
+ protected onClick(event: MouseEvent): void;
778
+ /** 원본처럼 초점을 받은 항목을 위로 올려 초점 테두리가 이웃 항목에 가리지 않게 한다 */
779
+ protected onFocusin(event: FocusEvent): void;
780
+ /** 초점이 밖으로 옮겨 가면 닫는다. 갈 곳 없이 빠진 초점(다른 창으로 전환 등)은 무시하고, 빈 곳 클릭은 문서 클릭으로 닫는다 */
781
+ protected onFocusout(event: FocusEvent): void;
782
+ protected onDocumentClick(event: MouseEvent): void;
783
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsDropdown, never>;
784
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsDropdown, "[krdsDropdown]", ["krdsDropdown"], {
785
+ "open": {
786
+ "alias": "open";
787
+ "required": false;
788
+ "isSignal": true;
789
+ };
790
+ "position": {
791
+ "alias": "position";
792
+ "required": false;
793
+ "isSignal": true;
794
+ };
795
+ }, {
796
+ "open": "openChange";
797
+ }, never, never, true, never>;
798
+ }
799
+ /** 파일 업로드 목록의 파일 */
800
+ export interface KrdsFileInfo {
801
+ /** 파일 id */
802
+ id: string;
803
+ /** 파일 객체 */
804
+ file: File;
805
+ /** 파일명 */
806
+ name: string;
807
+ /** 파일 크기 (bytes) */
808
+ size: number;
809
+ /** 파일 타입 (MIME) */
810
+ type: string;
811
+ /** 업로드 상태 (업로드는 사용하는 쪽에서 처리하고 상태만 바꿔 넘긴다) */
812
+ status: 'pending' | 'uploading' | 'completed' | 'error';
813
+ /** 오류 문구 */
814
+ errorMessage?: string;
815
+ /** 다운로드 주소 (있으면 다운로드·바로보기 버튼) */
816
+ downloadUrl?: string;
817
+ }
818
+ /** 파일 검사 실패 이벤트 */
819
+ export interface KrdsFileError {
820
+ file: KrdsFileInfo;
821
+ error: string;
822
+ }
823
+ /** 파일 선택 버튼 크기 */
824
+ export type KrdsFileUploadSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';
825
+ /**
826
+ * KRDS 파일 업로드. 파일을 끌어다 놓거나 파일선택 버튼으로 고르면 크기·형식·개수를 검사해 목록(`[(files)]`)에 넣는다.
827
+ * 실제 업로드는 사용하는 쪽에서 처리하고, 파일의 status·downloadUrl을 바꿔 넘기면 상태별 버튼을 보여 준다
828
+ *
829
+ * @example <krds-file-upload heading="증빙 서류" accept=".pdf,.jpg" [maxFiles]="3" [(files)]="files" />
830
+ */
831
+ export declare class KrdsFileUpload {
832
+ /** 파일 목록 */
833
+ readonly files: import("@angular/core").ModelSignal<KrdsFileInfo[]>;
834
+ /** 제목 (기본 title 속성과 겹쳐 툴팁이 뜨지 않게 heading으로 받음) */
835
+ readonly heading: import("@angular/core").InputSignal<string | undefined>;
836
+ /** 설명 */
837
+ readonly description: import("@angular/core").InputSignal<string | undefined>;
838
+ /** 끌어다 놓는 영역의 안내 문구 */
839
+ readonly placeholder: import("@angular/core").InputSignal<string>;
840
+ /** 파일선택 버튼 크기 */
841
+ readonly size: import("@angular/core").InputSignal<KrdsFileUploadSize>;
842
+ /** 허용 파일 형식 (예: '.jpg,.png,.pdf', 'image/*') */
843
+ readonly accept: import("@angular/core").InputSignal<string | undefined>;
844
+ /** 최대 파일 개수 (오류 항목은 세지 않음) */
845
+ readonly maxFiles: import("@angular/core").InputSignal<number>;
846
+ /** 최대 파일 크기 (bytes, 이 크기 이상이면 오류) */
847
+ readonly maxFileSize: import("@angular/core").InputSignal<number>;
848
+ /** 여러 파일 선택 (끄면 새 파일이 기존 파일을 대체) */
849
+ readonly multiple: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
850
+ /** 비활성화 */
851
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
852
+ /** 읽기 전용 (추가·삭제 없이 다운로드·바로보기만) */
853
+ readonly readonly: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
854
+ /** 끌어다 놓기 */
855
+ readonly dragAndDrop: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
856
+ /** 다운로드 버튼 표시 */
857
+ readonly showDownload: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
858
+ /** 바로보기 버튼 표시 */
859
+ readonly showPreviewButton: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
860
+ /** 전체 파일 삭제 버튼 표시 */
861
+ readonly showClearAll: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
862
+ /** 파일 input의 name */
863
+ readonly name: import("@angular/core").InputSignal<string>;
864
+ /** 파일을 추가했을 때 */
865
+ readonly fileAdded: import("@angular/core").OutputEmitterRef<KrdsFileInfo>;
866
+ /** 파일을 삭제했을 때 (파일 id) */
867
+ readonly fileRemoved: import("@angular/core").OutputEmitterRef<string>;
868
+ /** 추가한 파일이 검사(크기·형식)에 실패했을 때 */
869
+ readonly fileError: import("@angular/core").OutputEmitterRef<KrdsFileError>;
870
+ /** 전체 파일 삭제 버튼을 눌렀을 때 */
871
+ readonly cleared: import("@angular/core").OutputEmitterRef<void>;
872
+ /** 파일의 다운로드 버튼을 눌렀을 때 */
873
+ readonly download: import("@angular/core").OutputEmitterRef<KrdsFileInfo>;
874
+ /** 파일의 바로보기 버튼을 눌렀을 때 */
875
+ readonly preview: import("@angular/core").OutputEmitterRef<KrdsFileInfo>;
876
+ protected readonly inputId: string;
877
+ protected readonly dragOver: import("@angular/core").WritableSignal<boolean>;
878
+ protected readonly validCount: import("@angular/core").Signal<number>;
879
+ private get locked();
880
+ protected lines(message: string): string[];
881
+ protected fileName(file: KrdsFileInfo): string;
882
+ private validate;
883
+ private addFiles;
884
+ protected onFileChange(input: HTMLInputElement): void;
885
+ protected onDragOver(event: DragEvent): void;
886
+ protected onDrop(event: DragEvent): void;
887
+ protected removeFile(id: string): void;
888
+ protected clearAll(): void;
889
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFileUpload, never>;
890
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsFileUpload, "krds-file-upload", never, {
891
+ "files": {
892
+ "alias": "files";
893
+ "required": false;
894
+ "isSignal": true;
895
+ };
896
+ "heading": {
897
+ "alias": "heading";
898
+ "required": false;
899
+ "isSignal": true;
900
+ };
901
+ "description": {
902
+ "alias": "description";
903
+ "required": false;
904
+ "isSignal": true;
905
+ };
906
+ "placeholder": {
907
+ "alias": "placeholder";
908
+ "required": false;
909
+ "isSignal": true;
910
+ };
911
+ "size": {
912
+ "alias": "size";
913
+ "required": false;
914
+ "isSignal": true;
915
+ };
916
+ "accept": {
917
+ "alias": "accept";
918
+ "required": false;
919
+ "isSignal": true;
920
+ };
921
+ "maxFiles": {
922
+ "alias": "maxFiles";
923
+ "required": false;
924
+ "isSignal": true;
925
+ };
926
+ "maxFileSize": {
927
+ "alias": "maxFileSize";
928
+ "required": false;
929
+ "isSignal": true;
930
+ };
931
+ "multiple": {
932
+ "alias": "multiple";
933
+ "required": false;
934
+ "isSignal": true;
935
+ };
936
+ "disabled": {
937
+ "alias": "disabled";
938
+ "required": false;
939
+ "isSignal": true;
940
+ };
941
+ "readonly": {
942
+ "alias": "readonly";
943
+ "required": false;
944
+ "isSignal": true;
945
+ };
946
+ "dragAndDrop": {
947
+ "alias": "dragAndDrop";
948
+ "required": false;
949
+ "isSignal": true;
950
+ };
951
+ "showDownload": {
952
+ "alias": "showDownload";
953
+ "required": false;
954
+ "isSignal": true;
955
+ };
956
+ "showPreviewButton": {
957
+ "alias": "showPreviewButton";
958
+ "required": false;
959
+ "isSignal": true;
960
+ };
961
+ "showClearAll": {
962
+ "alias": "showClearAll";
963
+ "required": false;
964
+ "isSignal": true;
965
+ };
966
+ "name": {
967
+ "alias": "name";
968
+ "required": false;
969
+ "isSignal": true;
970
+ };
971
+ }, {
972
+ "files": "filesChange";
973
+ "fileAdded": "fileAdded";
974
+ "fileRemoved": "fileRemoved";
975
+ "fileError": "fileError";
976
+ "cleared": "cleared";
977
+ "download": "download";
978
+ "preview": "preview";
979
+ }, never, never, true, never>;
980
+ }
981
+ /** 플로팅 버튼 항목 (단일형 버튼·확장형 항목 공통) */
982
+ export interface KrdsFloatingButtonItem {
983
+ /** 버튼 이름 (레이블) */
984
+ label: string;
985
+ /** 아이콘 클래스 (예: 'ico-faq') */
986
+ icon: string;
987
+ /** 링크 주소 (없으면 버튼으로 렌더링) */
988
+ href?: string;
989
+ /** 링크를 새 창으로 열기 ('새 창 열림' 안내 포함) */
990
+ external?: boolean;
991
+ }
992
+ /** 확장형 항목 선택 이벤트 (링크 항목은 event.preventDefault()로 라우터 이동 가능) */
993
+ export interface KrdsFloatingButtonSelect {
994
+ item: KrdsFloatingButtonItem;
995
+ index: number;
996
+ event: MouseEvent;
997
+ }
998
+ /**
999
+ * KRDS 플로팅 버튼. 화면에서 가장 자주 쓰는 중요한 작업을 화면 오른쪽 아래에 고정해 보여 준다.
1000
+ * `items`가 없으면 단일형(아이콘 + 레이블, 클릭은 기본 `(click)`으로 받음),
1001
+ * 있으면 확장형(+ 버튼으로 항목을 펼치고 X로 닫음, 선택은 `(itemSelect)`)이다
1002
+ *
1003
+ * @example
1004
+ * <krds-floating-button label="채팅 상담" icon="ico-faq" (click)="openChat()" />
1005
+ * <krds-floating-button label="상담 메뉴" [items]="items" (itemSelect)="onSelect($event)" />
1006
+ */
1007
+ export declare class KrdsFloatingButton {
1008
+ /** 단일형 버튼의 레이블, 확장형은 확장 버튼의 이름 (화면에는 숨김) */
1009
+ readonly label: import("@angular/core").InputSignal<string>;
1010
+ /** 단일형 버튼의 아이콘 클래스 */
1011
+ readonly icon: import("@angular/core").InputSignal<string>;
1012
+ /** 단일형 버튼의 링크 주소 */
1013
+ readonly href: import("@angular/core").InputSignal<string | undefined>;
1014
+ /** 단일형 링크를 새 창으로 열기 ('새 창 열림' 안내 포함) */
1015
+ readonly external: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1016
+ /** 단일형 레이블을 화면에서 숨김 (아이콘만 표시, 화면낭독기는 읽음) */
1017
+ readonly hideLabel: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1018
+ /** 확장형 항목 (지정하면 확장형, 3개 이하 권장) */
1019
+ readonly items: import("@angular/core").InputSignal<KrdsFloatingButtonItem[] | undefined>;
1020
+ /** 확장형 항목을 선택했을 때 */
1021
+ readonly itemSelect: import("@angular/core").OutputEmitterRef<KrdsFloatingButtonSelect>;
1022
+ protected readonly open: import("@angular/core").WritableSignal<boolean>;
1023
+ protected readonly listId: string;
1024
+ protected readonly single: import("@angular/core").Signal<KrdsFloatingButtonItem>;
1025
+ private readonly host;
1026
+ private readonly document;
1027
+ private readonly toggle;
1028
+ protected close(returnFocus?: boolean): void;
1029
+ protected onFocusout(event: FocusEvent): void;
1030
+ protected onAction(item: KrdsFloatingButtonItem, index: number | undefined, event: MouseEvent): void;
1031
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFloatingButton, never>;
1032
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsFloatingButton, "krds-floating-button", never, {
1033
+ "label": {
1034
+ "alias": "label";
1035
+ "required": true;
1036
+ "isSignal": true;
1037
+ };
1038
+ "icon": {
1039
+ "alias": "icon";
1040
+ "required": false;
1041
+ "isSignal": true;
1042
+ };
1043
+ "href": {
1044
+ "alias": "href";
1045
+ "required": false;
1046
+ "isSignal": true;
1047
+ };
1048
+ "external": {
1049
+ "alias": "external";
1050
+ "required": false;
1051
+ "isSignal": true;
1052
+ };
1053
+ "hideLabel": {
1054
+ "alias": "hideLabel";
1055
+ "required": false;
1056
+ "isSignal": true;
1057
+ };
1058
+ "items": {
1059
+ "alias": "items";
1060
+ "required": false;
1061
+ "isSignal": true;
1062
+ };
1063
+ }, {
1064
+ "itemSelect": "itemSelect";
1065
+ }, never, never, true, never>;
1066
+ }
1067
+ /** 푸터 위쪽 관련 사이트 영역 (`<div krdsFooterTop>`) */
1068
+ export declare class KrdsFooterTop {
1069
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFooterTop, never>;
1070
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsFooterTop, "[krdsFooterTop]", never, {}, {}, never, ["*"], true, never>;
1071
+ }
1072
+ /** 푸터 로고 영역 */
1073
+ export declare class KrdsFooterLogo {
1074
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFooterLogo, never>;
1075
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsFooterLogo, "[krdsFooterLogo]", never, {}, {}, never, never, true, never>;
1076
+ }
1077
+ /** 푸터 기관 정보·링크 영역 */
1078
+ export declare class KrdsFooterContent {
1079
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFooterContent, never>;
1080
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsFooterContent, "[krdsFooterContent]", never, {}, {}, never, never, true, never>;
1081
+ }
1082
+ /** 푸터 아래쪽 정책 링크·저작권 영역 */
1083
+ export declare class KrdsFooterBottom {
1084
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFooterBottom, never>;
1085
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsFooterBottom, "[krdsFooterBottom]", never, {}, {}, never, never, true, never>;
1086
+ }
1087
+ /**
1088
+ * KRDS 푸터. 기본 `<footer>`(contentinfo 랜드마크)에 붙여 영역을 KRDS 구조로 배치한다
1089
+ *
1090
+ * @example
1091
+ * <footer krdsFooter>
1092
+ * <div krdsFooterTop>...</div>
1093
+ * <div krdsFooterLogo><span class="sr-only">기관명</span></div>
1094
+ * <div krdsFooterContent>...</div>
1095
+ * <div krdsFooterBottom>...</div>
1096
+ * </footer>
1097
+ */
1098
+ export declare class KrdsFooter {
1099
+ /** id (KRDS CSS 기준 krds-footer) */
1100
+ readonly id: import("@angular/core").InputSignal<string>;
1101
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFooter, never>;
1102
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsFooter, "footer[krdsFooter]", never, {
1103
+ "id": {
1104
+ "alias": "id";
1105
+ "required": false;
1106
+ "isSignal": true;
1107
+ };
1108
+ }, {}, never, ["[krdsFooterTop]", "[krdsFooterLogo]", "[krdsFooterContent]", "[krdsFooterBottom]"], true, never>;
1109
+ }
1110
+ /** 입력 상태 (도움말 문구 색과 입력 필드 테두리) */
1111
+ export type KrdsFormGroupState = 'default' | 'error' | 'success' | 'information';
1112
+ /**
1113
+ * KRDS 폼 그룹. 레이블, 입력 영역(.form-conts), 도움말을 묶고, 안에 든 입력 요소(`krdsInput`·`krdsSelect`·`krdsControl`)에
1114
+ * label `for`, 도움말 `aria-describedby`, 오류 상태 `aria-invalid`를 자동으로 연결한다.
1115
+ * 입력 요소 하나를 위한 묶음이다. 체크박스·라디오 여러 개는 `<fieldset krdsCheckArea>`와 legend로 묶는다
1116
+ *
1117
+ * @example
1118
+ * <krds-form-group label="이메일" hint="이메일 형식이 올바르지 않습니다" state="error">
1119
+ * <input krdsInput type="email" [(ngModel)]="email" />
1120
+ * </krds-form-group>
1121
+ */
1122
+ export declare class KrdsFormGroup implements KrdsField {
1123
+ /** 레이블 */
1124
+ readonly label: import("@angular/core").InputSignal<string | undefined>;
1125
+ /** 도움말 (state에 따라 오류·성공·안내 문구) */
1126
+ readonly hint: import("@angular/core").InputSignal<string | undefined>;
1127
+ /** 입력 상태 */
1128
+ readonly state: import("@angular/core").InputSignal<KrdsFormGroupState>;
1129
+ /** 입력 필드 안에 버튼을 둠 (비밀번호 보기·내용 삭제 등) */
1130
+ readonly withButton: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1131
+ /** 값이 있을 때만 내용 삭제 버튼(.btn-delete-input)을 보임 */
1132
+ readonly deleteButton: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1133
+ /** 입력 필드 안에 로딩 스피너 표시 (데이터를 불러오거나 검증하는 중) */
1134
+ readonly loading: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1135
+ protected readonly control: import("@angular/core").Signal<KrdsControl | undefined>;
1136
+ protected readonly hintId: string;
1137
+ protected readonly hintClass: import("@angular/core").Signal<string>;
1138
+ readonly describedBy: import("@angular/core").Signal<string | null>;
1139
+ readonly invalid: import("@angular/core").Signal<boolean>;
1140
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFormGroup, never>;
1141
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsFormGroup, "krds-form-group", never, {
1142
+ "label": {
1143
+ "alias": "label";
1144
+ "required": false;
1145
+ "isSignal": true;
1146
+ };
1147
+ "hint": {
1148
+ "alias": "hint";
1149
+ "required": false;
1150
+ "isSignal": true;
1151
+ };
1152
+ "state": {
1153
+ "alias": "state";
1154
+ "required": false;
1155
+ "isSignal": true;
1156
+ };
1157
+ "withButton": {
1158
+ "alias": "withButton";
1159
+ "required": false;
1160
+ "isSignal": true;
1161
+ };
1162
+ "deleteButton": {
1163
+ "alias": "deleteButton";
1164
+ "required": false;
1165
+ "isSignal": true;
1166
+ };
1167
+ "loading": {
1168
+ "alias": "loading";
1169
+ "required": false;
1170
+ "isSignal": true;
1171
+ };
1172
+ }, {}, ["control"], ["*"], true, never>;
1173
+ }
1174
+ /** 헤더 위쪽 유틸리티 영역 (`<div krdsHeaderUtility>`) */
1175
+ export declare class KrdsHeaderUtility {
1176
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsHeaderUtility, never>;
1177
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsHeaderUtility, "[krdsHeaderUtility]", never, {}, {}, never, never, true, never>;
1178
+ }
1179
+ /** 헤더 로고·주요 버튼 영역 (`<div krdsHeaderBranding>`) */
1180
+ export declare class KrdsHeaderBranding {
1181
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsHeaderBranding, never>;
1182
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsHeaderBranding, "[krdsHeaderBranding]", never, {}, {}, never, never, true, never>;
1183
+ }
1184
+ /**
1185
+ * KRDS 헤더. 기본 `<header>`(banner 랜드마크)에 붙여 KRDS 구조로 배치한다.
1186
+ * 유틸리티·브랜딩은 `[krdsHeaderUtility]`·`[krdsHeaderBranding]`, PC 메뉴는 그냥 넣고, 모바일 드로어는 `krdsHeaderMobile` 속성을 붙여 넣는다
1187
+ *
1188
+ * @example
1189
+ * <header krdsHeader>
1190
+ * <div krdsHeaderUtility>...</div>
1191
+ * <div krdsHeaderBranding><h2 class="logo">...</h2></div>
1192
+ * <krds-main-menu [items]="menu" />
1193
+ * <krds-main-menu krdsHeaderMobile variant="mobile" [items]="menu" [(open)]="menuOpen" />
1194
+ * </header>
1195
+ */
1196
+ export declare class KrdsHeader {
1197
+ /** id (KRDS CSS 기준 krds-header) */
1198
+ readonly id: import("@angular/core").InputSignal<string>;
1199
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsHeader, never>;
1200
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsHeader, "header[krdsHeader]", never, {
1201
+ "id": {
1202
+ "alias": "id";
1203
+ "required": false;
1204
+ "isSignal": true;
1205
+ };
1206
+ }, {}, never, ["[krdsHeaderUtility]", "[krdsHeaderBranding]", "*", "[krdsHeaderMobile]"], true, never>;
1207
+ }
1208
+ /**
1209
+ * KRDS 운영기관 식별자. 누리집을 운영하는 기관을 알린다
1210
+ *
1211
+ * @example <div krdsIdentifier>이 누리집은 보건복지부 누리집입니다.</div>
1212
+ */
1213
+ export declare class KrdsIdentifier {
1214
+ /** 로고 이름 (화면낭독기) */
1215
+ readonly logoLabel: import("@angular/core").InputSignal<string>;
1216
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsIdentifier, never>;
1217
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsIdentifier, "[krdsIdentifier]", never, {
1218
+ "logoLabel": {
1219
+ "alias": "logoLabel";
1220
+ "required": false;
1221
+ "isSignal": true;
1222
+ };
1223
+ }, {}, never, ["*"], true, never>;
1224
+ }
1225
+ /**
1226
+ * KRDS 이미지. 기본 `<img>`에 KRDS 클래스를 붙이고 기본으로 지연 로딩한다.
1227
+ * 개발 모드에서는 대체 텍스트(alt)가 역할을 되풀이하거나('…사진') 옆 설명(figcaption)과 같으면 경고한다
1228
+ *
1229
+ * @example
1230
+ * <figure krdsFigure>
1231
+ * <img krdsImage src="/office.jpg" alt="정부서울청사 정문" />
1232
+ * <figcaption>정부서울청사</figcaption>
1233
+ * </figure>
1234
+ */
1235
+ export declare class KrdsImage {
1236
+ /** 로딩 방식 (화면 위쪽의 중요한 이미지는 eager) */
1237
+ readonly loading: import("@angular/core").InputSignal<"lazy" | "eager">;
1238
+ constructor();
1239
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsImage, never>;
1240
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsImage, "img[krdsImage]", never, {
1241
+ "loading": {
1242
+ "alias": "loading";
1243
+ "required": false;
1244
+ "isSignal": true;
1245
+ };
1246
+ }, {}, never, never, true, never>;
1247
+ }
1248
+ /** 설명이 있는 이미지 묶음 (`<figure>`) */
1249
+ export declare class KrdsFigure {
1250
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsFigure, never>;
1251
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsFigure, "figure[krdsFigure]", never, {}, {}, never, never, true, never>;
1252
+ }
1253
+ /** 콘텐츠 내 탐색 항목 */
1254
+ export interface KrdsInPageNavItem {
1255
+ /** 같은 페이지의 #id (또는 다른 주소) */
1256
+ href: string;
1257
+ text: string;
1258
+ /** 처음 활성 항목 (autoActive가 아니면 계속 활성 표시) */
1259
+ active?: boolean;
1260
+ }
1261
+ /** 콘텐츠 내 탐색 항목 클릭 이벤트 */
1262
+ export interface KrdsInPageNavClick {
1263
+ item: KrdsInPageNavItem;
1264
+ event: MouseEvent | KeyboardEvent;
1265
+ }
1266
+ /** 콘텐츠 내 탐색 아래쪽 버튼 영역 (`<div krdsInPageAction>`) */
1267
+ export declare class KrdsInPageAction {
1268
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsInPageAction, never>;
1269
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsInPageAction, "[krdsInPageAction]", never, {}, {}, never, never, true, never>;
1270
+ }
1271
+ /**
1272
+ * KRDS 콘텐츠 내 탐색. #id 항목을 누르면 고정 헤더 높이만큼 비켜 부드럽게 스크롤하고, 키보드로 누르면 그 섹션의 제목으로 초점을 옮긴다.
1273
+ * autoActive면 스크롤 위치에 따라 현재 섹션을 표시한다 (aria-current). 아래쪽 버튼 등은 `[krdsInPageAction]` 요소로 넣는다
1274
+ *
1275
+ * @example <krds-in-page-navigation heading="전입 신고" [items]="[{ href: '#target', text: '신청 대상' }, { href: '#docs', text: '구비 서류' }]" />
1276
+ */
1277
+ export declare class KrdsInPageNavigation {
1278
+ /** 페이지 제목 (title 속성은 기본 툴팁이 되므로 heading으로 받음) */
1279
+ readonly heading: import("@angular/core").InputSignal<string | undefined>;
1280
+ /** 머리 문구 */
1281
+ readonly caption: import("@angular/core").InputSignal<string>;
1282
+ /** 항목 */
1283
+ readonly items: import("@angular/core").InputSignal<KrdsInPageNavItem[]>;
1284
+ /** 스크롤 위치에 따라 현재 섹션 표시 */
1285
+ readonly autoActive: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1286
+ /** 스크롤할 때 비켜 갈 고정 헤더 요소들 */
1287
+ readonly headerTopSelector: import("@angular/core").InputSignal<string>;
1288
+ readonly headerInnerSelector: import("@angular/core").InputSignal<string>;
1289
+ /** 항목을 눌렀을 때 */
1290
+ readonly itemClick: import("@angular/core").OutputEmitterRef<KrdsInPageNavClick>;
1291
+ private readonly document;
1292
+ private readonly activeHref;
1293
+ constructor();
1294
+ protected isActive(item: KrdsInPageNavItem): boolean;
1295
+ protected onKey(item: KrdsInPageNavItem, event: Event): void;
1296
+ protected select(item: KrdsInPageNavItem, event: MouseEvent | KeyboardEvent): void;
1297
+ /** 스크롤 위치로 현재 섹션 (끝까지 내리면 마지막, 첫 섹션 위면 첫 섹션) */
1298
+ private updateActive;
1299
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsInPageNavigation, never>;
1300
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsInPageNavigation, "krds-in-page-navigation", never, {
1301
+ "heading": {
1302
+ "alias": "heading";
1303
+ "required": false;
1304
+ "isSignal": true;
1305
+ };
1306
+ "caption": {
1307
+ "alias": "caption";
1308
+ "required": false;
1309
+ "isSignal": true;
1310
+ };
1311
+ "items": {
1312
+ "alias": "items";
1313
+ "required": false;
1314
+ "isSignal": true;
1315
+ };
1316
+ "autoActive": {
1317
+ "alias": "autoActive";
1318
+ "required": false;
1319
+ "isSignal": true;
1320
+ };
1321
+ "headerTopSelector": {
1322
+ "alias": "headerTopSelector";
1323
+ "required": false;
1324
+ "isSignal": true;
1325
+ };
1326
+ "headerInnerSelector": {
1327
+ "alias": "headerInnerSelector";
1328
+ "required": false;
1329
+ "isSignal": true;
1330
+ };
1331
+ }, {
1332
+ "itemClick": "itemClick";
1333
+ }, never, ["[krdsInPageAction]"], true, never>;
1334
+ }
1335
+ /** 입력 필드 크기 (KRDS 실제 규격) */
1336
+ export type KrdsInputSize = 'small' | 'medium' | 'large' | 'xlarge';
1337
+ /** 감싸는 컴포넌트가 입력 요소에 더 붙일 클래스 (날짜 입력 필드의 'datepicker cal' 등) */
1338
+ export declare const KRDS_INPUT_CLASS: InjectionToken<string>;
1339
+ /**
1340
+ * KRDS 텍스트 입력 필드·텍스트 영역. 기본 `<input>`·`<textarea>`에 KRDS 클래스만 붙이므로
1341
+ * 값·type·placeholder·maxlength·required·disabled는 기본 요소 그대로 쓴다 (`[(ngModel)]`, `formControlName` 포함).
1342
+ * `krdsControl`을 함께 적용하므로 폼 그룹 안에서는 label·도움말이 자동으로 연결된다
1343
+ *
1344
+ * @example
1345
+ * <krds-form-group label="이름" hint="실명을 입력하세요">
1346
+ * <input krdsInput [(ngModel)]="name" />
1347
+ * </krds-form-group>
1348
+ */
1349
+ export declare class KrdsInput {
1350
+ /** 크기 */
1351
+ readonly size: import("@angular/core").InputSignal<KrdsInputSize | undefined>;
1352
+ private readonly extraClass;
1353
+ protected readonly classes: import("@angular/core").Signal<string>;
1354
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsInput, never>;
1355
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsInput, "input[krdsInput], textarea[krdsInput]", never, {
1356
+ "size": {
1357
+ "alias": "size";
1358
+ "required": false;
1359
+ "isSignal": true;
1360
+ };
1361
+ }, {}, never, never, true, [{
1362
+ directive: typeof KrdsControl;
1363
+ inputs: {
1364
+ "id": "id";
1365
+ };
1366
+ outputs: {};
1367
+ }]>;
1368
+ }
1369
+ /** 언어 */
1370
+ export interface KrdsLanguage {
1371
+ /** 언어 코드 (lang 속성) */
1372
+ code: string;
1373
+ /** 그 언어로 쓴 이름 */
1374
+ name: string;
1375
+ /** 다른 누리집으로 가는 주소 (type="external") */
1376
+ url?: string;
1377
+ }
1378
+ /** 언어 목록 위쪽 영역 (현재 언어 안내 등, `<div krdsLanguageTop>`) */
1379
+ export declare class KrdsLanguageTop {
1380
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsLanguageTop, never>;
1381
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsLanguageTop, "[krdsLanguageTop]", never, {}, {}, never, never, true, never>;
1382
+ }
1383
+ /**
1384
+ * KRDS 언어 변경. 버튼으로 언어 목록을 열고, 고르면 `[(language)]`를 바꾸고 닫은 뒤 버튼으로 초점을 돌려준다.
1385
+ * type="external"이면 언어별 누리집으로 가는 새 창 링크 목록이다. 버튼 글자는 내용으로 넣는다
1386
+ *
1387
+ * @example
1388
+ * <krds-language-switcher [languages]="languages" [(language)]="lang">
1389
+ * 언어변경
1390
+ * <div krdsLanguageTop><p class="current-laguage"><span>현재 언어</span><strong>한국어</strong></p></div>
1391
+ * </krds-language-switcher>
1392
+ */
1393
+ export declare class KrdsLanguageSwitcher {
1394
+ /** 언어 목록 */
1395
+ readonly languages: import("@angular/core").InputSignal<KrdsLanguage[]>;
1396
+ /** 고른 언어 코드 */
1397
+ readonly language: import("@angular/core").ModelSignal<string>;
1398
+ /** default는 언어 선택, external은 언어별 누리집 링크 */
1399
+ readonly type: import("@angular/core").InputSignal<"default" | "external">;
1400
+ /** 언어를 골라 목록을 닫았을 때 */
1401
+ readonly closed: import("@angular/core").OutputEmitterRef<void>;
1402
+ private readonly dropdown;
1403
+ protected select(event: MouseEvent, code: string): void;
1404
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsLanguageSwitcher, never>;
1405
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsLanguageSwitcher, "krds-language-switcher", never, {
1406
+ "languages": {
1407
+ "alias": "languages";
1408
+ "required": true;
1409
+ "isSignal": true;
1410
+ };
1411
+ "language": {
1412
+ "alias": "language";
1413
+ "required": false;
1414
+ "isSignal": true;
1415
+ };
1416
+ "type": {
1417
+ "alias": "type";
1418
+ "required": false;
1419
+ "isSignal": true;
1420
+ };
1421
+ }, {
1422
+ "language": "languageChange";
1423
+ "closed": "closed";
1424
+ }, never, ["*", "[krdsLanguageTop]"], true, [{
1425
+ directive: typeof KrdsDropdown;
1426
+ inputs: {
1427
+ "position": "dropPosition";
1428
+ };
1429
+ outputs: {};
1430
+ }]>;
1431
+ }
1432
+ /** 레이아웃 크기 */
1433
+ export interface KrdsLayoutSize {
1434
+ width: number;
1435
+ height: number;
1436
+ }
1437
+ /** 스크롤 정보 */
1438
+ export interface KrdsLayoutScroll {
1439
+ scrollY: number;
1440
+ scrollHeight: number;
1441
+ /** 본문(#container) 위쪽에서 50px 넘게 내려온 뒤의 스크롤 방향 (그 위에서는 null) */
1442
+ direction: 'up' | 'down' | null;
1443
+ }
1444
+ /**
1445
+ * KRDS 페이지 레이아웃(.g-wrap). 본문(#container) 아래로 스크롤하면 방향에 따라 scroll-down·scroll-up 클래스를 붙여
1446
+ * KRDS CSS가 내려갈 때 헤더를 숨기고 올라올 때 보이게 한다 (도움 패널도 이 클래스를 보고 위치를 맞춤)
1447
+ *
1448
+ * @example
1449
+ * <div krdsLayout>
1450
+ * <div krdsSkipLink>...</div>
1451
+ * <header krdsHeader>...</header>
1452
+ * <div id="container">...</div>
1453
+ * </div>
1454
+ */
1455
+ export declare class KrdsLayout {
1456
+ /** id (KRDS 기준 wrap) */
1457
+ readonly id: import("@angular/core").InputSignal<string>;
1458
+ /** 스크롤 방향 감지 */
1459
+ readonly scrollDetection: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1460
+ /** 스크롤할 때 (resize·scroll은 기본 DOM 이벤트와 겹쳐 쓰지 않음) */
1461
+ readonly scrolled: import("@angular/core").OutputEmitterRef<KrdsLayoutScroll>;
1462
+ /** 레이아웃 크기가 바뀔 때 */
1463
+ readonly resized: import("@angular/core").OutputEmitterRef<KrdsLayoutSize>;
1464
+ /** 문서 높이가 바뀔 때 */
1465
+ readonly scrollHeightChange: import("@angular/core").OutputEmitterRef<number>;
1466
+ protected readonly direction: import("@angular/core").WritableSignal<"up" | "down" | null>;
1467
+ private readonly host;
1468
+ private readonly document;
1469
+ private lastScrollY;
1470
+ private scrollHeight;
1471
+ constructor();
1472
+ private onScroll;
1473
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsLayout, never>;
1474
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsLayout, "[krdsLayout]", never, {
1475
+ "id": {
1476
+ "alias": "id";
1477
+ "required": false;
1478
+ "isSignal": true;
1479
+ };
1480
+ "scrollDetection": {
1481
+ "alias": "scrollDetection";
1482
+ "required": false;
1483
+ "isSignal": true;
1484
+ };
1485
+ }, {
1486
+ "scrolled": "scrolled";
1487
+ "resized": "resized";
1488
+ "scrollHeightChange": "scrollHeightChange";
1489
+ }, never, never, true, never>;
1490
+ }
1491
+ /** 링크 크기 (링크는 small, medium, large만 지원) */
1492
+ export type KrdsLinkSize = 'small' | 'medium' | 'large';
1493
+ /**
1494
+ * KRDS 링크. 기본 `<a>`에 KRDS 클래스만 붙이므로 href·target·title·rel은 기본 속성 그대로 쓴다.
1495
+ * 새 창 링크는 `title="새 창 열림"`으로 그 사실을 알린다
1496
+ *
1497
+ * @example <a krdsLink href="https://www.krds.go.kr" target="_blank" title="새 창 열림" size="small">KRDS</a>
1498
+ */
1499
+ export declare class KrdsLink {
1500
+ /** 링크 크기 */
1501
+ readonly size: import("@angular/core").InputSignal<KrdsLinkSize | undefined>;
1502
+ /** link 클래스 적용 여부 */
1503
+ readonly link: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1504
+ /** 본문 텍스트 컬러 링크 */
1505
+ readonly basic: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1506
+ /** Pure 링크 여부 (가상클래스 상태 시 컬러 유지) */
1507
+ readonly pure: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1508
+ protected readonly classes: import("@angular/core").Signal<string>;
1509
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsLink, never>;
1510
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsLink, "a[krdsLink]", never, {
1511
+ "size": {
1512
+ "alias": "size";
1513
+ "required": false;
1514
+ "isSignal": true;
1515
+ };
1516
+ "link": {
1517
+ "alias": "link";
1518
+ "required": false;
1519
+ "isSignal": true;
1520
+ };
1521
+ "basic": {
1522
+ "alias": "basic";
1523
+ "required": false;
1524
+ "isSignal": true;
1525
+ };
1526
+ "pure": {
1527
+ "alias": "pure";
1528
+ "required": false;
1529
+ "isSignal": true;
1530
+ };
1531
+ }, {}, never, never, true, never>;
1532
+ }
1533
+ /**
1534
+ * 새 창 링크. target·rel과 '새 창 열림' 안내(title)를 붙인다 (`[krdsExternal]="false"`면 붙이지 않음)
1535
+ *
1536
+ * @example <a href="https://www.gov.kr" krdsExternal>정부24</a>
1537
+ */
1538
+ export declare class KrdsExternalLink {
1539
+ /** 새 창으로 열기 */
1540
+ readonly krdsExternal: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1541
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsExternalLink, never>;
1542
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsExternalLink, "a[krdsExternal]", never, {
1543
+ "krdsExternal": {
1544
+ "alias": "krdsExternal";
1545
+ "required": false;
1546
+ "isSignal": true;
1547
+ };
1548
+ }, {}, never, never, true, never>;
1549
+ }
1550
+ /** 메인 메뉴 렌더링 방식: PC 메가 메뉴 또는 모바일 드로어 */
1551
+ export type KrdsMainMenuVariant = 'pc' | 'mobile';
1552
+ /** 서브 패널 배치: default는 배너가 아래, between은 배너가 오른쪽 */
1553
+ export type KrdsMainMenuLayout = 'default' | 'between';
1554
+ /** 모바일 4단계 항목 */
1555
+ export interface KrdsMainMenuDepth4Item {
1556
+ text: string;
1557
+ href?: string;
1558
+ /** 새 창 열림 */
1559
+ external?: boolean;
1560
+ /** 현재 페이지 */
1561
+ selected?: boolean;
1562
+ }
1563
+ /** 링크 항목 (PC 서브 패널의 마지막 단계, 모바일 3단계) */
1564
+ export interface KrdsMainMenuLinkItem {
1565
+ text: string;
1566
+ /** 링크 주소 (없으면 button) */
1567
+ href?: string;
1568
+ external?: boolean;
1569
+ /** 메뉴 설명 (PC type-description) */
1570
+ description?: string;
1571
+ selected?: boolean;
1572
+ /** 모바일 4단계 패널 제목 (기본: text) */
1573
+ panelTitle?: string;
1574
+ /** 모바일 4단계 항목 */
1575
+ items?: KrdsMainMenuDepth4Item[];
1576
+ }
1577
+ /** 2단계 항목 (items가 있으면 서브 패널을 여는 버튼, 없으면 바로가기 링크) */
1578
+ export interface KrdsMainMenuSubItem {
1579
+ text: string;
1580
+ href?: string;
1581
+ external?: boolean;
1582
+ /** 서브 패널 제목 (기본: text) */
1583
+ title?: string;
1584
+ /** 서브 패널 제목 옆 바로가기 링크 (PC) */
1585
+ titleLink?: {
1586
+ text?: string;
1587
+ href: string;
1588
+ };
1589
+ items?: KrdsMainMenuLinkItem[];
1590
+ /** 배너 영역 표시 (krdsMainMenuBanner 템플릿, PC) */
1591
+ banner?: boolean;
1592
+ layout?: KrdsMainMenuLayout;
1593
+ /** 모바일 3단계 처음 펼침 */
1594
+ expanded?: boolean;
1595
+ selected?: boolean;
1596
+ }
1597
+ /** 1단계 항목 (subItems가 있으면 2단계 목록이 있는 패널, items만 있으면 링크만 나열하는 single-list 패널, 둘 다 없으면 링크) */
1598
+ export interface KrdsMainMenuItem {
1599
+ text: string;
1600
+ href?: string;
1601
+ external?: boolean;
1602
+ subItems?: KrdsMainMenuSubItem[];
1603
+ items?: KrdsMainMenuLinkItem[];
1604
+ /** single-list 패널 제목 */
1605
+ title?: string;
1606
+ banner?: boolean;
1607
+ layout?: KrdsMainMenuLayout;
1608
+ selected?: boolean;
1609
+ }
1610
+ /** 메뉴 항목 클릭 이벤트 (라우터로 이동하려면 event.preventDefault()) */
1611
+ export interface KrdsMainMenuClick {
1612
+ item: KrdsMainMenuItem | KrdsMainMenuSubItem | KrdsMainMenuLinkItem | KrdsMainMenuDepth4Item;
1613
+ event: MouseEvent;
1614
+ }
1615
+ /** PC 패널 열림 이벤트 */
1616
+ export interface KrdsMainMenuToggle {
1617
+ index: number;
1618
+ expanded: boolean;
1619
+ }
1620
+ /** PC 서브 패널 배너 템플릿 컨텍스트 */
1621
+ export interface KrdsMainMenuBannerContext {
1622
+ $implicit: KrdsMainMenuItem;
1623
+ item: KrdsMainMenuItem;
1624
+ subItem?: KrdsMainMenuSubItem;
1625
+ index: number;
1626
+ subIndex: number;
1627
+ }
1628
+ /** PC 서브 패널 배너 (`<ng-template krdsMainMenuBanner let-item let-subItem="subItem">`) */
1629
+ export declare class KrdsMainMenuBanner {
1630
+ readonly template: TemplateRef<KrdsMainMenuBannerContext>;
1631
+ static ngTemplateContextGuard(_dir: KrdsMainMenuBanner, _ctx: unknown): _ctx is KrdsMainMenuBannerContext;
1632
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsMainMenuBanner, never>;
1633
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsMainMenuBanner, "ng-template[krdsMainMenuBanner]", never, {}, {}, never, never, true, never>;
1634
+ }
1635
+ /** 모바일 드로어 아래쪽 영역 (`<div krdsMainMenuBottom>`) */
1636
+ export declare class KrdsMainMenuBottom {
1637
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsMainMenuBottom, never>;
1638
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsMainMenuBottom, "[krdsMainMenuBottom]", never, {}, {}, never, never, true, never>;
1639
+ }
1640
+ /**
1641
+ * KRDS 메인 메뉴. variant="pc"는 메가 메뉴, variant="mobile"은 드로어다.
1642
+ * - PC: 1단계 버튼으로 패널을 열고 닫고, Esc·바깥 클릭·초점 이탈로 닫는다. 1·2단계 버튼은 Home·End·방향키로 옮긴다. 열리면 배경을 어둡게 한다
1643
+ * - 모바일: `[(open)]`으로 드로어를 열고 닫고, 열리면 드로어로 초점을 옮겨 Tab을 가두며 닫히면 연 요소로 돌려준다. 1단계 탭은 해당 패널로 스크롤하고, 3단계는 펼치고, 4단계는 패널로 연다
1644
+ *
1645
+ * @example
1646
+ * <krds-main-menu [items]="menu" (itemClick)="navigate($event)" />
1647
+ * <krds-main-menu variant="mobile" [items]="menu" [(open)]="menuOpen">
1648
+ * <div krdsMainMenuHeader>로그인</div>
1649
+ * </krds-main-menu>
1650
+ */
1651
+ export declare class KrdsMainMenu {
1652
+ /** 메뉴 항목 */
1653
+ readonly items: import("@angular/core").InputSignal<KrdsMainMenuItem[]>;
1654
+ /** 렌더링 방식 */
1655
+ readonly variant: import("@angular/core").InputSignal<KrdsMainMenuVariant>;
1656
+ /** 메뉴 이름 */
1657
+ readonly label: import("@angular/core").InputSignal<string>;
1658
+ /** 모바일 드로어 열림 */
1659
+ readonly open: import("@angular/core").ModelSignal<boolean>;
1660
+ /** 모바일 드로어 id (바깥 열기 버튼의 aria-controls 대상) */
1661
+ readonly mobileId: import("@angular/core").InputSignal<string>;
1662
+ /** PC 패널이 열리면 배경을 어둡게 */
1663
+ readonly backdrop: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1664
+ /** 모바일 닫기 버튼 문구 */
1665
+ readonly closeLabel: import("@angular/core").InputSignal<string>;
1666
+ /** PC 패널을 열거나 닫았을 때 */
1667
+ readonly menuToggle: import("@angular/core").OutputEmitterRef<KrdsMainMenuToggle>;
1668
+ /** 메뉴 항목을 클릭했을 때 */
1669
+ readonly itemClick: import("@angular/core").OutputEmitterRef<KrdsMainMenuClick>;
1670
+ protected readonly bannerTemplate: import("@angular/core").Signal<KrdsMainMenuBanner | undefined>;
1671
+ private readonly uid;
1672
+ private readonly host;
1673
+ private readonly document;
1674
+ private readonly injector;
1675
+ protected readonly openIndex: import("@angular/core").WritableSignal<number>;
1676
+ private readonly subOverrides;
1677
+ protected readonly panelMinHeight: import("@angular/core").WritableSignal<number>;
1678
+ private backdropEl;
1679
+ protected readonly activeTab: import("@angular/core").WritableSignal<number>;
1680
+ private readonly depth3Expanded;
1681
+ protected readonly depth4Displayed: import("@angular/core").WritableSignal<string | null>;
1682
+ protected readonly depth4Opened: import("@angular/core").WritableSignal<string | null>;
1683
+ protected readonly drawerDisplayed: import("@angular/core").WritableSignal<boolean>;
1684
+ protected readonly drawerOpened: import("@angular/core").WritableSignal<boolean>;
1685
+ private depth4Trigger;
1686
+ private previousFocus;
1687
+ private drawerTimer?;
1688
+ private drawerInitialized;
1689
+ constructor();
1690
+ protected panelId(i: number): string;
1691
+ protected subPanelId(i: number, j: number): string;
1692
+ protected tabId(i: number): string;
1693
+ protected depth3Id(i: number, j: number): string;
1694
+ protected hasPanel(item: KrdsMainMenuItem): boolean;
1695
+ protected hasDescription(links?: KrdsMainMenuLinkItem[]): boolean;
1696
+ protected onItemClick(item: KrdsMainMenuClick['item'], event: MouseEvent): void;
1697
+ /** 원본처럼 링크가 아닌 첫 2단계를 기본으로 연다 */
1698
+ protected activeSub(i: number): number;
1699
+ private mainTriggers;
1700
+ protected toggleMain(i: number): void;
1701
+ protected closeMain(restoreFocus?: boolean): void;
1702
+ protected selectSub(i: number, j: number): void;
1703
+ /** 서브 패널이 absolute라 열린 패널 높이에 맞춰 목록 최소 높이를 맞춘다 */
1704
+ private adjustPanelHeight;
1705
+ private removeBackdrop;
1706
+ protected onDocumentClick(event: MouseEvent): void;
1707
+ protected onPcFocusout(event: FocusEvent, root: HTMLElement): void;
1708
+ protected onPcKeydown(event: KeyboardEvent): void;
1709
+ /** PC와 같은 메뉴 데이터로 쓰도록 single-list(items)와 하위 메뉴 없는 링크도 패널에 링크로 보여 준다 */
1710
+ protected mobileSubItems(item: KrdsMainMenuItem): KrdsMainMenuSubItem[];
1711
+ private initialDepth3;
1712
+ protected depth3Open(key: string): boolean;
1713
+ protected toggleDepth3(event: MouseEvent, key: string): void;
1714
+ /** 4단계 패널: 먼저 보이게 한 뒤 열림 클래스를 붙이고(전환), 이전화면 버튼으로 초점 */
1715
+ protected openDepth4(event: MouseEvent, key: string, trigger: HTMLElement): void;
1716
+ protected closeDepth4(): void;
1717
+ /** 1단계 탭을 누르면 해당 패널 위치로 스크롤 */
1718
+ protected onTabClick(event: MouseEvent, i: number, body: HTMLElement): void;
1719
+ /** 스크롤 위치에 따라 활성 탭 */
1720
+ protected onBodyScroll(body: HTMLElement): void;
1721
+ private openDrawer;
1722
+ private closeDrawer;
1723
+ protected onMobileKeydown(event: KeyboardEvent, wrap: HTMLElement): void;
1724
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsMainMenu, never>;
1725
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsMainMenu, "krds-main-menu", never, {
1726
+ "items": {
1727
+ "alias": "items";
1728
+ "required": false;
1729
+ "isSignal": true;
1730
+ };
1731
+ "variant": {
1732
+ "alias": "variant";
1733
+ "required": false;
1734
+ "isSignal": true;
1735
+ };
1736
+ "label": {
1737
+ "alias": "label";
1738
+ "required": false;
1739
+ "isSignal": true;
1740
+ };
1741
+ "open": {
1742
+ "alias": "open";
1743
+ "required": false;
1744
+ "isSignal": true;
1745
+ };
1746
+ "mobileId": {
1747
+ "alias": "mobileId";
1748
+ "required": false;
1749
+ "isSignal": true;
1750
+ };
1751
+ "backdrop": {
1752
+ "alias": "backdrop";
1753
+ "required": false;
1754
+ "isSignal": true;
1755
+ };
1756
+ "closeLabel": {
1757
+ "alias": "closeLabel";
1758
+ "required": false;
1759
+ "isSignal": true;
1760
+ };
1761
+ }, {
1762
+ "open": "openChange";
1763
+ "menuToggle": "menuToggle";
1764
+ "itemClick": "itemClick";
1765
+ }, ["bannerTemplate"], ["[krdsMainMenuHeader]", "[krdsMainMenuBottom]"], true, never>;
1766
+ }
1767
+ /**
1768
+ * KRDS 공식 배너. 페이지 맨 위에 대한민국 공식 전자정부 누리집임을 알린다 (KRDS CSS가 id #krds-masthead로 스타일을 줌)
1769
+ *
1770
+ * @example <div krdsMasthead>이 누리집은 대한민국 공식 전자정부 누리집입니다.</div>
1771
+ */
1772
+ export declare class KrdsMasthead {
1773
+ /** id (KRDS CSS 기준 krds-masthead) */
1774
+ readonly id: import("@angular/core").InputSignal<string>;
1775
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsMasthead, never>;
1776
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsMasthead, "[krdsMasthead]", never, {
1777
+ "id": {
1778
+ "alias": "id";
1779
+ "required": false;
1780
+ "isSignal": true;
1781
+ };
1782
+ }, {}, never, ["*"], true, never>;
1783
+ }
1784
+ /** 원고(설명적 원고): 화면과 소리의 정보를 글로 옮긴 내용 (`<div krdsMediaTranscript>`, '원고 보기'로 펼침) */
1785
+ export declare class KrdsMediaTranscript {
1786
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsMediaTranscript, never>;
1787
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsMediaTranscript, "[krdsMediaTranscript]", never, {}, {}, never, never, true, never>;
1788
+ }
1789
+ /**
1790
+ * KRDS 접근 가능한 미디어. 기본 `<figure>`에 붙여 제목·재생기·원고를 묶는다.
1791
+ * 재생기는 기본 `<video controls>`·`<audio controls>`(자막 track 포함)나 외부 재생기(유튜브 iframe 등)를 그대로 넣는다.
1792
+ * 개발 모드에서는 자막·원고가 모두 없거나(오디오·외부 재생기는 원고가 없으면) 자동 재생이면 경고한다
1793
+ *
1794
+ * @example
1795
+ * <figure krdsMedia heading="민원 신청 안내 영상">
1796
+ * <video controls preload="metadata" src="/guide.mp4">
1797
+ * <track kind="captions" src="/guide.ko.vtt" srclang="ko" label="한국어" default />
1798
+ * </video>
1799
+ * <div krdsMediaTranscript><p>민원 신청은 세 단계로 진행됩니다.</p></div>
1800
+ * </figure>
1801
+ */
1802
+ export declare class KrdsMedia {
1803
+ /** 미디어 제목 (화면낭독기가 미디어 영역 이름으로 읽음, title 속성은 기본 툴팁이 되므로 heading으로 받음) */
1804
+ readonly heading: import("@angular/core").InputSignal<string>;
1805
+ /** 제목을 화면에서 숨김 (화면낭독기는 읽음) */
1806
+ readonly hideHeading: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1807
+ protected readonly transcript: import("@angular/core").Signal<KrdsMediaTranscript | undefined>;
1808
+ constructor();
1809
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsMedia, never>;
1810
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsMedia, "figure[krdsMedia]", never, {
1811
+ "heading": {
1812
+ "alias": "heading";
1813
+ "required": true;
1814
+ "isSignal": true;
1815
+ };
1816
+ "hideHeading": {
1817
+ "alias": "hideHeading";
1818
+ "required": false;
1819
+ "isSignal": true;
1820
+ };
1821
+ }, {}, ["transcript"], ["*", "[krdsMediaTranscript]"], true, never>;
1822
+ }
1823
+ /** 모달 크기 */
1824
+ export type KrdsModalSize = 'small' | 'medium' | 'large';
1825
+ /** 모달 아래쪽 버튼 영역 (`<div krdsModalFooter>`) */
1826
+ export declare class KrdsModalFooter {
1827
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsModalFooter, never>;
1828
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsModalFooter, "[krdsModalFooter]", never, {}, {}, never, never, true, never>;
1829
+ }
1830
+ /**
1831
+ * KRDS 모달. `[(open)]`으로 열고 닫고, 브라우저에서는 body 끝으로 옮겨 다른 요소의 쌓임 순서에 가리지 않게 한다.
1832
+ * 열리면 내용으로 초점을 옮기고 Tab 초점을 모달 안에 가두며 배경 스크롤을 막고, 닫히면 연 요소로 초점을 돌려준다.
1833
+ * Esc·배경 클릭으로 닫히고 `persistent`면 닫기·버튼으로만 닫힌다
1834
+ *
1835
+ * @example
1836
+ * <krds-modal heading="신청을 취소할까요?" [(open)]="confirmOpen">
1837
+ * <p>취소하면 입력한 내용이 사라집니다.</p>
1838
+ * <div krdsModalFooter>
1839
+ * <button krdsButton variant="tertiary" (click)="confirmOpen.set(false)">아니요</button>
1840
+ * <button krdsButton (click)="cancel()">예</button>
1841
+ * </div>
1842
+ * </krds-modal>
1843
+ */
1844
+ export declare class KrdsModal {
1845
+ /** 열림 여부 */
1846
+ readonly open: import("@angular/core").ModelSignal<boolean>;
1847
+ /** 제목 (대화 상자의 이름) */
1848
+ readonly heading: import("@angular/core").InputSignal<string>;
1849
+ /** 대화 상자 id (없으면 자동 생성) */
1850
+ readonly modalId: import("@angular/core").InputSignal<string | undefined>;
1851
+ /** 배경을 어둡게 */
1852
+ readonly backdrop: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1853
+ /** 크기 */
1854
+ readonly size: import("@angular/core").InputSignal<KrdsModalSize>;
1855
+ /** 화면 전체 */
1856
+ readonly full: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1857
+ /** 바텀시트 (모바일 아래에서 올라옴) */
1858
+ readonly bottomSheet: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1859
+ /** Esc·배경 클릭으로 닫지 않음 */
1860
+ readonly persistent: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
1861
+ private readonly uid;
1862
+ protected readonly id: import("@angular/core").Signal<string>;
1863
+ protected readonly titleId: import("@angular/core").Signal<string>;
1864
+ protected readonly sizeClass: import("@angular/core").Signal<string>;
1865
+ private readonly host;
1866
+ private readonly document;
1867
+ private opened;
1868
+ private originalOverflow;
1869
+ private previousFocus;
1870
+ constructor();
1871
+ private restore;
1872
+ protected onKeydown(event: KeyboardEvent): void;
1873
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsModal, never>;
1874
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsModal, "krds-modal", never, {
1875
+ "open": {
1876
+ "alias": "open";
1877
+ "required": false;
1878
+ "isSignal": true;
1879
+ };
1880
+ "heading": {
1881
+ "alias": "heading";
1882
+ "required": true;
1883
+ "isSignal": true;
1884
+ };
1885
+ "modalId": {
1886
+ "alias": "modalId";
1887
+ "required": false;
1888
+ "isSignal": true;
1889
+ };
1890
+ "backdrop": {
1891
+ "alias": "backdrop";
1892
+ "required": false;
1893
+ "isSignal": true;
1894
+ };
1895
+ "size": {
1896
+ "alias": "size";
1897
+ "required": false;
1898
+ "isSignal": true;
1899
+ };
1900
+ "full": {
1901
+ "alias": "full";
1902
+ "required": false;
1903
+ "isSignal": true;
1904
+ };
1905
+ "bottomSheet": {
1906
+ "alias": "bottomSheet";
1907
+ "required": false;
1908
+ "isSignal": true;
1909
+ };
1910
+ "persistent": {
1911
+ "alias": "persistent";
1912
+ "required": false;
1913
+ "isSignal": true;
1914
+ };
1915
+ }, {
1916
+ "open": "openChange";
1917
+ }, never, ["*", "[krdsModalFooter]"], true, never>;
1918
+ }
1919
+ type PageItem = {
1920
+ type: 'page';
1921
+ page: number;
1922
+ } | {
1923
+ type: 'ellipsis';
1924
+ key: string;
1925
+ };
1926
+ /**
1927
+ * KRDS 페이지네이션. 현재 페이지는 `[(page)]`로 주고받는다. 처음·끝 페이지는 늘 보이고, 나머지는 현재 페이지 주변 pageRange개만 보이며 그 밖은 생략(…)으로 줄인다.
1928
+ * 링크를 눌러도 주소는 바뀌지 않는다 (기본 동작을 막고 page만 바꿈).
1929
+ * 첫·끝 페이지의 이전·다음은 비활성 링크(href 없이 aria-disabled)로 남겨, 화면낭독기가 "이전, 링크, 사용 불가"로 읽는다
1930
+ *
1931
+ * @example <nav krdsPagination [max]="20" [(page)]="page"></nav>
1932
+ */
1933
+ export declare class KrdsPagination {
1934
+ /** 현재 페이지 */
1935
+ readonly page: import("@angular/core").ModelSignal<number>;
1936
+ /** 첫 페이지 */
1937
+ readonly min: import("@angular/core").InputSignalWithTransform<number, unknown>;
1938
+ /** 마지막 페이지 */
1939
+ readonly max: import("@angular/core").InputSignalWithTransform<number, unknown>;
1940
+ /** 가운데에 보일 페이지 수 */
1941
+ readonly pageRange: import("@angular/core").InputSignalWithTransform<number, unknown>;
1942
+ /** 내비게이션 이름 */
1943
+ readonly label: import("@angular/core").InputSignal<string>;
1944
+ protected readonly minPage: import("@angular/core").Signal<number>;
1945
+ protected readonly current: import("@angular/core").Signal<number>;
1946
+ protected readonly pages: import("@angular/core").Signal<PageItem[]>;
1947
+ protected go(event: MouseEvent, page: number): void;
1948
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsPagination, never>;
1949
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsPagination, "nav[krdsPagination]", never, {
1950
+ "page": {
1951
+ "alias": "page";
1952
+ "required": false;
1953
+ "isSignal": true;
1954
+ };
1955
+ "min": {
1956
+ "alias": "min";
1957
+ "required": false;
1958
+ "isSignal": true;
1959
+ };
1960
+ "max": {
1961
+ "alias": "max";
1962
+ "required": true;
1963
+ "isSignal": true;
1964
+ };
1965
+ "pageRange": {
1966
+ "alias": "pageRange";
1967
+ "required": false;
1968
+ "isSignal": true;
1969
+ };
1970
+ "label": {
1971
+ "alias": "label";
1972
+ "required": false;
1973
+ "isSignal": true;
1974
+ };
1975
+ }, {
1976
+ "page": "pageChange";
1977
+ }, never, never, true, never>;
1978
+ }
1979
+ /**
1980
+ * KRDS 도움 패널. 도움말 버튼으로 오른쪽 패널을 열고, 접어두기로 닫는다 (`[(open)]`).
1981
+ * 원본처럼 보이는 공식 배너·헤더 높이만큼 버튼과 패널 내용을 내려 헤더에 가려지지 않게 하고,
1982
+ * 같은 오른쪽에 고정되는 콘텐츠 내 탐색이 버튼 아래에 서도록 버튼 아래쪽 끝을 CSS 변수로 알린다
1983
+ *
1984
+ * @example <krds-panel [(open)]="helpOpen"><krds-tabs [tabs]="tabs">...</krds-tabs></krds-panel>
1985
+ */
1986
+ export declare class KrdsPanel {
1987
+ /** 열림 */
1988
+ readonly open: import("@angular/core").ModelSignal<boolean>;
1989
+ /** 높이만큼 비켜 갈 공식 배너·헤더 */
1990
+ readonly headerTopSelector: import("@angular/core").InputSignal<string>;
1991
+ readonly headerInnerSelector: import("@angular/core").InputSignal<string>;
1992
+ protected readonly headerOffset: import("@angular/core").WritableSignal<number>;
1993
+ private readonly expand;
1994
+ private readonly host;
1995
+ private readonly document;
1996
+ private readonly owner;
1997
+ private frame;
1998
+ constructor();
1999
+ /** 닫고, 패널 안에 있던 초점은 도움말 버튼으로 돌려준다 */
2000
+ protected close(): void;
2001
+ protected updateOffset(): void;
2002
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsPanel, never>;
2003
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsPanel, "krds-panel", never, {
2004
+ "open": {
2005
+ "alias": "open";
2006
+ "required": false;
2007
+ "isSignal": true;
2008
+ };
2009
+ "headerTopSelector": {
2010
+ "alias": "headerTopSelector";
2011
+ "required": false;
2012
+ "isSignal": true;
2013
+ };
2014
+ "headerInnerSelector": {
2015
+ "alias": "headerInnerSelector";
2016
+ "required": false;
2017
+ "isSignal": true;
2018
+ };
2019
+ }, {
2020
+ "open": "openChange";
2021
+ }, never, ["*"], true, never>;
2022
+ }
2023
+ /**
2024
+ * KRDS 수량 토글. 수량 값은 spinbutton(↑/↓ 1씩, Home/End 최솟값/최댓값)이고, −/+ 버튼은 탭 순서에서 빼고 누르면 초점을 수량 값으로 옮긴다
2025
+ * (끝값에서 버튼이 비활성화돼도 초점을 잃지 않고 화면낭독기가 바뀐 값을 읽음). 값은 `[(value)]`(Signal Forms `[formField]` 포함)
2026
+ *
2027
+ * @example <krds-quantity-toggle label="인원" [min]="1" [max]="9" [(value)]="count" />
2028
+ */
2029
+ export declare class KrdsQuantityToggle {
2030
+ /** 수량 (없으면 min) */
2031
+ readonly value: import("@angular/core").ModelSignal<number | undefined>;
2032
+ /** 레이블 */
2033
+ readonly label: import("@angular/core").InputSignal<string>;
2034
+ /** 레이블을 화면에서 숨김 (화면낭독기는 읽음) */
2035
+ readonly hideLabel: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2036
+ readonly min: import("@angular/core").InputSignalWithTransform<number, unknown>;
2037
+ readonly max: import("@angular/core").InputSignalWithTransform<number, unknown>;
2038
+ /** 세로형 (+ 버튼이 위) */
2039
+ readonly vertical: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2040
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2041
+ /** 수량 값 요소의 id */
2042
+ readonly id: import("@angular/core").InputSignal<string | undefined>;
2043
+ protected readonly labelId: string;
2044
+ protected readonly current: import("@angular/core").Signal<number>;
2045
+ private readonly spin;
2046
+ private update;
2047
+ protected stepBy(delta: number): void;
2048
+ protected onKeydown(event: KeyboardEvent): void;
2049
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsQuantityToggle, never>;
2050
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsQuantityToggle, "krds-quantity-toggle", never, {
2051
+ "value": {
2052
+ "alias": "value";
2053
+ "required": false;
2054
+ "isSignal": true;
2055
+ };
2056
+ "label": {
2057
+ "alias": "label";
2058
+ "required": true;
2059
+ "isSignal": true;
2060
+ };
2061
+ "hideLabel": {
2062
+ "alias": "hideLabel";
2063
+ "required": false;
2064
+ "isSignal": true;
2065
+ };
2066
+ "min": {
2067
+ "alias": "min";
2068
+ "required": false;
2069
+ "isSignal": true;
2070
+ };
2071
+ "max": {
2072
+ "alias": "max";
2073
+ "required": false;
2074
+ "isSignal": true;
2075
+ };
2076
+ "vertical": {
2077
+ "alias": "vertical";
2078
+ "required": false;
2079
+ "isSignal": true;
2080
+ };
2081
+ "disabled": {
2082
+ "alias": "disabled";
2083
+ "required": false;
2084
+ "isSignal": true;
2085
+ };
2086
+ "id": {
2087
+ "alias": "id";
2088
+ "required": false;
2089
+ "isSignal": true;
2090
+ };
2091
+ }, {
2092
+ "value": "valueChange";
2093
+ }, never, never, true, never>;
2094
+ }
2095
+ /** 선택 값을 보일 자리: handle은 손잡이 위, end는 슬라이더 끝 */
2096
+ export type KrdsRangeSliderValuePosition = 'handle' | 'end';
2097
+ /**
2098
+ * KRDS 범위슬라이드. 기본 `<input type="range">`(키보드·화면낭독기 지원)를 KRDS 모양으로 그리고 값은 `[(value)]`로 주고받는다.
2099
+ * Signal Forms의 `[formField]`로도 연결된다. 화면의 값 글자는 valueText로 바꿀 수 있고 화면낭독기는 aria-valuetext로 같은 글을 읽는다
2100
+ *
2101
+ * @example <krds-range-slider label="글자 크기" [min]="12" [max]="24" [step]="2" [valueText]="px" [(value)]="size" />
2102
+ */
2103
+ export declare class KrdsRangeSlider {
2104
+ /** 값 (없으면 min) */
2105
+ readonly value: import("@angular/core").ModelSignal<number | undefined>;
2106
+ /** 레이블 */
2107
+ readonly label: import("@angular/core").InputSignal<string>;
2108
+ /** 레이블을 화면에서 숨김 (화면낭독기는 읽음) */
2109
+ readonly hideLabel: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2110
+ readonly min: import("@angular/core").InputSignalWithTransform<number, unknown>;
2111
+ readonly max: import("@angular/core").InputSignalWithTransform<number, unknown>;
2112
+ readonly step: import("@angular/core").InputSignalWithTransform<number, unknown>;
2113
+ /** 값을 글자로 (예: v => v + 'px') */
2114
+ readonly valueText: import("@angular/core").InputSignal<((value: number) => string) | undefined>;
2115
+ /** 선택 값을 보일 자리 */
2116
+ readonly valuePosition: import("@angular/core").InputSignal<KrdsRangeSliderValuePosition>;
2117
+ /** input의 id (없으면 자동 생성) */
2118
+ readonly id: import("@angular/core").InputSignal<string | undefined>;
2119
+ /** 값을 확정했을 때 (손을 뗄 때, change는 안쪽 input의 기본 이벤트와 겹쳐 쓰지 않음) */
2120
+ readonly valueCommit: import("@angular/core").OutputEmitterRef<number>;
2121
+ private readonly uid;
2122
+ protected readonly inputId: import("@angular/core").Signal<string>;
2123
+ protected readonly current: import("@angular/core").Signal<number>;
2124
+ protected readonly percent: import("@angular/core").Signal<number>;
2125
+ /** 양 끝을 뺀 단계 눈금 위치 (0~1) */
2126
+ protected readonly ticks: import("@angular/core").Signal<number[]>;
2127
+ protected text(value: number): string;
2128
+ protected read(event: Event): number;
2129
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsRangeSlider, never>;
2130
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsRangeSlider, "krds-range-slider", never, {
2131
+ "value": {
2132
+ "alias": "value";
2133
+ "required": false;
2134
+ "isSignal": true;
2135
+ };
2136
+ "label": {
2137
+ "alias": "label";
2138
+ "required": true;
2139
+ "isSignal": true;
2140
+ };
2141
+ "hideLabel": {
2142
+ "alias": "hideLabel";
2143
+ "required": false;
2144
+ "isSignal": true;
2145
+ };
2146
+ "min": {
2147
+ "alias": "min";
2148
+ "required": false;
2149
+ "isSignal": true;
2150
+ };
2151
+ "max": {
2152
+ "alias": "max";
2153
+ "required": false;
2154
+ "isSignal": true;
2155
+ };
2156
+ "step": {
2157
+ "alias": "step";
2158
+ "required": false;
2159
+ "isSignal": true;
2160
+ };
2161
+ "valueText": {
2162
+ "alias": "valueText";
2163
+ "required": false;
2164
+ "isSignal": true;
2165
+ };
2166
+ "valuePosition": {
2167
+ "alias": "valuePosition";
2168
+ "required": false;
2169
+ "isSignal": true;
2170
+ };
2171
+ "id": {
2172
+ "alias": "id";
2173
+ "required": false;
2174
+ "isSignal": true;
2175
+ };
2176
+ }, {
2177
+ "value": "valueChange";
2178
+ "valueCommit": "valueCommit";
2179
+ }, never, never, true, never>;
2180
+ }
2181
+ /** 화면 크기 단계 */
2182
+ export type KrdsResizeScale = 'sm' | 'md' | 'lg' | 'xlg' | 'xxlg';
2183
+ /**
2184
+ * KRDS 화면 크기 조정. 목록에서 크기를 고르면 화면(body)을 확대·축소하고 `[(scale)]`를 바꾼 뒤 닫고 버튼으로 초점을 돌려준다
2185
+ *
2186
+ * @example <krds-resize [(scale)]="scale" />
2187
+ */
2188
+ export declare class KrdsResize {
2189
+ /** 화면 크기 (넘기거나 고르기 전에는 화면을 바꾸지 않고 '보통'으로 표시) */
2190
+ readonly scale: import("@angular/core").ModelSignal<KrdsResizeScale | undefined>;
2191
+ /** 크기를 골라 목록을 닫았을 때 */
2192
+ readonly closed: import("@angular/core").OutputEmitterRef<void>;
2193
+ protected readonly scales: {
2194
+ key: KrdsResizeScale;
2195
+ label: string;
2196
+ zoom: string;
2197
+ }[];
2198
+ private readonly dropdown;
2199
+ private readonly document;
2200
+ constructor();
2201
+ protected select(key: KrdsResizeScale): void;
2202
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsResize, never>;
2203
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsResize, "krds-resize", never, {
2204
+ "scale": {
2205
+ "alias": "scale";
2206
+ "required": false;
2207
+ "isSignal": true;
2208
+ };
2209
+ }, {
2210
+ "scale": "scaleChange";
2211
+ "closed": "closed";
2212
+ }, never, never, true, [{
2213
+ directive: typeof KrdsDropdown;
2214
+ inputs: {};
2215
+ outputs: {};
2216
+ }]>;
2217
+ }
2218
+ /** 셀렉트 크기 (KRDS 셀렉트 스타일에 있는 small·medium·large) */
2219
+ export type KrdsSelectSize = 'small' | 'medium' | 'large';
2220
+ /** 셀렉트 입력 상태 */
2221
+ export type KrdsSelectState = 'default' | 'error' | 'success' | 'information';
2222
+ /**
2223
+ * KRDS 셀렉트. 기본 `<select>`에 KRDS 클래스만 붙이므로 option·선택 값·disabled는 기본 요소 그대로 쓴다.
2224
+ * 선택 전 안내 문구는 `<option value="" disabled>선택</option>`으로 넣고, 이름은 label(보이는 레이블이 없으면 aria-label)로 준다.
2225
+ * `krdsControl`을 함께 적용하므로 폼 그룹 안에서는 label·도움말이 자동으로 연결된다
2226
+ *
2227
+ * @example
2228
+ * <krds-form-group label="지역">
2229
+ * <select krdsSelect [(ngModel)]="region">
2230
+ * <option value="" disabled>선택</option>
2231
+ * <option value="seoul">서울</option>
2232
+ * </select>
2233
+ * </krds-form-group>
2234
+ */
2235
+ export declare class KrdsSelect {
2236
+ /** 크기 */
2237
+ readonly size: import("@angular/core").InputSignal<KrdsSelectSize>;
2238
+ /** 입력 상태 */
2239
+ readonly state: import("@angular/core").InputSignal<KrdsSelectState>;
2240
+ /** 정렬 스타일 (목록 정렬 기준 선택용) */
2241
+ readonly sort: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2242
+ protected readonly classes: import("@angular/core").Signal<string>;
2243
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsSelect, never>;
2244
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsSelect, "select[krdsSelect]", never, {
2245
+ "size": {
2246
+ "alias": "size";
2247
+ "required": false;
2248
+ "isSignal": true;
2249
+ };
2250
+ "state": {
2251
+ "alias": "state";
2252
+ "required": false;
2253
+ "isSignal": true;
2254
+ };
2255
+ "sort": {
2256
+ "alias": "sort";
2257
+ "required": false;
2258
+ "isSignal": true;
2259
+ };
2260
+ }, {}, never, never, true, [{
2261
+ directive: typeof KrdsControl;
2262
+ inputs: {
2263
+ "id": "id";
2264
+ };
2265
+ outputs: {};
2266
+ }]>;
2267
+ }
2268
+ /** 사이드 메뉴 4단계(팝업 안) 항목 */
2269
+ export interface KrdsSideNavPopupItem {
2270
+ text: string;
2271
+ href?: string;
2272
+ }
2273
+ /** 사이드 메뉴 3단계 항목 (subItems가 있으면 팝업을 여는 버튼) */
2274
+ export interface KrdsSideNavSubItem {
2275
+ text: string;
2276
+ href?: string;
2277
+ /** 팝업 열림 */
2278
+ expanded?: boolean;
2279
+ /** 팝업 제목 (기본: text) */
2280
+ popupTitle?: string;
2281
+ subItems?: KrdsSideNavPopupItem[];
2282
+ }
2283
+ /** 사이드 메뉴 2단계 항목 (subItems가 있으면 펼침 버튼) */
2284
+ export interface KrdsSideNavItem {
2285
+ text: string;
2286
+ href?: string;
2287
+ /** 펼침 */
2288
+ expanded?: boolean;
2289
+ subItems?: KrdsSideNavSubItem[];
2290
+ }
2291
+ /** 사이드 메뉴 링크 클릭 이벤트 (라우터로 이동하려면 event.preventDefault()) */
2292
+ export interface KrdsSideNavClick {
2293
+ item: KrdsSideNavItem | KrdsSideNavSubItem | KrdsSideNavPopupItem;
2294
+ event: MouseEvent;
2295
+ }
2296
+ /**
2297
+ * KRDS 사이드 메뉴. 펼침 상태는 항목의 expanded로 `[(items)]`에 담아 주고받는다.
2298
+ * 2단계를 접으면 그 안의 팝업도 닫힌다. 3단계 팝업은 열면 제목 버튼으로 초점을 옮기고, 제목 버튼으로 닫으면 연 버튼으로 초점을 돌려주며, 초점이 밖으로 나가면 닫는다
2299
+ *
2300
+ * @example <nav krdsSideNavigation heading="민원 안내" [(items)]="menu"></nav>
2301
+ */
2302
+ export declare class KrdsSideNavigation {
2303
+ /** 메뉴 제목 (title 속성은 기본 툴팁이 되므로 heading으로 받음) */
2304
+ readonly heading: import("@angular/core").InputSignal<string>;
2305
+ /** 메뉴 항목 (expanded로 펼침 상태) */
2306
+ readonly items: import("@angular/core").ModelSignal<KrdsSideNavItem[]>;
2307
+ /** 링크를 클릭했을 때 */
2308
+ readonly itemClick: import("@angular/core").OutputEmitterRef<KrdsSideNavClick>;
2309
+ private readonly uid;
2310
+ protected menuId(i: number, j?: number): string;
2311
+ private updateSub;
2312
+ /** 2단계 펼치고 접기 (접으면 그 안의 팝업도 닫음) */
2313
+ protected toggleItem(i: number): void;
2314
+ private isOpen;
2315
+ /** 3단계 팝업 열고 닫기 (열면 전환이 끝난 뒤 제목 버튼으로 초점) */
2316
+ protected togglePopup(i: number, j: number, popup: HTMLElement, title: HTMLElement): void;
2317
+ /** 제목 버튼으로 닫으면 연 버튼으로 초점을 돌려준다 */
2318
+ protected closePopup(i: number, j: number, trigger?: HTMLElement): void;
2319
+ /**
2320
+ * 초점이 팝업 밖의 다른 요소로 옮겨 가면 닫고, 옮겨 간 초점은 그대로 둔다 (WAI-ARIA 메뉴 패턴).
2321
+ * 갈 곳 없이 빠진 초점(다른 창으로 전환 등)은 무시하고, 빈 곳 클릭은 문서 클릭으로 닫는다
2322
+ */
2323
+ protected onPopupFocusout(event: FocusEvent, i: number, j: number, popup: HTMLElement): void;
2324
+ /** 팝업 밖을 누르면 누른 항목의 팝업만 남기고 닫는다 */
2325
+ protected onDocumentClick(event: MouseEvent): void;
2326
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsSideNavigation, never>;
2327
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsSideNavigation, "nav[krdsSideNavigation]", never, {
2328
+ "heading": {
2329
+ "alias": "heading";
2330
+ "required": true;
2331
+ "isSignal": true;
2332
+ };
2333
+ "items": {
2334
+ "alias": "items";
2335
+ "required": false;
2336
+ "isSignal": true;
2337
+ };
2338
+ }, {
2339
+ "items": "itemsChange";
2340
+ "itemClick": "itemClick";
2341
+ }, never, never, true, never>;
2342
+ }
2343
+ /**
2344
+ * KRDS 건너뛰기 링크 묶음. KRDS CSS가 id(#krds-skip-link)로 스타일을 주므로 id만 붙이고, 링크는 기본 `<a>`로 넣는다.
2345
+ * 페이지 맨 앞에 두고 href는 같은 페이지의 #id로 쓴다
2346
+ *
2347
+ * @example
2348
+ * <div krdsSkipLink>
2349
+ * <a href="#main-content">본문 바로가기</a>
2350
+ * <a href="#main-menu">주메뉴 바로가기</a>
2351
+ * </div>
2352
+ */
2353
+ export declare class KrdsSkipLink {
2354
+ /** id (KRDS CSS 기준 krds-skip-link) */
2355
+ readonly id: import("@angular/core").InputSignal<string>;
2356
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsSkipLink, never>;
2357
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsSkipLink, "[krdsSkipLink]", never, {
2358
+ "id": {
2359
+ "alias": "id";
2360
+ "required": false;
2361
+ "isSignal": true;
2362
+ };
2363
+ }, {}, never, never, true, never>;
2364
+ }
2365
+ /** 스낵바 옵션 */
2366
+ export interface KrdsSnackbarOptions {
2367
+ /** 제목 */
2368
+ title: string;
2369
+ /** 본문 */
2370
+ message?: string;
2371
+ /** 아이콘 클래스 (예: 'ico-success-fill') */
2372
+ icon?: string;
2373
+ /** 작업 버튼 이름 (되돌리기·다시 시도 등 1개) */
2374
+ action?: string;
2375
+ /** 작업 버튼을 눌렀을 때. 스낵바를 닫은 뒤 부르므로 안에서 다시 show()할 수 있다 */
2376
+ onAction?: () => void;
2377
+ /** 노출 시간(ms). 기본 0으로 닫기 버튼을 누를 때까지 둔다 */
2378
+ duration?: number;
2379
+ }
2380
+ /**
2381
+ * 어디서든 스낵바를 띄우는 서비스. 앱에 `<krds-snackbar />`를 한 번 두고 쓴다 (서버 렌더링에서는 띄우지 않음)
2382
+ *
2383
+ * @example this.snackbar.show({ title: '삭제 완료', message: '항목을 삭제했습니다.', action: '되돌리기', onAction: () => this.restore() })
2384
+ */
2385
+ export declare class KrdsSnackbarService {
2386
+ private readonly browser;
2387
+ private readonly state;
2388
+ private seq;
2389
+ private timer?;
2390
+ /** 지금 띄운 스낵바 (show()마다 id가 바뀜) */
2391
+ readonly current: import("@angular/core").Signal<{
2392
+ id: number;
2393
+ options: KrdsSnackbarOptions;
2394
+ } | null>;
2395
+ /** 스낵바 표시 (이미 떠 있으면 내용을 바꾼다. 한 페이지에 하나만 둔다) */
2396
+ show(options: KrdsSnackbarOptions): void;
2397
+ /** 스낵바 닫기 */
2398
+ hide(): void;
2399
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsSnackbarService, never>;
2400
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
2401
+ }
2402
+ /**
2403
+ * KRDS 스낵바 영역. role="status" 영역은 늘 두고 KrdsSnackbarService로 띄운 내용을 넣는다.
2404
+ * 버튼으로 닫으면 초점을 스낵바로 들어오기 전 요소로 돌려준다
2405
+ *
2406
+ * @example <krds-snackbar />
2407
+ */
2408
+ export declare class KrdsSnackbar {
2409
+ protected readonly service: KrdsSnackbarService;
2410
+ private readonly ready;
2411
+ protected readonly shown: import("@angular/core").Signal<boolean>;
2412
+ private readonly host;
2413
+ private readonly document;
2414
+ private returnFocus;
2415
+ private hadFocus;
2416
+ constructor();
2417
+ protected onFocusin(event: FocusEvent): void;
2418
+ /** 먼저 닫고 부른다: onAction 안에서 다시 show()한 스낵바(다시 시도 → 결과)가 남는다 */
2419
+ protected act(options: KrdsSnackbarOptions): void;
2420
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsSnackbar, never>;
2421
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsSnackbar, "krds-snackbar", never, {}, {}, never, never, true, never>;
2422
+ }
2423
+ /**
2424
+ * KRDS 스피너. 화면낭독기에는 '로딩 중'을 알리고(role="status"), label이 있으면 화면에도 보인다
2425
+ *
2426
+ * @example <krds-spinner label="불러오는 중입니다" />
2427
+ */
2428
+ export declare class KrdsSpinner {
2429
+ /** 화면에 보이는 안내 문구 */
2430
+ readonly label: import("@angular/core").InputSignal<string | undefined>;
2431
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsSpinner, never>;
2432
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsSpinner, "krds-spinner", never, {
2433
+ "label": {
2434
+ "alias": "label";
2435
+ "required": false;
2436
+ "isSignal": true;
2437
+ };
2438
+ }, {}, never, never, true, never>;
2439
+ }
2440
+ /** 단계 상태 */
2441
+ export type KrdsStepStatus = 'done' | 'active' | 'pending';
2442
+ /**
2443
+ * 단계 표시기의 단계. 단계 제목은 내용으로 넣는다 (title 속성은 기본 툴팁이 되므로 쓰지 않음)
2444
+ */
2445
+ export declare class KrdsStep {
2446
+ /** 단계 번호 (예: '1단계') */
2447
+ readonly step: import("@angular/core").InputSignal<string | number>;
2448
+ /** 상태를 직접 정함 (지정하지 않으면 단계 표시기 안의 순서로 정함) */
2449
+ readonly status: import("@angular/core").InputSignal<"" | KrdsStepStatus | undefined>;
2450
+ private readonly indicator;
2451
+ protected readonly state: import("@angular/core").Signal<KrdsStepStatus>;
2452
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsStep, never>;
2453
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsStep, "li[krdsStep]", never, {
2454
+ "step": {
2455
+ "alias": "step";
2456
+ "required": true;
2457
+ "isSignal": true;
2458
+ };
2459
+ "status": {
2460
+ "alias": "status";
2461
+ "required": false;
2462
+ "isSignal": true;
2463
+ };
2464
+ }, {}, never, ["*"], true, never>;
2465
+ }
2466
+ /**
2467
+ * KRDS 단계 표시기. 진행 상태를 보여 주기만 한다 (KRDS 원본처럼 단계를 눌러 이동하지 않음).
2468
+ * 안에 든 `<li krdsStep>`의 실제 순서로 현재 단계 앞은 완료, 뒤는 대기로 표시하므로 단계를 @if·@for로 바꿔도 맞게 표시된다
2469
+ *
2470
+ * @example
2471
+ * <ol krdsStepIndicator [current]="1">
2472
+ * <li krdsStep step="1단계">약관 동의</li>
2473
+ * <li krdsStep step="2단계">정보 입력</li>
2474
+ * </ol>
2475
+ */
2476
+ export declare class KrdsStepIndicator {
2477
+ /** 현재 단계 위치 (0부터, 숫자가 아니면 첫 단계) */
2478
+ readonly current: import("@angular/core").InputSignalWithTransform<number, unknown>;
2479
+ private readonly steps;
2480
+ /** 단계의 위치에 따른 상태 */
2481
+ statusOf(step: KrdsStep): KrdsStepStatus;
2482
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsStepIndicator, never>;
2483
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsStepIndicator, "ol[krdsStepIndicator]", never, {
2484
+ "current": {
2485
+ "alias": "current";
2486
+ "required": false;
2487
+ "isSignal": true;
2488
+ };
2489
+ }, {}, ["steps"], never, true, never>;
2490
+ }
2491
+ /**
2492
+ * KRDS 구조화 목록. 항목(`<li krdsStructuredItem>`) 안에 KRDS 영역 클래스(card-top·card-body·card-btm·card-btn)로 내용을 나눈다
2493
+ *
2494
+ * @example
2495
+ * <ul krdsStructuredList>
2496
+ * <li krdsStructuredItem>
2497
+ * <div class="card-top"><span krdsBadge>접수중</span></div>
2498
+ * <div class="card-body"><p class="c-tit">청년 주거 지원</p></div>
2499
+ * <div class="card-btn"><a krdsLink href="/apply">신청하기</a></div>
2500
+ * </li>
2501
+ * </ul>
2502
+ */
2503
+ export declare class KrdsStructuredList {
2504
+ /** 한 줄에 항목 하나 (전체 폭) */
2505
+ readonly full: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2506
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsStructuredList, never>;
2507
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsStructuredList, "ul[krdsStructuredList]", never, {
2508
+ "full": {
2509
+ "alias": "full";
2510
+ "required": false;
2511
+ "isSignal": true;
2512
+ };
2513
+ }, {}, never, never, true, never>;
2514
+ }
2515
+ /** 구조화 목록의 항목 */
2516
+ export declare class KrdsStructuredItem {
2517
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsStructuredItem, never>;
2518
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsStructuredItem, "li[krdsStructuredItem]", never, {}, {}, never, ["*"], true, never>;
2519
+ }
2520
+ /** 탭바 항목 */
2521
+ export interface KrdsTabBarItem {
2522
+ text: string;
2523
+ /** 아이콘 클래스 (예: 'ico-bread-home') */
2524
+ icon: string;
2525
+ /** 링크 주소 (없으면 버튼) */
2526
+ href?: string;
2527
+ /** 현재 페이지 (aria-current) */
2528
+ selected?: boolean;
2529
+ }
2530
+ /** 탭바 항목 클릭 이벤트 */
2531
+ export interface KrdsTabBarClick {
2532
+ item: KrdsTabBarItem;
2533
+ event: MouseEvent;
2534
+ }
2535
+ /**
2536
+ * KRDS 탭바. 좁은 화면 아래쪽에 고정되는 주요 메뉴 내비게이션 (넓은 화면에서는 KRDS CSS가 숨김).
2537
+ * 현재 페이지는 aria-current="page", href 없는 항목은 버튼이다
2538
+ *
2539
+ * @example <nav krdsTabBar [items]="[{ text: '홈', icon: 'ico-bread-home', href: '/', selected: true }]"></nav>
2540
+ */
2541
+ export declare class KrdsTabBar {
2542
+ /** 항목 */
2543
+ readonly items: import("@angular/core").InputSignal<KrdsTabBarItem[]>;
2544
+ /** 내비게이션 이름 */
2545
+ readonly label: import("@angular/core").InputSignal<string>;
2546
+ /** 항목을 눌렀을 때 */
2547
+ readonly itemClick: import("@angular/core").OutputEmitterRef<KrdsTabBarClick>;
2548
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTabBar, never>;
2549
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsTabBar, "nav[krdsTabBar]", never, {
2550
+ "items": {
2551
+ "alias": "items";
2552
+ "required": true;
2553
+ "isSignal": true;
2554
+ };
2555
+ "label": {
2556
+ "alias": "label";
2557
+ "required": false;
2558
+ "isSignal": true;
2559
+ };
2560
+ }, {
2561
+ "itemClick": "itemClick";
2562
+ }, never, never, true, never>;
2563
+ }
2564
+ /** 표의 열 */
2565
+ export interface KrdsTableColumn<T = object> {
2566
+ /** 열 이름 (셀·머리글 템플릿을 고를 때 씀) */
2567
+ name: string;
2568
+ /** 머리글 */
2569
+ label: string;
2570
+ /** 셀 값: 행의 속성 이름 또는 행에서 값을 만드는 함수 */
2571
+ field?: (keyof T & string) | ((row: T) => unknown);
2572
+ /** 정렬 */
2573
+ align?: 'left' | 'center' | 'right';
2574
+ /** 셀 스타일 */
2575
+ style?: string | ((row: T) => string);
2576
+ /** 셀 클래스 */
2577
+ classes?: string | ((row: T) => string);
2578
+ /** 머리글 스타일 (width가 있으면 colgroup 너비로도 씀) */
2579
+ headerStyle?: string;
2580
+ /** 머리글 클래스 */
2581
+ headerClasses?: string;
2582
+ }
2583
+ /** 셀 템플릿 컨텍스트 */
2584
+ export interface KrdsTableCellContext<T = object> {
2585
+ $implicit: T;
2586
+ row: T;
2587
+ column: KrdsTableColumn<T>;
2588
+ value: unknown;
2589
+ index: number;
2590
+ }
2591
+ /** 행 클릭 이벤트 */
2592
+ export interface KrdsTableRowClick<T = object> {
2593
+ row: T;
2594
+ index: number;
2595
+ }
2596
+ /**
2597
+ * 열 이름별 셀 템플릿 (`<ng-template krdsCell="status" let-row let-value="value">`).
2598
+ * `[krdsCellOf]="rows"`를 주면 템플릿의 row가 행 타입이 된다 (strictTemplates에서 row.title 같은 접근을 검사)
2599
+ */
2600
+ export declare class KrdsTableCell<T extends object = object> {
2601
+ readonly name: import("@angular/core").InputSignal<string>;
2602
+ /** 행 목록 (템플릿의 row 타입을 정하는 데만 씀) */
2603
+ readonly rows: import("@angular/core").InputSignal<readonly T[] | undefined>;
2604
+ readonly template: TemplateRef<KrdsTableCellContext<T>>;
2605
+ static ngTemplateContextGuard<T extends object>(_dir: KrdsTableCell<T>, _ctx: unknown): _ctx is KrdsTableCellContext<T>;
2606
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTableCell<any>, never>;
2607
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsTableCell<any>, "ng-template[krdsCell]", never, {
2608
+ "name": {
2609
+ "alias": "krdsCell";
2610
+ "required": true;
2611
+ "isSignal": true;
2612
+ };
2613
+ "rows": {
2614
+ "alias": "krdsCellOf";
2615
+ "required": false;
2616
+ "isSignal": true;
2617
+ };
2618
+ }, {}, never, never, true, never>;
2619
+ }
2620
+ /** 머리글 템플릿 컨텍스트 */
2621
+ export interface KrdsTableHeaderContext {
2622
+ $implicit: KrdsTableColumn;
2623
+ }
2624
+ /** 열 이름별 머리글 템플릿 (`<ng-template krdsHeader="status" let-column>`) */
2625
+ export declare class KrdsTableHeader {
2626
+ readonly name: import("@angular/core").InputSignal<string>;
2627
+ readonly template: TemplateRef<KrdsTableHeaderContext>;
2628
+ static ngTemplateContextGuard(_dir: KrdsTableHeader, _ctx: unknown): _ctx is KrdsTableHeaderContext;
2629
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTableHeader, never>;
2630
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsTableHeader, "ng-template[krdsHeader]", never, {
2631
+ "name": {
2632
+ "alias": "krdsHeader";
2633
+ "required": true;
2634
+ "isSignal": true;
2635
+ };
2636
+ }, {}, never, never, true, never>;
2637
+ }
2638
+ /** 행이 없을 때 보여 줄 내용 (`<ng-template krdsNoData>`) */
2639
+ export declare class KrdsTableNoData {
2640
+ readonly template: TemplateRef<any>;
2641
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTableNoData, never>;
2642
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsTableNoData, "ng-template[krdsNoData]", never, {}, {}, never, never, true, never>;
2643
+ }
2644
+ /**
2645
+ * KRDS 표. 열(`columns`)과 행(`rows`)으로 그리고, 첫 열은 행 머리글(th scope="row")이 된다.
2646
+ * 셀·머리글·빈 목록은 `<ng-template krdsCell="열 이름">` 등으로 바꿔 넣는다.
2647
+ * `clickable`이면 행을 클릭·Enter·Space로 고를 수 있다 (셀 안의 버튼·링크 클릭은 행 선택으로 보지 않음)
2648
+ *
2649
+ * @example
2650
+ * <krds-table caption="신청 내역" tableClass="col data" [columns]="columns" [rows]="rows" clickable (rowClick)="open($event.row)">
2651
+ * <ng-template krdsCell="status" let-value="value"><span krdsBadge>{{ value }}</span></ng-template>
2652
+ * </krds-table>
2653
+ */
2654
+ export declare class KrdsTable<T extends object> {
2655
+ /** 표 제목 (caption) */
2656
+ readonly caption: import("@angular/core").InputSignal<string | undefined>;
2657
+ /** 열 */
2658
+ readonly columns: import("@angular/core").InputSignal<KrdsTableColumn<T>[]>;
2659
+ /** 행 */
2660
+ readonly rows: import("@angular/core").InputSignal<T[]>;
2661
+ /** table 요소에 더 붙일 KRDS 클래스 (예: 'col data') */
2662
+ readonly tableClass: import("@angular/core").InputSignal<string | undefined>;
2663
+ /** 행을 클릭·Enter·Space로 고를 수 있게 함 */
2664
+ readonly clickable: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2665
+ /** 행을 골랐을 때 (clickable일 때) */
2666
+ readonly rowClick: import("@angular/core").OutputEmitterRef<KrdsTableRowClick<T>>;
2667
+ private readonly cells;
2668
+ private readonly headers;
2669
+ protected readonly noData: import("@angular/core").Signal<KrdsTableNoData | undefined>;
2670
+ /** 머리글 스타일의 width를 colgroup 너비로 (하나도 없으면 colgroup 없음) */
2671
+ protected readonly colWidths: import("@angular/core").Signal<(string | null)[] | null>;
2672
+ protected cellOf(name: string): TemplateRef<KrdsTableCellContext<object>> | null;
2673
+ protected headerOf(name: string): TemplateRef<KrdsTableHeaderContext> | null;
2674
+ protected valueOf(row: T, column: KrdsTableColumn<T>): unknown;
2675
+ protected headerClass(column: KrdsTableColumn<T>): string;
2676
+ protected cellClass(row: T, column: KrdsTableColumn<T>): string;
2677
+ protected cellStyle(row: T, column: KrdsTableColumn<T>): string | null;
2678
+ protected onRowClick(event: MouseEvent, row: T, index: number): void;
2679
+ protected onRowKeydown(event: KeyboardEvent, row: T, index: number): void;
2680
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTable<any>, never>;
2681
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsTable<any>, "krds-table", never, {
2682
+ "caption": {
2683
+ "alias": "caption";
2684
+ "required": false;
2685
+ "isSignal": true;
2686
+ };
2687
+ "columns": {
2688
+ "alias": "columns";
2689
+ "required": true;
2690
+ "isSignal": true;
2691
+ };
2692
+ "rows": {
2693
+ "alias": "rows";
2694
+ "required": true;
2695
+ "isSignal": true;
2696
+ };
2697
+ "tableClass": {
2698
+ "alias": "tableClass";
2699
+ "required": false;
2700
+ "isSignal": true;
2701
+ };
2702
+ "clickable": {
2703
+ "alias": "clickable";
2704
+ "required": false;
2705
+ "isSignal": true;
2706
+ };
2707
+ }, {
2708
+ "rowClick": "rowClick";
2709
+ }, ["cells", "headers", "noData"], never, true, never>;
2710
+ }
2711
+ /** 탭 */
2712
+ export interface KrdsTabItem {
2713
+ /** 탭 id (패널의 krdsTabPanel과 같게) */
2714
+ id: string;
2715
+ /** 탭 이름 */
2716
+ label: string;
2717
+ /** 비활성화 */
2718
+ disabled?: boolean;
2719
+ }
2720
+ /** 탭 스타일 */
2721
+ export type KrdsTabsVariant = 'line' | 'fill';
2722
+ /** 탭 패널 내용 (`<ng-template krdsTabPanel="탭 id">`) */
2723
+ export declare class KrdsTabPanel {
2724
+ /** 패널이 속한 탭 id */
2725
+ readonly id: import("@angular/core").InputSignal<string>;
2726
+ readonly template: TemplateRef<any>;
2727
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTabPanel, never>;
2728
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsTabPanel, "ng-template[krdsTabPanel]", never, {
2729
+ "id": {
2730
+ "alias": "krdsTabPanel";
2731
+ "required": true;
2732
+ "isSignal": true;
2733
+ };
2734
+ }, {}, never, never, true, never>;
2735
+ }
2736
+ /**
2737
+ * KRDS 탭. 탭 목록은 `tabs`로, 패널 내용은 탭 id별 `<ng-template krdsTabPanel>`으로 넣는다.
2738
+ * 선택한 탭 id는 `[(selected)]`로 주고받고(없으면 첫 활성 탭), 방향키(←·→)로 탭 사이 초점을 옮긴다.
2739
+ * 방향키는 비활성 탭을 건너뛰고 끝에서 처음으로 돌아가며, Home·End는 첫·마지막 탭으로 간다 (WAI-ARIA 탭 패턴)
2740
+ *
2741
+ * @example
2742
+ * <krds-tabs [tabs]="[{ id: 'notice', label: '공지' }, { id: 'faq', label: '자주 묻는 질문' }]" [(selected)]="tab">
2743
+ * <ng-template krdsTabPanel="notice">공지 목록</ng-template>
2744
+ * <ng-template krdsTabPanel="faq">질문 목록</ng-template>
2745
+ * </krds-tabs>
2746
+ */
2747
+ export declare class KrdsTabs {
2748
+ /** 탭 목록 */
2749
+ readonly tabs: import("@angular/core").InputSignal<KrdsTabItem[]>;
2750
+ /** 선택한 탭 id */
2751
+ readonly selected: import("@angular/core").ModelSignal<string | undefined>;
2752
+ /** 스타일 */
2753
+ readonly variant: import("@angular/core").InputSignal<KrdsTabsVariant>;
2754
+ /** 탭을 전체 폭으로 나눔 */
2755
+ readonly full: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2756
+ /** 선택한 탭을 화면낭독기에 알리는 문구 */
2757
+ readonly selectedText: import("@angular/core").InputSignal<string>;
2758
+ private readonly uid;
2759
+ private readonly panels;
2760
+ protected readonly active: import("@angular/core").Signal<string | undefined>;
2761
+ protected tabId(id: string): string;
2762
+ protected panelId(id: string): string;
2763
+ protected panelOf(id: string): TemplateRef<any> | null;
2764
+ protected select(tab: KrdsTabItem): void;
2765
+ protected onKeydown(event: KeyboardEvent): void;
2766
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTabs, never>;
2767
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsTabs, "krds-tabs", never, {
2768
+ "tabs": {
2769
+ "alias": "tabs";
2770
+ "required": true;
2771
+ "isSignal": true;
2772
+ };
2773
+ "selected": {
2774
+ "alias": "selected";
2775
+ "required": false;
2776
+ "isSignal": true;
2777
+ };
2778
+ "variant": {
2779
+ "alias": "variant";
2780
+ "required": false;
2781
+ "isSignal": true;
2782
+ };
2783
+ "full": {
2784
+ "alias": "full";
2785
+ "required": false;
2786
+ "isSignal": true;
2787
+ };
2788
+ "selectedText": {
2789
+ "alias": "selectedText";
2790
+ "required": false;
2791
+ "isSignal": true;
2792
+ };
2793
+ }, {
2794
+ "selected": "selectedChange";
2795
+ }, ["panels"], never, true, never>;
2796
+ }
2797
+ /** 태그 묶음 크기 */
2798
+ export type KrdsTagGroupSize = 'small' | 'medium' | 'large';
2799
+ /**
2800
+ * KRDS 태그. `<krds-tag>`는 삭제 버튼이 있는 태그, `<a krdsTag>`는 링크 태그다.
2801
+ * 삭제 버튼 이름은 "태그 내용 삭제"로 읽혀 어느 태그를 지우는지 알 수 있다. 태그 크기와 색은 감싸는 `[krdsTagGroup]`이 정한다
2802
+ *
2803
+ * @example
2804
+ * <div krdsTagGroup>
2805
+ * <krds-tag (remove)="remove(tag)">{{ tag }}</krds-tag>
2806
+ * <a krdsTag href="/search?q=정책">#정책</a>
2807
+ * </div>
2808
+ */
2809
+ export declare class KrdsTag {
2810
+ /** 삭제 버튼을 클릭했을 때 */
2811
+ readonly remove: import("@angular/core").OutputEmitterRef<MouseEvent>;
2812
+ protected readonly isLink: boolean;
2813
+ protected readonly labelId: string;
2814
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTag, never>;
2815
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsTag, "krds-tag, a[krdsTag]", never, {}, {
2816
+ "remove": "remove";
2817
+ }, never, ["*"], true, never>;
2818
+ }
2819
+ /**
2820
+ * 태그 묶음. 안에 든 태그의 크기와 색을 정한다
2821
+ */
2822
+ export declare class KrdsTagGroup {
2823
+ /** 태그 크기 */
2824
+ readonly size: import("@angular/core").InputSignal<KrdsTagGroupSize>;
2825
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTagGroup, never>;
2826
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsTagGroup, "[krdsTagGroup]", never, {
2827
+ "size": {
2828
+ "alias": "size";
2829
+ "required": false;
2830
+ "isSignal": true;
2831
+ };
2832
+ }, {}, never, never, true, never>;
2833
+ }
2834
+ /** 텍스트 목록 스타일 */
2835
+ export type KrdsTextListVariant = 'decimal' | 'dash' | 'hollow' | 'ordered';
2836
+ /**
2837
+ * KRDS 텍스트 목록. 기본 `<ul>`·`<ol>`에 KRDS 클래스만 붙인다
2838
+ *
2839
+ * @example <ol krdsTextList variant="decimal"><li>신청서를 작성합니다.</li></ol>
2840
+ */
2841
+ export declare class KrdsTextList {
2842
+ /** 스타일 */
2843
+ readonly variant: import("@angular/core").InputSignal<KrdsTextListVariant>;
2844
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTextList, never>;
2845
+ static ɵdir: i0.ɵɵDirectiveDeclaration<KrdsTextList, "ul[krdsTextList], ol[krdsTextList]", never, {
2846
+ "variant": {
2847
+ "alias": "variant";
2848
+ "required": false;
2849
+ "isSignal": true;
2850
+ };
2851
+ }, {}, never, never, true, never>;
2852
+ }
2853
+ /**
2854
+ * KRDS 텍스트 영역의 글자 수 표시. 안에 `<textarea krdsInput>`을 넣고 현재 글자 수를 `count`로 넘긴다.
2855
+ * 글자 수 표시가 없으면 이 묶음 없이 `<textarea krdsInput>`만 쓴다
2856
+ *
2857
+ * @example
2858
+ * <krds-form-group label="문의 내용">
2859
+ * <krds-textarea [count]="content.length" [max]="500">
2860
+ * <textarea krdsInput [(ngModel)]="content" maxlength="500"></textarea>
2861
+ * </krds-textarea>
2862
+ * </krds-form-group>
2863
+ */
2864
+ export declare class KrdsTextarea {
2865
+ /** 현재 글자 수 (지정하면 글자 수 표시) */
2866
+ readonly count: import("@angular/core").InputSignal<number | undefined>;
2867
+ /** 최대 글자 수 */
2868
+ readonly max: import("@angular/core").InputSignal<number | undefined>;
2869
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTextarea, never>;
2870
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsTextarea, "krds-textarea", never, {
2871
+ "count": {
2872
+ "alias": "count";
2873
+ "required": false;
2874
+ "isSignal": true;
2875
+ };
2876
+ "max": {
2877
+ "alias": "max";
2878
+ "required": false;
2879
+ "isSignal": true;
2880
+ };
2881
+ }, {}, never, ["*"], true, never>;
2882
+ }
2883
+ /** 토스트 유형 (기본 노출 시간을 정함) */
2884
+ export type KrdsToastType = 'info' | 'warning';
2885
+ /** 토스트 옵션 */
2886
+ export interface KrdsToastOptions {
2887
+ /** 유형 (info 3초, warning 4초) */
2888
+ type?: KrdsToastType;
2889
+ /** 노출 시간(ms). 0이면 자동으로 닫지 않는다 */
2890
+ duration?: number;
2891
+ }
2892
+ /**
2893
+ * 어디서든 토스트를 띄우는 서비스. 앱에 `<krds-toast />`를 한 번 두고 쓴다 (서버 렌더링에서는 띄우지 않음)
2894
+ *
2895
+ * @example
2896
+ * private readonly toast = inject(KrdsToastService)
2897
+ * save() { this.toast.info('저장되었습니다.') }
2898
+ */
2899
+ export declare class KrdsToastService {
2900
+ private readonly browser;
2901
+ private readonly state;
2902
+ private seq;
2903
+ private timer?;
2904
+ /** 지금 띄운 토스트 (show()마다 id가 바뀜) */
2905
+ readonly current: import("@angular/core").Signal<{
2906
+ id: number;
2907
+ message: string;
2908
+ } | null>;
2909
+ /** 토스트 표시 (떠 있으면 메시지를 바꾸고 노출 시간을 다시 센다) */
2910
+ show(message: string, options?: KrdsToastOptions): void;
2911
+ /** 정보형 토스트 (3초): 인증·저장·업로드 완료 등 */
2912
+ info(message: string, duration?: number): void;
2913
+ /** 주의·경고형 토스트 (4초): 인증·저장·업로드 실패 등 */
2914
+ warning(message: string, duration?: number): void;
2915
+ /** 토스트 닫기 */
2916
+ hide(): void;
2917
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsToastService, never>;
2918
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
2919
+ }
2920
+ /**
2921
+ * KRDS 토스트 영역. 화면낭독기가 읽는 role="status" 영역은 늘 두고, KrdsToastService로 띄운 메시지를 넣는다
2922
+ *
2923
+ * @example <krds-toast />
2924
+ */
2925
+ export declare class KrdsToast {
2926
+ protected readonly service: KrdsToastService;
2927
+ private readonly ready;
2928
+ protected readonly shown: import("@angular/core").Signal<boolean>;
2929
+ constructor();
2930
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsToast, never>;
2931
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsToast, "krds-toast", never, {}, {}, never, never, true, never>;
2932
+ }
2933
+ /** 토글 스위치 크기 */
2934
+ export type KrdsToggleSwitchSize = 'medium' | 'large';
2935
+ /**
2936
+ * KRDS 토글 스위치. 안에 넣은 `<input type="checkbox" krdsControl>` 뒤에 스위치 모양 label을 붙여 연결한다.
2937
+ * 켜짐 상태·disabled는 기본 input에 그대로 쓴다 (`[(ngModel)]`, `formControlName` 포함)
2938
+ *
2939
+ * @example <krds-toggle-switch><input type="checkbox" krdsControl [(ngModel)]="alarm" />알림</krds-toggle-switch>
2940
+ */
2941
+ export declare class KrdsToggleSwitch {
2942
+ /** 크기 */
2943
+ readonly size: import("@angular/core").InputSignal<KrdsToggleSwitchSize>;
2944
+ protected readonly control: import("@angular/core").Signal<KrdsControl>;
2945
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsToggleSwitch, never>;
2946
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsToggleSwitch, "krds-toggle-switch", never, {
2947
+ "size": {
2948
+ "alias": "size";
2949
+ "required": false;
2950
+ "isSignal": true;
2951
+ };
2952
+ }, {}, ["control"], ["[krdsControl]", "*"], true, never>;
2953
+ }
2954
+ /** 툴팁 버튼 형태: default는 작은 텍스트 버튼, icon은 아이콘 버튼, button은 일반 버튼 */
2955
+ export type KrdsTooltipType = 'default' | 'icon' | 'button';
2956
+ /**
2957
+ * KRDS 툴팁. 버튼에 마우스를 올리거나 초점을 주면 설명을 보여 주고, 떠나거나 Esc·스크롤·화면 크기 변경이면 숨긴다.
2958
+ * 버튼 이름은 버튼 글자와 설명을 합친 것(aria-labelledby)이라 아이콘 버튼도 설명으로 이름을 얻는다
2959
+ *
2960
+ * @example <krds-tooltip content="신청 후 3일 안에 처리됩니다">처리 기간 <i class="svg-icon ico-angle right"></i></krds-tooltip>
2961
+ */
2962
+ export declare class KrdsTooltip {
2963
+ /** 설명 */
2964
+ readonly content: import("@angular/core").InputSignal<string>;
2965
+ /** 버튼 형태 */
2966
+ readonly type: import("@angular/core").InputSignal<KrdsTooltipType>;
2967
+ /** 위아래로 펼침 */
2968
+ readonly vertical: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2969
+ /** 상자형 */
2970
+ readonly box: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2971
+ /** 비활성화 */
2972
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
2973
+ protected readonly popoverId: string;
2974
+ protected readonly visible: import("@angular/core").WritableSignal<boolean>;
2975
+ protected readonly buttonText: import("@angular/core").WritableSignal<string>;
2976
+ private readonly position;
2977
+ private readonly button;
2978
+ private readonly popover;
2979
+ private readonly injector;
2980
+ protected readonly buttonClass: import("@angular/core").Signal<string>;
2981
+ protected readonly popoverClass: import("@angular/core").Signal<string>;
2982
+ protected readonly popoverStyle: import("@angular/core").Signal<{
2983
+ display: string | null;
2984
+ }>;
2985
+ constructor();
2986
+ protected show(): void;
2987
+ protected hide(): void;
2988
+ /** 버튼 위치와 화면 가운데를 기준으로 위·아래·좌·우를 정한다 (모바일·상자형·세로형은 위아래) */
2989
+ private updatePosition;
2990
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTooltip, never>;
2991
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsTooltip, "krds-tooltip", never, {
2992
+ "content": {
2993
+ "alias": "content";
2994
+ "required": true;
2995
+ "isSignal": true;
2996
+ };
2997
+ "type": {
2998
+ "alias": "type";
2999
+ "required": false;
3000
+ "isSignal": true;
3001
+ };
3002
+ "vertical": {
3003
+ "alias": "vertical";
3004
+ "required": false;
3005
+ "isSignal": true;
3006
+ };
3007
+ "box": {
3008
+ "alias": "box";
3009
+ "required": false;
3010
+ "isSignal": true;
3011
+ };
3012
+ "disabled": {
3013
+ "alias": "disabled";
3014
+ "required": false;
3015
+ "isSignal": true;
3016
+ };
3017
+ }, {}, never, ["*"], true, never>;
3018
+ }
3019
+ /** 음성 지원 버튼 크기 */
3020
+ export type KrdsTtsSize = 'xsmall' | 'small' | 'medium';
3021
+ /** 음성 지원 아이콘 */
3022
+ export type KrdsTtsIcon = 'volume' | 'play';
3023
+ /**
3024
+ * KRDS 음성 지원. 기본 `<button>`에 붙여, 누르면 text를 한국어 음성으로 읽고(SpeechSynthesis) 다시 누르면 멈춘다.
3025
+ * label이 없으면 aria-label로 이름을 준다
3026
+ *
3027
+ * @example <button krdsTts text="신청 방법을 안내합니다." label="듣기"></button>
3028
+ */
3029
+ export declare class KrdsTts {
3030
+ /** 읽을 글 */
3031
+ readonly text: import("@angular/core").InputSignal<string>;
3032
+ /** 화면에 보이는 버튼 글자 */
3033
+ readonly label: import("@angular/core").InputSignal<string | undefined>;
3034
+ /** 크기 */
3035
+ readonly size: import("@angular/core").InputSignal<KrdsTtsSize>;
3036
+ /** 아이콘 */
3037
+ readonly iconType: import("@angular/core").InputSignal<KrdsTtsIcon>;
3038
+ /** 비활성화 (기본 disabled도 그대로 쓸 수 있음) */
3039
+ readonly disabled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
3040
+ /** 읽기 시작했을 때 */
3041
+ readonly play: import("@angular/core").OutputEmitterRef<string>;
3042
+ /** 눌러서 멈췄을 때 */
3043
+ readonly pause: import("@angular/core").OutputEmitterRef<void>;
3044
+ /** 끝까지 읽었을 때 */
3045
+ readonly end: import("@angular/core").OutputEmitterRef<void>;
3046
+ /** 읽지 못했을 때 (SpeechSynthesis 미지원 포함) */
3047
+ readonly error: import("@angular/core").OutputEmitterRef<Error>;
3048
+ protected readonly playing: import("@angular/core").WritableSignal<boolean>;
3049
+ protected readonly classes: import("@angular/core").Signal<string>;
3050
+ protected readonly icon: import("@angular/core").Signal<"ico-stop" | "ico-play" | "ico-volume">;
3051
+ constructor();
3052
+ private stop;
3053
+ protected toggle(): void;
3054
+ static ɵfac: i0.ɵɵFactoryDeclaration<KrdsTts, never>;
3055
+ static ɵcmp: i0.ɵɵComponentDeclaration<KrdsTts, "button[krdsTts]", never, {
3056
+ "text": {
3057
+ "alias": "text";
3058
+ "required": true;
3059
+ "isSignal": true;
3060
+ };
3061
+ "label": {
3062
+ "alias": "label";
3063
+ "required": false;
3064
+ "isSignal": true;
3065
+ };
3066
+ "size": {
3067
+ "alias": "size";
3068
+ "required": false;
3069
+ "isSignal": true;
3070
+ };
3071
+ "iconType": {
3072
+ "alias": "icon";
3073
+ "required": false;
3074
+ "isSignal": true;
3075
+ };
3076
+ "disabled": {
3077
+ "alias": "disabled";
3078
+ "required": false;
3079
+ "isSignal": true;
3080
+ };
3081
+ }, {
3082
+ "play": "play";
3083
+ "pause": "pause";
3084
+ "end": "end";
3085
+ "error": "error";
3086
+ }, never, never, true, never>;
3087
+ }
3088
+ export {};