@ngb-bootstrap/core 0.0.0 → 0.1.0-next.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 (76) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +18 -0
  3. package/README.md +26 -0
  4. package/fesm2022/ngb-bootstrap-core-alert.mjs +154 -0
  5. package/fesm2022/ngb-bootstrap-core-alert.mjs.map +1 -0
  6. package/fesm2022/ngb-bootstrap-core-badge.mjs +100 -0
  7. package/fesm2022/ngb-bootstrap-core-badge.mjs.map +1 -0
  8. package/fesm2022/ngb-bootstrap-core-breadcrumb.mjs +135 -0
  9. package/fesm2022/ngb-bootstrap-core-breadcrumb.mjs.map +1 -0
  10. package/fesm2022/ngb-bootstrap-core-button.mjs +513 -0
  11. package/fesm2022/ngb-bootstrap-core-button.mjs.map +1 -0
  12. package/fesm2022/ngb-bootstrap-core-card.mjs +540 -0
  13. package/fesm2022/ngb-bootstrap-core-card.mjs.map +1 -0
  14. package/fesm2022/ngb-bootstrap-core-cdk.mjs +282 -0
  15. package/fesm2022/ngb-bootstrap-core-cdk.mjs.map +1 -0
  16. package/fesm2022/ngb-bootstrap-core-checkbox.mjs +165 -0
  17. package/fesm2022/ngb-bootstrap-core-checkbox.mjs.map +1 -0
  18. package/fesm2022/ngb-bootstrap-core-chips.mjs +512 -0
  19. package/fesm2022/ngb-bootstrap-core-chips.mjs.map +1 -0
  20. package/fesm2022/ngb-bootstrap-core-floating-label.mjs +83 -0
  21. package/fesm2022/ngb-bootstrap-core-floating-label.mjs.map +1 -0
  22. package/fesm2022/ngb-bootstrap-core-footer.mjs +48 -0
  23. package/fesm2022/ngb-bootstrap-core-footer.mjs.map +1 -0
  24. package/fesm2022/ngb-bootstrap-core-icon.mjs +243 -0
  25. package/fesm2022/ngb-bootstrap-core-icon.mjs.map +1 -0
  26. package/fesm2022/ngb-bootstrap-core-input.mjs +540 -0
  27. package/fesm2022/ngb-bootstrap-core-input.mjs.map +1 -0
  28. package/fesm2022/ngb-bootstrap-core-layout.mjs +272 -0
  29. package/fesm2022/ngb-bootstrap-core-layout.mjs.map +1 -0
  30. package/fesm2022/ngb-bootstrap-core-navbar.mjs +150 -0
  31. package/fesm2022/ngb-bootstrap-core-navbar.mjs.map +1 -0
  32. package/fesm2022/ngb-bootstrap-core-radio.mjs +279 -0
  33. package/fesm2022/ngb-bootstrap-core-radio.mjs.map +1 -0
  34. package/fesm2022/ngb-bootstrap-core-sidebar.mjs +425 -0
  35. package/fesm2022/ngb-bootstrap-core-sidebar.mjs.map +1 -0
  36. package/fesm2022/ngb-bootstrap-core-spinner.mjs +126 -0
  37. package/fesm2022/ngb-bootstrap-core-spinner.mjs.map +1 -0
  38. package/fesm2022/ngb-bootstrap-core-switch.mjs +147 -0
  39. package/fesm2022/ngb-bootstrap-core-switch.mjs.map +1 -0
  40. package/fesm2022/ngb-bootstrap-core.mjs +69 -0
  41. package/fesm2022/ngb-bootstrap-core.mjs.map +1 -0
  42. package/ngb-bootstrap.css +827 -0
  43. package/package.json +118 -4
  44. package/styles/_breadcrumb.scss +9 -0
  45. package/styles/_button.scss +14 -0
  46. package/styles/_card.scss +86 -0
  47. package/styles/_chip.scss +10 -0
  48. package/styles/_choice.scss +14 -0
  49. package/styles/_contrast.scss +23 -0
  50. package/styles/_icon.scss +62 -0
  51. package/styles/_index.scss +33 -0
  52. package/styles/_input.scss +9 -0
  53. package/styles/_layout.scss +602 -0
  54. package/styles/_overlay.scss +14 -0
  55. package/styles/_tokens.scss +29 -0
  56. package/styles/_typography.scss +77 -0
  57. package/styles/ngb-bootstrap.scss +2 -0
  58. package/types/ngb-bootstrap-core-alert.d.ts +65 -0
  59. package/types/ngb-bootstrap-core-badge.d.ts +38 -0
  60. package/types/ngb-bootstrap-core-breadcrumb.d.ts +32 -0
  61. package/types/ngb-bootstrap-core-button.d.ts +177 -0
  62. package/types/ngb-bootstrap-core-card.d.ts +154 -0
  63. package/types/ngb-bootstrap-core-cdk.d.ts +165 -0
  64. package/types/ngb-bootstrap-core-checkbox.d.ts +53 -0
  65. package/types/ngb-bootstrap-core-chips.d.ts +170 -0
  66. package/types/ngb-bootstrap-core-floating-label.d.ts +22 -0
  67. package/types/ngb-bootstrap-core-footer.d.ts +16 -0
  68. package/types/ngb-bootstrap-core-icon.d.ts +99 -0
  69. package/types/ngb-bootstrap-core-input.d.ts +208 -0
  70. package/types/ngb-bootstrap-core-layout.d.ts +102 -0
  71. package/types/ngb-bootstrap-core-navbar.d.ts +33 -0
  72. package/types/ngb-bootstrap-core-radio.d.ts +96 -0
  73. package/types/ngb-bootstrap-core-sidebar.d.ts +62 -0
  74. package/types/ngb-bootstrap-core-spinner.d.ts +49 -0
  75. package/types/ngb-bootstrap-core-switch.d.ts +44 -0
  76. package/types/ngb-bootstrap-core.d.ts +82 -0
