@keepui/ui 0.4.0 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"keepui-ui.mjs","sources":["../../../projects/keep-ui/src/lib/tokens/file.token.ts","../../../projects/keep-ui/src/lib/services/web-file.service.ts","../../../projects/keep-ui/src/lib/components/button/button.component.ts","../../../projects/keep-ui/src/lib/components/card/card.component.ts","../../../projects/keep-ui/src/lib/components/icon/icon.component.ts","../../../projects/keep-ui/src/lib/components/icon-action-button/icon-action-button.component.ts","../../../projects/keep-ui/src/lib/i18n/translation-keys.ts","../../../projects/keep-ui/src/lib/components/image-preview/image-preview.component.ts","../../../projects/keep-ui/src/lib/components/signal-dropdown/signal-dropdown.component.ts","../../../projects/keep-ui/src/lib/components/signal-text-input/signal-text-input.component.ts","../../../projects/keep-ui/src/lib/components/signal-textarea/signal-textarea.component.ts","../../../projects/keep-ui/src/lib/providers/provide-keep-ui.ts","../../../projects/keep-ui/src/lib/i18n/keep-ui-translations.ts","../../../projects/keep-ui/src/lib/services/keep-ui-transloco-loader.service.ts","../../../projects/keep-ui/src/lib/services/keep-ui-language.service.ts","../../../projects/keep-ui/src/lib/providers/keep-ui-i18n.provider.ts","../../../projects/keep-ui/src/lib/testing/mock-file.service.ts","../../../projects/keep-ui/src/public-api.ts","../../../projects/keep-ui/src/keepui-ui.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { FilePort } from '../ports/file.port';\r\n\r\n/**\r\n * Injection token for the platform file/image adapter.\r\n *\r\n * Register a concrete implementation with:\r\n * - `provideKeepUi()` for web projects\r\n * - `provideKeepUiCapacitor()` for Angular + Capacitor projects\r\n */\r\nexport const FILE_PORT = new InjectionToken<FilePort>('FILE_PORT');\r\n","import { Injectable } from '@angular/core';\r\nimport { FilePort } from '../ports/file.port';\r\nimport { FileResult } from '../models/file-result.model';\r\n\r\n/**\r\n * Web implementation of `FilePort`.\r\n *\r\n * Uses a hidden `<input type=\"file\">` and the `FileReader` API to let the user\r\n * pick an image from the file system in a browser environment.\r\n *\r\n * This implementation has no dependency on Capacitor or any native plugin.\r\n */\r\n@Injectable()\r\nexport class WebFileService implements FilePort {\r\n pickImage(): Promise<FileResult> {\r\n return new Promise<FileResult>((resolve, reject) => {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = 'image/*';\r\n\r\n input.onchange = () => {\r\n const file = input.files?.[0];\r\n if (!file) {\r\n reject(new Error('No file selected'));\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n resolve({\r\n dataUrl: reader.result as string,\r\n mimeType: file.type,\r\n });\r\n };\r\n reader.onerror = () => reject(reader.error ?? new Error('FileReader error'));\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n input.click();\r\n });\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, computed, input, output } from '@angular/core';\r\nimport { ButtonVariant, ButtonSize, ButtonShape, ButtonType } from './button.types';\r\n\r\n/**\r\n * Accessible, themed action button with support for variants, shapes, sizes,\r\n * loading state, full-width layout, and named icon slots.\r\n *\r\n * Works identically on **web** and **Angular + Capacitor** (no native API usage).\r\n *\r\n * ```html\r\n * <!-- Basic usage -->\r\n * <keepui-button (clicked)=\"save()\">Save</keepui-button>\r\n *\r\n * <!-- Primary, pill-shaped, fixed width -->\r\n * <keepui-button variant=\"primary\" shape=\"pill\">Confirm</keepui-button>\r\n *\r\n * <!-- With leading icon (any inline element) -->\r\n * <keepui-button variant=\"outline\" size=\"auto\">\r\n * <svg slot=\"leading\" width=\"16\" height=\"16\" aria-hidden=\"true\">…</svg>\r\n * Upload\r\n * </keepui-button>\r\n *\r\n * <!-- Loading state -->\r\n * <keepui-button [loading]=\"isSaving()\">Saving…</keepui-button>\r\n *\r\n * <!-- Full-width, danger -->\r\n * <keepui-button variant=\"danger\" [fullWidth]=\"true\">Delete account</keepui-button>\r\n *\r\n * <!-- Icon-only (requires ariaLabel for accessibility) -->\r\n * <keepui-button variant=\"ghost\" size=\"auto\" ariaLabel=\"Close dialog\">\r\n * <svg slot=\"leading\" …>…</svg>\r\n * </keepui-button>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-button',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[style.display]': 'fullWidth() ? \"block\" : \"inline-block\"',\r\n '[style.width]': 'fullWidth() ? \"100%\" : null',\r\n },\r\n template: `\r\n <button\r\n [attr.type]=\"type()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-disabled]=\"isDisabled() ? true : null\"\r\n [attr.aria-busy]=\"loading() ? true : null\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (click)=\"handleClick()\"\r\n [class]=\"buttonClass()\"\r\n >\r\n @if (loading()) {\r\n <span class=\"keepui-btn-spinner\" aria-hidden=\"true\"></span>\r\n } @else {\r\n <ng-content select=\"[slot='leading']\" />\r\n }\r\n\r\n <ng-content />\r\n\r\n @if (!loading()) {\r\n <ng-content select=\"[slot='trailing']\" />\r\n }\r\n </button>\r\n `,\r\n styles: [`\r\n .keepui-btn-spinner {\r\n display: inline-block;\r\n width: 1em;\r\n height: 1em;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: keepui-spin 0.65s linear infinite;\r\n flex-shrink: 0;\r\n }\r\n\r\n @keyframes keepui-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `],\r\n})\r\nexport class ButtonComponent {\r\n /** Visual style of the button. @default 'primary' */\r\n readonly variant = input<ButtonVariant>('primary');\r\n\r\n /**\r\n * Size mode.\r\n * - `md` → fixed 160 px wide, 40 px tall.\r\n * - `auto` → padding-driven width, 40 px tall.\r\n * @default 'md'\r\n */\r\n readonly size = input<ButtonSize>('md');\r\n\r\n /** Border-radius style. @default 'pill' */\r\n readonly shape = input<ButtonShape>('pill');\r\n\r\n /** HTML `type` attribute of the inner `<button>`. @default 'button' */\r\n readonly type = input<ButtonType>('button');\r\n\r\n /** Disables the button when `true`. @default false */\r\n readonly disabled = input(false);\r\n\r\n /**\r\n * Replaces the content with an animated spinner and sets `aria-busy`.\r\n * Also disables the button until the operation completes.\r\n * @default false\r\n */\r\n readonly loading = input(false);\r\n\r\n /** Expands the button to fill its container width. @default false */\r\n readonly fullWidth = input(false);\r\n\r\n /**\r\n * Accessible label for icon-only buttons.\r\n * When provided, sets the `aria-label` attribute on the inner `<button>`.\r\n * @default ''\r\n */\r\n readonly ariaLabel = input('');\r\n\r\n /** Emitted when the button is clicked and is not disabled or loading. */\r\n readonly clicked = output<void>();\r\n\r\n protected readonly isDisabled = computed(() => this.disabled() || this.loading());\r\n\r\n protected readonly buttonClass = computed(() => {\r\n const base = [\r\n 'inline-flex items-center justify-center gap-2',\r\n 'min-h-[2.75rem] text-sm font-medium cursor-pointer select-none',\r\n 'transition-colors duration-200',\r\n 'focus-visible:outline-none focus-visible:ring-2',\r\n 'focus-visible:ring-ku-primary-border focus-visible:ring-offset-2',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n ].join(' ');\r\n\r\n const sizeClass = this.fullWidth()\r\n ? 'w-full h-10 px-4'\r\n : this.size() === 'md'\r\n ? 'w-40 h-10'\r\n : 'px-6 h-10';\r\n\r\n const shapeMap: Record<ButtonShape, string> = {\r\n pill: 'rounded-full',\r\n rounded: 'rounded-2xl',\r\n };\r\n\r\n const variantMap: Record<ButtonVariant, string> = {\r\n primary: [\r\n 'bg-ku-action-primary text-white border border-ku-action-primary',\r\n 'enabled:hover:opacity-90',\r\n 'enabled:active:opacity-80',\r\n ].join(' '),\r\n secondary: [\r\n 'bg-ku-primary text-ku-action-primary border border-ku-action-primary',\r\n 'enabled:hover:bg-ku-action-background transition-colors',\r\n ].join(' '),\r\n outline: [\r\n 'bg-ku-primary border border-ku-secondary-border text-ku-gray-text',\r\n 'enabled:hover:text-ku-action-primary enabled:hover:border-ku-action-primary transition-colors',\r\n ].join(' '),\r\n ghost: [\r\n 'bg-transparent border border-ku-action-primary text-ku-action-primary',\r\n 'enabled:hover:bg-ku-action-background',\r\n ].join(' '),\r\n danger: [\r\n 'bg-ku-error-primary text-white border border-ku-error-primary',\r\n 'enabled:hover:opacity-90',\r\n 'enabled:active:opacity-80',\r\n ].join(' '),\r\n };\r\n\r\n return [base, sizeClass, shapeMap[this.shape()], variantMap[this.variant()]].join(' ');\r\n });\r\n\r\n protected handleClick(): void {\r\n if (!this.isDisabled()) {\r\n this.clicked.emit();\r\n }\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, computed, input, output } from '@angular/core';\r\nimport { CardColors, CardPadding, CardVariant } from './card.types';\r\n\r\n/**\r\n * Contenedor versátil con soporte de variante, padding, color, estado clickable,\r\n * seleccionado y scrollable.\r\n *\r\n * `padding=\"screen\"` aplica padding lateral y superior pero omite el inferior\r\n * intencionadamente para que el contenido parezca continuar más allá del área visible,\r\n * invitando al usuario a hacer scroll. Un `div` espaciador se inserta automáticamente\r\n * al final del contenido proyectado: cuando el usuario llega al fondo, el espaciador\r\n * reproduce el padding inferior correcto sin que el consumidor deba declararlo.\r\n *\r\n * ```html\r\n * <keepui-card>Contenido</keepui-card>\r\n *\r\n * <keepui-card variant=\"flat\" padding=\"lg\" [clickable]=\"true\" (clicked)=\"onSelect()\">\r\n * Card clicable\r\n * </keepui-card>\r\n *\r\n * <div class=\"h-screen overflow-hidden\">\r\n * <keepui-card padding=\"screen\" [scrollable]=\"true\" [fullHeight]=\"true\">\r\n * Contenido largo — el padding inferior se gestiona automáticamente\r\n * </keepui-card>\r\n * </div>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-card',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block',\r\n '[class.h-full]': 'fullHeight()',\r\n },\r\n template: `\r\n <div\r\n [class]=\"cardClass()\"\r\n (click)=\"onCardClick()\"\r\n [attr.role]=\"clickable() ? 'button' : null\"\r\n [attr.tabindex]=\"clickable() ? 0 : null\"\r\n (keydown.enter)=\"onCardClick()\"\r\n (keydown.space)=\"onCardClick()\"\r\n >\r\n <ng-content />\r\n @if (padding() === 'screen') {\r\n <div class=\"h-4 shrink-0\" aria-hidden=\"true\"></div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class CardComponent {\r\n private readonly BASE_CLASS = 'rounded-xl transition-colors overflow-hidden';\r\n\r\n private readonly VARIANT_CLASS_MAP: Record<CardVariant, string> = {\r\n flat: '',\r\n outlined: 'border border-ku-secondary-border',\r\n };\r\n\r\n private readonly SELECTED_VARIANT_CLASS_MAP: Record<CardVariant, string> = {\r\n flat: 'border border-ku-brand-border',\r\n outlined: 'border border-ku-brand-border',\r\n };\r\n\r\n private readonly PADDING_CLASS_MAP: Record<CardPadding, string> = {\r\n none: '',\r\n sm: 'p-3',\r\n md: 'p-4',\r\n lg: 'p-6',\r\n screen: 'px-4 pt-4',\r\n };\r\n\r\n private readonly COLORS_CLASS_MAP: Record<CardColors, string> = {\r\n primary: 'bg-ku-primary',\r\n secondary: 'bg-ku-secondary',\r\n };\r\n\r\n readonly variant = input<CardVariant>('outlined');\r\n readonly padding = input<CardPadding>('md');\r\n readonly colors = input<CardColors>('primary');\r\n readonly clickable = input<boolean>(false);\r\n readonly selected = input<boolean>(false);\r\n readonly scrollable = input<boolean>(false);\r\n readonly fullHeight = input<boolean>(false);\r\n readonly clicked = output<void>();\r\n\r\n protected readonly cardClass = computed<string>(() => {\r\n const variantClass = this.selected()\r\n ? this.SELECTED_VARIANT_CLASS_MAP[this.variant()]\r\n : this.VARIANT_CLASS_MAP[this.variant()];\r\n\r\n const classes = [\r\n this.BASE_CLASS,\r\n this.COLORS_CLASS_MAP[this.colors()],\r\n variantClass,\r\n this.PADDING_CLASS_MAP[this.padding()],\r\n ];\r\n\r\n if (this.clickable()) {\r\n classes.push(\r\n 'cursor-pointer hover:bg-ku-primary-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-ku-brand-border focus-visible:ring-offset-2'\r\n );\r\n }\r\n\r\n if (this.scrollable()) {\r\n classes.push('overflow-y-auto', 'overflow-x-auto');\r\n }\r\n\r\n if (this.fullHeight()) {\r\n classes.push('h-full');\r\n }\r\n\r\n return classes.filter(Boolean).join(' ');\r\n });\r\n\r\n protected onCardClick(): void {\r\n if (this.clickable()) {\r\n this.clicked.emit();\r\n }\r\n }\r\n}\r\n","import { Component, input, computed, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n/**\r\n * Generic SVG sprite icon renderer.\r\n *\r\n * Renders a `<use href=\"#name\">` reference pointing to an SVG symbol pre-registered\r\n * in the DOM by the consuming application (e.g. via `IconRegistryService`).\r\n *\r\n * Accessibility:\r\n * - When used decoratively (default), the SVG carries `aria-hidden=\"true\"` automatically.\r\n * - When used as a standalone meaningful icon, supply an `ariaLabel` — the SVG will\r\n * receive `role=\"img\"` and `aria-label` accordingly.\r\n *\r\n * ```html\r\n * <!-- Decorative — hidden from screen readers -->\r\n * <keepui-icon name=\"check-icon\" [size]=\"20\" aria-hidden=\"true\" />\r\n *\r\n * <!-- Meaningful standalone icon -->\r\n * <keepui-icon name=\"close-icon\" ariaLabel=\"Cerrar\" />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-icon',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'inline-flex items-center justify-center',\r\n },\r\n template: `\r\n <svg\r\n class=\"block\"\r\n [attr.width]=\"size()\"\r\n [attr.height]=\"size()\"\r\n [attr.viewBox]=\"viewBox()\"\r\n [attr.aria-hidden]=\"ariaLabel() ? null : true\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.role]=\"ariaLabel() ? 'img' : null\"\r\n >\r\n <use [attr.href]=\"href()\" />\r\n </svg>\r\n `,\r\n})\r\nexport class IconComponent {\r\n /** ID of the SVG symbol to render (without the `#` prefix). */\r\n readonly name = input.required<string>();\r\n\r\n /** Width and height of the icon in pixels. @default 24 */\r\n readonly size = input<number>(24);\r\n\r\n /** `viewBox` attribute forwarded to the `<svg>` element. @default '0 0 24 24' */\r\n readonly viewBox = input<string>('0 0 24 24');\r\n\r\n /**\r\n * Accessible label for standalone icons.\r\n * When provided, sets `role=\"img\"` and `aria-label` on the SVG.\r\n * When omitted, the SVG is marked `aria-hidden=\"true\"` (decorative).\r\n * @default ''\r\n */\r\n readonly ariaLabel = input<string>('');\r\n\r\n protected readonly href = computed(() => `#${this.name()}`);\r\n}\r\n\r\n","import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\r\nimport { IconComponent } from '../icon/icon.component';\r\nimport { IconActionButtonVariant, IconActionButtonType } from './icon-action-button.types';\r\n\r\n/**\r\n * Circular icon-only action button with `default` and `danger` variants,\r\n * loading state, and full accessibility support.\r\n *\r\n * Because this button renders no visible text, `ariaLabel` is **required** to\r\n * satisfy WCAG 2.1 SC 4.1.2 (Name, Role, Value).\r\n *\r\n * The icon color is inherited automatically via `currentColor` from the button's\r\n * text color, so SVG symbols defined with `stroke=\"currentColor\"` will adapt to\r\n * both variants and themes without extra classes.\r\n *\r\n * ```html\r\n * <keepui-icon-action-button icon=\"edit-icon\" ariaLabel=\"Editar\" />\r\n *\r\n * <keepui-icon-action-button\r\n * icon=\"trash-icon\"\r\n * variant=\"danger\"\r\n * ariaLabel=\"Eliminar elemento\"\r\n * [loading]=\"isDeleting()\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-icon-action-button',\r\n standalone: true,\r\n imports: [IconComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styles: [`\r\n .keepui-iab-spinner {\r\n display: inline-block;\r\n width: 1.25em;\r\n height: 1.25em;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: keepui-iab-spin 0.65s linear infinite;\r\n flex-shrink: 0;\r\n }\r\n\r\n @keyframes keepui-iab-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `\r\n <button\r\n [attr.type]=\"type()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-disabled]=\"isDisabled() ? true : null\"\r\n [attr.aria-busy]=\"loading() ? true : null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [class]=\"buttonClass()\"\r\n >\r\n @if (loading()) {\r\n <span class=\"keepui-iab-spinner\" aria-hidden=\"true\"></span>\r\n } @else {\r\n <keepui-icon [name]=\"icon()\" [size]=\"iconSize()\" />\r\n }\r\n </button>\r\n `,\r\n})\r\nexport class IconActionButtonComponent {\r\n /** ID of the SVG symbol to render (without the `#` prefix). */\r\n readonly icon = input.required<string>();\r\n\r\n /**\r\n * Accessible label for the button. Always required — icon-only buttons must\r\n * have a programmatic name for screen readers (WCAG 2.1 SC 4.1.2).\r\n */\r\n readonly ariaLabel = input.required<string>();\r\n\r\n /** Visual style variant. @default 'default' */\r\n readonly variant = input<IconActionButtonVariant>('default');\r\n\r\n /** Size of the inner icon in pixels. @default 20 */\r\n readonly iconSize = input<number>(20);\r\n\r\n /** HTML `type` attribute of the inner `<button>`. @default 'button' */\r\n readonly type = input<IconActionButtonType>('button');\r\n\r\n /** Disables the button when `true`. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Shows an animated spinner and disables the button.\r\n * Also sets `aria-busy=\"true\"` on the element.\r\n * @default false\r\n */\r\n readonly loading = input<boolean>(false);\r\n\r\n protected readonly isDisabled = computed(() => this.disabled() || this.loading());\r\n\r\n protected readonly buttonClass = computed<string>(() => {\r\n const base = [\r\n 'inline-flex items-center justify-center shrink-0 cursor-pointer',\r\n 'size-11 rounded-full border transition-colors',\r\n 'focus-visible:outline-none focus-visible:ring-2',\r\n 'focus-visible:ring-ku-primary-border focus-visible:ring-offset-2',\r\n 'disabled:cursor-not-allowed disabled:opacity-50',\r\n ].join(' ');\r\n\r\n const variantMap: Record<IconActionButtonVariant, string> = {\r\n default: [\r\n 'border-ku-secondary-border bg-ku-primary text-ku-gray-text',\r\n 'enabled:hover:bg-ku-action-background enabled:hover:border-ku-action-primary',\r\n 'enabled:hover:text-ku-action-primary',\r\n ].join(' '),\r\n danger: [\r\n 'border-ku-secondary-border bg-ku-primary text-ku-gray-text',\r\n 'enabled:hover:bg-ku-error-background enabled:hover:border-ku-error-primary enabled:hover:text-ku-error-primary',\r\n 'enabled:hover:opacity-90',\r\n ].join(' '),\r\n };\r\n\r\n return `${base} ${variantMap[this.variant()]}`;\r\n });\r\n}\r\n\r\n","/**\r\n * Typed constants for every translation key used in @keepui/ui.\r\n *\r\n * Use these instead of raw strings so that renaming a key is caught by\r\n * the TypeScript compiler across all consumers.\r\n *\r\n * @example\r\n * ```ts\r\n * import { KEEPUI_TRANSLATION_KEYS as T } from '@keepui/ui';\r\n *\r\n * const label = translocoService.translate(T.IMAGE_PREVIEW.SELECT_IMAGE);\r\n * ```\r\n */\r\nexport const KEEPUI_TRANSLATION_KEYS = {\r\n IMAGE_PREVIEW: {\r\n SELECT_IMAGE: 'imagePreview.selectImage',\r\n LOADING: 'imagePreview.loading',\r\n PREVIEW_ALT: 'imagePreview.previewAlt',\r\n ERROR_UNEXPECTED: 'imagePreview.errorUnexpected',\r\n },\r\n SIGNAL_TEXT_INPUT: {\r\n SHOW_PASSWORD: 'signalTextInput.showPassword',\r\n HIDE_PASSWORD: 'signalTextInput.hidePassword',\r\n },\r\n} as const;\r\n\r\n/** Union of all supported KeepUI locales. */\r\nexport type KeepUiLanguage = 'en' | 'es' | 'de';\r\n\r\n/** Ordered list of languages available in KeepUI. */\r\nexport const KEEPUI_AVAILABLE_LANGUAGES: readonly KeepUiLanguage[] = [\r\n 'en',\r\n 'es',\r\n 'de',\r\n] as const;\r\n\r\n","import { Component, ChangeDetectionStrategy, inject, signal } from '@angular/core';\r\nimport { TranslocoPipe, TRANSLOCO_SCOPE } from '@jsverse/transloco';\r\nimport { FILE_PORT } from '../../tokens/file.token';\r\nimport { KEEPUI_TRANSLATION_KEYS as T } from '../../i18n/translation-keys';\r\nimport { ButtonComponent } from '../button/button.component';\r\n\r\n/**\r\n * Standalone component that allows the user to pick and preview an image.\r\n *\r\n * This component is fully platform-agnostic. It delegates file picking to\r\n * whatever `FilePort` implementation is provided via `FILE_PORT`.\r\n *\r\n * UI strings are fully internationalised via Transloco (scope `'keepui'`).\r\n * Call `provideKeepUiI18n()` in your `app.config.ts` and use\r\n * `KeepUiLanguageService.setLanguage(lang)` to change locale at runtime.\r\n *\r\n * Usage:\r\n * ```html\r\n * <keepui-image-preview />\r\n * ```\r\n *\r\n * Prerequisites — register providers in `app.config.ts`:\r\n * - Web: `provideKeepUi()` + `provideKeepUiI18n()`\r\n * - Capacitor: `provideKeepUiCapacitor()` + `provideKeepUiI18n()`\r\n */\r\n@Component({\r\n selector: 'keepui-image-preview',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TranslocoPipe, ButtonComponent],\r\n providers: [{ provide: TRANSLOCO_SCOPE, useValue: 'keepui' }],\r\n host: { class: 'block' },\r\n template: `\r\n <div class=\"flex flex-col gap-4\">\r\n\r\n <keepui-button\r\n type=\"button\"\r\n variant=\"secondary\"\r\n size=\"auto\"\r\n shape=\"rounded\"\r\n [loading]=\"loading()\"\r\n (clicked)=\"pickImage()\"\r\n >\r\n {{ (loading() ? keys.LOADING : keys.SELECT_IMAGE) | transloco }}\r\n </keepui-button>\r\n\r\n <span role=\"status\" class=\"sr-only\">\r\n @if (imageUrl()) {\r\n {{ keys.PREVIEW_ALT | transloco }}\r\n }\r\n </span>\r\n\r\n @if (imageUrl()) {\r\n <div class=\"max-w-full\">\r\n <img\r\n class=\"max-w-full h-auto rounded border border-ku-secondary-border\"\r\n [src]=\"imageUrl()\"\r\n [attr.alt]=\"keys.PREVIEW_ALT | transloco\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (error()) {\r\n <p class=\"text-ku-red-text text-sm m-0\" role=\"alert\">{{ error() }}</p>\r\n }\r\n\r\n </div>\r\n `,\r\n})\r\nexport class ImagePreviewComponent {\r\n private readonly filePort = inject(FILE_PORT);\r\n\r\n /** Translation key references (typed via KEEPUI_TRANSLATION_KEYS). */\r\n protected readonly keys = T.IMAGE_PREVIEW;\r\n\r\n /** URL of the selected image, ready to bind to `[src]`. */\r\n readonly imageUrl = signal<string | null>(null);\r\n /** Error message if the last pick operation failed. */\r\n readonly error = signal<string | null>(null);\r\n /** True while the pick operation is in progress. */\r\n readonly loading = signal(false);\r\n\r\n async pickImage(): Promise<void> {\r\n this.error.set(null);\r\n this.loading.set(true);\r\n\r\n try {\r\n const result = await this.filePort.pickImage();\r\n this.imageUrl.set(result.dataUrl);\r\n } catch (err) {\r\n this.error.set(\r\n err instanceof Error ? err.message : T.IMAGE_PREVIEW.ERROR_UNEXPECTED,\r\n );\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n model,\r\n computed,\r\n viewChild,\r\n ElementRef,\r\n effect,\r\n signal,\r\n DestroyRef,\r\n inject,\r\n output,\r\n} from '@angular/core';\r\nimport { SignalDropdownOption, SignalDropdownWidth } from './signal-dropdown.types';\r\nimport { IconComponent } from '../icon/icon.component';\r\n\r\nconst DROPDOWN_ITEM_HEIGHT = 40;\r\nconst DROPDOWN_PADDING = 8;\r\nconst DROPDOWN_GAP = 8;\r\n\r\n/**\r\n * Signal-based accessible dropdown / select component.\r\n *\r\n * Fully platform-agnostic — no native API usage. The panel opens in `fixed`\r\n * position so it is never clipped by overflow-hidden ancestors. It repositions\r\n * itself automatically on scroll and resize.\r\n *\r\n * The `value` and `touched` properties are `model()` signals so the component\r\n * integrates seamlessly with Angular signal-based forms.\r\n *\r\n * ```html\r\n * <keepui-signal-dropdown\r\n * label=\"País\"\r\n * placeholder=\"Selecciona un país\"\r\n * [options]=\"countries\"\r\n * [(value)]=\"selectedCountry\"\r\n * />\r\n * ```\r\n *\r\n * @typeParam T – type of each option's `value` property. Defaults to `string`.\r\n */\r\n@Component({\r\n selector: 'keepui-signal-dropdown',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [IconComponent],\r\n host: {\r\n class: 'block',\r\n '(document:click)': 'onDocumentClick($event)',\r\n '(document:keydown.escape)': 'close()',\r\n },\r\n template: `\r\n <div class=\"flex flex-col gap-1\" [class]=\"widthClass()\">\r\n\r\n @if (label()) {\r\n <label [for]=\"selectId()\" class=\"text-sm text-ku-gray-text\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-ku-error-primary\" aria-hidden=\"true\"> *</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative\" #dropdownContainer>\r\n\r\n <button\r\n #dropdownButton\r\n [id]=\"selectId()\"\r\n type=\"button\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-required]=\"required() ? true : null\"\r\n [attr.aria-invalid]=\"showError() ? true : null\"\r\n [attr.aria-describedby]=\"showError() ? errorId() : null\"\r\n (click)=\"toggleDropdown()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onButtonKeydown($event)\"\r\n class=\"w-full inline-flex items-center gap-2 bg-ku-primary border rounded-xl\r\n px-4 py-2.5 text-sm transition-all cursor-pointer min-h-[2.75rem]\r\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ku-action-primary\r\n focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\r\n [class]=\"showError() ? 'border-ku-error-primary' : 'border-ku-secondary-border'\"\r\n >\r\n <span\r\n class=\"flex-1 text-left flex items-center justify-between gap-2 min-w-0\"\r\n [class]=\"value() === null ? 'text-ku-gray-text opacity-70' : 'text-ku-primary-text'\"\r\n >\r\n <span class=\"truncate\">{{ selectedLabel() }}</span>\r\n\r\n @if (selectedBadges().length) {\r\n <span class=\"flex flex-wrap items-center gap-1.5 shrink-0\">\r\n @for (badge of selectedBadges(); track badge) {\r\n <span class=\"inline-flex items-center rounded-full bg-ku-action-background\r\n px-2 py-0.5 text-[11px] font-medium text-ku-action-primary\">\r\n {{ badge }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n </span>\r\n\r\n <keepui-icon\r\n name=\"chevron-down-icon\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n class=\"text-ku-gray-text transition-transform duration-200 shrink-0\"\r\n [class.rotate-180]=\"isOpen()\"\r\n />\r\n </button>\r\n\r\n @if (isOpen()) {\r\n <div\r\n role=\"listbox\"\r\n [attr.aria-label]=\"label() || null\"\r\n class=\"fixed rounded-xl shadow-lg bg-ku-primary border border-ku-secondary-border\r\n z-[1000] overflow-y-auto max-h-64\"\r\n [style]=\"panelStyle()\"\r\n >\r\n @for (option of options(); track option.value; let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"isSelected(option.value)\"\r\n (click)=\"selectOption(option)\"\r\n (keydown)=\"onOptionKeydown($event, option, i)\"\r\n class=\"w-full text-left cursor-pointer px-4 py-2 text-sm text-ku-primary-text\r\n flex items-center gap-3 transition-colors min-h-[2.75rem]\r\n hover:bg-ku-primary-hover focus-visible:outline-none\r\n focus-visible:bg-ku-primary-hover\"\r\n [class]=\"isSelected(option.value) ? 'bg-ku-primary-hover' : ''\"\r\n >\r\n <span class=\"flex-1 flex items-center justify-between gap-2 min-w-0\">\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n\r\n @if (option.badges?.length) {\r\n <span class=\"flex flex-wrap items-center gap-1.5 shrink-0\">\r\n @for (badge of option.badges ?? []; track badge) {\r\n <span class=\"inline-flex items-center rounded-full bg-ku-action-background\r\n px-2 py-0.5 text-[11px] font-medium text-ku-action-primary\">\r\n {{ badge }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n </span>\r\n\r\n @if (isSelected(option.value)) {\r\n <keepui-icon\r\n name=\"check-icon\"\r\n [size]=\"16\"\r\n aria-hidden=\"true\"\r\n class=\"text-ku-action-primary shrink-0\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n @if (showError()) {\r\n <span\r\n [id]=\"errorId()\"\r\n class=\"text-sm text-ku-error-primary\"\r\n role=\"alert\"\r\n >\r\n @if (errorMessage()) {\r\n {{ errorMessage() }}\r\n } @else if (errors().length > 0) {\r\n {{ errors()[0] }}\r\n }\r\n </span>\r\n }\r\n\r\n </div>\r\n `,\r\n})\r\nexport class SignalDropdownComponent<T = string> {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n protected readonly isOpen = signal(false);\r\n protected readonly openUpwards = signal(false);\r\n protected readonly panelTopPx = signal(0);\r\n protected readonly panelLeftPx = signal(0);\r\n protected readonly panelWidthPx = signal(0);\r\n\r\n protected readonly dropdownButton =\r\n viewChild<ElementRef<HTMLButtonElement>>('dropdownButton');\r\n protected readonly dropdownContainer =\r\n viewChild<ElementRef<HTMLElement>>('dropdownContainer');\r\n\r\n /** Optional label text rendered above the dropdown. */\r\n readonly label = input<string>('');\r\n\r\n /** Placeholder shown when no value is selected. */\r\n readonly placeholder = input<string>('');\r\n\r\n /** Array of options to display in the panel. */\r\n readonly options = input.required<SignalDropdownOption<T>[]>();\r\n\r\n /** Layout width of the wrapper. @default 'full' */\r\n readonly width = input<SignalDropdownWidth>('full');\r\n\r\n /** Marks the field as required. Adds `aria-required` and a visual asterisk. @default false */\r\n readonly required = input<boolean>(false);\r\n\r\n /** Human-readable error message shown below the dropdown. Takes precedence over `errors[0]`. */\r\n readonly errorMessage = input<string>('');\r\n\r\n /**\r\n * Array of error strings. The first item is displayed when `errorMessage` is empty.\r\n * Set together with `invalid=true` to trigger the error state.\r\n */\r\n readonly errors = input<readonly string[]>([]);\r\n\r\n /**\r\n * Stable `id` used to link the `<label>` with the trigger `<button>`.\r\n * A random suffix is generated by default.\r\n */\r\n readonly selectId = input<string>(\r\n `ku-dropdown-${Math.random().toString(36).slice(2, 8)}`,\r\n );\r\n\r\n /** Disables the dropdown. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Forces the error visual state regardless of the `touched` model.\r\n * Useful for external form validation. @default false\r\n */\r\n readonly invalid = input<boolean>(false);\r\n\r\n /** Currently selected value. Use `[(value)]` for two-way binding. */\r\n readonly value = model<T | null>(null);\r\n\r\n /** Whether the control has been interacted with. Use `[(touched)]` for two-way binding. */\r\n readonly touched = model<boolean>(false);\r\n\r\n /** Emitted when the selected value changes. */\r\n readonly valueChange = output<T | null>();\r\n\r\n protected readonly errorId = computed(\r\n () => `${this.selectId()}-error`,\r\n );\r\n\r\n protected readonly panelStyle = computed<string>(\r\n () =>\r\n `top:${this.panelTopPx()}px;left:${this.panelLeftPx()}px;width:${this.panelWidthPx()}px`,\r\n );\r\n\r\n protected readonly widthClass = computed<string>(() => {\r\n const map: Record<SignalDropdownWidth, string> = {\r\n full: 'w-full',\r\n half: 'w-1/2',\r\n auto: 'w-auto',\r\n };\r\n return map[this.width()];\r\n });\r\n\r\n protected readonly selectedLabel = computed<string>(() => {\r\n const current = this.value();\r\n if (current === null) return this.placeholder();\r\n return this.options().find(o => o.value === current)?.label ?? this.placeholder();\r\n });\r\n\r\n protected readonly selectedBadges = computed<string[]>(() => {\r\n const current = this.value();\r\n if (current === null) return [];\r\n return this.options().find(o => o.value === current)?.badges ?? [];\r\n });\r\n\r\n protected readonly showError = computed(\r\n () => this.touched() && (this.invalid() || this.errorMessage().length > 0 || this.errors().length > 0),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.isOpen()) {\r\n this.calculateDropdownPosition();\r\n this.addViewportListeners();\r\n } else {\r\n this.removeViewportListeners();\r\n }\r\n });\r\n\r\n this.destroyRef.onDestroy(() => this.removeViewportListeners());\r\n }\r\n\r\n protected onDocumentClick(event: MouseEvent): void {\r\n const container = this.dropdownContainer()?.nativeElement;\r\n if (container && !container.contains(event.target as Node)) {\r\n this.isOpen.set(false);\r\n }\r\n }\r\n\r\n protected toggleDropdown(): void {\r\n if (this.disabled()) return;\r\n this.isOpen.update(open => !open);\r\n }\r\n\r\n protected close(): void {\r\n if (this.isOpen()) {\r\n this.isOpen.set(false);\r\n this.dropdownButton()?.nativeElement.focus();\r\n }\r\n }\r\n\r\n protected selectOption(option: SignalDropdownOption<T>): void {\r\n this.value.set(option.value);\r\n this.isOpen.set(false);\r\n this.dropdownButton()?.nativeElement.focus();\r\n this.valueChange.emit(option.value);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.touched.set(true);\r\n }\r\n\r\n protected isSelected(optionValue: T): boolean {\r\n return this.value() === optionValue;\r\n }\r\n\r\n protected onButtonKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (!this.isOpen()) {\r\n this.isOpen.set(true);\r\n }\r\n }\r\n }\r\n\r\n protected onOptionKeydown(\r\n event: KeyboardEvent,\r\n option: SignalDropdownOption<T>,\r\n index: number,\r\n ): void {\r\n const panel = this.dropdownContainer()?.nativeElement;\r\n const optionButtons = panel?.querySelectorAll<HTMLButtonElement>('[role=\"option\"]');\r\n if (!optionButtons) return;\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n optionButtons[Math.min(index + 1, optionButtons.length - 1)]?.focus();\r\n } else if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (index === 0) {\r\n this.dropdownButton()?.nativeElement.focus();\r\n } else {\r\n optionButtons[index - 1]?.focus();\r\n }\r\n } else if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.selectOption(option);\r\n }\r\n }\r\n\r\n private calculateDropdownPosition(): void {\r\n const button = this.dropdownButton()?.nativeElement;\r\n if (!button) return;\r\n\r\n const rect = button.getBoundingClientRect();\r\n const estimatedHeight = Math.min(\r\n this.options().length * DROPDOWN_ITEM_HEIGHT + DROPDOWN_PADDING,\r\n 256,\r\n );\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const shouldOpenUpwards =\r\n spaceBelow < estimatedHeight + DROPDOWN_GAP &&\r\n spaceAbove > estimatedHeight + DROPDOWN_GAP;\r\n\r\n this.openUpwards.set(shouldOpenUpwards);\r\n this.panelWidthPx.set(rect.width);\r\n this.panelLeftPx.set(rect.left);\r\n this.panelTopPx.set(\r\n shouldOpenUpwards\r\n ? rect.top - estimatedHeight - DROPDOWN_GAP\r\n : rect.bottom + DROPDOWN_GAP,\r\n );\r\n }\r\n\r\n private readonly recalculatePosition = (): void => {\r\n if (this.isOpen()) this.calculateDropdownPosition();\r\n };\r\n\r\n private addViewportListeners(): void {\r\n this.removeViewportListeners();\r\n window.addEventListener('scroll', this.recalculatePosition, true);\r\n window.addEventListener('resize', this.recalculatePosition);\r\n }\r\n\r\n private removeViewportListeners(): void {\r\n window.removeEventListener('scroll', this.recalculatePosition, true);\r\n window.removeEventListener('resize', this.recalculatePosition);\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n model,\r\n computed,\r\n signal,\r\n viewChild,\r\n ElementRef,\r\n} from '@angular/core';\r\nimport { TranslocoPipe, TRANSLOCO_SCOPE } from '@jsverse/transloco';\r\nimport { SignalTextInputType, SignalTextInputWidth } from './signal-text-input.types';\r\nimport { IconComponent } from '../icon/icon.component';\r\nimport { KEEPUI_TRANSLATION_KEYS as T } from '../../i18n/translation-keys';\r\n\r\n/**\r\n * Signal-based accessible text input supporting all common HTML input types,\r\n * leading/trailing icons, a trailing content slot, and a built-in\r\n * password-visibility toggle (when `type=\"password\"`).\r\n *\r\n * The `value` and `touched` properties are `model()` signals so the component\r\n * integrates seamlessly with Angular signal-based forms.\r\n *\r\n * Password toggle labels are translated via Transloco (scope `'keepui'`).\r\n * Call `provideKeepUiI18n()` in your `app.config.ts` to activate i18n.\r\n *\r\n * ```html\r\n * <keepui-signal-text-input\r\n * label=\"Email\"\r\n * type=\"email\"\r\n * placeholder=\"usuario@ejemplo.com\"\r\n * leadingIcon=\"mail-icon\"\r\n * [(value)]=\"email\"\r\n * />\r\n *\r\n * <!-- Password with toggle -->\r\n * <keepui-signal-text-input\r\n * label=\"Contraseña\"\r\n * type=\"password\"\r\n * [(value)]=\"password\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-signal-text-input',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [IconComponent, TranslocoPipe],\r\n providers: [{ provide: TRANSLOCO_SCOPE, useValue: 'keepui' }],\r\n host: { class: 'block' },\r\n template: `\r\n <div class=\"flex flex-col gap-1\" [class]=\"widthClass()\">\r\n\r\n @if (label()) {\r\n <label [for]=\"inputId()\" class=\"text-sm text-ku-gray-text\">\r\n {{ label() }}\r\n @if (required() && showRequiredIndicator()) {\r\n <span class=\"text-ku-error-primary\" aria-hidden=\"true\"> *</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative flex items-center\">\r\n\r\n @if (hasLeading()) {\r\n <span\r\n class=\"absolute left-3 flex items-center pointer-events-none text-ku-gray-text\"\r\n aria-hidden=\"true\"\r\n >\r\n <keepui-icon [name]=\"leadingIcon()\" [size]=\"18\" />\r\n </span>\r\n }\r\n\r\n <input\r\n #inputRef\r\n [id]=\"inputId()\"\r\n [type]=\"resolvedType()\"\r\n [value]=\"value()\"\r\n [placeholder]=\"placeholder()\"\r\n [disabled]=\"disabled()\"\r\n [attr.required]=\"required() ? true : null\"\r\n [attr.aria-required]=\"required() ? true : null\"\r\n [attr.aria-invalid]=\"showError() ? true : null\"\r\n [attr.aria-describedby]=\"showError() ? errorId() : null\"\r\n class=\"bg-ku-primary border rounded-xl py-2.5 text-sm text-ku-primary-text\r\n placeholder:text-ku-gray-text outline-none transition-colors w-full\r\n disabled:opacity-50 disabled:cursor-not-allowed min-h-[2.75rem]\r\n dark:[color-scheme:dark]\"\r\n [class]=\"inputClasses()\"\r\n (click)=\"openDatePicker()\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n @if (hasTrailingSlot()) {\r\n <div class=\"absolute right-1 flex items-center\">\r\n <ng-content select=\"[trailingSlot]\" />\r\n </div>\r\n } @else if (isPasswordType()) {\r\n <button\r\n type=\"button\"\r\n (click)=\"togglePasswordVisibility()\"\r\n class=\"absolute right-3 flex items-center justify-center text-ku-gray-text\r\n hover:text-ku-primary-text transition-colors cursor-pointer\r\n focus-visible:outline-none focus-visible:ring-2\r\n focus-visible:ring-ku-action-primary rounded min-h-[2.75rem] min-w-[2.75rem]\"\r\n [attr.aria-label]=\"(isPasswordVisible()\r\n ? keys.HIDE_PASSWORD\r\n : keys.SHOW_PASSWORD) | transloco\"\r\n >\r\n <keepui-icon\r\n [name]=\"isPasswordVisible() ? 'eye-off-icon' : 'eye-icon'\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n } @else if (hasTrailing()) {\r\n <span\r\n class=\"absolute right-3 flex items-center pointer-events-none text-ku-gray-text\"\r\n aria-hidden=\"true\"\r\n >\r\n <keepui-icon [name]=\"trailingIcon()\" [size]=\"18\" />\r\n </span>\r\n }\r\n\r\n </div>\r\n\r\n @if (showError()) {\r\n <span\r\n [id]=\"errorId()\"\r\n class=\"text-sm text-ku-error-primary\"\r\n role=\"alert\"\r\n >\r\n @if (errorMessage()) {\r\n {{ errorMessage() }}\r\n } @else if (errors().length > 0) {\r\n {{ errors()[0] }}\r\n }\r\n </span>\r\n }\r\n\r\n </div>\r\n `,\r\n})\r\nexport class SignalTextInputComponent {\r\n\r\n protected readonly isPasswordVisible = signal(false);\r\n\r\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputRef');\r\n\r\n /** Translation key references (typed via KEEPUI_TRANSLATION_KEYS). */\r\n protected readonly keys = T.SIGNAL_TEXT_INPUT;\r\n\r\n /** Optional label text rendered above the input. */\r\n readonly label = input<string>('');\r\n\r\n /** Placeholder passed to the underlying `<input>`. */\r\n readonly placeholder = input<string>('');\r\n\r\n /** HTML `type` attribute. Use `'password'` to enable the visibility toggle. @default 'text' */\r\n readonly type = input<SignalTextInputType>('text');\r\n\r\n /** Layout width of the wrapper. @default 'full' */\r\n readonly width = input<SignalTextInputWidth>('full');\r\n\r\n /** Name of the leading icon (SVG symbol ID). Leave empty for no icon. */\r\n readonly leadingIcon = input<string>('');\r\n\r\n /** Name of the trailing icon (SVG symbol ID). Ignored when `type=\"password\"`. */\r\n readonly trailingIcon = input<string>('');\r\n\r\n /**\r\n * When `true`, a slot for custom trailing content is enabled\r\n * (projects `[trailingSlot]` content). Overrides `trailingIcon`.\r\n * @default false\r\n */\r\n readonly hasTrailingSlot = input<boolean>(false);\r\n\r\n /** Marks the field as required. Adds `aria-required` and a visual asterisk. @default false */\r\n readonly required = input<boolean>(false);\r\n\r\n /** When `false`, hides the visual asterisk even if `required=true`. @default true */\r\n readonly showRequiredIndicator = input<boolean>(true);\r\n\r\n /** Human-readable error message. Takes precedence over `errors[0]`. */\r\n readonly errorMessage = input<string>('');\r\n\r\n /**\r\n * Array of error strings. The first item is displayed when `errorMessage` is empty.\r\n * Set together with `invalid=true` to trigger the error state.\r\n */\r\n readonly errors = input<readonly string[]>([]);\r\n\r\n /**\r\n * Stable `id` used to link the `<label>` with the `<input>`.\r\n * A random suffix is generated by default.\r\n */\r\n readonly inputId = input<string>(\r\n `ku-text-input-${Math.random().toString(36).slice(2, 8)}`,\r\n );\r\n\r\n /** Disables the input. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Forces the error visual state regardless of the `touched` model.\r\n * Useful for external form validation. @default false\r\n */\r\n readonly invalid = input<boolean>(false);\r\n\r\n /** Current text value. Use `[(value)]` for two-way binding. */\r\n readonly value = model<string>('');\r\n\r\n /** Whether the control has been interacted with. Use `[(touched)]` for two-way binding. */\r\n readonly touched = model<boolean>(false);\r\n\r\n protected readonly errorId = computed(\r\n () => `${this.inputId()}-error`,\r\n );\r\n\r\n protected readonly isPasswordType = computed(() => this.type() === 'password');\r\n\r\n protected readonly resolvedType = computed<string>(() => {\r\n if (this.isPasswordType()) {\r\n return this.isPasswordVisible() ? 'text' : 'password';\r\n }\r\n return this.type();\r\n });\r\n\r\n protected readonly widthClass = computed<string>(() => {\r\n const map: Record<SignalTextInputWidth, string> = {\r\n full: 'w-full',\r\n half: 'w-1/2',\r\n auto: 'w-auto',\r\n };\r\n return map[this.width()];\r\n });\r\n\r\n protected readonly hasLeading = computed(() => this.leadingIcon().length > 0);\r\n\r\n protected readonly hasTrailing = computed(\r\n () => this.trailingIcon().length > 0 && !this.isPasswordType(),\r\n );\r\n\r\n protected readonly showError = computed(\r\n () =>\r\n this.touched() &&\r\n (this.invalid() || this.errorMessage().length > 0 || this.errors().length > 0),\r\n );\r\n\r\n protected readonly isDateEmpty = computed(\r\n () => this.type() === 'date' && !this.value(),\r\n );\r\n\r\n protected readonly inputClasses = computed(() => {\r\n const textColor = this.isDateEmpty()\r\n ? 'text-ku-gray-text'\r\n : 'text-ku-primary-text';\r\n const paddingLeft = this.hasLeading() ? 'pl-9' : 'pl-4';\r\n const paddingRight = this.hasTrailingSlot()\r\n ? 'pr-24'\r\n : this.hasTrailing() || this.isPasswordType()\r\n ? 'pr-10'\r\n : 'pr-4';\r\n const borderColor = this.showError()\r\n ? 'border-ku-error-primary'\r\n : 'border-ku-secondary-border focus-visible:border-ku-action-primary';\r\n const cursor = this.type() === 'date' ? 'cursor-pointer' : '';\r\n\r\n return `${textColor} ${paddingLeft} ${paddingRight} ${borderColor} ${cursor}`;\r\n });\r\n\r\n protected onInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n this.value.set(target.value);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.touched.set(true);\r\n }\r\n\r\n protected openDatePicker(): void {\r\n if (this.type() === 'date') {\r\n try {\r\n this.inputRef()?.nativeElement.showPicker();\r\n } catch { /* showPicker not supported in all browsers */ }\r\n }\r\n }\r\n\r\n protected togglePasswordVisibility(): void {\r\n this.isPasswordVisible.update(v => !v);\r\n }\r\n}\r\n\r\n\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n model,\r\n computed,\r\n} from '@angular/core';\r\nimport { SignalTextareaResize, SignalTextareaWidth } from './signal-textarea.types';\r\n\r\n/**\r\n * Signal-based accessible textarea component with character counter,\r\n * resize control, and integrated error display.\r\n *\r\n * The `value` and `touched` properties are `model()` signals so the component\r\n * integrates seamlessly with Angular signal-based forms.\r\n *\r\n * ```html\r\n * <keepui-signal-textarea\r\n * label=\"Descripción\"\r\n * placeholder=\"Escribe aquí…\"\r\n * [rows]=\"5\"\r\n * [maxLength]=\"500\"\r\n * [(value)]=\"description\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-signal-textarea',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'block' },\r\n template: `\r\n <div class=\"flex flex-col gap-1\" [class]=\"widthClass()\">\r\n\r\n @if (label()) {\r\n <label [for]=\"textareaId()\" class=\"text-sm text-ku-gray-text\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-ku-error-primary\" aria-hidden=\"true\"> *</span>\r\n }\r\n </label>\r\n }\r\n\r\n <textarea\r\n [id]=\"textareaId()\"\r\n [value]=\"value()\"\r\n [placeholder]=\"placeholder()\"\r\n [rows]=\"rows()\"\r\n [disabled]=\"disabled()\"\r\n [attr.maxlength]=\"maxLength() ?? null\"\r\n [attr.required]=\"required() ? true : null\"\r\n [attr.aria-required]=\"required() ? true : null\"\r\n [attr.aria-invalid]=\"showError() ? true : null\"\r\n [attr.aria-describedby]=\"showError() ? errorId() : (maxLength() ? charCountId() : null)\"\r\n class=\"bg-ku-primary border rounded-xl p-3 text-sm text-ku-primary-text\r\n placeholder:text-ku-gray-text outline-none transition-colors w-full\r\n disabled:opacity-50 disabled:cursor-not-allowed\"\r\n [class]=\"textareaClasses()\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n\r\n <div class=\"flex items-start justify-between gap-2\">\r\n\r\n <span\r\n [id]=\"errorId()\"\r\n class=\"text-sm text-ku-error-primary\"\r\n role=\"alert\"\r\n >\r\n @if (showError()) {\r\n @if (errorMessage()) {\r\n {{ errorMessage() }}\r\n } @else if (errors().length > 0) {\r\n {{ errors()[0] }}\r\n }\r\n }\r\n </span>\r\n\r\n @if (maxLength()) {\r\n <span\r\n [id]=\"charCountId()\"\r\n class=\"text-xs text-ku-gray-text ml-auto shrink-0\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n >\r\n {{ charCount() }}&thinsp;/&thinsp;{{ maxLength() }}\r\n </span>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n `,\r\n})\r\nexport class SignalTextareaComponent {\r\n\r\n /** Optional label text rendered above the textarea. */\r\n readonly label = input<string>('');\r\n\r\n /** Placeholder passed to the underlying `<textarea>`. */\r\n readonly placeholder = input<string>('');\r\n\r\n /** Number of visible text rows. @default 4 */\r\n readonly rows = input<number>(4);\r\n\r\n /** Layout width of the wrapper. @default 'full' */\r\n readonly width = input<SignalTextareaWidth>('full');\r\n\r\n /** CSS `resize` behaviour. @default 'none' */\r\n readonly resize = input<SignalTextareaResize>('none');\r\n\r\n /** Marks the field as required. @default false */\r\n readonly required = input<boolean>(false);\r\n\r\n /** Human-readable error message. Takes precedence over `errors[0]`. */\r\n readonly errorMessage = input<string>('');\r\n\r\n /**\r\n * Array of error strings. The first item is displayed when `errorMessage` is empty.\r\n * Set together with `invalid=true` to trigger the error state.\r\n */\r\n readonly errors = input<readonly string[]>([]);\r\n\r\n /**\r\n * Stable `id` used to link the `<label>` with the `<textarea>`.\r\n * A random suffix is generated by default.\r\n */\r\n readonly textareaId = input<string>(\r\n `ku-textarea-${Math.random().toString(36).slice(2, 8)}`,\r\n );\r\n\r\n /** Disables the textarea. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /** Maximum number of characters allowed. Shows a character counter when set. */\r\n readonly maxLength = input<number | undefined>(undefined);\r\n\r\n /**\r\n * Forces the error visual state regardless of the `touched` model.\r\n * Useful for external form validation. @default false\r\n */\r\n readonly invalid = input<boolean>(false);\r\n\r\n /** Current text value. Use `[(value)]` for two-way binding. */\r\n readonly value = model<string>('');\r\n\r\n /** Whether the control has been interacted with. Use `[(touched)]` for two-way binding. */\r\n readonly touched = model<boolean>(false);\r\n\r\n protected readonly errorId = computed(() => `${this.textareaId()}-error`);\r\n protected readonly charCountId = computed(() => `${this.textareaId()}-count`);\r\n\r\n protected readonly charCount = computed(() => this.value().length);\r\n\r\n protected readonly showError = computed(\r\n () =>\r\n this.touched() &&\r\n (this.invalid() || this.errorMessage().length > 0 || this.errors().length > 0),\r\n );\r\n\r\n protected readonly widthClass = computed<string>(() => {\r\n const map: Record<SignalTextareaWidth, string> = {\r\n full: 'w-full',\r\n half: 'w-1/2',\r\n auto: 'w-auto',\r\n };\r\n return map[this.width()];\r\n });\r\n\r\n protected readonly resizeClass = computed<string>(() => {\r\n const map: Record<SignalTextareaResize, string> = {\r\n none: 'resize-none',\r\n vertical: 'resize-y',\r\n horizontal: 'resize-x',\r\n both: 'resize',\r\n };\r\n return map[this.resize()];\r\n });\r\n\r\n protected readonly textareaClasses = computed(() => {\r\n const borderColor = this.showError()\r\n ? 'border-ku-error-primary'\r\n : 'border-ku-secondary-border focus-visible:border-ku-action-primary';\r\n return `${this.resizeClass()} ${borderColor}`;\r\n });\r\n\r\n protected onInput(event: Event): void {\r\n const target = event.target as HTMLTextAreaElement;\r\n this.value.set(target.value);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.touched.set(true);\r\n }\r\n}\r\n\r\n\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { FILE_PORT } from '../tokens/file.token';\r\nimport { WebFileService } from '../services/web-file.service';\r\n\r\n/**\r\n * Registers KeepUI core providers for a **web** Angular application.\r\n *\r\n * Registers `WebFileService` as the implementation of `FILE_PORT`, enabling\r\n * all KeepUI components to use the browser's native file picker.\r\n *\r\n * Add to `app.config.ts`:\r\n * ```ts\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [provideKeepUi()],\r\n * };\r\n * ```\r\n */\r\nexport function provideKeepUi(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: FILE_PORT, useClass: WebFileService },\r\n ]);\r\n}\r\n","/**\r\n * Inline translation objects for KeepUI.\r\n *\r\n * These mirror `en.json`, `es.json` and `de.json` and are bundled directly\r\n * into the library so that no HTTP request is needed at runtime.\r\n *\r\n * > **Do not edit this file manually.**\r\n * > Keep it in sync with the JSON files inside `/i18n/`.\r\n */\r\n\r\nimport { KeepUiLanguage } from './translation-keys';\r\n\r\nexport interface KeepUiTranslationSchema {\r\n imagePreview: {\r\n selectImage: string;\r\n loading: string;\r\n previewAlt: string;\r\n errorUnexpected: string;\r\n };\r\n signalTextInput: {\r\n showPassword: string;\r\n hidePassword: string;\r\n };\r\n}\r\n\r\nconst EN: KeepUiTranslationSchema = {\r\n imagePreview: {\r\n selectImage: 'Select image',\r\n loading: 'Loading…',\r\n previewAlt: 'Selected image preview',\r\n errorUnexpected: 'An unexpected error occurred',\r\n },\r\n signalTextInput: {\r\n showPassword: 'Show password',\r\n hidePassword: 'Hide password',\r\n },\r\n};\r\n\r\nconst ES: KeepUiTranslationSchema = {\r\n imagePreview: {\r\n selectImage: 'Seleccionar imagen',\r\n loading: 'Cargando…',\r\n previewAlt: 'Vista previa de imagen seleccionada',\r\n errorUnexpected: 'Ha ocurrido un error inesperado',\r\n },\r\n signalTextInput: {\r\n showPassword: 'Mostrar contraseña',\r\n hidePassword: 'Ocultar contraseña',\r\n },\r\n};\r\n\r\nconst DE: KeepUiTranslationSchema = {\r\n imagePreview: {\r\n selectImage: 'Bild auswählen',\r\n loading: 'Laden…',\r\n previewAlt: 'Vorschau des ausgewählten Bildes',\r\n errorUnexpected: 'Ein unerwarteter Fehler ist aufgetreten',\r\n },\r\n signalTextInput: {\r\n showPassword: 'Passwort anzeigen',\r\n hidePassword: 'Passwort verbergen',\r\n },\r\n};\r\n\r\n/** Map from locale code to its translation object. */\r\nexport const KEEPUI_TRANSLATIONS: Record<KeepUiLanguage, KeepUiTranslationSchema> = {\r\n en: EN,\r\n es: ES,\r\n de: DE,\r\n};\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { Translation, TranslocoLoader } from '@jsverse/transloco';\r\nimport { Observable, of } from 'rxjs';\r\nimport { KeepUiLanguage } from '../i18n/translation-keys';\r\nimport { KEEPUI_TRANSLATIONS } from '../i18n/keep-ui-translations';\r\n\r\n/**\r\n * Transloco loader for KeepUI.\r\n *\r\n * Serves translations **inline** (bundled in the library JS) so that no HTTP\r\n * request is required. It handles both plain lang paths (`'en'`, `'es'`, …)\r\n * and scope-prefixed paths (`'keepui/en'`, `'keepui/es'`, …).\r\n *\r\n * @internal\r\n */\r\n@Injectable()\r\nexport class KeepUiTranslocoLoader implements TranslocoLoader {\r\n getTranslation(langPath: string): Observable<Translation> {\r\n // Transloco calls this with 'keepui/en', 'keepui/es', etc.\r\n // when a component has TRANSLOCO_SCOPE = 'keepui'.\r\n const lang = langPath.includes('/') ? langPath.split('/')[1] : langPath;\r\n\r\n const isValid = (l: string): l is KeepUiLanguage =>\r\n l === 'en' || l === 'es' || l === 'de';\r\n\r\n const translations = isValid(lang)\r\n ? KEEPUI_TRANSLATIONS[lang]\r\n : KEEPUI_TRANSLATIONS['en'];\r\n\r\n return of(translations as unknown as Translation);\r\n }\r\n}\r\n\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { KeepUiLanguage, KEEPUI_AVAILABLE_LANGUAGES } from '../i18n/translation-keys';\r\n\r\n/**\r\n * Service that exposes a public API for changing the active language of all\r\n * KeepUI components at runtime.\r\n *\r\n * ### Usage\r\n * ```ts\r\n * // Inject anywhere in the host application\r\n * const lang = inject(KeepUiLanguageService);\r\n *\r\n * // Switch to Spanish\r\n * lang.setLanguage('es');\r\n *\r\n * // Read the active language\r\n * console.log(lang.activeLanguage()); // 'es'\r\n * ```\r\n *\r\n * Register via `provideKeepUiI18n()` in `app.config.ts`.\r\n */\r\n@Injectable()\r\nexport class KeepUiLanguageService {\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n /** Signal that reflects the currently active KeepUI locale. */\r\n readonly activeLanguage = signal<KeepUiLanguage>(\r\n this.transloco.getActiveLang() as KeepUiLanguage,\r\n );\r\n\r\n /** Ordered list of all supported locales. */\r\n readonly availableLanguages: readonly KeepUiLanguage[] = KEEPUI_AVAILABLE_LANGUAGES;\r\n\r\n /**\r\n * Changes the active language for all KeepUI components.\r\n *\r\n * @param lang - One of `'en'`, `'es'` or `'de'`.\r\n */\r\n setLanguage(lang: KeepUiLanguage): void {\r\n this.transloco.setActiveLang(lang);\r\n this.activeLanguage.set(lang);\r\n }\r\n}\r\n\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { provideTransloco } from '@jsverse/transloco';\r\nimport { KeepUiLanguage, KEEPUI_AVAILABLE_LANGUAGES } from '../i18n/translation-keys';\r\nimport { KeepUiTranslocoLoader } from '../services/keep-ui-transloco-loader.service';\r\nimport { KeepUiLanguageService } from '../services/keep-ui-language.service';\r\n\r\n/**\r\n * Options for `provideKeepUiI18n()`.\r\n */\r\nexport interface KeepUiI18nOptions {\r\n /**\r\n * The default language to use when the app starts.\r\n * @default 'en'\r\n */\r\n defaultLang?: KeepUiLanguage;\r\n}\r\n\r\n/**\r\n * Registers all providers required for KeepUI internationalisation.\r\n *\r\n * - Configures a self-contained Transloco instance scoped to `'keepui'`.\r\n * - Bundles all translations **inline** — no HTTP assets required.\r\n * - Provides {@link KeepUiLanguageService} so the host app can switch locale.\r\n *\r\n * ### Usage in `app.config.ts`\r\n * ```ts\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideKeepUi(),\r\n * provideKeepUiI18n(), // default language: 'en'\r\n * provideKeepUiI18n({ defaultLang: 'es' }), // or start in Spanish\r\n * ],\r\n * };\r\n * ```\r\n *\r\n * ### Changing language at runtime\r\n * ```ts\r\n * const lang = inject(KeepUiLanguageService);\r\n * lang.setLanguage('de');\r\n * ```\r\n *\r\n * > **Note:** If your application already calls `provideTransloco()`, do NOT\r\n * > call `provideKeepUiI18n()` — instead configure your Transloco loader to\r\n * > handle the `'keepui/{lang}'` scope paths, and provide `KeepUiLanguageService`\r\n * > manually.\r\n */\r\nexport function provideKeepUiI18n(\r\n options: KeepUiI18nOptions = {},\r\n): EnvironmentProviders {\r\n const defaultLang: KeepUiLanguage = options.defaultLang ?? 'en';\r\n\r\n return makeEnvironmentProviders([\r\n provideTransloco({\r\n config: {\r\n defaultLang,\r\n availableLangs: [...KEEPUI_AVAILABLE_LANGUAGES],\r\n reRenderOnLangChange: true,\r\n failedRetries: 0,\r\n missingHandler: { useFallbackTranslation: true },\r\n fallbackLang: 'en',\r\n },\r\n loader: KeepUiTranslocoLoader,\r\n }),\r\n\r\n KeepUiLanguageService,\r\n ]);\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { FilePort } from '../ports/file.port';\r\nimport { FileResult } from '../models/file-result.model';\r\n\r\n/**\r\n * A controllable mock implementation of `FilePort` for use in unit tests.\r\n *\r\n * By default, `pickImage()` resolves successfully. Set `nextError` to make the\r\n * next call reject with that error.\r\n *\r\n * ```ts\r\n * providers: [{ provide: FILE_PORT, useClass: MockFileService }]\r\n * ```\r\n */\r\n@Injectable()\r\nexport class MockFileService implements FilePort {\r\n /** Set this to make the next `pickImage()` call reject with this error. */\r\n nextError: Error | null = null;\r\n\r\n pickImage(): Promise<FileResult> {\r\n if (this.nextError) {\r\n const err = this.nextError;\r\n this.nextError = null;\r\n return Promise.reject(err);\r\n }\r\n return Promise.resolve({\r\n dataUrl: 'data:image/jpeg;base64,mockImageData==',\r\n mimeType: 'image/jpeg',\r\n });\r\n }\r\n}\r\n","// Public API Surface of @keepui/ui\r\n\r\n// Models\r\nexport * from './lib/models/file-result.model';\r\n\r\n// Ports (interfaces)\r\nexport * from './lib/ports/file.port';\r\n\r\n// Injection tokens\r\nexport * from './lib/tokens/file.token';\r\n\r\n// Services\r\nexport * from './lib/services/web-file.service';\r\n\r\n// Components\r\nexport * from './lib/components/button/button.types';\r\nexport * from './lib/components/button/button.component';\r\nexport * from './lib/components/card/card.types';\r\nexport * from './lib/components/card/card.component';\r\nexport * from './lib/components/icon/icon.component';\r\nexport * from './lib/components/icon-action-button/icon-action-button.types';\r\nexport * from './lib/components/icon-action-button/icon-action-button.component';\r\nexport * from './lib/components/image-preview/image-preview.component';\r\nexport * from './lib/components/signal-dropdown/signal-dropdown.types';\r\nexport * from './lib/components/signal-dropdown/signal-dropdown.component';\r\nexport * from './lib/components/signal-text-input/signal-text-input.types';\r\nexport * from './lib/components/signal-text-input/signal-text-input.component';\r\nexport * from './lib/components/signal-textarea/signal-textarea.types';\r\nexport * from './lib/components/signal-textarea/signal-textarea.component';\r\n\r\n// Providers\r\nexport * from './lib/providers/provide-keep-ui';\r\nexport * from './lib/providers/keep-ui-i18n.provider';\r\n\r\n// i18n – translation keys & language utilities\r\nexport * from './lib/i18n/translation-keys';\r\nexport * from './lib/i18n/keep-ui-translations';\r\nexport * from './lib/services/keep-ui-language.service';\r\n\r\n// Testing utilities\r\nexport * from './lib/testing/mock-file.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["T"],"mappings":"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"}
1
+ {"version":3,"file":"keepui-ui.mjs","sources":["../../../projects/keep-ui/src/lib/tokens/file.token.ts","../../../projects/keep-ui/src/lib/services/web-file.service.ts","../../../projects/keep-ui/src/lib/components/button/button.component.ts","../../../projects/keep-ui/src/lib/components/card/card.component.ts","../../../projects/keep-ui/src/lib/components/icon/icon.component.ts","../../../projects/keep-ui/src/lib/components/icon-action-button/icon-action-button.component.ts","../../../projects/keep-ui/src/lib/i18n/translation-keys.ts","../../../projects/keep-ui/src/lib/components/image-preview/image-preview.component.ts","../../../projects/keep-ui/src/lib/components/signal-dropdown/signal-dropdown.component.ts","../../../projects/keep-ui/src/lib/components/signal-text-input/signal-text-input.component.ts","../../../projects/keep-ui/src/lib/components/signal-textarea/signal-textarea.component.ts","../../../projects/keep-ui/src/lib/components/tab-group/tab-group.component.ts","../../../projects/keep-ui/src/lib/components/stepper/stepper.component.ts","../../../projects/keep-ui/src/lib/providers/provide-keep-ui.ts","../../../projects/keep-ui/src/lib/i18n/keep-ui-translations.ts","../../../projects/keep-ui/src/lib/services/keep-ui-transloco-loader.service.ts","../../../projects/keep-ui/src/lib/services/keep-ui-language.service.ts","../../../projects/keep-ui/src/lib/providers/keep-ui-i18n.provider.ts","../../../projects/keep-ui/src/lib/testing/mock-file.service.ts","../../../projects/keep-ui/src/public-api.ts","../../../projects/keep-ui/src/keepui-ui.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { FilePort } from '../ports/file.port';\r\n\r\n/**\r\n * Injection token for the platform file/image adapter.\r\n *\r\n * Register a concrete implementation with:\r\n * - `provideKeepUi()` for web projects\r\n * - `provideKeepUiCapacitor()` for Angular + Capacitor projects\r\n */\r\nexport const FILE_PORT = new InjectionToken<FilePort>('FILE_PORT');\r\n","import { Injectable } from '@angular/core';\r\nimport { FilePort } from '../ports/file.port';\r\nimport { FileResult } from '../models/file-result.model';\r\n\r\n/**\r\n * Web implementation of `FilePort`.\r\n *\r\n * Uses a hidden `<input type=\"file\">` and the `FileReader` API to let the user\r\n * pick an image from the file system in a browser environment.\r\n *\r\n * This implementation has no dependency on Capacitor or any native plugin.\r\n */\r\n@Injectable()\r\nexport class WebFileService implements FilePort {\r\n pickImage(): Promise<FileResult> {\r\n return new Promise<FileResult>((resolve, reject) => {\r\n const input = document.createElement('input');\r\n input.type = 'file';\r\n input.accept = 'image/*';\r\n\r\n input.onchange = () => {\r\n const file = input.files?.[0];\r\n if (!file) {\r\n reject(new Error('No file selected'));\r\n return;\r\n }\r\n\r\n const reader = new FileReader();\r\n reader.onload = () => {\r\n resolve({\r\n dataUrl: reader.result as string,\r\n mimeType: file.type,\r\n });\r\n };\r\n reader.onerror = () => reject(reader.error ?? new Error('FileReader error'));\r\n reader.readAsDataURL(file);\r\n };\r\n\r\n input.click();\r\n });\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, computed, input, output } from '@angular/core';\r\nimport { ButtonVariant, ButtonSize, ButtonShape, ButtonType } from './button.types';\r\n\r\n/**\r\n * Accessible, themed action button with support for variants, shapes, sizes,\r\n * loading state, full-width layout, and named icon slots.\r\n *\r\n * Works identically on **web** and **Angular + Capacitor** (no native API usage).\r\n *\r\n * ```html\r\n * <!-- Basic usage -->\r\n * <keepui-button (clicked)=\"save()\">Save</keepui-button>\r\n *\r\n * <!-- Primary, pill-shaped, fixed width -->\r\n * <keepui-button variant=\"primary\" shape=\"pill\">Confirm</keepui-button>\r\n *\r\n * <!-- With leading icon (any inline element) -->\r\n * <keepui-button variant=\"outline\" size=\"auto\">\r\n * <svg slot=\"leading\" width=\"16\" height=\"16\" aria-hidden=\"true\">…</svg>\r\n * Upload\r\n * </keepui-button>\r\n *\r\n * <!-- Loading state -->\r\n * <keepui-button [loading]=\"isSaving()\">Saving…</keepui-button>\r\n *\r\n * <!-- Full-width, danger -->\r\n * <keepui-button variant=\"danger\" [fullWidth]=\"true\">Delete account</keepui-button>\r\n *\r\n * <!-- Icon-only (requires ariaLabel for accessibility) -->\r\n * <keepui-button variant=\"ghost\" size=\"auto\" ariaLabel=\"Close dialog\">\r\n * <svg slot=\"leading\" …>…</svg>\r\n * </keepui-button>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-button',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n '[style.display]': 'fullWidth() ? \"block\" : \"inline-block\"',\r\n '[style.width]': 'fullWidth() ? \"100%\" : null',\r\n },\r\n template: `\r\n <button\r\n [attr.type]=\"type()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-disabled]=\"isDisabled() ? true : null\"\r\n [attr.aria-busy]=\"loading() ? true : null\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n (click)=\"handleClick()\"\r\n [class]=\"buttonClass()\"\r\n >\r\n @if (loading()) {\r\n <span class=\"keepui-btn-spinner\" aria-hidden=\"true\"></span>\r\n } @else {\r\n <ng-content select=\"[slot='leading']\" />\r\n }\r\n\r\n <ng-content />\r\n\r\n @if (!loading()) {\r\n <ng-content select=\"[slot='trailing']\" />\r\n }\r\n </button>\r\n `,\r\n styles: [`\r\n .keepui-btn-spinner {\r\n display: inline-block;\r\n width: 1em;\r\n height: 1em;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: keepui-spin 0.65s linear infinite;\r\n flex-shrink: 0;\r\n }\r\n\r\n @keyframes keepui-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `],\r\n})\r\nexport class ButtonComponent {\r\n /** Visual style of the button. @default 'primary' */\r\n readonly variant = input<ButtonVariant>('primary');\r\n\r\n /**\r\n * Size mode.\r\n * - `md` → fixed 160 px wide, 40 px tall.\r\n * - `auto` → padding-driven width, 40 px tall.\r\n * @default 'md'\r\n */\r\n readonly size = input<ButtonSize>('md');\r\n\r\n /** Border-radius style. @default 'pill' */\r\n readonly shape = input<ButtonShape>('pill');\r\n\r\n /** HTML `type` attribute of the inner `<button>`. @default 'button' */\r\n readonly type = input<ButtonType>('button');\r\n\r\n /** Disables the button when `true`. @default false */\r\n readonly disabled = input(false);\r\n\r\n /**\r\n * Replaces the content with an animated spinner and sets `aria-busy`.\r\n * Also disables the button until the operation completes.\r\n * @default false\r\n */\r\n readonly loading = input(false);\r\n\r\n /** Expands the button to fill its container width. @default false */\r\n readonly fullWidth = input(false);\r\n\r\n /**\r\n * Accessible label for icon-only buttons.\r\n * When provided, sets the `aria-label` attribute on the inner `<button>`.\r\n * @default ''\r\n */\r\n readonly ariaLabel = input('');\r\n\r\n /** Emitted when the button is clicked and is not disabled or loading. */\r\n readonly clicked = output<void>();\r\n\r\n protected readonly isDisabled = computed(() => this.disabled() || this.loading());\r\n\r\n protected readonly buttonClass = computed(() => {\r\n const base = [\r\n 'inline-flex items-center justify-center gap-2',\r\n 'min-h-[2.75rem] text-sm font-medium cursor-pointer select-none',\r\n 'transition-colors duration-200',\r\n 'focus-visible:outline-none focus-visible:ring-2',\r\n 'focus-visible:ring-ku-primary-border focus-visible:ring-offset-2',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n ].join(' ');\r\n\r\n const sizeClass = this.fullWidth()\r\n ? 'w-full h-10 px-4'\r\n : this.size() === 'md'\r\n ? 'w-40 h-10'\r\n : 'px-6 h-10';\r\n\r\n const shapeMap: Record<ButtonShape, string> = {\r\n pill: 'rounded-full',\r\n rounded: 'rounded-2xl',\r\n };\r\n\r\n const variantMap: Record<ButtonVariant, string> = {\r\n primary: [\r\n 'bg-ku-action-primary text-white border border-ku-action-primary',\r\n 'enabled:hover:opacity-90',\r\n 'enabled:active:opacity-80',\r\n ].join(' '),\r\n secondary: [\r\n 'bg-ku-primary text-ku-action-primary border border-ku-action-primary',\r\n 'enabled:hover:bg-ku-action-background transition-colors',\r\n ].join(' '),\r\n outline: [\r\n 'bg-ku-primary border border-ku-secondary-border text-ku-gray-text',\r\n 'enabled:hover:text-ku-action-primary enabled:hover:border-ku-action-primary transition-colors',\r\n ].join(' '),\r\n ghost: [\r\n 'bg-transparent border border-ku-action-primary text-ku-action-primary',\r\n 'enabled:hover:bg-ku-action-background',\r\n ].join(' '),\r\n danger: [\r\n 'bg-ku-error-primary text-white border border-ku-error-primary',\r\n 'enabled:hover:opacity-90',\r\n 'enabled:active:opacity-80',\r\n ].join(' '),\r\n };\r\n\r\n return [base, sizeClass, shapeMap[this.shape()], variantMap[this.variant()]].join(' ');\r\n });\r\n\r\n protected handleClick(): void {\r\n if (!this.isDisabled()) {\r\n this.clicked.emit();\r\n }\r\n }\r\n}\r\n","import { Component, ChangeDetectionStrategy, computed, input, output } from '@angular/core';\r\nimport { CardColors, CardPadding, CardVariant } from './card.types';\r\n\r\n/**\r\n * Contenedor versátil con soporte de variante, padding, color, estado clickable,\r\n * seleccionado y scrollable.\r\n *\r\n * `padding=\"screen\"` aplica padding lateral y superior pero omite el inferior\r\n * intencionadamente para que el contenido parezca continuar más allá del área visible,\r\n * invitando al usuario a hacer scroll. Un `div` espaciador se inserta automáticamente\r\n * al final del contenido proyectado: cuando el usuario llega al fondo, el espaciador\r\n * reproduce el padding inferior correcto sin que el consumidor deba declararlo.\r\n *\r\n * ```html\r\n * <keepui-card>Contenido</keepui-card>\r\n *\r\n * <keepui-card variant=\"flat\" padding=\"lg\" [clickable]=\"true\" (clicked)=\"onSelect()\">\r\n * Card clicable\r\n * </keepui-card>\r\n *\r\n * <div class=\"h-screen overflow-hidden\">\r\n * <keepui-card padding=\"screen\" [scrollable]=\"true\" [fullHeight]=\"true\">\r\n * Contenido largo — el padding inferior se gestiona automáticamente\r\n * </keepui-card>\r\n * </div>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-card',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'block',\r\n '[class.h-full]': 'fullHeight()',\r\n },\r\n template: `\r\n <div\r\n [class]=\"cardClass()\"\r\n (click)=\"onCardClick()\"\r\n [attr.role]=\"clickable() ? 'button' : null\"\r\n [attr.tabindex]=\"clickable() ? 0 : null\"\r\n (keydown.enter)=\"onCardClick()\"\r\n (keydown.space)=\"onCardClick()\"\r\n >\r\n <ng-content />\r\n @if (padding() === 'screen') {\r\n <div class=\"h-4 shrink-0\" aria-hidden=\"true\"></div>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class CardComponent {\r\n private readonly BASE_CLASS = 'rounded-xl transition-colors overflow-hidden';\r\n\r\n private readonly VARIANT_CLASS_MAP: Record<CardVariant, string> = {\r\n flat: '',\r\n outlined: 'border border-ku-secondary-border',\r\n };\r\n\r\n private readonly SELECTED_VARIANT_CLASS_MAP: Record<CardVariant, string> = {\r\n flat: 'border border-ku-brand-border',\r\n outlined: 'border border-ku-brand-border',\r\n };\r\n\r\n private readonly PADDING_CLASS_MAP: Record<CardPadding, string> = {\r\n none: '',\r\n sm: 'p-3',\r\n md: 'p-4',\r\n lg: 'p-6',\r\n screen: 'px-4 pt-4',\r\n };\r\n\r\n private readonly COLORS_CLASS_MAP: Record<CardColors, string> = {\r\n primary: 'bg-ku-primary',\r\n secondary: 'bg-ku-secondary',\r\n };\r\n\r\n readonly variant = input<CardVariant>('outlined');\r\n readonly padding = input<CardPadding>('md');\r\n readonly colors = input<CardColors>('primary');\r\n readonly clickable = input<boolean>(false);\r\n readonly selected = input<boolean>(false);\r\n readonly scrollable = input<boolean>(false);\r\n readonly fullHeight = input<boolean>(false);\r\n readonly clicked = output<void>();\r\n\r\n protected readonly cardClass = computed<string>(() => {\r\n const variantClass = this.selected()\r\n ? this.SELECTED_VARIANT_CLASS_MAP[this.variant()]\r\n : this.VARIANT_CLASS_MAP[this.variant()];\r\n\r\n const classes = [\r\n this.BASE_CLASS,\r\n this.COLORS_CLASS_MAP[this.colors()],\r\n variantClass,\r\n this.PADDING_CLASS_MAP[this.padding()],\r\n ];\r\n\r\n if (this.clickable()) {\r\n classes.push(\r\n 'cursor-pointer hover:bg-ku-primary-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-ku-brand-border focus-visible:ring-offset-2'\r\n );\r\n }\r\n\r\n if (this.scrollable()) {\r\n classes.push('overflow-y-auto', 'overflow-x-auto');\r\n }\r\n\r\n if (this.fullHeight()) {\r\n classes.push('h-full');\r\n }\r\n\r\n return classes.filter(Boolean).join(' ');\r\n });\r\n\r\n protected onCardClick(): void {\r\n if (this.clickable()) {\r\n this.clicked.emit();\r\n }\r\n }\r\n}\r\n","import { Component, input, computed, ChangeDetectionStrategy } from '@angular/core';\r\n\r\n/**\r\n * Generic SVG sprite icon renderer.\r\n *\r\n * Renders a `<use href=\"#name\">` reference pointing to an SVG symbol pre-registered\r\n * in the DOM by the consuming application (e.g. via `IconRegistryService`).\r\n *\r\n * Accessibility:\r\n * - When used decoratively (default), the SVG carries `aria-hidden=\"true\"` automatically.\r\n * - When used as a standalone meaningful icon, supply an `ariaLabel` — the SVG will\r\n * receive `role=\"img\"` and `aria-label` accordingly.\r\n *\r\n * ```html\r\n * <!-- Decorative — hidden from screen readers -->\r\n * <keepui-icon name=\"check-icon\" [size]=\"20\" aria-hidden=\"true\" />\r\n *\r\n * <!-- Meaningful standalone icon -->\r\n * <keepui-icon name=\"close-icon\" ariaLabel=\"Cerrar\" />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-icon',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'inline-flex items-center justify-center',\r\n },\r\n template: `\r\n <svg\r\n class=\"block\"\r\n [attr.width]=\"size()\"\r\n [attr.height]=\"size()\"\r\n [attr.viewBox]=\"viewBox()\"\r\n [attr.aria-hidden]=\"ariaLabel() ? null : true\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.role]=\"ariaLabel() ? 'img' : null\"\r\n >\r\n <use [attr.href]=\"href()\" />\r\n </svg>\r\n `,\r\n})\r\nexport class IconComponent {\r\n /** ID of the SVG symbol to render (without the `#` prefix). */\r\n readonly name = input.required<string>();\r\n\r\n /** Width and height of the icon in pixels. @default 24 */\r\n readonly size = input<number>(24);\r\n\r\n /** `viewBox` attribute forwarded to the `<svg>` element. @default '0 0 24 24' */\r\n readonly viewBox = input<string>('0 0 24 24');\r\n\r\n /**\r\n * Accessible label for standalone icons.\r\n * When provided, sets `role=\"img\"` and `aria-label` on the SVG.\r\n * When omitted, the SVG is marked `aria-hidden=\"true\"` (decorative).\r\n * @default ''\r\n */\r\n readonly ariaLabel = input<string>('');\r\n\r\n protected readonly href = computed(() => `#${this.name()}`);\r\n}\r\n\r\n","import { Component, ChangeDetectionStrategy, input, computed } from '@angular/core';\r\nimport { IconComponent } from '../icon/icon.component';\r\nimport { IconActionButtonVariant, IconActionButtonType } from './icon-action-button.types';\r\n\r\n/**\r\n * Circular icon-only action button with `default` and `danger` variants,\r\n * loading state, and full accessibility support.\r\n *\r\n * Because this button renders no visible text, `ariaLabel` is **required** to\r\n * satisfy WCAG 2.1 SC 4.1.2 (Name, Role, Value).\r\n *\r\n * The icon color is inherited automatically via `currentColor` from the button's\r\n * text color, so SVG symbols defined with `stroke=\"currentColor\"` will adapt to\r\n * both variants and themes without extra classes.\r\n *\r\n * ```html\r\n * <keepui-icon-action-button icon=\"edit-icon\" ariaLabel=\"Editar\" />\r\n *\r\n * <keepui-icon-action-button\r\n * icon=\"trash-icon\"\r\n * variant=\"danger\"\r\n * ariaLabel=\"Eliminar elemento\"\r\n * [loading]=\"isDeleting()\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-icon-action-button',\r\n standalone: true,\r\n imports: [IconComponent],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styles: [`\r\n .keepui-iab-spinner {\r\n display: inline-block;\r\n width: 1.25em;\r\n height: 1.25em;\r\n border: 2px solid currentColor;\r\n border-top-color: transparent;\r\n border-radius: 50%;\r\n animation: keepui-iab-spin 0.65s linear infinite;\r\n flex-shrink: 0;\r\n }\r\n\r\n @keyframes keepui-iab-spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n `],\r\n template: `\r\n <button\r\n [attr.type]=\"type()\"\r\n [disabled]=\"isDisabled()\"\r\n [attr.aria-disabled]=\"isDisabled() ? true : null\"\r\n [attr.aria-busy]=\"loading() ? true : null\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [class]=\"buttonClass()\"\r\n >\r\n @if (loading()) {\r\n <span class=\"keepui-iab-spinner\" aria-hidden=\"true\"></span>\r\n } @else {\r\n <keepui-icon [name]=\"icon()\" [size]=\"iconSize()\" />\r\n }\r\n </button>\r\n `,\r\n})\r\nexport class IconActionButtonComponent {\r\n /** ID of the SVG symbol to render (without the `#` prefix). */\r\n readonly icon = input.required<string>();\r\n\r\n /**\r\n * Accessible label for the button. Always required — icon-only buttons must\r\n * have a programmatic name for screen readers (WCAG 2.1 SC 4.1.2).\r\n */\r\n readonly ariaLabel = input.required<string>();\r\n\r\n /** Visual style variant. @default 'default' */\r\n readonly variant = input<IconActionButtonVariant>('default');\r\n\r\n /** Size of the inner icon in pixels. @default 20 */\r\n readonly iconSize = input<number>(20);\r\n\r\n /** HTML `type` attribute of the inner `<button>`. @default 'button' */\r\n readonly type = input<IconActionButtonType>('button');\r\n\r\n /** Disables the button when `true`. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Shows an animated spinner and disables the button.\r\n * Also sets `aria-busy=\"true\"` on the element.\r\n * @default false\r\n */\r\n readonly loading = input<boolean>(false);\r\n\r\n protected readonly isDisabled = computed(() => this.disabled() || this.loading());\r\n\r\n protected readonly buttonClass = computed<string>(() => {\r\n const base = [\r\n 'inline-flex items-center justify-center shrink-0 cursor-pointer',\r\n 'size-11 rounded-full border transition-colors',\r\n 'focus-visible:outline-none focus-visible:ring-2',\r\n 'focus-visible:ring-ku-primary-border focus-visible:ring-offset-2',\r\n 'disabled:cursor-not-allowed disabled:opacity-50',\r\n ].join(' ');\r\n\r\n const variantMap: Record<IconActionButtonVariant, string> = {\r\n default: [\r\n 'border-ku-secondary-border bg-ku-primary text-ku-gray-text',\r\n 'enabled:hover:bg-ku-action-background enabled:hover:border-ku-action-primary',\r\n 'enabled:hover:text-ku-action-primary',\r\n ].join(' '),\r\n danger: [\r\n 'border-ku-secondary-border bg-ku-primary text-ku-gray-text',\r\n 'enabled:hover:bg-ku-error-background enabled:hover:border-ku-error-primary enabled:hover:text-ku-error-primary',\r\n 'enabled:hover:opacity-90',\r\n ].join(' '),\r\n };\r\n\r\n return `${base} ${variantMap[this.variant()]}`;\r\n });\r\n}\r\n\r\n","/**\r\n * Typed constants for every translation key used in @keepui/ui.\r\n *\r\n * Use these instead of raw strings so that renaming a key is caught by\r\n * the TypeScript compiler across all consumers.\r\n *\r\n * @example\r\n * ```ts\r\n * import { KEEPUI_TRANSLATION_KEYS as T } from '@keepui/ui';\r\n *\r\n * const label = translocoService.translate(T.IMAGE_PREVIEW.SELECT_IMAGE);\r\n * ```\r\n */\r\nexport const KEEPUI_TRANSLATION_KEYS = {\r\n IMAGE_PREVIEW: {\r\n SELECT_IMAGE: 'imagePreview.selectImage',\r\n LOADING: 'imagePreview.loading',\r\n PREVIEW_ALT: 'imagePreview.previewAlt',\r\n ERROR_UNEXPECTED: 'imagePreview.errorUnexpected',\r\n },\r\n SIGNAL_TEXT_INPUT: {\r\n SHOW_PASSWORD: 'signalTextInput.showPassword',\r\n HIDE_PASSWORD: 'signalTextInput.hidePassword',\r\n },\r\n} as const;\r\n\r\n/** Union of all supported KeepUI locales. */\r\nexport type KeepUiLanguage = 'en' | 'es' | 'de';\r\n\r\n/** Ordered list of languages available in KeepUI. */\r\nexport const KEEPUI_AVAILABLE_LANGUAGES: readonly KeepUiLanguage[] = [\r\n 'en',\r\n 'es',\r\n 'de',\r\n] as const;\r\n\r\n","import { Component, ChangeDetectionStrategy, inject, signal } from '@angular/core';\r\nimport { TranslocoPipe, TRANSLOCO_SCOPE } from '@jsverse/transloco';\r\nimport { FILE_PORT } from '../../tokens/file.token';\r\nimport { KEEPUI_TRANSLATION_KEYS as T } from '../../i18n/translation-keys';\r\nimport { ButtonComponent } from '../button/button.component';\r\n\r\n/**\r\n * Standalone component that allows the user to pick and preview an image.\r\n *\r\n * This component is fully platform-agnostic. It delegates file picking to\r\n * whatever `FilePort` implementation is provided via `FILE_PORT`.\r\n *\r\n * UI strings are fully internationalised via Transloco (scope `'keepui'`).\r\n * Call `provideKeepUiI18n()` in your `app.config.ts` and use\r\n * `KeepUiLanguageService.setLanguage(lang)` to change locale at runtime.\r\n *\r\n * Usage:\r\n * ```html\r\n * <keepui-image-preview />\r\n * ```\r\n *\r\n * Prerequisites — register providers in `app.config.ts`:\r\n * - Web: `provideKeepUi()` + `provideKeepUiI18n()`\r\n * - Capacitor: `provideKeepUiCapacitor()` + `provideKeepUiI18n()`\r\n */\r\n@Component({\r\n selector: 'keepui-image-preview',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [TranslocoPipe, ButtonComponent],\r\n providers: [{ provide: TRANSLOCO_SCOPE, useValue: 'keepui' }],\r\n host: { class: 'block' },\r\n template: `\r\n <div class=\"flex flex-col gap-4\">\r\n\r\n <keepui-button\r\n type=\"button\"\r\n variant=\"secondary\"\r\n size=\"auto\"\r\n shape=\"rounded\"\r\n [loading]=\"loading()\"\r\n (clicked)=\"pickImage()\"\r\n >\r\n {{ (loading() ? keys.LOADING : keys.SELECT_IMAGE) | transloco }}\r\n </keepui-button>\r\n\r\n <span role=\"status\" class=\"sr-only\">\r\n @if (imageUrl()) {\r\n {{ keys.PREVIEW_ALT | transloco }}\r\n }\r\n </span>\r\n\r\n @if (imageUrl()) {\r\n <div class=\"max-w-full\">\r\n <img\r\n class=\"max-w-full h-auto rounded border border-ku-secondary-border\"\r\n [src]=\"imageUrl()\"\r\n [attr.alt]=\"keys.PREVIEW_ALT | transloco\"\r\n />\r\n </div>\r\n }\r\n\r\n @if (error()) {\r\n <p class=\"text-ku-red-text text-sm m-0\" role=\"alert\">{{ error() }}</p>\r\n }\r\n\r\n </div>\r\n `,\r\n})\r\nexport class ImagePreviewComponent {\r\n private readonly filePort = inject(FILE_PORT);\r\n\r\n /** Translation key references (typed via KEEPUI_TRANSLATION_KEYS). */\r\n protected readonly keys = T.IMAGE_PREVIEW;\r\n\r\n /** URL of the selected image, ready to bind to `[src]`. */\r\n readonly imageUrl = signal<string | null>(null);\r\n /** Error message if the last pick operation failed. */\r\n readonly error = signal<string | null>(null);\r\n /** True while the pick operation is in progress. */\r\n readonly loading = signal(false);\r\n\r\n async pickImage(): Promise<void> {\r\n this.error.set(null);\r\n this.loading.set(true);\r\n\r\n try {\r\n const result = await this.filePort.pickImage();\r\n this.imageUrl.set(result.dataUrl);\r\n } catch (err) {\r\n this.error.set(\r\n err instanceof Error ? err.message : T.IMAGE_PREVIEW.ERROR_UNEXPECTED,\r\n );\r\n } finally {\r\n this.loading.set(false);\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n model,\r\n computed,\r\n viewChild,\r\n ElementRef,\r\n effect,\r\n signal,\r\n DestroyRef,\r\n inject,\r\n output,\r\n} from '@angular/core';\r\nimport { SignalDropdownOption, SignalDropdownWidth } from './signal-dropdown.types';\r\nimport { IconComponent } from '../icon/icon.component';\r\n\r\nconst DROPDOWN_ITEM_HEIGHT = 40;\r\nconst DROPDOWN_PADDING = 8;\r\nconst DROPDOWN_GAP = 8;\r\n\r\n/**\r\n * Signal-based accessible dropdown / select component.\r\n *\r\n * Fully platform-agnostic — no native API usage. The panel opens in `fixed`\r\n * position so it is never clipped by overflow-hidden ancestors. It repositions\r\n * itself automatically on scroll and resize.\r\n *\r\n * The `value` and `touched` properties are `model()` signals so the component\r\n * integrates seamlessly with Angular signal-based forms.\r\n *\r\n * ```html\r\n * <keepui-signal-dropdown\r\n * label=\"País\"\r\n * placeholder=\"Selecciona un país\"\r\n * [options]=\"countries\"\r\n * [(value)]=\"selectedCountry\"\r\n * />\r\n * ```\r\n *\r\n * @typeParam T – type of each option's `value` property. Defaults to `string`.\r\n */\r\n@Component({\r\n selector: 'keepui-signal-dropdown',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [IconComponent],\r\n host: {\r\n class: 'block',\r\n '(document:click)': 'onDocumentClick($event)',\r\n '(document:keydown.escape)': 'close()',\r\n },\r\n template: `\r\n <div class=\"flex flex-col gap-1\" [class]=\"widthClass()\">\r\n\r\n @if (label()) {\r\n <label [for]=\"selectId()\" class=\"text-sm text-ku-gray-text\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-ku-error-primary\" aria-hidden=\"true\"> *</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative\" #dropdownContainer>\r\n\r\n <button\r\n #dropdownButton\r\n [id]=\"selectId()\"\r\n type=\"button\"\r\n [disabled]=\"disabled()\"\r\n [attr.aria-disabled]=\"disabled() ? true : null\"\r\n [attr.aria-expanded]=\"isOpen()\"\r\n [attr.aria-haspopup]=\"'listbox'\"\r\n [attr.aria-required]=\"required() ? true : null\"\r\n [attr.aria-invalid]=\"showError() ? true : null\"\r\n [attr.aria-describedby]=\"showError() ? errorId() : null\"\r\n (click)=\"toggleDropdown()\"\r\n (blur)=\"onBlur()\"\r\n (keydown)=\"onButtonKeydown($event)\"\r\n class=\"w-full inline-flex items-center gap-2 bg-ku-primary border rounded-xl\r\n px-4 py-2.5 text-sm transition-all cursor-pointer min-h-[2.75rem]\r\n focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ku-action-primary\r\n focus-visible:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed\"\r\n [class]=\"showError() ? 'border-ku-error-primary' : 'border-ku-secondary-border'\"\r\n >\r\n <span\r\n class=\"flex-1 text-left flex items-center justify-between gap-2 min-w-0\"\r\n [class]=\"value() === null ? 'text-ku-gray-text opacity-70' : 'text-ku-primary-text'\"\r\n >\r\n <span class=\"truncate\">{{ selectedLabel() }}</span>\r\n\r\n @if (selectedBadges().length) {\r\n <span class=\"flex flex-wrap items-center gap-1.5 shrink-0\">\r\n @for (badge of selectedBadges(); track badge) {\r\n <span class=\"inline-flex items-center rounded-full bg-ku-action-background\r\n px-2 py-0.5 text-[11px] font-medium text-ku-action-primary\">\r\n {{ badge }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n </span>\r\n\r\n <keepui-icon\r\n name=\"chevron-down-icon\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n class=\"text-ku-gray-text transition-transform duration-200 shrink-0\"\r\n [class.rotate-180]=\"isOpen()\"\r\n />\r\n </button>\r\n\r\n @if (isOpen()) {\r\n <div\r\n role=\"listbox\"\r\n [attr.aria-label]=\"label() || null\"\r\n class=\"fixed rounded-xl shadow-lg bg-ku-primary border border-ku-secondary-border\r\n z-[1000] overflow-y-auto max-h-64\"\r\n [style]=\"panelStyle()\"\r\n >\r\n @for (option of options(); track option.value; let i = $index) {\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n [attr.aria-selected]=\"isSelected(option.value)\"\r\n (click)=\"selectOption(option)\"\r\n (keydown)=\"onOptionKeydown($event, option, i)\"\r\n class=\"w-full text-left cursor-pointer px-4 py-2 text-sm text-ku-primary-text\r\n flex items-center gap-3 transition-colors min-h-[2.75rem]\r\n hover:bg-ku-primary-hover focus-visible:outline-none\r\n focus-visible:bg-ku-primary-hover\"\r\n [class]=\"isSelected(option.value) ? 'bg-ku-primary-hover' : ''\"\r\n >\r\n <span class=\"flex-1 flex items-center justify-between gap-2 min-w-0\">\r\n <span class=\"truncate\">{{ option.label }}</span>\r\n\r\n @if (option.badges?.length) {\r\n <span class=\"flex flex-wrap items-center gap-1.5 shrink-0\">\r\n @for (badge of option.badges ?? []; track badge) {\r\n <span class=\"inline-flex items-center rounded-full bg-ku-action-background\r\n px-2 py-0.5 text-[11px] font-medium text-ku-action-primary\">\r\n {{ badge }}\r\n </span>\r\n }\r\n </span>\r\n }\r\n </span>\r\n\r\n @if (isSelected(option.value)) {\r\n <keepui-icon\r\n name=\"check-icon\"\r\n [size]=\"16\"\r\n aria-hidden=\"true\"\r\n class=\"text-ku-action-primary shrink-0\"\r\n />\r\n }\r\n </button>\r\n }\r\n </div>\r\n }\r\n\r\n </div>\r\n\r\n @if (showError()) {\r\n <span\r\n [id]=\"errorId()\"\r\n class=\"text-sm text-ku-error-primary\"\r\n role=\"alert\"\r\n >\r\n @if (errorMessage()) {\r\n {{ errorMessage() }}\r\n } @else if (errors().length > 0) {\r\n {{ errors()[0] }}\r\n }\r\n </span>\r\n }\r\n\r\n </div>\r\n `,\r\n})\r\nexport class SignalDropdownComponent<T = string> {\r\n\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n protected readonly isOpen = signal(false);\r\n protected readonly openUpwards = signal(false);\r\n protected readonly panelTopPx = signal(0);\r\n protected readonly panelLeftPx = signal(0);\r\n protected readonly panelWidthPx = signal(0);\r\n\r\n protected readonly dropdownButton =\r\n viewChild<ElementRef<HTMLButtonElement>>('dropdownButton');\r\n protected readonly dropdownContainer =\r\n viewChild<ElementRef<HTMLElement>>('dropdownContainer');\r\n\r\n /** Optional label text rendered above the dropdown. */\r\n readonly label = input<string>('');\r\n\r\n /** Placeholder shown when no value is selected. */\r\n readonly placeholder = input<string>('');\r\n\r\n /** Array of options to display in the panel. */\r\n readonly options = input.required<SignalDropdownOption<T>[]>();\r\n\r\n /** Layout width of the wrapper. @default 'full' */\r\n readonly width = input<SignalDropdownWidth>('full');\r\n\r\n /** Marks the field as required. Adds `aria-required` and a visual asterisk. @default false */\r\n readonly required = input<boolean>(false);\r\n\r\n /** Human-readable error message shown below the dropdown. Takes precedence over `errors[0]`. */\r\n readonly errorMessage = input<string>('');\r\n\r\n /**\r\n * Array of error strings. The first item is displayed when `errorMessage` is empty.\r\n * Set together with `invalid=true` to trigger the error state.\r\n */\r\n readonly errors = input<readonly string[]>([]);\r\n\r\n /**\r\n * Stable `id` used to link the `<label>` with the trigger `<button>`.\r\n * A random suffix is generated by default.\r\n */\r\n readonly selectId = input<string>(\r\n `ku-dropdown-${Math.random().toString(36).slice(2, 8)}`,\r\n );\r\n\r\n /** Disables the dropdown. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Forces the error visual state regardless of the `touched` model.\r\n * Useful for external form validation. @default false\r\n */\r\n readonly invalid = input<boolean>(false);\r\n\r\n /** Currently selected value. Use `[(value)]` for two-way binding. */\r\n readonly value = model<T | null>(null);\r\n\r\n /** Whether the control has been interacted with. Use `[(touched)]` for two-way binding. */\r\n readonly touched = model<boolean>(false);\r\n\r\n /** Emitted when the selected value changes. */\r\n readonly valueChange = output<T | null>();\r\n\r\n protected readonly errorId = computed(\r\n () => `${this.selectId()}-error`,\r\n );\r\n\r\n protected readonly panelStyle = computed<string>(\r\n () =>\r\n `top:${this.panelTopPx()}px;left:${this.panelLeftPx()}px;width:${this.panelWidthPx()}px`,\r\n );\r\n\r\n protected readonly widthClass = computed<string>(() => {\r\n const map: Record<SignalDropdownWidth, string> = {\r\n full: 'w-full',\r\n half: 'w-1/2',\r\n auto: 'w-auto',\r\n };\r\n return map[this.width()];\r\n });\r\n\r\n protected readonly selectedLabel = computed<string>(() => {\r\n const current = this.value();\r\n if (current === null) return this.placeholder();\r\n return this.options().find(o => o.value === current)?.label ?? this.placeholder();\r\n });\r\n\r\n protected readonly selectedBadges = computed<string[]>(() => {\r\n const current = this.value();\r\n if (current === null) return [];\r\n return this.options().find(o => o.value === current)?.badges ?? [];\r\n });\r\n\r\n protected readonly showError = computed(\r\n () => this.touched() && (this.invalid() || this.errorMessage().length > 0 || this.errors().length > 0),\r\n );\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this.isOpen()) {\r\n this.calculateDropdownPosition();\r\n this.addViewportListeners();\r\n } else {\r\n this.removeViewportListeners();\r\n }\r\n });\r\n\r\n this.destroyRef.onDestroy(() => this.removeViewportListeners());\r\n }\r\n\r\n protected onDocumentClick(event: MouseEvent): void {\r\n const container = this.dropdownContainer()?.nativeElement;\r\n if (container && !container.contains(event.target as Node)) {\r\n this.isOpen.set(false);\r\n }\r\n }\r\n\r\n protected toggleDropdown(): void {\r\n if (this.disabled()) return;\r\n this.isOpen.update(open => !open);\r\n }\r\n\r\n protected close(): void {\r\n if (this.isOpen()) {\r\n this.isOpen.set(false);\r\n this.dropdownButton()?.nativeElement.focus();\r\n }\r\n }\r\n\r\n protected selectOption(option: SignalDropdownOption<T>): void {\r\n this.value.set(option.value);\r\n this.isOpen.set(false);\r\n this.dropdownButton()?.nativeElement.focus();\r\n this.valueChange.emit(option.value);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.touched.set(true);\r\n }\r\n\r\n protected isSelected(optionValue: T): boolean {\r\n return this.value() === optionValue;\r\n }\r\n\r\n protected onButtonKeydown(event: KeyboardEvent): void {\r\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (!this.isOpen()) {\r\n this.isOpen.set(true);\r\n }\r\n }\r\n }\r\n\r\n protected onOptionKeydown(\r\n event: KeyboardEvent,\r\n option: SignalDropdownOption<T>,\r\n index: number,\r\n ): void {\r\n const panel = this.dropdownContainer()?.nativeElement;\r\n const optionButtons = panel?.querySelectorAll<HTMLButtonElement>('[role=\"option\"]');\r\n if (!optionButtons) return;\r\n\r\n if (event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n optionButtons[Math.min(index + 1, optionButtons.length - 1)]?.focus();\r\n } else if (event.key === 'ArrowUp') {\r\n event.preventDefault();\r\n if (index === 0) {\r\n this.dropdownButton()?.nativeElement.focus();\r\n } else {\r\n optionButtons[index - 1]?.focus();\r\n }\r\n } else if (event.key === 'Enter' || event.key === ' ') {\r\n event.preventDefault();\r\n this.selectOption(option);\r\n }\r\n }\r\n\r\n private calculateDropdownPosition(): void {\r\n const button = this.dropdownButton()?.nativeElement;\r\n if (!button) return;\r\n\r\n const rect = button.getBoundingClientRect();\r\n const estimatedHeight = Math.min(\r\n this.options().length * DROPDOWN_ITEM_HEIGHT + DROPDOWN_PADDING,\r\n 256,\r\n );\r\n const spaceBelow = window.innerHeight - rect.bottom;\r\n const spaceAbove = rect.top;\r\n const shouldOpenUpwards =\r\n spaceBelow < estimatedHeight + DROPDOWN_GAP &&\r\n spaceAbove > estimatedHeight + DROPDOWN_GAP;\r\n\r\n this.openUpwards.set(shouldOpenUpwards);\r\n this.panelWidthPx.set(rect.width);\r\n this.panelLeftPx.set(rect.left);\r\n this.panelTopPx.set(\r\n shouldOpenUpwards\r\n ? rect.top - estimatedHeight - DROPDOWN_GAP\r\n : rect.bottom + DROPDOWN_GAP,\r\n );\r\n }\r\n\r\n private readonly recalculatePosition = (): void => {\r\n if (this.isOpen()) this.calculateDropdownPosition();\r\n };\r\n\r\n private addViewportListeners(): void {\r\n this.removeViewportListeners();\r\n window.addEventListener('scroll', this.recalculatePosition, true);\r\n window.addEventListener('resize', this.recalculatePosition);\r\n }\r\n\r\n private removeViewportListeners(): void {\r\n window.removeEventListener('scroll', this.recalculatePosition, true);\r\n window.removeEventListener('resize', this.recalculatePosition);\r\n }\r\n}\r\n\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n model,\r\n computed,\r\n signal,\r\n viewChild,\r\n ElementRef,\r\n} from '@angular/core';\r\nimport { TranslocoPipe, TRANSLOCO_SCOPE } from '@jsverse/transloco';\r\nimport { SignalTextInputType, SignalTextInputWidth } from './signal-text-input.types';\r\nimport { IconComponent } from '../icon/icon.component';\r\nimport { KEEPUI_TRANSLATION_KEYS as T } from '../../i18n/translation-keys';\r\n\r\n/**\r\n * Signal-based accessible text input supporting all common HTML input types,\r\n * leading/trailing icons, a trailing content slot, and a built-in\r\n * password-visibility toggle (when `type=\"password\"`).\r\n *\r\n * The `value` and `touched` properties are `model()` signals so the component\r\n * integrates seamlessly with Angular signal-based forms.\r\n *\r\n * Password toggle labels are translated via Transloco (scope `'keepui'`).\r\n * Call `provideKeepUiI18n()` in your `app.config.ts` to activate i18n.\r\n *\r\n * ```html\r\n * <keepui-signal-text-input\r\n * label=\"Email\"\r\n * type=\"email\"\r\n * placeholder=\"usuario@ejemplo.com\"\r\n * leadingIcon=\"mail-icon\"\r\n * [(value)]=\"email\"\r\n * />\r\n *\r\n * <!-- Password with toggle -->\r\n * <keepui-signal-text-input\r\n * label=\"Contraseña\"\r\n * type=\"password\"\r\n * [(value)]=\"password\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-signal-text-input',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [IconComponent, TranslocoPipe],\r\n providers: [{ provide: TRANSLOCO_SCOPE, useValue: 'keepui' }],\r\n host: { class: 'block' },\r\n template: `\r\n <div class=\"flex flex-col gap-1\" [class]=\"widthClass()\">\r\n\r\n @if (label()) {\r\n <label [for]=\"inputId()\" class=\"text-sm text-ku-gray-text\">\r\n {{ label() }}\r\n @if (required() && showRequiredIndicator()) {\r\n <span class=\"text-ku-error-primary\" aria-hidden=\"true\"> *</span>\r\n }\r\n </label>\r\n }\r\n\r\n <div class=\"relative flex items-center\">\r\n\r\n @if (hasLeading()) {\r\n <span\r\n class=\"absolute left-3 flex items-center pointer-events-none text-ku-gray-text\"\r\n aria-hidden=\"true\"\r\n >\r\n <keepui-icon [name]=\"leadingIcon()\" [size]=\"18\" />\r\n </span>\r\n }\r\n\r\n <input\r\n #inputRef\r\n [id]=\"inputId()\"\r\n [type]=\"resolvedType()\"\r\n [value]=\"value()\"\r\n [placeholder]=\"placeholder()\"\r\n [disabled]=\"disabled()\"\r\n [attr.required]=\"required() ? true : null\"\r\n [attr.aria-required]=\"required() ? true : null\"\r\n [attr.aria-invalid]=\"showError() ? true : null\"\r\n [attr.aria-describedby]=\"showError() ? errorId() : null\"\r\n class=\"bg-ku-primary border rounded-xl py-2.5 text-sm text-ku-primary-text\r\n placeholder:text-ku-gray-text outline-none transition-colors w-full\r\n disabled:opacity-50 disabled:cursor-not-allowed min-h-[2.75rem]\r\n dark:[color-scheme:dark]\"\r\n [class]=\"inputClasses()\"\r\n (click)=\"openDatePicker()\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n @if (hasTrailingSlot()) {\r\n <div class=\"absolute right-1 flex items-center\">\r\n <ng-content select=\"[trailingSlot]\" />\r\n </div>\r\n } @else if (isPasswordType()) {\r\n <button\r\n type=\"button\"\r\n (click)=\"togglePasswordVisibility()\"\r\n class=\"absolute right-3 flex items-center justify-center text-ku-gray-text\r\n hover:text-ku-primary-text transition-colors cursor-pointer\r\n focus-visible:outline-none focus-visible:ring-2\r\n focus-visible:ring-ku-action-primary rounded min-h-[2.75rem] min-w-[2.75rem]\"\r\n [attr.aria-label]=\"(isPasswordVisible()\r\n ? keys.HIDE_PASSWORD\r\n : keys.SHOW_PASSWORD) | transloco\"\r\n >\r\n <keepui-icon\r\n [name]=\"isPasswordVisible() ? 'eye-off-icon' : 'eye-icon'\"\r\n [size]=\"18\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n } @else if (hasTrailing()) {\r\n <span\r\n class=\"absolute right-3 flex items-center pointer-events-none text-ku-gray-text\"\r\n aria-hidden=\"true\"\r\n >\r\n <keepui-icon [name]=\"trailingIcon()\" [size]=\"18\" />\r\n </span>\r\n }\r\n\r\n </div>\r\n\r\n @if (showError()) {\r\n <span\r\n [id]=\"errorId()\"\r\n class=\"text-sm text-ku-error-primary\"\r\n role=\"alert\"\r\n >\r\n @if (errorMessage()) {\r\n {{ errorMessage() }}\r\n } @else if (errors().length > 0) {\r\n {{ errors()[0] }}\r\n }\r\n </span>\r\n }\r\n\r\n </div>\r\n `,\r\n})\r\nexport class SignalTextInputComponent {\r\n\r\n protected readonly isPasswordVisible = signal(false);\r\n\r\n protected readonly inputRef = viewChild<ElementRef<HTMLInputElement>>('inputRef');\r\n\r\n /** Translation key references (typed via KEEPUI_TRANSLATION_KEYS). */\r\n protected readonly keys = T.SIGNAL_TEXT_INPUT;\r\n\r\n /** Optional label text rendered above the input. */\r\n readonly label = input<string>('');\r\n\r\n /** Placeholder passed to the underlying `<input>`. */\r\n readonly placeholder = input<string>('');\r\n\r\n /** HTML `type` attribute. Use `'password'` to enable the visibility toggle. @default 'text' */\r\n readonly type = input<SignalTextInputType>('text');\r\n\r\n /** Layout width of the wrapper. @default 'full' */\r\n readonly width = input<SignalTextInputWidth>('full');\r\n\r\n /** Name of the leading icon (SVG symbol ID). Leave empty for no icon. */\r\n readonly leadingIcon = input<string>('');\r\n\r\n /** Name of the trailing icon (SVG symbol ID). Ignored when `type=\"password\"`. */\r\n readonly trailingIcon = input<string>('');\r\n\r\n /**\r\n * When `true`, a slot for custom trailing content is enabled\r\n * (projects `[trailingSlot]` content). Overrides `trailingIcon`.\r\n * @default false\r\n */\r\n readonly hasTrailingSlot = input<boolean>(false);\r\n\r\n /** Marks the field as required. Adds `aria-required` and a visual asterisk. @default false */\r\n readonly required = input<boolean>(false);\r\n\r\n /** When `false`, hides the visual asterisk even if `required=true`. @default true */\r\n readonly showRequiredIndicator = input<boolean>(true);\r\n\r\n /** Human-readable error message. Takes precedence over `errors[0]`. */\r\n readonly errorMessage = input<string>('');\r\n\r\n /**\r\n * Array of error strings. The first item is displayed when `errorMessage` is empty.\r\n * Set together with `invalid=true` to trigger the error state.\r\n */\r\n readonly errors = input<readonly string[]>([]);\r\n\r\n /**\r\n * Stable `id` used to link the `<label>` with the `<input>`.\r\n * A random suffix is generated by default.\r\n */\r\n readonly inputId = input<string>(\r\n `ku-text-input-${Math.random().toString(36).slice(2, 8)}`,\r\n );\r\n\r\n /** Disables the input. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /**\r\n * Forces the error visual state regardless of the `touched` model.\r\n * Useful for external form validation. @default false\r\n */\r\n readonly invalid = input<boolean>(false);\r\n\r\n /** Current text value. Use `[(value)]` for two-way binding. */\r\n readonly value = model<string>('');\r\n\r\n /** Whether the control has been interacted with. Use `[(touched)]` for two-way binding. */\r\n readonly touched = model<boolean>(false);\r\n\r\n protected readonly errorId = computed(\r\n () => `${this.inputId()}-error`,\r\n );\r\n\r\n protected readonly isPasswordType = computed(() => this.type() === 'password');\r\n\r\n protected readonly resolvedType = computed<string>(() => {\r\n if (this.isPasswordType()) {\r\n return this.isPasswordVisible() ? 'text' : 'password';\r\n }\r\n return this.type();\r\n });\r\n\r\n protected readonly widthClass = computed<string>(() => {\r\n const map: Record<SignalTextInputWidth, string> = {\r\n full: 'w-full',\r\n half: 'w-1/2',\r\n auto: 'w-auto',\r\n };\r\n return map[this.width()];\r\n });\r\n\r\n protected readonly hasLeading = computed(() => this.leadingIcon().length > 0);\r\n\r\n protected readonly hasTrailing = computed(\r\n () => this.trailingIcon().length > 0 && !this.isPasswordType(),\r\n );\r\n\r\n protected readonly showError = computed(\r\n () =>\r\n this.touched() &&\r\n (this.invalid() || this.errorMessage().length > 0 || this.errors().length > 0),\r\n );\r\n\r\n protected readonly isDateEmpty = computed(\r\n () => this.type() === 'date' && !this.value(),\r\n );\r\n\r\n protected readonly inputClasses = computed(() => {\r\n const textColor = this.isDateEmpty()\r\n ? 'text-ku-gray-text'\r\n : 'text-ku-primary-text';\r\n const paddingLeft = this.hasLeading() ? 'pl-9' : 'pl-4';\r\n const paddingRight = this.hasTrailingSlot()\r\n ? 'pr-24'\r\n : this.hasTrailing() || this.isPasswordType()\r\n ? 'pr-10'\r\n : 'pr-4';\r\n const borderColor = this.showError()\r\n ? 'border-ku-error-primary'\r\n : 'border-ku-secondary-border focus-visible:border-ku-action-primary';\r\n const cursor = this.type() === 'date' ? 'cursor-pointer' : '';\r\n\r\n return `${textColor} ${paddingLeft} ${paddingRight} ${borderColor} ${cursor}`;\r\n });\r\n\r\n protected onInput(event: Event): void {\r\n const target = event.target as HTMLInputElement;\r\n this.value.set(target.value);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.touched.set(true);\r\n }\r\n\r\n protected openDatePicker(): void {\r\n if (this.type() === 'date') {\r\n try {\r\n this.inputRef()?.nativeElement.showPicker();\r\n } catch { /* showPicker not supported in all browsers */ }\r\n }\r\n }\r\n\r\n protected togglePasswordVisibility(): void {\r\n this.isPasswordVisible.update(v => !v);\r\n }\r\n}\r\n\r\n\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n input,\r\n model,\r\n computed,\r\n} from '@angular/core';\r\nimport { SignalTextareaResize, SignalTextareaWidth } from './signal-textarea.types';\r\n\r\n/**\r\n * Signal-based accessible textarea component with character counter,\r\n * resize control, and integrated error display.\r\n *\r\n * The `value` and `touched` properties are `model()` signals so the component\r\n * integrates seamlessly with Angular signal-based forms.\r\n *\r\n * ```html\r\n * <keepui-signal-textarea\r\n * label=\"Descripción\"\r\n * placeholder=\"Escribe aquí…\"\r\n * [rows]=\"5\"\r\n * [maxLength]=\"500\"\r\n * [(value)]=\"description\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-signal-textarea',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: { class: 'block' },\r\n template: `\r\n <div class=\"flex flex-col gap-1\" [class]=\"widthClass()\">\r\n\r\n @if (label()) {\r\n <label [for]=\"textareaId()\" class=\"text-sm text-ku-gray-text\">\r\n {{ label() }}\r\n @if (required()) {\r\n <span class=\"text-ku-error-primary\" aria-hidden=\"true\"> *</span>\r\n }\r\n </label>\r\n }\r\n\r\n <textarea\r\n [id]=\"textareaId()\"\r\n [value]=\"value()\"\r\n [placeholder]=\"placeholder()\"\r\n [rows]=\"rows()\"\r\n [disabled]=\"disabled()\"\r\n [attr.maxlength]=\"maxLength() ?? null\"\r\n [attr.required]=\"required() ? true : null\"\r\n [attr.aria-required]=\"required() ? true : null\"\r\n [attr.aria-invalid]=\"showError() ? true : null\"\r\n [attr.aria-describedby]=\"showError() ? errorId() : (maxLength() ? charCountId() : null)\"\r\n class=\"bg-ku-primary border rounded-xl p-3 text-sm text-ku-primary-text\r\n placeholder:text-ku-gray-text outline-none transition-colors w-full\r\n disabled:opacity-50 disabled:cursor-not-allowed\"\r\n [class]=\"textareaClasses()\"\r\n (input)=\"onInput($event)\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n\r\n <div class=\"flex items-start justify-between gap-2\">\r\n\r\n <span\r\n [id]=\"errorId()\"\r\n class=\"text-sm text-ku-error-primary\"\r\n role=\"alert\"\r\n >\r\n @if (showError()) {\r\n @if (errorMessage()) {\r\n {{ errorMessage() }}\r\n } @else if (errors().length > 0) {\r\n {{ errors()[0] }}\r\n }\r\n }\r\n </span>\r\n\r\n @if (maxLength()) {\r\n <span\r\n [id]=\"charCountId()\"\r\n class=\"text-xs text-ku-gray-text ml-auto shrink-0\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n >\r\n {{ charCount() }}&thinsp;/&thinsp;{{ maxLength() }}\r\n </span>\r\n }\r\n\r\n </div>\r\n\r\n </div>\r\n `,\r\n})\r\nexport class SignalTextareaComponent {\r\n\r\n /** Optional label text rendered above the textarea. */\r\n readonly label = input<string>('');\r\n\r\n /** Placeholder passed to the underlying `<textarea>`. */\r\n readonly placeholder = input<string>('');\r\n\r\n /** Number of visible text rows. @default 4 */\r\n readonly rows = input<number>(4);\r\n\r\n /** Layout width of the wrapper. @default 'full' */\r\n readonly width = input<SignalTextareaWidth>('full');\r\n\r\n /** CSS `resize` behaviour. @default 'none' */\r\n readonly resize = input<SignalTextareaResize>('none');\r\n\r\n /** Marks the field as required. @default false */\r\n readonly required = input<boolean>(false);\r\n\r\n /** Human-readable error message. Takes precedence over `errors[0]`. */\r\n readonly errorMessage = input<string>('');\r\n\r\n /**\r\n * Array of error strings. The first item is displayed when `errorMessage` is empty.\r\n * Set together with `invalid=true` to trigger the error state.\r\n */\r\n readonly errors = input<readonly string[]>([]);\r\n\r\n /**\r\n * Stable `id` used to link the `<label>` with the `<textarea>`.\r\n * A random suffix is generated by default.\r\n */\r\n readonly textareaId = input<string>(\r\n `ku-textarea-${Math.random().toString(36).slice(2, 8)}`,\r\n );\r\n\r\n /** Disables the textarea. @default false */\r\n readonly disabled = input<boolean>(false);\r\n\r\n /** Maximum number of characters allowed. Shows a character counter when set. */\r\n readonly maxLength = input<number | undefined>(undefined);\r\n\r\n /**\r\n * Forces the error visual state regardless of the `touched` model.\r\n * Useful for external form validation. @default false\r\n */\r\n readonly invalid = input<boolean>(false);\r\n\r\n /** Current text value. Use `[(value)]` for two-way binding. */\r\n readonly value = model<string>('');\r\n\r\n /** Whether the control has been interacted with. Use `[(touched)]` for two-way binding. */\r\n readonly touched = model<boolean>(false);\r\n\r\n protected readonly errorId = computed(() => `${this.textareaId()}-error`);\r\n protected readonly charCountId = computed(() => `${this.textareaId()}-count`);\r\n\r\n protected readonly charCount = computed(() => this.value().length);\r\n\r\n protected readonly showError = computed(\r\n () =>\r\n this.touched() &&\r\n (this.invalid() || this.errorMessage().length > 0 || this.errors().length > 0),\r\n );\r\n\r\n protected readonly widthClass = computed<string>(() => {\r\n const map: Record<SignalTextareaWidth, string> = {\r\n full: 'w-full',\r\n half: 'w-1/2',\r\n auto: 'w-auto',\r\n };\r\n return map[this.width()];\r\n });\r\n\r\n protected readonly resizeClass = computed<string>(() => {\r\n const map: Record<SignalTextareaResize, string> = {\r\n none: 'resize-none',\r\n vertical: 'resize-y',\r\n horizontal: 'resize-x',\r\n both: 'resize',\r\n };\r\n return map[this.resize()];\r\n });\r\n\r\n protected readonly textareaClasses = computed(() => {\r\n const borderColor = this.showError()\r\n ? 'border-ku-error-primary'\r\n : 'border-ku-secondary-border focus-visible:border-ku-action-primary';\r\n return `${this.resizeClass()} ${borderColor}`;\r\n });\r\n\r\n protected onInput(event: Event): void {\r\n const target = event.target as HTMLTextAreaElement;\r\n this.value.set(target.value);\r\n }\r\n\r\n protected onBlur(): void {\r\n this.touched.set(true);\r\n }\r\n}\r\n\r\n\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n computed,\r\n input,\r\n output,\r\n viewChildren,\r\n} from '@angular/core';\r\nimport { IconComponent } from '../icon/icon.component';\r\nimport { Tab, TabGroupVariant } from './tab-group.types';\r\n\r\n/**\r\n * Accessible pill-style tab group with icon support and two visual variants.\r\n *\r\n * Implements the WAI-ARIA `tablist` pattern: keyboard navigation with arrow keys,\r\n * `Home`, and `End`. Each tab carries `role=\"tab\"` and `aria-selected`.\r\n *\r\n * Works identically on **web** and **Angular + Capacitor**.\r\n *\r\n * ```html\r\n * <!-- Basic usage -->\r\n * <keepui-tab-group\r\n * [tabs]=\"tabs\"\r\n * [selectedTabId]=\"activeTab\"\r\n * (tabChange)=\"activeTab = $event\"\r\n * />\r\n *\r\n * <!-- Filled variant -->\r\n * <keepui-tab-group\r\n * variant=\"filled\"\r\n * [tabs]=\"tabs\"\r\n * [selectedTabId]=\"activeTab\"\r\n * (tabChange)=\"activeTab = $event\"\r\n * />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-tab-group',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [IconComponent],\r\n template: `\r\n <div\r\n role=\"tablist\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n class=\"flex items-center p-1 rounded-full border transition-colors duration-200\"\r\n [class]=\"containerClass()\"\r\n (keydown)=\"onKeydown($event)\"\r\n >\r\n @for (tab of tabs(); track tab.id; let i = $index) {\r\n <button\r\n #tabButton\r\n type=\"button\"\r\n role=\"tab\"\r\n [id]=\"'keepui-tab-' + tab.id\"\r\n [attr.aria-selected]=\"selectedTabId() === tab.id\"\r\n [attr.aria-disabled]=\"tab.disabled ? true : null\"\r\n [disabled]=\"tab.disabled || false\"\r\n [tabindex]=\"selectedTabId() === tab.id ? 0 : -1\"\r\n class=\"flex-1 inline-flex items-center justify-center gap-1.5 px-3 py-1.5 rounded-full\r\n transition-colors duration-200 text-sm font-medium cursor-pointer\r\n min-h-[2.75rem]\r\n focus-visible:outline-none focus-visible:ring-2\r\n focus-visible:ring-ku-action-primary focus-visible:ring-offset-2\r\n disabled:cursor-not-allowed disabled:opacity-40\"\r\n [class]=\"buttonClass(tab.id)\"\r\n (click)=\"onTabClick(tab)\"\r\n >\r\n @if (tab.icon) {\r\n <keepui-icon\r\n [name]=\"tab.icon\"\r\n [size]=\"16\"\r\n [class]=\"iconClass(tab.id)\"\r\n aria-hidden=\"true\"\r\n />\r\n }\r\n <span>{{ tab.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n `,\r\n})\r\nexport class TabGroupComponent {\r\n /** List of tabs to render. */\r\n readonly tabs = input.required<Tab[]>();\r\n\r\n /** ID of the currently selected tab. */\r\n readonly selectedTabId = input.required<string>();\r\n\r\n /** Visual style variant. @default 'default' */\r\n readonly variant = input<TabGroupVariant>('default');\r\n\r\n /**\r\n * Accessible label for the tablist container.\r\n * Provide a meaningful description when multiple tab groups exist on the page.\r\n */\r\n readonly ariaLabel = input<string>('');\r\n\r\n /** Emits the `id` of the tab the user has selected. */\r\n readonly tabChange = output<string>();\r\n\r\n private readonly tabButtons = viewChildren<ElementRef<HTMLButtonElement>>('tabButton');\r\n\r\n protected readonly containerClass = computed(() =>\r\n this.variant() === 'filled'\r\n ? 'bg-ku-action-primary/10 border-ku-action-primary/20'\r\n : 'bg-ku-secondary border-ku-secondary-border',\r\n );\r\n\r\n protected buttonClass(tabId: string): string {\r\n const isActive = this.selectedTabId() === tabId;\r\n if (this.variant() === 'filled') {\r\n return isActive\r\n ? 'bg-ku-action-primary text-white'\r\n : 'text-ku-gray-text hover:text-ku-primary-text hover:bg-ku-action-primary/10';\r\n }\r\n return isActive\r\n ? 'bg-ku-primary text-ku-primary-text shadow-sm border border-ku-primary-border'\r\n : 'text-ku-gray-text hover:text-ku-primary-text hover:bg-ku-secondary-hover';\r\n }\r\n\r\n protected iconClass(tabId: string): string {\r\n const isActive = this.selectedTabId() === tabId;\r\n if (this.variant() === 'filled') {\r\n return isActive ? 'text-white' : 'text-ku-gray-text';\r\n }\r\n return isActive ? 'text-ku-action-primary' : 'text-ku-gray-text';\r\n }\r\n\r\n protected onTabClick(tab: Tab): void {\r\n if (!tab.disabled && tab.id !== this.selectedTabId()) {\r\n this.tabChange.emit(tab.id);\r\n }\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n const tabs = this.tabs().filter(t => !t.disabled);\r\n const activeIndex = tabs.findIndex(t => t.id === this.selectedTabId());\r\n\r\n let nextIndex = activeIndex;\r\n\r\n if (event.key === 'ArrowRight' || event.key === 'ArrowDown') {\r\n nextIndex = (activeIndex + 1) % tabs.length;\r\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowUp') {\r\n nextIndex = (activeIndex - 1 + tabs.length) % tabs.length;\r\n } else if (event.key === 'Home') {\r\n nextIndex = 0;\r\n } else if (event.key === 'End') {\r\n nextIndex = tabs.length - 1;\r\n } else {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n const nextTab = tabs[nextIndex];\r\n this.tabChange.emit(nextTab.id);\r\n this.focusTab(nextTab.id);\r\n }\r\n\r\n private focusTab(tabId: string): void {\r\n const allTabs = this.tabs();\r\n const index = allTabs.findIndex(t => t.id === tabId);\r\n const buttons = this.tabButtons();\r\n buttons[index]?.nativeElement.focus();\r\n }\r\n}\r\n\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n input,\r\n output,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { IconComponent } from '../icon/icon.component';\r\nimport { StepperOrientation, StepperSize, StepperStep } from './stepper.types';\r\n\r\n/**\r\n * Visual step-progress indicator with optional navigation.\r\n *\r\n * Renders a sequence of numbered step circles connected by a progress bar.\r\n * Completed steps show a check-mark; the active step is highlighted; future\r\n * steps are muted. Steps with an `icon` replace the number with the given SVG symbol.\r\n *\r\n * Accessibility: uses `role=\"list\"` / `role=\"listitem\"` with `aria-current=\"step\"` on\r\n * the active item. When steps are interactive (i.e. `stepChange` is listened to),\r\n * completed and current steps render as `<button>` elements; future steps remain\r\n * inert `<span>` elements.\r\n *\r\n * Works identically on **web** and **Angular + Capacitor**.\r\n *\r\n * ```html\r\n * <!-- Read-only progress indicator -->\r\n * <keepui-stepper [steps]=\"steps\" [activeIndex]=\"1\" />\r\n *\r\n * <!-- Interactive stepper (go back to a previous step) -->\r\n * <keepui-stepper\r\n * [steps]=\"steps\"\r\n * [activeIndex]=\"currentStep\"\r\n * (stepChange)=\"currentStep = $event\"\r\n * />\r\n *\r\n * <!-- Small variant -->\r\n * <keepui-stepper [steps]=\"steps\" [activeIndex]=\"0\" size=\"sm\" />\r\n * ```\r\n */\r\n@Component({\r\n selector: 'keepui-stepper',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [IconComponent, NgTemplateOutlet],\r\n template: `\r\n <nav\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [class]=\"wrapperClass()\"\r\n >\r\n <ol\r\n role=\"list\"\r\n [class]=\"listClass()\"\r\n >\r\n @for (step of steps(); track step.id; let i = $index; let last = $last) {\r\n <li\r\n role=\"listitem\"\r\n [class]=\"itemClass()\"\r\n [attr.aria-current]=\"isActive(i) ? 'step' : null\"\r\n >\r\n <div [class]=\"stepColumnClass()\">\r\n @if (isClickable(i, step)) {\r\n <button\r\n type=\"button\"\r\n [class]=\"bubbleClass(i)\"\r\n [attr.aria-label]=\"step.label\"\r\n [attr.aria-disabled]=\"step.disabled ? true : null\"\r\n [disabled]=\"step.disabled || false\"\r\n (click)=\"onStepClick(i, step)\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"bubbleContent; context: { i, step }\" />\r\n </button>\r\n } @else {\r\n <span [class]=\"bubbleClass(i)\" aria-hidden=\"true\">\r\n <ng-container *ngTemplateOutlet=\"bubbleContent; context: { i, step }\" />\r\n </span>\r\n }\r\n\r\n <span [class]=\"labelClass(i)\">{{ step.label }}</span>\r\n </div>\r\n\r\n @if (!last) {\r\n <div [class]=\"connectorClass(i)\"></div>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n\r\n <ng-template #bubbleContent let-i=\"i\" let-step=\"step\">\r\n @if (isCompleted(i)) {\r\n <svg\r\n width=\"14\"\r\n height=\"14\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n } @else if (step.icon) {\r\n <keepui-icon [name]=\"step.icon\" [size]=\"iconSize()\" aria-hidden=\"true\" />\r\n } @else {\r\n <span class=\"font-semibold leading-none\">{{ i + 1 }}</span>\r\n }\r\n </ng-template>\r\n `,\r\n})\r\nexport class StepperComponent {\r\n /** Steps to render. */\r\n readonly steps = input.required<StepperStep[]>();\r\n\r\n /** Zero-based index of the currently active step. @default 0 */\r\n readonly activeIndex = input<number>(0);\r\n\r\n /** Visual size of the step circles and connector bars. @default 'md' */\r\n readonly size = input<StepperSize>('md');\r\n\r\n /** Layout direction. @default 'horizontal' */\r\n readonly orientation = input<StepperOrientation>('horizontal');\r\n\r\n /**\r\n * Accessible label for the `<nav>` element.\r\n * @default ''\r\n */\r\n readonly ariaLabel = input<string>('');\r\n\r\n /**\r\n * Emits the zero-based index of the step the user clicked.\r\n * Only completed steps and the active step are clickable.\r\n * When no subscriber is attached, the stepper is purely visual.\r\n */\r\n readonly stepChange = output<number>();\r\n\r\n protected readonly iconSize = computed(() => (this.size() === 'sm' ? 12 : 16));\r\n\r\n protected isCompleted(index: number): boolean {\r\n return index < this.activeIndex();\r\n }\r\n\r\n protected isActive(index: number): boolean {\r\n return index === this.activeIndex();\r\n }\r\n\r\n protected isClickable(index: number, step: StepperStep): boolean {\r\n return !step.disabled && (this.isCompleted(index) || this.isActive(index));\r\n }\r\n\r\n protected onStepClick(index: number, step: StepperStep): void {\r\n if (!step.disabled) {\r\n this.stepChange.emit(index);\r\n }\r\n }\r\n\r\n protected readonly wrapperClass = computed(() => 'w-full');\r\n\r\n protected readonly listClass = computed(() => {\r\n const base = 'list-none m-0 p-0 flex';\r\n return this.orientation() === 'vertical'\r\n ? `${base} flex-col gap-0`\r\n : `${base} flex-row items-start`;\r\n });\r\n\r\n protected readonly itemClass = computed(() => {\r\n const base = 'flex';\r\n return this.orientation() === 'vertical'\r\n ? `${base} flex-row items-center flex-1`\r\n : `${base} flex-col items-center flex-1`;\r\n });\r\n\r\n protected readonly stepColumnClass = computed(() => {\r\n return this.orientation() === 'vertical'\r\n ? 'flex flex-row items-center gap-3'\r\n : 'flex flex-col items-center gap-1.5';\r\n });\r\n\r\n protected bubbleClass(index: number): string {\r\n const sizeClass = this.size() === 'sm'\r\n ? 'w-6 h-6 text-xs'\r\n : 'w-9 h-9 text-sm';\r\n\r\n const base = [\r\n 'inline-flex items-center justify-center rounded-full shrink-0',\r\n 'transition-colors duration-200',\r\n 'focus-visible:outline-none focus-visible:ring-2',\r\n 'focus-visible:ring-ku-action-primary focus-visible:ring-offset-2',\r\n sizeClass,\r\n ].join(' ');\r\n\r\n if (this.isCompleted(index)) {\r\n return `${base} bg-ku-action-primary text-white cursor-pointer`;\r\n }\r\n if (this.isActive(index)) {\r\n return `${base} bg-ku-action-primary text-white ring-2 ring-ku-action-primary ring-offset-2`;\r\n }\r\n return `${base} bg-ku-secondary border-2 border-ku-secondary-border text-ku-gray-text cursor-default`;\r\n }\r\n\r\n protected labelClass(index: number): string {\r\n const base = 'text-xs font-medium text-center transition-colors duration-200';\r\n if (this.isActive(index)) {\r\n return `${base} text-ku-primary-text`;\r\n }\r\n if (this.isCompleted(index)) {\r\n return `${base} text-ku-action-primary`;\r\n }\r\n return `${base} text-ku-gray-text`;\r\n }\r\n\r\n protected connectorClass(index: number): string {\r\n const filled = this.isCompleted(index) || this.isActive(index);\r\n\r\n if (this.orientation() === 'vertical') {\r\n const height = this.size() === 'sm' ? 'h-8' : 'h-10';\r\n return [\r\n `${height} w-0.5 mx-auto my-1 rounded-full transition-colors duration-300`,\r\n filled ? 'bg-ku-action-primary' : 'bg-ku-secondary-border',\r\n ].join(' ');\r\n }\r\n\r\n return [\r\n 'w-full h-0.5 mt-4 mb-1 rounded-full transition-colors duration-300',\r\n filled ? 'bg-ku-action-primary' : 'bg-ku-secondary-border',\r\n ].join(' ');\r\n }\r\n}\r\n\r\n\r\n\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { FILE_PORT } from '../tokens/file.token';\r\nimport { WebFileService } from '../services/web-file.service';\r\n\r\n/**\r\n * Registers KeepUI core providers for a **web** Angular application.\r\n *\r\n * Registers `WebFileService` as the implementation of `FILE_PORT`, enabling\r\n * all KeepUI components to use the browser's native file picker.\r\n *\r\n * Add to `app.config.ts`:\r\n * ```ts\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [provideKeepUi()],\r\n * };\r\n * ```\r\n */\r\nexport function provideKeepUi(): EnvironmentProviders {\r\n return makeEnvironmentProviders([\r\n { provide: FILE_PORT, useClass: WebFileService },\r\n ]);\r\n}\r\n","/**\r\n * Inline translation objects for KeepUI.\r\n *\r\n * These mirror `en.json`, `es.json` and `de.json` and are bundled directly\r\n * into the library so that no HTTP request is needed at runtime.\r\n *\r\n * > **Do not edit this file manually.**\r\n * > Keep it in sync with the JSON files inside `/i18n/`.\r\n */\r\n\r\nimport { KeepUiLanguage } from './translation-keys';\r\n\r\nexport interface KeepUiTranslationSchema {\r\n imagePreview: {\r\n selectImage: string;\r\n loading: string;\r\n previewAlt: string;\r\n errorUnexpected: string;\r\n };\r\n signalTextInput: {\r\n showPassword: string;\r\n hidePassword: string;\r\n };\r\n}\r\n\r\nconst EN: KeepUiTranslationSchema = {\r\n imagePreview: {\r\n selectImage: 'Select image',\r\n loading: 'Loading…',\r\n previewAlt: 'Selected image preview',\r\n errorUnexpected: 'An unexpected error occurred',\r\n },\r\n signalTextInput: {\r\n showPassword: 'Show password',\r\n hidePassword: 'Hide password',\r\n },\r\n};\r\n\r\nconst ES: KeepUiTranslationSchema = {\r\n imagePreview: {\r\n selectImage: 'Seleccionar imagen',\r\n loading: 'Cargando…',\r\n previewAlt: 'Vista previa de imagen seleccionada',\r\n errorUnexpected: 'Ha ocurrido un error inesperado',\r\n },\r\n signalTextInput: {\r\n showPassword: 'Mostrar contraseña',\r\n hidePassword: 'Ocultar contraseña',\r\n },\r\n};\r\n\r\nconst DE: KeepUiTranslationSchema = {\r\n imagePreview: {\r\n selectImage: 'Bild auswählen',\r\n loading: 'Laden…',\r\n previewAlt: 'Vorschau des ausgewählten Bildes',\r\n errorUnexpected: 'Ein unerwarteter Fehler ist aufgetreten',\r\n },\r\n signalTextInput: {\r\n showPassword: 'Passwort anzeigen',\r\n hidePassword: 'Passwort verbergen',\r\n },\r\n};\r\n\r\n/** Map from locale code to its translation object. */\r\nexport const KEEPUI_TRANSLATIONS: Record<KeepUiLanguage, KeepUiTranslationSchema> = {\r\n en: EN,\r\n es: ES,\r\n de: DE,\r\n};\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { Translation, TranslocoLoader } from '@jsverse/transloco';\r\nimport { Observable, of } from 'rxjs';\r\nimport { KeepUiLanguage } from '../i18n/translation-keys';\r\nimport { KEEPUI_TRANSLATIONS } from '../i18n/keep-ui-translations';\r\n\r\n/**\r\n * Transloco loader for KeepUI.\r\n *\r\n * Serves translations **inline** (bundled in the library JS) so that no HTTP\r\n * request is required. It handles both plain lang paths (`'en'`, `'es'`, …)\r\n * and scope-prefixed paths (`'keepui/en'`, `'keepui/es'`, …).\r\n *\r\n * @internal\r\n */\r\n@Injectable()\r\nexport class KeepUiTranslocoLoader implements TranslocoLoader {\r\n getTranslation(langPath: string): Observable<Translation> {\r\n // Transloco calls this with 'keepui/en', 'keepui/es', etc.\r\n // when a component has TRANSLOCO_SCOPE = 'keepui'.\r\n const lang = langPath.includes('/') ? langPath.split('/')[1] : langPath;\r\n\r\n const isValid = (l: string): l is KeepUiLanguage =>\r\n l === 'en' || l === 'es' || l === 'de';\r\n\r\n const translations = isValid(lang)\r\n ? KEEPUI_TRANSLATIONS[lang]\r\n : KEEPUI_TRANSLATIONS['en'];\r\n\r\n return of(translations as unknown as Translation);\r\n }\r\n}\r\n\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { TranslocoService } from '@jsverse/transloco';\r\nimport { KeepUiLanguage, KEEPUI_AVAILABLE_LANGUAGES } from '../i18n/translation-keys';\r\n\r\n/**\r\n * Service that exposes a public API for changing the active language of all\r\n * KeepUI components at runtime.\r\n *\r\n * ### Usage\r\n * ```ts\r\n * // Inject anywhere in the host application\r\n * const lang = inject(KeepUiLanguageService);\r\n *\r\n * // Switch to Spanish\r\n * lang.setLanguage('es');\r\n *\r\n * // Read the active language\r\n * console.log(lang.activeLanguage()); // 'es'\r\n * ```\r\n *\r\n * Register via `provideKeepUiI18n()` in `app.config.ts`.\r\n */\r\n@Injectable()\r\nexport class KeepUiLanguageService {\r\n private readonly transloco = inject(TranslocoService);\r\n\r\n /** Signal that reflects the currently active KeepUI locale. */\r\n readonly activeLanguage = signal<KeepUiLanguage>(\r\n this.transloco.getActiveLang() as KeepUiLanguage,\r\n );\r\n\r\n /** Ordered list of all supported locales. */\r\n readonly availableLanguages: readonly KeepUiLanguage[] = KEEPUI_AVAILABLE_LANGUAGES;\r\n\r\n /**\r\n * Changes the active language for all KeepUI components.\r\n *\r\n * @param lang - One of `'en'`, `'es'` or `'de'`.\r\n */\r\n setLanguage(lang: KeepUiLanguage): void {\r\n this.transloco.setActiveLang(lang);\r\n this.activeLanguage.set(lang);\r\n }\r\n}\r\n\r\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\r\nimport { provideTransloco } from '@jsverse/transloco';\r\nimport { KeepUiLanguage, KEEPUI_AVAILABLE_LANGUAGES } from '../i18n/translation-keys';\r\nimport { KeepUiTranslocoLoader } from '../services/keep-ui-transloco-loader.service';\r\nimport { KeepUiLanguageService } from '../services/keep-ui-language.service';\r\n\r\n/**\r\n * Options for `provideKeepUiI18n()`.\r\n */\r\nexport interface KeepUiI18nOptions {\r\n /**\r\n * The default language to use when the app starts.\r\n * @default 'en'\r\n */\r\n defaultLang?: KeepUiLanguage;\r\n}\r\n\r\n/**\r\n * Registers all providers required for KeepUI internationalisation.\r\n *\r\n * - Configures a self-contained Transloco instance scoped to `'keepui'`.\r\n * - Bundles all translations **inline** — no HTTP assets required.\r\n * - Provides {@link KeepUiLanguageService} so the host app can switch locale.\r\n *\r\n * ### Usage in `app.config.ts`\r\n * ```ts\r\n * export const appConfig: ApplicationConfig = {\r\n * providers: [\r\n * provideKeepUi(),\r\n * provideKeepUiI18n(), // default language: 'en'\r\n * provideKeepUiI18n({ defaultLang: 'es' }), // or start in Spanish\r\n * ],\r\n * };\r\n * ```\r\n *\r\n * ### Changing language at runtime\r\n * ```ts\r\n * const lang = inject(KeepUiLanguageService);\r\n * lang.setLanguage('de');\r\n * ```\r\n *\r\n * > **Note:** If your application already calls `provideTransloco()`, do NOT\r\n * > call `provideKeepUiI18n()` — instead configure your Transloco loader to\r\n * > handle the `'keepui/{lang}'` scope paths, and provide `KeepUiLanguageService`\r\n * > manually.\r\n */\r\nexport function provideKeepUiI18n(\r\n options: KeepUiI18nOptions = {},\r\n): EnvironmentProviders {\r\n const defaultLang: KeepUiLanguage = options.defaultLang ?? 'en';\r\n\r\n return makeEnvironmentProviders([\r\n provideTransloco({\r\n config: {\r\n defaultLang,\r\n availableLangs: [...KEEPUI_AVAILABLE_LANGUAGES],\r\n reRenderOnLangChange: true,\r\n failedRetries: 0,\r\n missingHandler: { useFallbackTranslation: true },\r\n fallbackLang: 'en',\r\n },\r\n loader: KeepUiTranslocoLoader,\r\n }),\r\n\r\n KeepUiLanguageService,\r\n ]);\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { FilePort } from '../ports/file.port';\r\nimport { FileResult } from '../models/file-result.model';\r\n\r\n/**\r\n * A controllable mock implementation of `FilePort` for use in unit tests.\r\n *\r\n * By default, `pickImage()` resolves successfully. Set `nextError` to make the\r\n * next call reject with that error.\r\n *\r\n * ```ts\r\n * providers: [{ provide: FILE_PORT, useClass: MockFileService }]\r\n * ```\r\n */\r\n@Injectable()\r\nexport class MockFileService implements FilePort {\r\n /** Set this to make the next `pickImage()` call reject with this error. */\r\n nextError: Error | null = null;\r\n\r\n pickImage(): Promise<FileResult> {\r\n if (this.nextError) {\r\n const err = this.nextError;\r\n this.nextError = null;\r\n return Promise.reject(err);\r\n }\r\n return Promise.resolve({\r\n dataUrl: 'data:image/jpeg;base64,mockImageData==',\r\n mimeType: 'image/jpeg',\r\n });\r\n }\r\n}\r\n","// Public API Surface of @keepui/ui\r\n\r\n// Models\r\nexport * from './lib/models/file-result.model';\r\n\r\n// Ports (interfaces)\r\nexport * from './lib/ports/file.port';\r\n\r\n// Injection tokens\r\nexport * from './lib/tokens/file.token';\r\n\r\n// Services\r\nexport * from './lib/services/web-file.service';\r\n\r\n// Components\r\nexport * from './lib/components/button/button.types';\r\nexport * from './lib/components/button/button.component';\r\nexport * from './lib/components/card/card.types';\r\nexport * from './lib/components/card/card.component';\r\nexport * from './lib/components/icon/icon.component';\r\nexport * from './lib/components/icon-action-button/icon-action-button.types';\r\nexport * from './lib/components/icon-action-button/icon-action-button.component';\r\nexport * from './lib/components/image-preview/image-preview.component';\r\nexport * from './lib/components/signal-dropdown/signal-dropdown.types';\r\nexport * from './lib/components/signal-dropdown/signal-dropdown.component';\r\nexport * from './lib/components/signal-text-input/signal-text-input.types';\r\nexport * from './lib/components/signal-text-input/signal-text-input.component';\r\nexport * from './lib/components/signal-textarea/signal-textarea.types';\r\nexport * from './lib/components/signal-textarea/signal-textarea.component';\r\nexport * from './lib/components/tab-group/tab-group.types';\r\nexport * from './lib/components/tab-group/tab-group.component';\r\nexport * from './lib/components/stepper/stepper.types';\r\nexport * from './lib/components/stepper/stepper.component';\r\n\r\n// Providers\r\nexport * from './lib/providers/provide-keep-ui';\r\nexport * from './lib/providers/keep-ui-i18n.provider';\r\n\r\n// i18n – translation keys & language utilities\r\nexport * from './lib/i18n/translation-keys';\r\nexport * from './lib/i18n/keep-ui-translations';\r\nexport * from './lib/services/keep-ui-language.service';\r\n\r\n// Testing utilities\r\nexport * from './lib/testing/mock-file.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["T"],"mappings":";;;;;;AAGA;;;;;;AAMG;MACU,SAAS,GAAG,IAAI,cAAc,CAAW,WAAW;;ACNjE;;;;;;;AAOG;MAEU,cAAc,CAAA;IACzB,SAAS,GAAA;QACP,OAAO,IAAI,OAAO,CAAa,CAAC,OAAO,EAAE,MAAM,KAAI;YACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,YAAA,KAAK,CAAC,IAAI,GAAG,MAAM;AACnB,YAAA,KAAK,CAAC,MAAM,GAAG,SAAS;AAExB,YAAA,KAAK,CAAC,QAAQ,GAAG,MAAK;gBACpB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC7B,IAAI,CAAC,IAAI,EAAE;AACT,oBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACrC;gBACF;AAEA,gBAAA,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE;AAC/B,gBAAA,MAAM,CAAC,MAAM,GAAG,MAAK;AACnB,oBAAA,OAAO,CAAC;wBACN,OAAO,EAAE,MAAM,CAAC,MAAgB;wBAChC,QAAQ,EAAE,IAAI,CAAC,IAAI;AACpB,qBAAA,CAAC;AACJ,gBAAA,CAAC;AACD,gBAAA,MAAM,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAC5E,gBAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC;AAC5B,YAAA,CAAC;YAED,KAAK,CAAC,KAAK,EAAE;AACf,QAAA,CAAC,CAAC;IACJ;+GA3BW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAd,cAAc,EAAA,CAAA,CAAA;;4FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACTD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;MAiDU,eAAe,CAAA;AAhD5B,IAAA,WAAA,GAAA;;AAkDW,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAgB,SAAS,CAAC;AAElD;;;;;AAKG;AACM,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,IAAI,CAAC;;AAG9B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAc,MAAM,CAAC;;AAGlC,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAa,QAAQ,CAAC;;AAGlC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC;AAEhC;;;;AAIG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC;;AAGtB,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC;AAEjC;;;;AAIG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,EAAE,CAAC;;QAGrB,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;AAEd,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;AAE9D,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AAC7C,YAAA,MAAM,IAAI,GAAG;gBACX,+CAA+C;gBAC/C,gEAAgE;gBAChE,gCAAgC;gBAChC,iDAAiD;gBACjD,kEAAkE;gBAClE,iDAAiD;AAClD,aAAA,CAAC,IAAI,CAAC,GAAG,CAAC;AAEX,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;AAC9B,kBAAE;AACF,kBAAE,IAAI,CAAC,IAAI,EAAE,KAAK;AAChB,sBAAE;sBACA,WAAW;AAEjB,YAAA,MAAM,QAAQ,GAAgC;AAC5C,gBAAA,IAAI,EAAE,cAAc;AACpB,gBAAA,OAAO,EAAE,aAAa;aACvB;AAED,YAAA,MAAM,UAAU,GAAkC;AAChD,gBAAA,OAAO,EAAE;oBACP,iEAAiE;oBACjE,0BAA0B;oBAC1B,2BAA2B;iBAC5B,CAAC,IAAI,CAAC,GAAG,CAAC;AACX,gBAAA,SAAS,EAAE;oBACT,sEAAsE;oBACtE,yDAAyD;iBAC1D,CAAC,IAAI,CAAC,GAAG,CAAC;AACX,gBAAA,OAAO,EAAE;oBACP,mEAAmE;oBACnE,+FAA+F;iBAChG,CAAC,IAAI,CAAC,GAAG,CAAC;AACX,gBAAA,KAAK,EAAE;oBACL,uEAAuE;oBACvE,uCAAuC;iBACxC,CAAC,IAAI,CAAC,GAAG,CAAC;AACX,gBAAA,MAAM,EAAE;oBACN,+DAA+D;oBAC/D,0BAA0B;oBAC1B,2BAA2B;iBAC5B,CAAC,IAAI,CAAC,GAAG,CAAC;aACZ;YAED,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACxF,QAAA,CAAC,CAAC;AAOH,IAAA;IALW,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACrB;IACF;+GAhGW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,4CAAA,EAAA,aAAA,EAAA,+BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAxChB,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAkBU,eAAe,EAAA,UAAA,EAAA,CAAA;kBAhD3B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cACb,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,iBAAiB,EAAE,wCAAwC;AAC3D,wBAAA,eAAe,EAAE,6BAA6B;qBAC/C,EAAA,QAAA,EACS,CAAA;;;;;;;;;;;;;;;;;;;;;;AAsBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA;;;AC7DH;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MAyBU,aAAa,CAAA;AAxB1B,IAAA,WAAA,GAAA;QAyBmB,IAAA,CAAA,UAAU,GAAG,8CAA8C;AAE3D,QAAA,IAAA,CAAA,iBAAiB,GAAgC;AAChE,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,QAAQ,EAAE,mCAAmC;SAC9C;AAEgB,QAAA,IAAA,CAAA,0BAA0B,GAAgC;AACzE,YAAA,IAAI,EAAE,+BAA+B;AACrC,YAAA,QAAQ,EAAE,+BAA+B;SAC1C;AAEgB,QAAA,IAAA,CAAA,iBAAiB,GAAgC;AAChE,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,MAAM,EAAE,WAAW;SACpB;AAEgB,QAAA,IAAA,CAAA,gBAAgB,GAA+B;AAC9D,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,SAAS,EAAE,iBAAiB;SAC7B;AAEQ,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAc,UAAU,CAAC;AACxC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAc,IAAI,CAAC;AAClC,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAa,SAAS,CAAC;AACrC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAU,KAAK,CAAC;AACjC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;AAChC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAClC,QAAA,IAAA,CAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;QAClC,IAAA,CAAA,OAAO,GAAG,MAAM,EAAQ;AAEd,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAS,MAAK;AACnD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ;kBAC9B,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,EAAE;kBAC9C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAE1C,YAAA,MAAM,OAAO,GAAG;AACd,gBAAA,IAAI,CAAC,UAAU;AACf,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACpC,YAAY;AACZ,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;aACvC;AAED,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,gBAAA,OAAO,CAAC,IAAI,CACV,iJAAiJ,CAClJ;YACH;AAEA,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,gBAAA,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;YACpD;AAEA,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AACrB,gBAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxB;YAEA,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1C,QAAA,CAAC,CAAC;AAOH,IAAA;IALW,WAAW,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACrB;IACF;+GApEW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,cAAA,EAAA,cAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhBd,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEU,aAAa,EAAA,UAAA,EAAA,CAAA;kBAxBzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,OAAO;AACd,wBAAA,gBAAgB,EAAE,cAAc;AACjC,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;AAcT,EAAA,CAAA;AACF,iBAAA;;;AChDD;;;;;;;;;;;;;;;;;;AAkBG;MAsBU,aAAa,CAAA;AArB1B,IAAA,WAAA,GAAA;;AAuBW,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAU;;AAG/B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,EAAE,CAAC;;AAGxB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAS,WAAW,CAAC;AAE7C;;;;;AAKG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,CAAC;AAEnB,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,EAAE,CAAA,CAAE,CAAC;AAC5D,IAAA;+GAnBY,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAb,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,yCAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAdd,CAAA;;;;;;;;;;;;AAYT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEU,aAAa,EAAA,UAAA,EAAA,CAAA;kBArBzB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,aAAa;AACvB,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,yCAAyC;AACjD,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;AAYT,EAAA,CAAA;AACF,iBAAA;;;ACrCD;;;;;;;;;;;;;;;;;;;;;AAqBG;MAuCU,yBAAyB,CAAA;AAtCtC,IAAA,WAAA,GAAA;;AAwCW,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAU;AAExC;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,EAAU;;AAGpC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAA0B,SAAS,CAAC;;AAGnD,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,CAAC;;AAG5B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAuB,QAAQ,CAAC;;AAG5C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;AAEzC;;;;AAIG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,CAAC;AAErB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;AAE9D,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAS,MAAK;AACrD,YAAA,MAAM,IAAI,GAAG;gBACX,iEAAiE;gBACjE,+CAA+C;gBAC/C,iDAAiD;gBACjD,kEAAkE;gBAClE,iDAAiD;AAClD,aAAA,CAAC,IAAI,CAAC,GAAG,CAAC;AAEX,YAAA,MAAM,UAAU,GAA4C;AAC1D,gBAAA,OAAO,EAAE;oBACP,4DAA4D;oBAC5D,8EAA8E;oBAC9E,sCAAsC;iBACvC,CAAC,IAAI,CAAC,GAAG,CAAC;AACX,gBAAA,MAAM,EAAE;oBACN,4DAA4D;oBAC5D,iHAAiH;oBACjH,0BAA0B;iBAC3B,CAAC,IAAI,CAAC,GAAG,CAAC;aACZ;YAED,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA,CAAE;AAChD,QAAA,CAAC,CAAC;AACH,IAAA;+GAvDY,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAjB1B,CAAA;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0QAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjCS,aAAa,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAmCZ,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAtCrC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP,CAAC,aAAa,CAAC,EAAA,eAAA,EACP,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAiBrC,CAAA;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,0QAAA,CAAA,EAAA;;;AC9DH;;;;;;;;;;;;AAYG;AACI,MAAM,uBAAuB,GAAG;AACrC,IAAA,aAAa,EAAE;AACb,QAAA,YAAY,EAAE,0BAA0B;AACxC,QAAA,OAAO,EAAE,sBAAsB;AAC/B,QAAA,WAAW,EAAE,yBAAyB;AACtC,QAAA,gBAAgB,EAAE,8BAA8B;AACjD,KAAA;AACD,IAAA,iBAAiB,EAAE;AACjB,QAAA,aAAa,EAAE,8BAA8B;AAC7C,QAAA,aAAa,EAAE,8BAA8B;AAC9C,KAAA;;AAMH;AACO,MAAM,0BAA0B,GAA8B;IACnE,IAAI;IACJ,IAAI;IACJ,IAAI;;;AC3BN;;;;;;;;;;;;;;;;;;AAkBG;MA6CU,qBAAqB,CAAA;AA5ClC,IAAA,WAAA,GAAA;AA6CmB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;;AAG1B,QAAA,IAAA,CAAA,IAAI,GAAGA,uBAAC,CAAC,aAAa;;AAGhC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAgB,IAAI,CAAC;;AAEtC,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAgB,IAAI,CAAC;;AAEnC,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAiBjC,IAAA;AAfC,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AAEtB,QAAA,IAAI;YACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;QACnC;QAAE,OAAO,GAAG,EAAE;YACZ,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,GAAG,YAAY,KAAK,GAAG,GAAG,CAAC,OAAO,GAAGA,uBAAC,CAAC,aAAa,CAAC,gBAAgB,CACtE;QACH;gBAAU;AACR,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;IACF;+GA3BW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAvCrB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAEnD,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAtCS,aAAa,kDAAE,eAAe,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAwC7B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA5CjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,eAAe,CAAC;oBACzC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC7D,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;AACxB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCT,EAAA,CAAA;AACF,iBAAA;;;ACnDD,MAAM,oBAAoB,GAAG,EAAE;AAC/B,MAAM,gBAAgB,GAAG,CAAC;AAC1B,MAAM,YAAY,GAAG,CAAC;AAEtB;;;;;;;;;;;;;;;;;;;;AAoBG;MA4IU,uBAAuB,CAAA;AAmGlC,IAAA,WAAA,GAAA;AAjGiB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAE7B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC;AACtB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;AAC3B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC;AACtB,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC;AACvB,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC;AAExB,QAAA,IAAA,CAAA,cAAc,GAC/B,SAAS,CAAgC,gBAAgB,CAAC;AACzC,QAAA,IAAA,CAAA,iBAAiB,GAClC,SAAS,CAA0B,mBAAmB,CAAC;;AAGhD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,CAAC;;AAGzB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE,CAAC;;AAG/B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAC,QAAQ,EAA6B;;AAGrD,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAsB,MAAM,CAAC;;AAG1C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;;AAGhC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,EAAE,CAAC;AAEzC;;;AAGG;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoB,EAAE,CAAC;AAE9C;;;AAGG;QACM,IAAA,CAAA,QAAQ,GAAG,KAAK,CACvB,CAAA,YAAA,EAAe,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE,CACxD;;AAGQ,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;AAEzC;;;AAGG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,CAAC;;AAG/B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAW,IAAI,CAAC;;AAG7B,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,CAAC;;QAG/B,IAAA,CAAA,WAAW,GAAG,MAAM,EAAY;AAEtB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CACnC,MAAM,CAAA,EAAG,IAAI,CAAC,QAAQ,EAAE,CAAA,MAAA,CAAQ,CACjC;QAEkB,IAAA,CAAA,UAAU,GAAG,QAAQ,CACtC,MACE,CAAA,IAAA,EAAO,IAAI,CAAC,UAAU,EAAE,WAAW,IAAI,CAAC,WAAW,EAAE,CAAA,SAAA,EAAY,IAAI,CAAC,YAAY,EAAE,CAAA,EAAA,CAAI,CAC3F;AAEkB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;AACpD,YAAA,MAAM,GAAG,GAAwC;AAC/C,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,IAAI,EAAE,QAAQ;aACf;AACD,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1B,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAS,MAAK;AACvD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE;YAC5B,IAAI,OAAO,KAAK,IAAI;AAAE,gBAAA,OAAO,IAAI,CAAC,WAAW,EAAE;YAC/C,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE;AACnF,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAW,MAAK;AAC1D,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE;YAC5B,IAAI,OAAO,KAAK,IAAI;AAAE,gBAAA,OAAO,EAAE;YAC/B,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,MAAM,IAAI,EAAE;AACpE,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CACrC,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CACvG;QA4GgB,IAAA,CAAA,mBAAmB,GAAG,MAAW;YAChD,IAAI,IAAI,CAAC,MAAM,EAAE;gBAAE,IAAI,CAAC,yBAAyB,EAAE;AACrD,QAAA,CAAC;QA3GC,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;gBACjB,IAAI,CAAC,yBAAyB,EAAE;gBAChC,IAAI,CAAC,oBAAoB,EAAE;YAC7B;iBAAO;gBACL,IAAI,CAAC,uBAAuB,EAAE;YAChC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjE;AAEU,IAAA,eAAe,CAAC,KAAiB,EAAA;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa;AACzD,QAAA,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,EAAE;AAC1D,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACxB;IACF;IAEU,cAAc,GAAA;QACtB,IAAI,IAAI,CAAC,QAAQ,EAAE;YAAE;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;IACnC;IAEU,KAAK,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;QAC9C;IACF;AAEU,IAAA,YAAY,CAAC,MAA+B,EAAA;QACpD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;QACtB,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;QAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;IACrC;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;AAEU,IAAA,UAAU,CAAC,WAAc,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,KAAK,WAAW;IACrC;AAEU,IAAA,eAAe,CAAC,KAAoB,EAAA;AAC5C,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YACxD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACvB;QACF;IACF;AAEU,IAAA,eAAe,CACvB,KAAoB,EACpB,MAA+B,EAC/B,KAAa,EAAA;QAEb,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa;QACrD,MAAM,aAAa,GAAG,KAAK,EAAE,gBAAgB,CAAoB,iBAAiB,CAAC;AACnF,QAAA,IAAI,CAAC,aAAa;YAAE;AAEpB,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YAC7B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;QACvE;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;YAClC,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,KAAK,KAAK,CAAC,EAAE;gBACf,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,CAAC,KAAK,EAAE;YAC9C;iBAAO;gBACL,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE;YACnC;QACF;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;YACrD,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC3B;IACF;IAEQ,yBAAyB,GAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa;AACnD,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,qBAAqB,EAAE;AAC3C,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC9B,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,oBAAoB,GAAG,gBAAgB,EAC/D,GAAG,CACJ;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM;AACnD,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG;AAC3B,QAAA,MAAM,iBAAiB,GACrB,UAAU,GAAG,eAAe,GAAG,YAAY;AAC3C,YAAA,UAAU,GAAG,eAAe,GAAG,YAAY;AAE7C,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC;QACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB;AACE,cAAE,IAAI,CAAC,GAAG,GAAG,eAAe,GAAG;AAC/B,cAAE,IAAI,CAAC,MAAM,GAAG,YAAY,CAC/B;IACH;IAMQ,oBAAoB,GAAA;QAC1B,IAAI,CAAC,uBAAuB,EAAE;QAC9B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACjE,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAC7D;IAEQ,uBAAuB,GAAA;QAC7B,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC;QACpE,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC;IAChE;+GA1NW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,yBAAA,EAAA,SAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAjIxB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+HT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EArIS,aAAa,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAuIZ,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBA3InC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,aAAa,CAAC;AACxB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,OAAO;AACd,wBAAA,kBAAkB,EAAE,yBAAyB;AAC7C,wBAAA,2BAA2B,EAAE,SAAS;AACvC,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+HT,EAAA,CAAA;AACF,iBAAA;;;ACrKD;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MAsGU,wBAAwB,CAAA;AArGrC,IAAA,WAAA,GAAA;AAuGqB,QAAA,IAAA,CAAA,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC;AAEjC,QAAA,IAAA,CAAA,QAAQ,GAAG,SAAS,CAA+B,UAAU,CAAC;;AAG9D,QAAA,IAAA,CAAA,IAAI,GAAGA,uBAAC,CAAC,iBAAiB;;AAGpC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,CAAC;;AAGzB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE,CAAC;;AAG/B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAsB,MAAM,CAAC;;AAGzC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAuB,MAAM,CAAC;;AAG3C,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE,CAAC;;AAG/B,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,EAAE,CAAC;AAEzC;;;;AAIG;AACM,QAAA,IAAA,CAAA,eAAe,GAAG,KAAK,CAAU,KAAK,CAAC;;AAGvC,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;;AAGhC,QAAA,IAAA,CAAA,qBAAqB,GAAG,KAAK,CAAU,IAAI,CAAC;;AAG5C,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,EAAE,CAAC;AAEzC;;;AAGG;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoB,EAAE,CAAC;AAE9C;;;AAGG;QACM,IAAA,CAAA,OAAO,GAAG,KAAK,CACtB,CAAA,cAAA,EAAiB,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE,CAC1D;;AAGQ,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;AAEzC;;;AAGG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,CAAC;;AAG/B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,CAAC;;AAGzB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,CAAC;AAErB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CACnC,MAAM,CAAA,EAAG,IAAI,CAAC,OAAO,EAAE,CAAA,MAAA,CAAQ,CAChC;AAEkB,QAAA,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,UAAU,CAAC;AAE3D,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAS,MAAK;AACtD,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;AACzB,gBAAA,OAAO,IAAI,CAAC,iBAAiB,EAAE,GAAG,MAAM,GAAG,UAAU;YACvD;AACA,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACpB,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;AACpD,YAAA,MAAM,GAAG,GAAyC;AAChD,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,IAAI,EAAE,QAAQ;aACf;AACD,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1B,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;QAE1D,IAAA,CAAA,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAC/D;QAEkB,IAAA,CAAA,SAAS,GAAG,QAAQ,CACrC,MACE,IAAI,CAAC,OAAO,EAAE;aACb,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CACjF;AAEkB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CACvC,MAAM,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAC9C;AAEkB,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AAC9C,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW;AAChC,kBAAE;kBACA,sBAAsB;AAC1B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,MAAM;AACvD,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe;AACvC,kBAAE;kBACA,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc;AACzC,sBAAE;sBACA,MAAM;AACZ,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS;AAChC,kBAAE;kBACA,mEAAmE;AACvE,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,gBAAgB,GAAG,EAAE;YAE7D,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE;AAC/E,QAAA,CAAC,CAAC;AAsBH,IAAA;AApBW,IAAA,OAAO,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA0B;QAC/C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;IAC9B;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;IAEU,cAAc,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE;AAC1B,YAAA,IAAI;gBACF,IAAI,CAAC,QAAQ,EAAE,EAAE,aAAa,CAAC,UAAU,EAAE;YAC7C;AAAE,YAAA,MAAM,iDAAiD;QAC3D;IACF;IAEU,wBAAwB,GAAA;AAChC,QAAA,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC;+GAnJW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAhGxB,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,UAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAEnD,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4FT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EA/FS,aAAa,qGAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAiG3B,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBArGpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,0BAA0B;AACpC,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;oBACvC,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC7D,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;AACxB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4FT,EAAA,CAAA;AACF,iBAAA;;;ACtID;;;;;;;;;;;;;;;;AAgBG;MAqEU,uBAAuB,CAAA;AApEpC,IAAA,WAAA,GAAA;;AAuEW,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,CAAC;;AAGzB,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,EAAE,CAAC;;AAG/B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAS,CAAC,CAAC;;AAGvB,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAsB,MAAM,CAAC;;AAG1C,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAuB,MAAM,CAAC;;AAG5C,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;;AAGhC,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAS,EAAE,CAAC;AAEzC;;;AAGG;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,KAAK,CAAoB,EAAE,CAAC;AAE9C;;;AAGG;QACM,IAAA,CAAA,UAAU,GAAG,KAAK,CACzB,CAAA,YAAA,EAAe,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE,CACxD;;AAGQ,QAAA,IAAA,CAAA,QAAQ,GAAG,KAAK,CAAU,KAAK,CAAC;;AAGhC,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,CAAC;AAEzD;;;AAGG;AACM,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,CAAC;;AAG/B,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAS,EAAE,CAAC;;AAGzB,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAU,KAAK,CAAC;AAErB,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,MAAA,CAAQ,CAAC;AACtD,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAA,EAAG,IAAI,CAAC,UAAU,EAAE,CAAA,MAAA,CAAQ,CAAC;AAE1D,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC;QAE/C,IAAA,CAAA,SAAS,GAAG,QAAQ,CACrC,MACE,IAAI,CAAC,OAAO,EAAE;aACb,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CACjF;AAEkB,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAS,MAAK;AACpD,YAAA,MAAM,GAAG,GAAwC;AAC/C,gBAAA,IAAI,EAAE,QAAQ;AACd,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,IAAI,EAAE,QAAQ;aACf;AACD,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAC1B,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAS,MAAK;AACrD,YAAA,MAAM,GAAG,GAAyC;AAChD,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,QAAQ,EAAE,UAAU;AACpB,gBAAA,UAAU,EAAE,UAAU;AACtB,gBAAA,IAAI,EAAE,QAAQ;aACf;AACD,YAAA,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAC3B,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS;AAChC,kBAAE;kBACA,mEAAmE;YACvE,OAAO,CAAA,EAAG,IAAI,CAAC,WAAW,EAAE,CAAA,CAAA,EAAI,WAAW,EAAE;AAC/C,QAAA,CAAC,CAAC;AAUH,IAAA;AARW,IAAA,OAAO,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA6B;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;IAC9B;IAEU,MAAM,GAAA;AACd,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxB;+GAnGW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,OAAA,EAAA,eAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/DxB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAEU,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBApEnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,wBAAwB;AAClC,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;AACxB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6DT,EAAA,CAAA;AACF,iBAAA;;;ACjFD;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;MA+CU,iBAAiB,CAAA;AA9C9B,IAAA,WAAA,GAAA;;AAgDW,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAS;;AAG9B,QAAA,IAAA,CAAA,aAAa,GAAG,KAAK,CAAC,QAAQ,EAAU;;AAGxC,QAAA,IAAA,CAAA,OAAO,GAAG,KAAK,CAAkB,SAAS,CAAC;AAEpD;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,CAAC;;QAG7B,IAAA,CAAA,SAAS,GAAG,MAAM,EAAU;AAEpB,QAAA,IAAA,CAAA,UAAU,GAAG,YAAY,CAAgC,WAAW,CAAC;QAEnE,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAC,MAC3C,IAAI,CAAC,OAAO,EAAE,KAAK;AACjB,cAAE;cACA,4CAA4C,CACjD;AA0DF,IAAA;AAxDW,IAAA,WAAW,CAAC,KAAa,EAAA;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK;AAC/C,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,EAAE;AAC/B,YAAA,OAAO;AACL,kBAAE;kBACA,4EAA4E;QAClF;AACA,QAAA,OAAO;AACL,cAAE;cACA,0EAA0E;IAChF;AAEU,IAAA,SAAS,CAAC,KAAa,EAAA;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,KAAK;AAC/C,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,QAAQ,EAAE;YAC/B,OAAO,QAAQ,GAAG,YAAY,GAAG,mBAAmB;QACtD;QACA,OAAO,QAAQ,GAAG,wBAAwB,GAAG,mBAAmB;IAClE;AAEU,IAAA,UAAU,CAAC,GAAQ,EAAA;AAC3B,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE;YACpD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B;IACF;AAEU,IAAA,SAAS,CAAC,KAAoB,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AACjD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;QAEtE,IAAI,SAAS,GAAG,WAAW;AAE3B,QAAA,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE;YAC3D,SAAS,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM;QAC7C;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE;AAC/D,YAAA,SAAS,GAAG,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;QAC3D;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,EAAE;YAC/B,SAAS,GAAG,CAAC;QACf;AAAO,aAAA,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE;AAC9B,YAAA,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;QAC7B;aAAO;YACL;QACF;QAEA,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AAC/B,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3B;AAEQ,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE;AAC3B,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC;AACpD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,OAAO,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,KAAK,EAAE;IACvC;+GAlFW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAzClB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAxCS,aAAa,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FA0CZ,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBA9C7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,aAAa,CAAC;AACxB,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCT,EAAA,CAAA;AACF,iBAAA;;;ACvED;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;MAyEU,gBAAgB,CAAA;AAxE7B,IAAA,WAAA,GAAA;;AA0EW,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAiB;;AAGvC,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAS,CAAC,CAAC;;AAG9B,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK,CAAc,IAAI,CAAC;;AAG/B,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqB,YAAY,CAAC;AAE9D;;;AAGG;AACM,QAAA,IAAA,CAAA,SAAS,GAAG,KAAK,CAAS,EAAE,CAAC;AAEtC;;;;AAIG;QACM,IAAA,CAAA,UAAU,GAAG,MAAM,EAAU;QAEnB,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAoB3D,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,QAAQ,CAAC;AAEvC,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;YAC3C,MAAM,IAAI,GAAG,wBAAwB;AACrC,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK;kBAC1B,CAAA,EAAG,IAAI,CAAA,eAAA;AACT,kBAAE,CAAA,EAAG,IAAI,CAAA,qBAAA,CAAuB;AACpC,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;YAC3C,MAAM,IAAI,GAAG,MAAM;AACnB,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK;kBAC1B,CAAA,EAAG,IAAI,CAAA,6BAAA;AACT,kBAAE,CAAA,EAAG,IAAI,CAAA,6BAAA,CAA+B;AAC5C,QAAA,CAAC,CAAC;AAEiB,QAAA,IAAA,CAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AACjD,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE,KAAK;AAC5B,kBAAE;kBACA,oCAAoC;AAC1C,QAAA,CAAC,CAAC;AAmDH,IAAA;AAzFW,IAAA,WAAW,CAAC,KAAa,EAAA;AACjC,QAAA,OAAO,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;IACnC;AAEU,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC9B,QAAA,OAAO,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE;IACrC;IAEU,WAAW,CAAC,KAAa,EAAE,IAAiB,EAAA;QACpD,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5E;IAEU,WAAW,CAAC,KAAa,EAAE,IAAiB,EAAA;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7B;IACF;AAwBU,IAAA,WAAW,CAAC,KAAa,EAAA;AACjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK;AAChC,cAAE;cACA,iBAAiB;AAErB,QAAA,MAAM,IAAI,GAAG;YACX,+DAA+D;YAC/D,gCAAgC;YAChC,iDAAiD;YACjD,kEAAkE;YAClE,SAAS;AACV,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC;AAEX,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC3B,OAAO,CAAA,EAAG,IAAI,CAAA,+CAAA,CAAiD;QACjE;AACA,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,CAAA,EAAG,IAAI,CAAA,4EAAA,CAA8E;QAC9F;QACA,OAAO,CAAA,EAAG,IAAI,CAAA,qFAAA,CAAuF;IACvG;AAEU,IAAA,UAAU,CAAC,KAAa,EAAA;QAChC,MAAM,IAAI,GAAG,gEAAgE;AAC7E,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;YACxB,OAAO,CAAA,EAAG,IAAI,CAAA,qBAAA,CAAuB;QACvC;AACA,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC3B,OAAO,CAAA,EAAG,IAAI,CAAA,uBAAA,CAAyB;QACzC;QACA,OAAO,CAAA,EAAG,IAAI,CAAA,kBAAA,CAAoB;IACpC;AAEU,IAAA,cAAc,CAAC,KAAa,EAAA;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AAE9D,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE;AACrC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,KAAK,GAAG,MAAM;YACpD,OAAO;AACL,gBAAA,CAAA,EAAG,MAAM,CAAA,+DAAA,CAAiE;AAC1E,gBAAA,MAAM,GAAG,sBAAsB,GAAG,wBAAwB;AAC3D,aAAA,CAAC,IAAI,CAAC,GAAG,CAAC;QACb;QAEA,OAAO;YACL,oEAAoE;AACpE,YAAA,MAAM,GAAG,sBAAsB,GAAG,wBAAwB;AAC3D,SAAA,CAAC,IAAI,CAAC,GAAG,CAAC;IACb;+GApHW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnEjB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiET,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAlES,aAAa,0GAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FAoE9B,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAxE5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,UAAU,EAAE,IAAI;oBAChB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,gBAAgB,CAAC;AAC1C,oBAAA,QAAQ,EAAE,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiET,EAAA,CAAA;AACF,iBAAA;;;AC3GD;;;;;;;;;;;;AAYG;SACa,aAAa,GAAA;AAC3B,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE;AACjD,KAAA,CAAC;AACJ;;ACrBA;;;;;;;;AAQG;AAiBH,MAAM,EAAE,GAA4B;AAClC,IAAA,YAAY,EAAE;AACZ,QAAA,WAAW,EAAE,cAAc;AAC3B,QAAA,OAAO,EAAE,UAAU;AACnB,QAAA,UAAU,EAAE,wBAAwB;AACpC,QAAA,eAAe,EAAE,8BAA8B;AAChD,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,YAAY,EAAE,eAAe;AAC7B,QAAA,YAAY,EAAE,eAAe;AAC9B,KAAA;CACF;AAED,MAAM,EAAE,GAA4B;AAClC,IAAA,YAAY,EAAE;AACZ,QAAA,WAAW,EAAE,oBAAoB;AACjC,QAAA,OAAO,EAAE,WAAW;AACpB,QAAA,UAAU,EAAE,qCAAqC;AACjD,QAAA,eAAe,EAAE,iCAAiC;AACnD,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,YAAY,EAAE,oBAAoB;AAClC,QAAA,YAAY,EAAE,oBAAoB;AACnC,KAAA;CACF;AAED,MAAM,EAAE,GAA4B;AAClC,IAAA,YAAY,EAAE;AACZ,QAAA,WAAW,EAAE,gBAAgB;AAC7B,QAAA,OAAO,EAAE,QAAQ;AACjB,QAAA,UAAU,EAAE,kCAAkC;AAC9C,QAAA,eAAe,EAAE,yCAAyC;AAC3D,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,YAAY,EAAE,mBAAmB;AACjC,QAAA,YAAY,EAAE,oBAAoB;AACnC,KAAA;CACF;AAED;AACO,MAAM,mBAAmB,GAAoD;AAClF,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;AACN,IAAA,EAAE,EAAE,EAAE;;;AC9DR;;;;;;;;AAQG;MAEU,qBAAqB,CAAA;AAChC,IAAA,cAAc,CAAC,QAAgB,EAAA;;;QAG7B,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ;AAEvE,QAAA,MAAM,OAAO,GAAG,CAAC,CAAS,KACxB,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;AAExC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI;AAC/B,cAAE,mBAAmB,CAAC,IAAI;AAC1B,cAAE,mBAAmB,CAAC,IAAI,CAAC;AAE7B,QAAA,OAAO,EAAE,CAAC,YAAsC,CAAC;IACnD;+GAdW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,CAAA,CAAA;;4FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC;;;ACXD;;;;;;;;;;;;;;;;;AAiBG;MAEU,qBAAqB,CAAA;AADlC,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;;QAG5C,IAAA,CAAA,cAAc,GAAG,MAAM,CAC9B,IAAI,CAAC,SAAS,CAAC,aAAa,EAAoB,CACjD;;QAGQ,IAAA,CAAA,kBAAkB,GAA8B,0BAA0B;AAWpF,IAAA;AATC;;;;AAIG;AACH,IAAA,WAAW,CAAC,IAAoB,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B;+GAnBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAArB,qBAAqB,EAAA,CAAA,CAAA;;4FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC;;;ACLD;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BG;AACG,SAAU,iBAAiB,CAC/B,OAAA,GAA6B,EAAE,EAAA;AAE/B,IAAA,MAAM,WAAW,GAAmB,OAAO,CAAC,WAAW,IAAI,IAAI;AAE/D,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,gBAAgB,CAAC;AACf,YAAA,MAAM,EAAE;gBACN,WAAW;AACX,gBAAA,cAAc,EAAE,CAAC,GAAG,0BAA0B,CAAC;AAC/C,gBAAA,oBAAoB,EAAE,IAAI;AAC1B,gBAAA,aAAa,EAAE,CAAC;AAChB,gBAAA,cAAc,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE;AAChD,gBAAA,YAAY,EAAE,IAAI;AACnB,aAAA;AACD,YAAA,MAAM,EAAE,qBAAqB;SAC9B,CAAC;QAEF,qBAAqB;AACtB,KAAA,CAAC;AACJ;;AC9DA;;;;;;;;;AASG;MAEU,eAAe,CAAA;AAD5B,IAAA,WAAA,GAAA;;QAGE,IAAA,CAAA,SAAS,GAAiB,IAAI;AAa/B,IAAA;IAXC,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS;AAC1B,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;QAC5B;QACA,OAAO,OAAO,CAAC,OAAO,CAAC;AACrB,YAAA,OAAO,EAAE,wCAAwC;AACjD,YAAA,QAAQ,EAAE,YAAY;AACvB,SAAA,CAAC;IACJ;+GAdW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;mHAAf,eAAe,EAAA,CAAA,CAAA;;4FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;ACdD;AAEA;;ACFA;;AAEG;;;;"}