@@ -0,0 +1,425 @@
1
+ import { NgTemplateOutlet } from "@angular/common";
2
+ import * as i0 from "@angular/core";
3
+ import { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked, viewChild } from "@angular/core";
4
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
5
+ import { NavigationEnd, Router, RouterLink, RouterLinkActive, isActive } from "@angular/router";
6
+ import { NgbIcon } from "@ngb-bootstrap/core/icon";
7
+ import { NgbLayout } from "@ngb-bootstrap/core/layout";
8
+ import { ngbIconRight } from "@ngb-bootstrap/icons";
9
+ import { filter } from "rxjs";
10
+ const SUBTREE = {
11
+ paths: "subset",
12
+ queryParams: "ignored",
13
+ fragment: "ignored",
14
+ matrixParams: "ignored"
15
+ };
16
+ var NgbSidebar = class NgbSidebar {
17
+ layout = inject(NgbLayout, { optional: true });
18
+ router = inject(Router);
19
+ drawer = viewChild.required("drawer", ...ngDevMode ? [{ debugName: "drawer" }] : /* istanbul ignore next */ []);
20
+ expanded = signal(/* @__PURE__ */ new Set(), ...ngDevMode ? [{ debugName: "expanded" }] : /* istanbul ignore next */ []);
21
+ chevron = ngbIconRight;
22
+ items = input([], ...ngDevMode ? [{ debugName: "items" }] : /* istanbul ignore next */ []);
23
+ label = input("Main", ...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
24
+ closeLabel = input("Close", ...ngDevMode ? [{ debugName: "closeLabel" }] : /* istanbul ignore next */ []);
25
+ constructor() {
26
+ effect(() => {
27
+ const items = this.items();
28
+ untracked(() => this.expandActive(items));
29
+ });
30
+ this.router.events.pipe(filter((event) => event instanceof NavigationEnd), takeUntilDestroyed()).subscribe(() => this.expandActive(this.items()));
31
+ effect(() => {
32
+ const open = this.layout?.sidebarOpen() ?? false;
33
+ const dialog = this.drawer().nativeElement;
34
+ if (open && !dialog.open && typeof dialog.showModal === "function") dialog.showModal();
35
+ else if (!open && dialog.open) dialog.close();
36
+ });
37
+ }
38
+ isExpanded(item) {
39
+ return this.expanded().has(item);
40
+ }
41
+ toggle(item) {
42
+ if (this.layout?.sidebarRail()) {
43
+ this.layout.sidebarCollapsed.set(false);
44
+ this.expanded.update((current) => /* @__PURE__ */ new Set([...current, item]));
45
+ return;
46
+ }
47
+ this.expanded.update((current) => {
48
+ const next = new Set(current);
49
+ if (!next.delete(item)) next.add(item);
50
+ return next;
51
+ });
52
+ }
53
+ closeOnBackdrop(event) {
54
+ const dialog = this.drawer().nativeElement;
55
+ if (event.target !== dialog || !dialog.matches(":modal")) return;
56
+ const box = dialog.getBoundingClientRect();
57
+ if (!(event.clientX >= box.left && event.clientX <= box.right && event.clientY >= box.top && event.clientY <= box.bottom)) this.layout?.closeSidebar();
58
+ }
59
+ expandActive(items) {
60
+ const active = [];
61
+ const visit = (item) => {
62
+ if (item.children?.length) {
63
+ const hasActive = item.children.map(visit).some(Boolean);
64
+ if (hasActive) active.push(item);
65
+ return hasActive;
66
+ }
67
+ return !!item.link && isActive(item.link, this.router, SUBTREE)();
68
+ };
69
+ items.forEach(visit);
70
+ if (active.some((item) => !this.expanded().has(item))) this.expanded.update((current) => /* @__PURE__ */ new Set([...current, ...active]));
71
+ }
72
+ static ɵfac = i0.ɵɵngDeclareFactory({
73
+ minVersion: "12.0.0",
74
+ version: "22.2.3",
75
+ ngImport: i0,
76
+ type: NgbSidebar,
77
+ deps: [],
78
+ target: i0.ɵɵFactoryTarget.Component
79
+ });
80
+ static ɵcmp = i0.ɵɵngDeclareComponent({
81
+ minVersion: "17.0.0",
82
+ version: "22.2.3",
83
+ type: NgbSidebar,
84
+ isStandalone: true,
85
+ selector: "ngb-sidebar",
86
+ inputs: {
87
+ items: {
88
+ classPropertyName: "items",
89
+ publicName: "items",
90
+ isSignal: true,
91
+ isRequired: false,
92
+ transformFunction: null
93
+ },
94
+ label: {
95
+ classPropertyName: "label",
96
+ publicName: "label",
97
+ isSignal: true,
98
+ isRequired: false,
99
+ transformFunction: null
100
+ },
101
+ closeLabel: {
102
+ classPropertyName: "closeLabel",
103
+ publicName: "closeLabel",
104
+ isSignal: true,
105
+ isRequired: false,
106
+ transformFunction: null
107
+ }
108
+ },
109
+ host: { classAttribute: "ngb-sidebar lg:col-auto" },
110
+ viewQueries: [{
111
+ propertyName: "drawer",
112
+ first: true,
113
+ predicate: ["drawer"],
114
+ descendants: true,
115
+ isSignal: true
116
+ }],
117
+ ngImport: i0,
118
+ template: `
119
+ <!-- The click handler only catches backdrop clicks; keyboard users close the dialog with Escape. -->
120
+ <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
121
+ <dialog
122
+ #drawer
123
+ class="lg:drawer drawer-start ngb-sidebar-drawer"
124
+ [id]="layout?.sidebarId"
125
+ [attr.aria-label]="label()"
126
+ (close)="layout?.closeSidebar()"
127
+ (click)="closeOnBackdrop($event)"
128
+ >
129
+ <!-- Shown from lg up in a full-sidebar layout; elsewhere the navbar shows the brand. -->
130
+ @if (layout?.brand(); as brand) {
131
+ <div class="ngb-sidebar-brand"><ng-container *ngTemplateOutlet="brand.template" /></div>
132
+ }
133
+ <div class="drawer-body">
134
+ <!-- Taiga's drawer has no visible header; the close button shows on keyboard focus. -->
135
+ <button
136
+ type="button"
137
+ class="btn-close ngb-sidebar-close"
138
+ [attr.aria-label]="closeLabel()"
139
+ (click)="layout?.closeSidebar()"
140
+ ></button>
141
+ <nav class="ngb-sidebar-nav" [attr.aria-label]="label()">
142
+ <ng-content />
143
+ <ng-container *ngTemplateOutlet="list; context: { $implicit: items(), level: 0 }" />
144
+ </nav>
145
+ </div>
146
+ </dialog>
147
+
148
+ <ng-template #list let-items let-level="level">
149
+ <ul class="ngb-sidebar-list">
150
+ @for (item of items; track item.label) {
151
+ <li>
152
+ @if (item.children?.length) {
153
+ <button
154
+ type="button"
155
+ class="ngb-sidebar-link ngb-sidebar-group"
156
+ [attr.data-level]="level"
157
+ [attr.title]="level === 0 && layout?.sidebarRail() ? item.label : null"
158
+ [attr.aria-expanded]="isExpanded(item)"
159
+ (click)="toggle(item)"
160
+ >
161
+ <ng-container *ngTemplateOutlet="itemLabel; context: { $implicit: item, level }" />
162
+ <ngb-icon class="ngb-sidebar-chevron" [icon]="chevron" size="1rem" />
163
+ </button>
164
+ <!-- Always rendered so expanding can animate; inert while collapsed. -->
165
+ <div
166
+ class="ngb-sidebar-collapse"
167
+ [class.ngb-sidebar-collapse-open]="isExpanded(item)"
168
+ [inert]="!isExpanded(item)"
169
+ >
170
+ <div class="ngb-sidebar-collapse-inner">
171
+ <ng-container
172
+ *ngTemplateOutlet="
173
+ list;
174
+ context: { $implicit: item.children, level: level + 1 }
175
+ "
176
+ />
177
+ </div>
178
+ </div>
179
+ } @else if (item.href) {
180
+ <a
181
+ class="ngb-sidebar-link"
182
+ [attr.data-level]="level"
183
+ [attr.title]="level === 0 && layout?.sidebarRail() ? item.label : null"
184
+ [href]="item.href"
185
+ target="_blank"
186
+ rel="noopener"
187
+ >
188
+ <ng-container *ngTemplateOutlet="itemLabel; context: { $implicit: item, level }" />
189
+ </a>
190
+ } @else {
191
+ <a
192
+ class="ngb-sidebar-link"
193
+ [attr.data-level]="level"
194
+ [attr.title]="level === 0 && layout?.sidebarRail() ? item.label : null"
195
+ [routerLink]="item.link"
196
+ routerLinkActive="active"
197
+ ariaCurrentWhenActive="page"
198
+ (click)="layout?.closeSidebar()"
199
+ >
200
+ <ng-container *ngTemplateOutlet="itemLabel; context: { $implicit: item, level }" />
201
+ </a>
202
+ }
203
+ </li>
204
+ }
205
+ </ul>
206
+ </ng-template>
207
+
208
+ <ng-template #itemLabel let-item let-level="level">
209
+ @if (level === 0 && item.icon) {
210
+ <ngb-icon class="ngb-sidebar-icon" [icon]="item.icon" size="1rem" />
211
+ }
212
+ <span class="ngb-sidebar-label">{{ item.label }}</span>
213
+ </ng-template>
214
+ `,
215
+ isInline: true,
216
+ dependencies: [
217
+ {
218
+ kind: "component",
219
+ type: NgbIcon,
220
+ selector: "ngb-icon",
221
+ inputs: [
222
+ "name",
223
+ "icon",
224
+ "theme",
225
+ "size",
226
+ "strokeWidth",
227
+ "label"
228
+ ]
229
+ },
230
+ {
231
+ kind: "directive",
232
+ type: NgTemplateOutlet,
233
+ selector: "[ngTemplateOutlet]",
234
+ inputs: [
235
+ "ngTemplateOutletContext",
236
+ "ngTemplateOutlet",
237
+ "ngTemplateOutletInjector"
238
+ ]
239
+ },
240
+ {
241
+ kind: "directive",
242
+ type: RouterLink,
243
+ selector: "[routerLink]",
244
+ inputs: [
245
+ "target",
246
+ "queryParams",
247
+ "fragment",
248
+ "queryParamsHandling",
249
+ "state",
250
+ "info",
251
+ "relativeTo",
252
+ "preserveFragment",
253
+ "skipLocationChange",
254
+ "replaceUrl",
255
+ "browserUrl",
256
+ "routerLink"
257
+ ]
258
+ },
259
+ {
260
+ kind: "directive",
261
+ type: RouterLinkActive,
262
+ selector: "[routerLinkActive]",
263
+ inputs: [
264
+ "routerLinkActiveOptions",
265
+ "ariaCurrentWhenActive",
266
+ "routerLinkActive"
267
+ ],
268
+ outputs: ["isActiveChange"],
269
+ exportAs: ["routerLinkActive"]
270
+ }
271
+ ],
272
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
273
+ });
274
+ };
275
+ i0.ɵɵngDeclareClassMetadata({
276
+ minVersion: "12.0.0",
277
+ version: "22.2.3",
278
+ ngImport: i0,
279
+ type: NgbSidebar,
280
+ decorators: [{
281
+ type: Component,
282
+ args: [{
283
+ selector: "ngb-sidebar",
284
+ imports: [
285
+ NgbIcon,
286
+ NgTemplateOutlet,
287
+ RouterLink,
288
+ RouterLinkActive
289
+ ],
290
+ template: `
291
+ <!-- The click handler only catches backdrop clicks; keyboard users close the dialog with Escape. -->
292
+ <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->
293
+ <dialog
294
+ #drawer
295
+ class="lg:drawer drawer-start ngb-sidebar-drawer"
296
+ [id]="layout?.sidebarId"
297
+ [attr.aria-label]="label()"
298
+ (close)="layout?.closeSidebar()"
299
+ (click)="closeOnBackdrop($event)"
300
+ >
301
+ <!-- Shown from lg up in a full-sidebar layout; elsewhere the navbar shows the brand. -->
302
+ @if (layout?.brand(); as brand) {
303
+ <div class="ngb-sidebar-brand"><ng-container *ngTemplateOutlet="brand.template" /></div>
304
+ }
305
+ <div class="drawer-body">
306
+ <!-- Taiga's drawer has no visible header; the close button shows on keyboard focus. -->
307
+ <button
308
+ type="button"
309
+ class="btn-close ngb-sidebar-close"
310
+ [attr.aria-label]="closeLabel()"
311
+ (click)="layout?.closeSidebar()"
312
+ ></button>
313
+ <nav class="ngb-sidebar-nav" [attr.aria-label]="label()">
314
+ <ng-content />
315
+ <ng-container *ngTemplateOutlet="list; context: { $implicit: items(), level: 0 }" />
316
+ </nav>
317
+ </div>
318
+ </dialog>
319
+
320
+ <ng-template #list let-items let-level="level">
321
+ <ul class="ngb-sidebar-list">
322
+ @for (item of items; track item.label) {
323
+ <li>
324
+ @if (item.children?.length) {
325
+ <button
326
+ type="button"
327
+ class="ngb-sidebar-link ngb-sidebar-group"
328
+ [attr.data-level]="level"
329
+ [attr.title]="level === 0 && layout?.sidebarRail() ? item.label : null"
330
+ [attr.aria-expanded]="isExpanded(item)"
331
+ (click)="toggle(item)"
332
+ >
333
+ <ng-container *ngTemplateOutlet="itemLabel; context: { $implicit: item, level }" />
334
+ <ngb-icon class="ngb-sidebar-chevron" [icon]="chevron" size="1rem" />
335
+ </button>
336
+ <!-- Always rendered so expanding can animate; inert while collapsed. -->
337
+ <div
338
+ class="ngb-sidebar-collapse"
339
+ [class.ngb-sidebar-collapse-open]="isExpanded(item)"
340
+ [inert]="!isExpanded(item)"
341
+ >
342
+ <div class="ngb-sidebar-collapse-inner">
343
+ <ng-container
344
+ *ngTemplateOutlet="
345
+ list;
346
+ context: { $implicit: item.children, level: level + 1 }
347
+ "
348
+ />
349
+ </div>
350
+ </div>
351
+ } @else if (item.href) {
352
+ <a
353
+ class="ngb-sidebar-link"
354
+ [attr.data-level]="level"
355
+ [attr.title]="level === 0 && layout?.sidebarRail() ? item.label : null"
356
+ [href]="item.href"
357
+ target="_blank"
358
+ rel="noopener"
359
+ >
360
+ <ng-container *ngTemplateOutlet="itemLabel; context: { $implicit: item, level }" />
361
+ </a>
362
+ } @else {
363
+ <a
364
+ class="ngb-sidebar-link"
365
+ [attr.data-level]="level"
366
+ [attr.title]="level === 0 && layout?.sidebarRail() ? item.label : null"
367
+ [routerLink]="item.link"
368
+ routerLinkActive="active"
369
+ ariaCurrentWhenActive="page"
370
+ (click)="layout?.closeSidebar()"
371
+ >
372
+ <ng-container *ngTemplateOutlet="itemLabel; context: { $implicit: item, level }" />
373
+ </a>
374
+ }
375
+ </li>
376
+ }
377
+ </ul>
378
+ </ng-template>
379
+
380
+ <ng-template #itemLabel let-item let-level="level">
381
+ @if (level === 0 && item.icon) {
382
+ <ngb-icon class="ngb-sidebar-icon" [icon]="item.icon" size="1rem" />
383
+ }
384
+ <span class="ngb-sidebar-label">{{ item.label }}</span>
385
+ </ng-template>
386
+ `,
387
+ changeDetection: ChangeDetectionStrategy.OnPush,
388
+ host: { class: "ngb-sidebar lg:col-auto" }
389
+ }]
390
+ }],
391
+ ctorParameters: () => [],
392
+ propDecorators: {
393
+ drawer: [{
394
+ type: i0.ViewChild,
395
+ args: ["drawer", { isSignal: true }]
396
+ }],
397
+ items: [{
398
+ type: i0.Input,
399
+ args: [{
400
+ isSignal: true,
401
+ alias: "items",
402
+ required: false
403
+ }]
404
+ }],
405
+ label: [{
406
+ type: i0.Input,
407
+ args: [{
408
+ isSignal: true,
409
+ alias: "label",
410
+ required: false
411
+ }]
412
+ }],
413
+ closeLabel: [{
414
+ type: i0.Input,
415
+ args: [{
416
+ isSignal: true,
417
+ alias: "closeLabel",
418
+ required: false
419
+ }]
420
+ }]
421
+ }
422
+ });
423
+ export { NgbSidebar };
424
+
425
+ //# sourceMappingURL=ngb-bootstrap-core-sidebar.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngb-bootstrap-core-sidebar.mjs","names":[],"sources":["../../../../projects/core/sidebar/sidebar.ts"],"sourcesContent":["import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n IsActiveMatchOptions,\n NavigationEnd,\n Router,\n RouterLink,\n RouterLinkActive,\n isActive,\n} from '@angular/router';\nimport { NgbIcon } from '@ngb-bootstrap/core/icon';\nimport { NgbLayout } from '@ngb-bootstrap/core/layout';\nimport { NgbIconDefinition, ngbIconRight } from '@ngb-bootstrap/icons';\nimport { filter } from 'rxjs';\n\n/** One entry in `<ngb-sidebar>`: a router link, an external link, or a group of children. */\nexport interface NgbSidebarItem {\n readonly label: string;\n /** Router link, e.g. `/components/badge`. */\n readonly link?: string;\n /** External URL, opened in a new tab. */\n readonly href?: string;\n /** Icon shown before top-level items. */\n readonly icon?: NgbIconDefinition;\n readonly children?: readonly NgbSidebarItem[];\n}\n\nconst SUBTREE: IsActiveMatchOptions = {\n paths: 'subset',\n queryParams: 'ignored',\n fragment: 'ignored',\n matrixParams: 'ignored',\n};\n\n/**\n * Side navigation in the Taiga UI docs style. From `lg` up it is a fixed column of\n * `<ngb-layout>`; below `lg` it is a Bootstrap drawer (`.lg:drawer`) opened by the navbar's menu\n * button and closed by the backdrop, Escape or following a link. In a `collapsible` layout it\n * contracts from `lg` up to a rail of top-level icons. Groups expand to reveal the current route. Content placed inside it (e.g. a notice) appears above the items.\n *\n * ```html\n * <ngb-sidebar label=\"Documentation\" [items]=\"items\" />\n * ```\n */\n@Component({\n selector: 'ngb-sidebar',\n imports: [NgbIcon, NgTemplateOutlet, RouterLink, RouterLinkActive],\n template: `\n <!-- The click handler only catches backdrop clicks; keyboard users close the dialog with Escape. -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <dialog\n #drawer\n class=\"lg:drawer drawer-start ngb-sidebar-drawer\"\n [id]=\"layout?.sidebarId\"\n [attr.aria-label]=\"label()\"\n (close)=\"layout?.closeSidebar()\"\n (click)=\"closeOnBackdrop($event)\"\n >\n <!-- Shown from lg up in a full-sidebar layout; elsewhere the navbar shows the brand. -->\n @if (layout?.brand(); as brand) {\n <div class=\"ngb-sidebar-brand\"><ng-container *ngTemplateOutlet=\"brand.template\" /></div>\n }\n <div class=\"drawer-body\">\n <!-- Taiga's drawer has no visible header; the close button shows on keyboard focus. -->\n <button\n type=\"button\"\n class=\"btn-close ngb-sidebar-close\"\n [attr.aria-label]=\"closeLabel()\"\n (click)=\"layout?.closeSidebar()\"\n ></button>\n <nav class=\"ngb-sidebar-nav\" [attr.aria-label]=\"label()\">\n <ng-content />\n <ng-container *ngTemplateOutlet=\"list; context: { $implicit: items(), level: 0 }\" />\n </nav>\n </div>\n </dialog>\n\n <ng-template #list let-items let-level=\"level\">\n <ul class=\"ngb-sidebar-list\">\n @for (item of items; track item.label) {\n <li>\n @if (item.children?.length) {\n <button\n type=\"button\"\n class=\"ngb-sidebar-link ngb-sidebar-group\"\n [attr.data-level]=\"level\"\n [attr.title]=\"level === 0 && layout?.sidebarRail() ? item.label : null\"\n [attr.aria-expanded]=\"isExpanded(item)\"\n (click)=\"toggle(item)\"\n >\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { $implicit: item, level }\" />\n <ngb-icon class=\"ngb-sidebar-chevron\" [icon]=\"chevron\" size=\"1rem\" />\n </button>\n <!-- Always rendered so expanding can animate; inert while collapsed. -->\n <div\n class=\"ngb-sidebar-collapse\"\n [class.ngb-sidebar-collapse-open]=\"isExpanded(item)\"\n [inert]=\"!isExpanded(item)\"\n >\n <div class=\"ngb-sidebar-collapse-inner\">\n <ng-container\n *ngTemplateOutlet=\"\n list;\n context: { $implicit: item.children, level: level + 1 }\n \"\n />\n </div>\n </div>\n } @else if (item.href) {\n <a\n class=\"ngb-sidebar-link\"\n [attr.data-level]=\"level\"\n [attr.title]=\"level === 0 && layout?.sidebarRail() ? item.label : null\"\n [href]=\"item.href\"\n target=\"_blank\"\n rel=\"noopener\"\n >\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { $implicit: item, level }\" />\n </a>\n } @else {\n <a\n class=\"ngb-sidebar-link\"\n [attr.data-level]=\"level\"\n [attr.title]=\"level === 0 && layout?.sidebarRail() ? item.label : null\"\n [routerLink]=\"item.link\"\n routerLinkActive=\"active\"\n ariaCurrentWhenActive=\"page\"\n (click)=\"layout?.closeSidebar()\"\n >\n <ng-container *ngTemplateOutlet=\"itemLabel; context: { $implicit: item, level }\" />\n </a>\n }\n </li>\n }\n </ul>\n </ng-template>\n\n <ng-template #itemLabel let-item let-level=\"level\">\n @if (level === 0 && item.icon) {\n <ngb-icon class=\"ngb-sidebar-icon\" [icon]=\"item.icon\" size=\"1rem\" />\n }\n <span class=\"ngb-sidebar-label\">{{ item.label }}</span>\n </ng-template>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'ngb-sidebar lg:col-auto' },\n})\nexport class NgbSidebar {\n protected readonly layout = inject(NgbLayout, { optional: true });\n private readonly router = inject(Router);\n private readonly drawer = viewChild.required<ElementRef<HTMLDialogElement>>('drawer');\n private readonly expanded = signal<ReadonlySet<NgbSidebarItem>>(new Set());\n protected readonly chevron = ngbIconRight;\n\n /** The navigation tree. */\n readonly items = input<readonly NgbSidebarItem[]>([]);\n /** Accessible name of the navigation. */\n readonly label = input('Main');\n /** Accessible name of the drawer's close button. */\n readonly closeLabel = input('Close');\n\n constructor() {\n effect(() => {\n const items = this.items();\n untracked(() => this.expandActive(items));\n });\n this.router.events\n .pipe(\n filter((event) => event instanceof NavigationEnd),\n takeUntilDestroyed(),\n )\n .subscribe(() => this.expandActive(this.items()));\n\n // Open and close the drawer as a modal dialog below lg.\n effect(() => {\n const open = this.layout?.sidebarOpen() ?? false;\n const dialog = this.drawer().nativeElement;\n if (open && !dialog.open && typeof dialog.showModal === 'function') {\n dialog.showModal();\n } else if (!open && dialog.open) {\n dialog.close();\n }\n });\n }\n\n protected isExpanded(item: NgbSidebarItem): boolean {\n return this.expanded().has(item);\n }\n\n protected toggle(item: NgbSidebarItem): void {\n // The rail hides children: expand the sidebar and open the group instead.\n if (this.layout?.sidebarRail()) {\n this.layout.sidebarCollapsed.set(false);\n this.expanded.update((current) => new Set([...current, item]));\n return;\n }\n this.expanded.update((current) => {\n const next = new Set(current);\n if (!next.delete(item)) next.add(item);\n return next;\n });\n }\n\n /** A click on the dialog itself, outside its box, is a click on the backdrop. */\n protected closeOnBackdrop(event: MouseEvent): void {\n const dialog = this.drawer().nativeElement;\n if (event.target !== dialog || !dialog.matches(':modal')) return;\n const box = dialog.getBoundingClientRect();\n const inside =\n event.clientX >= box.left &&\n event.clientX <= box.right &&\n event.clientY >= box.top &&\n event.clientY <= box.bottom;\n if (!inside) this.layout?.closeSidebar();\n }\n\n /** Expands every group that contains the current route, keeping groups the user opened. */\n private expandActive(items: readonly NgbSidebarItem[]): void {\n const active: NgbSidebarItem[] = [];\n const visit = (item: NgbSidebarItem): boolean => {\n if (item.children?.length) {\n const hasActive = item.children.map(visit).some(Boolean);\n if (hasActive) active.push(item);\n return hasActive;\n }\n return !!item.link && isActive(item.link, this.router, SUBTREE)();\n };\n items.forEach(visit);\n if (active.some((item) => !this.expanded().has(item))) {\n this.expanded.update((current) => new Set([...current, ...active]));\n }\n }\n}\n"],"mappings":";;;;;;;;;AAsCA,MAAM,UAAgC;CACpC,OAAO;CACP,aAAa;CACb,UAAU;CACV,cAAc;AACf;AAmHD,IAAa,aAAb,MAAa,WAAU;CACF,SAAS,OAAO,WAAW,EAAE,UAAU,KAAI,CAAE;CAC/C,SAAS,OAAO,MAAM;CACtB,SAAS,UAAU,SAAwC,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,SAAA,CAAA,+BAAA,CAAA,CAAA;CACpE,WAAW,uBAAoC,IAAI,IAAG,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,WAAA,CAAA,+BAAA,CAAA,CAAA;CACvD,UAAU;CAGpB,QAAQ,MAAiC,CAAA,GAAG,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE5C,QAAQ,MAAM,QAAO,GAAA,YAAA,CAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAErB,aAAa,MAAM,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,aAAA,CAAA,+BAAA,CAAA,CAAA;CAEpC,cAAA;EACE,aAAY;GACV,MAAM,QAAQ,KAAK,MAAK;GACxB,gBAAgB,KAAK,aAAa,KAAK,CAAC;EAC1C,CAAC;EACD,KAAK,OAAO,OACT,KACC,QAAQ,UAAU,iBAAiB,aAAa,GAChD,mBAAkB,CAAE,CACrB,CACA,gBAAgB,KAAK,aAAa,KAAK,MAAK,CAAE,CAAC;EAGlD,aAAY;GACV,MAAM,OAAO,KAAK,QAAQ,YAAW,KAAM;GAC3C,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC;GAC7B,IAAI,QAAQ,CAAC,OAAO,QAAQ,OAAO,OAAO,cAAc,YACtD,OAAO,UAAS;QACX,IAAI,CAAC,QAAQ,OAAO,MACzB,OAAO,MAAK;EAEhB,CAAC;CACH;CAEU,WAAW,MAAoB;EACvC,OAAO,KAAK,SAAQ,CAAE,CAAC,IAAI,IAAI;CACjC;CAEU,OAAO,MAAoB;EAEnC,IAAI,KAAK,QAAQ,YAAW,GAAI;GAC9B,KAAK,OAAO,iBAAiB,IAAI,KAAK;GACtC,KAAK,SAAS,QAAQ,4BAAY,IAAI,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,CAAC;GAC7D;EACF;EACA,KAAK,SAAS,QAAQ,YAAW;GAC/B,MAAM,OAAO,IAAI,IAAI,OAAO;GAC5B,IAAI,CAAC,KAAK,OAAO,IAAI,GAAG,KAAK,IAAI,IAAI;GACrC,OAAO;EACT,CAAC;CACH;CAGU,gBAAgB,OAAiB;EACzC,MAAM,SAAS,KAAK,OAAM,CAAE,CAAC;EAC7B,IAAI,MAAM,WAAW,UAAU,CAAC,OAAO,QAAQ,QAAQ,GAAG;EAC1D,MAAM,MAAM,OAAO,sBAAqB;EAMxC,IAAI,EAJF,MAAM,WAAW,IAAI,QACrB,MAAM,WAAW,IAAI,SACrB,MAAM,WAAW,IAAI,OACrB,MAAM,WAAW,IAAI,SACV,KAAK,QAAQ,aAAY;CACxC;CAGQ,aAAa,OAAgC;EACnD,MAAM,SAA2B,CAAA;EACjC,MAAM,SAAS,SAAiC;GAC9C,IAAI,KAAK,UAAU,QAAQ;IACzB,MAAM,YAAY,KAAK,SAAS,IAAI,KAAK,CAAC,CAAC,KAAK,OAAO;IACvD,IAAI,WAAW,OAAO,KAAK,IAAI;IAC/B,OAAO;GACT;GACA,OAAO,CAAC,CAAC,KAAK,QAAQ,SAAS,KAAK,MAAM,KAAK,QAAQ,OAAO,CAAC,CAAA;EACjE;EACA,MAAM,QAAQ,KAAK;EACnB,IAAI,OAAO,MAAM,SAAS,CAAC,KAAK,SAAQ,CAAE,CAAC,IAAI,IAAI,CAAC,GAClD,KAAK,SAAS,QAAQ,4BAAY,IAAI,IAAI,CAAC,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;CAEtE;CApFW,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,YAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA,EAAA,gBAAA,0BAAA;EAAA,aAAA,CAAA;GAAA,cAAA;GAAA,OAAA;GAAA,WAAA,CAAA,QAAA;GAAA,aAAA;GAAA,UAAA;EAAA,CAAA;EAAA,UAAA;EAAA,UApGX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgGT,UAAA;EAAA,cAAA;GAAA;IAAA,MAAA;IAAA,MAjGS;IAAO,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAU,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IAAA;GAAA;GAAA;IAAA,MAAA;IAAA,MAAE;IAAgB,UAAA;IAAA,QAAA;KAAA;KAAA;KAAA;IAAA;IAAA,SAAA,CAAA,gBAAA;IAAA,UAAA,CAAA,kBAAA;GAAA;EAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAqGtD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EAvGtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,SAAS;IAAC;IAAS;IAAkB;IAAY;GAAgB;GACjE,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiGV,iBAAiB,wBAAwB;GACzC,MAAM,EAAE,OAAO,0BAAyB;EACzC,CAAA;CAI6E,CAAA;CAAA,sBAAA,CAAA;CAAA,gBAAA;EAAA,QAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA,UAAQ,EAAA,UAAA,KAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,OAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;EAAA,YAAA,CAAA;GAAA,MAAA,GAAA;GAAA,MAAA,CAAA;IAAA,UAAA;IAAA,OAAA;IAAA,UAAA;GAAA,CAAA;EAAA,CAAA;CAAA;AAAA,CAAA"}
@@ -0,0 +1,126 @@
1
+ import * as i0 from "@angular/core";
2
+ import { ChangeDetectionStrategy, Component, computed, inject, input } from "@angular/core";
3
+ import { NGB_I18N } from "@ngb-bootstrap/core";
4
+ var NgbSpinner = class NgbSpinner {
5
+ i18n = inject(NGB_I18N);
6
+ type = input("border", ...ngDevMode ? [{ debugName: "type" }] : /* istanbul ignore next */ []);
7
+ size = input("md", ...ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []);
8
+ color = input(...ngDevMode ? [void 0, { debugName: "color" }] : /* istanbul ignore next */ []);
9
+ label = input(...ngDevMode ? [void 0, { debugName: "label" }] : /* istanbul ignore next */ []);
10
+ text = computed(() => this.label() ?? this.i18n.loading, ...ngDevMode ? [{ debugName: "text" }] : /* istanbul ignore next */ []);
11
+ classes = computed(() => {
12
+ const classes = [`spinner-${this.type()}`];
13
+ if (this.size() === "sm") classes.push("spinner-sm");
14
+ const color = this.color();
15
+ if (color) classes.push(`fg-${color}`);
16
+ return classes.join(" ");
17
+ }, ...ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []);
18
+ static ɵfac = i0.ɵɵngDeclareFactory({
19
+ minVersion: "12.0.0",
20
+ version: "22.2.3",
21
+ ngImport: i0,
22
+ type: NgbSpinner,
23
+ deps: [],
24
+ target: i0.ɵɵFactoryTarget.Component
25
+ });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({
27
+ minVersion: "17.1.0",
28
+ version: "22.2.3",
29
+ type: NgbSpinner,
30
+ isStandalone: true,
31
+ selector: "ngb-spinner",
32
+ inputs: {
33
+ type: {
34
+ classPropertyName: "type",
35
+ publicName: "type",
36
+ isSignal: true,
37
+ isRequired: false,
38
+ transformFunction: null
39
+ },
40
+ size: {
41
+ classPropertyName: "size",
42
+ publicName: "size",
43
+ isSignal: true,
44
+ isRequired: false,
45
+ transformFunction: null
46
+ },
47
+ color: {
48
+ classPropertyName: "color",
49
+ publicName: "color",
50
+ isSignal: true,
51
+ isRequired: false,
52
+ transformFunction: null
53
+ },
54
+ label: {
55
+ classPropertyName: "label",
56
+ publicName: "label",
57
+ isSignal: true,
58
+ isRequired: false,
59
+ transformFunction: null
60
+ }
61
+ },
62
+ host: {
63
+ attributes: { "role": "status" },
64
+ properties: { "class": "classes()" }
65
+ },
66
+ ngImport: i0,
67
+ template: "<span class=\"visually-hidden\">{{ text() }}</span>",
68
+ isInline: true,
69
+ changeDetection: i0.ChangeDetectionStrategy.OnPush
70
+ });
71
+ };
72
+ i0.ɵɵngDeclareClassMetadata({
73
+ minVersion: "12.0.0",
74
+ version: "22.2.3",
75
+ ngImport: i0,
76
+ type: NgbSpinner,
77
+ decorators: [{
78
+ type: Component,
79
+ args: [{
80
+ selector: "ngb-spinner",
81
+ template: "<span class=\"visually-hidden\">{{ text() }}</span>",
82
+ changeDetection: ChangeDetectionStrategy.OnPush,
83
+ host: {
84
+ "[class]": "classes()",
85
+ role: "status"
86
+ }
87
+ }]
88
+ }],
89
+ propDecorators: {
90
+ type: [{
91
+ type: i0.Input,
92
+ args: [{
93
+ isSignal: true,
94
+ alias: "type",
95
+ required: false
96
+ }]
97
+ }],
98
+ size: [{
99
+ type: i0.Input,
100
+ args: [{
101
+ isSignal: true,
102
+ alias: "size",
103
+ required: false
104
+ }]
105
+ }],
106
+ color: [{
107
+ type: i0.Input,
108
+ args: [{
109
+ isSignal: true,
110
+ alias: "color",
111
+ required: false
112
+ }]
113
+ }],
114
+ label: [{
115
+ type: i0.Input,
116
+ args: [{
117
+ isSignal: true,
118
+ alias: "label",
119
+ required: false
120
+ }]
121
+ }]
122
+ }
123
+ });
124
+ export { NgbSpinner };
125
+
126
+ //# sourceMappingURL=ngb-bootstrap-core-spinner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngb-bootstrap-core-spinner.mjs","names":[],"sources":["../../../../projects/core/spinner/spinner.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NGB_I18N, NgbThemeColor } from '@ngb-bootstrap/core';\n\nexport type NgbSpinnerType = 'border' | 'grow';\nexport type NgbSpinnerSize = 'sm' | 'md';\n\n/**\n * Loading indicator built on Bootstrap 6 `.spinner-border` and `.spinner-grow`. It is a\n * `role=\"status\"` region with visually hidden text, named \"Loading…\" by default.\n *\n * ```html\n * <ngb-spinner color=\"primary\" size=\"sm\" />\n * <ngb-spinner type=\"grow\" label=\"Saving your draft\" />\n * ```\n */\n@Component({\n selector: 'ngb-spinner',\n template: '<span class=\"visually-hidden\">{{ text() }}</span>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n role: 'status',\n },\n})\nexport class NgbSpinner {\n private readonly i18n = inject(NGB_I18N);\n\n /** `border` (default) or `grow`. */\n readonly type = input<NgbSpinnerType>('border');\n /** `md` (default) or `sm`. For any other size, set `--spinner-width` and `--spinner-height`. */\n readonly size = input<NgbSpinnerSize>('md');\n /** Theme colour. Without it the spinner takes the current text colour. */\n readonly color = input<NgbThemeColor>();\n /** Accessible text. Defaults to the `loading` string of `NGB_I18N`. */\n readonly label = input<string>();\n\n protected readonly text = computed(() => this.label() ?? this.i18n.loading);\n\n protected readonly classes = computed(() => {\n const classes = [`spinner-${this.type()}`];\n if (this.size() === 'sm') classes.push('spinner-sm');\n const color = this.color();\n if (color) classes.push(`fg-${color}`);\n return classes.join(' ');\n });\n}\n"],"mappings":";;;AAwBA,IAAa,aAAb,MAAa,WAAU;CACJ,OAAO,OAAO,QAAQ;CAG9B,OAAO,MAAsB,UAAS,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAEtC,OAAO,MAAsB,MAAK,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAElC,QAAQ,MAAsB,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAE9B,QAAQ,MAAe,GAAA,YAAA,CAAA,QAAA,EAAA,WAAA,QAAA,CAAA,+BAAA,CAAA,CAAA;CAEb,OAAO,eAAe,KAAK,MAAK,KAAM,KAAK,KAAK,SAAQ,GAAA,YAAA,CAAA,EAAA,WAAA,OAAA,CAAA,+BAAA,CAAA,CAAA;CAExD,UAAU,eAAc;EACzC,MAAM,UAAU,CAAC,WAAW,KAAK,KAAI,GAAI;EACzC,IAAI,KAAK,KAAI,MAAO,MAAM,QAAQ,KAAK,YAAY;EACnD,MAAM,QAAQ,KAAK,MAAK;EACxB,IAAI,OAAO,QAAQ,KAAK,MAAM,OAAO;EACrC,OAAO,QAAQ,KAAK,GAAG;CACzB,GAAE,GAAA,YAAA,CAAA,EAAA,WAAA,UAAA,CAAA,+BAAA,CAAA,CAAA;CApBS,OAAA,OAAA,GAAA,mBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,UAAA;EAAA,MAAA;EAAU,MAAA,CAAA;EAAA,QAAA,GAAA,gBAAA;CAAA,CAAA;CAAV,OAAA,OAAA,GAAA,qBAAA;EAAA,YAAA;EAAA,SAAA;EAAA,MAAA;EAAU,cAAA;EAAA,UAAA;EAAA,QAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,MAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;GAAA,OAAA;IAAA,mBAAA;IAAA,YAAA;IAAA,UAAA;IAAA,YAAA;IAAA,mBAAA;GAAA;EAAA;EAAA,MAAA;GAAA,YAAA,EAAA,QAAA,SAAA;GAAA,YAAA,EAAA,SAAA,YAAA;EAAA;EAAA,UAAA;EAAA,UAPX;EAAmD,UAAA;EAAA,iBAAA,GAAA,wBAAA;CAAA,CAAA;;AAOlD,GAAA,yBAAA;CAAA,YAAA;CAAA,SAAA;CAAA,UAAA;CAAA,MAAA;CAAU,YAAA,CAAA;EATtB,MAAA;EAAU,MAAA,CAAA;GACT,UAAU;GACV,UAAU;GACV,iBAAiB,wBAAwB;GACzC,MAAM;IACJ,WAAW;IACX,MAAM;GACP;EACF,CAAA"}