mn-angular-lib 1.0.102 → 1.0.103
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":"mn-angular-lib.mjs","sources":["../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.tokens.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.providers.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.store.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.service.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alertVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-button/mn-buttonVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-button/mn-button.ts","../../../projects/mn-angular-lib/src/lib/features/mn-button/mn-button.html","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert-outlet/mn-alert-outlet.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert-outlet/mn-alert-outlet.html","../../../projects/mn-angular-lib/src/lib/features/mn-badge/mn-badgeVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-badge/mn-badge.ts","../../../projects/mn-angular-lib/src/lib/features/mn-badge/mn-badge.html","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-field-adapters.ts","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-fieldVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-error-message/mn-error-message.ts","../../../projects/mn-angular-lib/src/lib/features/mn-error-message/mn-error-message.html","../../../projects/mn-angular-lib/src/lib/config/mn-config.types.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.types.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.service.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.providers.ts","../../../projects/mn-angular-lib/src/lib/language/mn-translate.pipe.ts","../../../projects/mn-angular-lib/src/lib/config/mn-config.service.ts","../../../projects/mn-angular-lib/src/lib/config/mn-config.providers.ts","../../../projects/mn-angular-lib/src/lib/context/mn-context.tokens.ts","../../../projects/mn-angular-lib/src/lib/config/mn-component-config.providers.ts","../../../projects/mn-angular-lib/src/lib/context/mn-section.directive.ts","../../../projects/mn-angular-lib/src/lib/context/mn-instance.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-field.ts","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-field.html","../../../projects/mn-angular-lib/src/lib/features/mn-dual-horizontal-image/mn-dual-horizontal-image.ts","../../../projects/mn-angular-lib/src/lib/features/mn-dual-horizontal-image/mn-dual-horizontal-image.html","../../../projects/mn-angular-lib/src/lib/features/mn-information-card/mn-information-cardVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-information-card/mn-information-card.ts","../../../projects/mn-angular-lib/src/lib/features/mn-information-card/mn-information-card.html","../../../projects/mn-angular-lib/src/lib/features/mn-textarea/mn-textareaVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-textarea/mn-textarea.ts","../../../projects/mn-angular-lib/src/lib/features/mn-textarea/mn-textarea.html","../../../projects/mn-angular-lib/src/lib/features/mn-file-input/mn-file-inputVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-file-input/mn-file-input.ts","../../../projects/mn-angular-lib/src/lib/features/mn-file-input/mn-file-input.html","../../../projects/mn-angular-lib/src/lib/features/mn-checkbox/mn-checkboxVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-checkbox/mn-checkbox.ts","../../../projects/mn-angular-lib/src/lib/features/mn-checkbox/mn-checkbox.html","../../../projects/mn-angular-lib/src/lib/features/mn-datetime/mn-datetimeVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-datetime/mn-datetime.ts","../../../projects/mn-angular-lib/src/lib/features/mn-datetime/mn-datetime.html","../../../projects/mn-angular-lib/src/lib/features/mn-multi-select/mn-multi-selectVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-multi-select/mn-multi-select.ts","../../../projects/mn-angular-lib/src/lib/features/mn-multi-select/mn-multi-select.html","../../../projects/mn-angular-lib/src/lib/features/mn-select/mn-selectVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-select/mn-select.ts","../../../projects/mn-angular-lib/src/lib/features/mn-select/mn-select.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal.types.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal-haptics.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/form-layout.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/step.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/base-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/wizard-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/form-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/confirmation-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/custom-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal-ref.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-form-body/mn-custom-field-host.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-table.types.ts","../../../projects/mn-angular-lib/src/lib/features/mn-skeleton/mn-skeletonVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-skeleton/mn-skeleton.ts","../../../projects/mn-angular-lib/src/lib/features/mn-skeleton/mn-skeleton.html","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-hidden-below.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-show-above.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-show-below.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection.types.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection-base.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-selectable-collection-base.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection-pagination.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection-pagination.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-table.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-table.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-custom-body-host/mn-custom-body-host.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-form-body/mn-form-body.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-form-body/mn-form-body.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-footer-actions/mn-footer-actions.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-wizard-body/mn-wizard-body.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-wizard-body/mn-wizard-body.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-confirmation-body/mn-confirmation-body.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-confirmation-body/mn-confirmation-body.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-modal-shell/mn-modal-shell.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-modal-shell/mn-modal-shell.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal.service.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/index.ts","../../../projects/mn-angular-lib/src/lib/features/mn-list/mn-list.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-list/mn-list.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-grid/mn-grid.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-grid/mn-grid.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/models/calendar-config.model.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/services/calendar-date-formatter.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/services/default-calendar-date-formatter.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-month/calendar-month.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-month/calendar-month.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/services/calendar-event-layout.service.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/utils/calendar-utils.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event-default/calendar-event-default.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event-default/calendar-event-default.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event/calendar-event.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event/calendar-event.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-week/calendar-week.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-week/calendar-week.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-day/calendar-day.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-day/calendar-day.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-event-row/upcoming-event-row.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-event-row/upcoming-event-row.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-events/upcoming-events.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-events/upcoming-events.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-view/calendar-view.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-view/calendar-view.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/index.ts","../../../projects/mn-angular-lib/src/lib/features/mn-tab/mn-tab.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-tab/mn-tab.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-iconVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon-map.ts","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon.ts","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon.html","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon-attributes.directive.ts","../../../projects/mn-angular-lib/src/lib/shared/crud/crud.tokens.ts","../../../projects/mn-angular-lib/src/lib/shared/crud/crud.service.ts","../../../projects/mn-angular-lib/src/lib/shared/http/mn-http.service.ts","../../../projects/mn-angular-lib/src/lib/preview/mn-preview-listener.ts","../../../projects/mn-angular-lib/src/public-api.ts","../../../projects/mn-angular-lib/src/mn-angular-lib.ts"],"sourcesContent":["// projects/mn-angular-lib/src/lib/mn-mn-alert/mn-mn-alert.tokens.ts\nimport { InjectionToken } from '@angular/core';\nimport { MnAlert } from './mn-alert.types';\n\nexport type MnAlertKind = 'success' | 'info' | 'warning' | 'error' | 'default';\n\nexport type MnAlertConfig = {\n durations?: Partial<Record<MnAlertKind, number | null>>;\n cssClasses?: Partial<Record<MnAlertKind, string>>;\n icons?: Partial<Record<MnAlertKind, unknown>>;\n fallbackDuration?: number | null;\n finalize?: (a: MnAlert) => MnAlert;\n}\n\nexport const MN_ALERT_CONFIG = new InjectionToken<MnAlertConfig>('MN_ALERT_CONFIG');\n\nexport const DEFAULT_MN_ALERT_CONFIG: Required<MnAlertConfig> = {\n durations: { success: 3000, info: 4000, warning: 5000, error: 7000, default: 4000 },\n cssClasses: {\n success: 'mn-alert-success',\n info: 'mn-alert-info',\n warning: 'mn-alert-warning',\n error: 'mn-alert-error',\n default: 'alert'\n },\n icons: {},\n fallbackDuration: 4000,\n finalize: (a) => a\n};\n","// projects/mn-angular-lib/src/lib/mn-mn-alert/mn-mn-alert.providers.ts\nimport { Provider } from '@angular/core';\nimport { MN_ALERT_CONFIG, MnAlertConfig, DEFAULT_MN_ALERT_CONFIG } from './mn-alert.tokens';\n\nexport function provideMnAlerts(config: MnAlertConfig = {}): Provider {\n const merged: MnAlertConfig = {\n ...DEFAULT_MN_ALERT_CONFIG,\n ...config,\n durations: { ...DEFAULT_MN_ALERT_CONFIG.durations, ...(config.durations ?? {}) },\n cssClasses: { ...DEFAULT_MN_ALERT_CONFIG.cssClasses, ...(config.cssClasses ?? {}) },\n icons: { ...DEFAULT_MN_ALERT_CONFIG.icons, ...(config.icons ?? {}) }\n };\n return { provide: MN_ALERT_CONFIG, useValue: merged };\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { MnAlert, MnAlertId } from './mn-alert.types';\nimport { DEFAULT_MN_ALERT_CONFIG } from './mn-alert.tokens';\n\nlet COUNTER = 0;\nconst uid = () => `mn_${++COUNTER}`;\n\n@Injectable({ providedIn: 'root' })\nexport class MnAlertStore {\n private readonly _alerts$ = new BehaviorSubject<MnAlert[]>([]);\n readonly alerts$ = this._alerts$.asObservable();\n\n show(partial: Omit<MnAlert, 'id'>): MnAlertId {\n // Ensure every alert has a numeric duration: use provided or fall back to per-kind default\n const computedDuration = (partial as {\n duration?: number\n }).duration ?? (DEFAULT_MN_ALERT_CONFIG.durations as Record<string, number>)[(partial as {\n kind?: string\n }).kind ?? ''] ?? DEFAULT_MN_ALERT_CONFIG.fallbackDuration;\n const a: MnAlert = { id: uid(), ...partial, duration: computedDuration } as MnAlert;\n this._alerts$.next([...this._alerts$.value, a]);\n\n if (typeof a.duration === 'number' && a.duration > 0) {\n setTimeout(() => this.dismiss(a.id), a.duration);\n }\n return a.id;\n }\n\n dismiss(id: MnAlertId) {\n const list = this._alerts$.value;\n if (list.some(x => x.id === id)) {\n this._alerts$.next(list.filter(x => x.id !== id));\n }\n }\n\n clear() {\n this._alerts$.next([]);\n }\n}\n","// projects/mn-angular-lib/src/lib/mn-mn-alert/mn-mn-alert.service.ts\nimport {Injectable, inject} from '@angular/core';\nimport { MnAlertStore } from './mn-alert.store';\nimport { MnAlert, MnAlertId } from './mn-alert.types';\nimport { MN_ALERT_CONFIG, DEFAULT_MN_ALERT_CONFIG, MnAlertConfig, MnAlertKind } from './mn-alert.tokens';\nimport { MnAlertVariants } from './mn-alertVariants';\n\nexport type MnShowInput = {\n title: string;\n subTitle?: string;\n duration?: number;\n icon?: unknown;\n cssClass?: string;\n meta?: Record<string, unknown>;\n kind: MnAlertKind;\n variant?: MnAlertVariants['variant'];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MnAlertService {\n private readonly store = inject(MnAlertStore);\n\n private readonly cfg: Required<MnAlertConfig>;\n private readonly userDurations?: Partial<Record<MnAlertKind, number | null>>;\n private readonly hasUserDurations: boolean;\n\n constructor() {\n const cfg = inject<MnAlertConfig | null>(MN_ALERT_CONFIG, {optional: true});\n\n this.userDurations = cfg?.durations;\n this.hasUserDurations = !!cfg?.durations;\n this.cfg = {\n ...DEFAULT_MN_ALERT_CONFIG,\n ...(cfg ?? {}),\n // Do not pre-merge durations; keep defaults separate and use logic in kind()\n durations: DEFAULT_MN_ALERT_CONFIG.durations,\n cssClasses: { ...DEFAULT_MN_ALERT_CONFIG.cssClasses, ...(cfg?.cssClasses ?? {}) },\n icons: { ...DEFAULT_MN_ALERT_CONFIG.icons, ...(cfg?.icons ?? {}) }\n };\n }\n\n show(input: MnShowInput): MnAlertId {\n // Always ensure a numeric duration is set\n let duration = input.duration;\n if (duration == null) {\n // Prefer user defaultDuration if provided and not null, otherwise use library per-kind default\n const userDefault = this.cfg.fallbackDuration;\n if (typeof userDefault === 'number') {\n duration = userDefault;\n } else {\n duration = DEFAULT_MN_ALERT_CONFIG.durations[input.kind as keyof typeof DEFAULT_MN_ALERT_CONFIG.durations] as number;\n }\n }\n\n const a: Omit<MnAlert, 'id'> = {\n title: input.title,\n subTitle: input.subTitle,\n duration,\n icon: input.icon,\n cssClass: input.cssClass,\n meta: input.meta,\n kind: input.kind,\n variant: input.variant\n };\n return this.store.show(this.cfg.finalize(a as MnAlert));\n }\n\n success(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('success', title, subTitle, extra);\n }\n info(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('info', title, subTitle, extra);\n }\n warning(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('warning', title, subTitle, extra);\n }\n error(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('error', title, subTitle, extra);\n }\n\n dismiss(id: MnAlertId) { this.store.dismiss(id); }\n clear() { this.store.clear(); }\n\n private kind(kind: MnAlertKind, title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n let duration: number | null | undefined = extra?.duration;\n\n if (duration == null) {\n if (this.hasUserDurations) {\n const userDur = this.userDurations?.[kind];\n if (typeof userDur === 'number') {\n duration = userDur;\n } else {\n // userDur is undefined or null -> fallback to user defaultDuration if numeric\n if (typeof this.cfg.fallbackDuration === 'number') {\n duration = this.cfg.fallbackDuration;\n } else {\n duration = this.cfg.durations[kind as keyof typeof this.cfg.durations];\n }\n }\n } else {\n // No user durations provided at all; use library defaults per kind\n duration = this.cfg.durations[kind as keyof typeof this.cfg.durations];\n }\n }\n\n const cssClass = extra?.cssClass ?? this.cfg.cssClasses[kind];\n const icon = (extra?.icon ?? this.cfg.icons[kind]) as unknown;\n const variant = extra?.variant;\n\n return this.show({ title, subTitle, duration: duration as number, cssClass, icon, meta: extra?.meta , kind: kind, variant});\n }\n}\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnAlertVariants = tv({\n base: 'flex items-start gap-3 p-4 border rounded-xl shadow-sm transition-all duration-300 w-full ',\n variants: {\n kind: {\n success: 'bg-success/10 border-success/30 text-success',\n info: 'bg-info/10 border-info/30 text-info',\n warning: 'bg-warning/10 border-warning/30 text-warning',\n error: 'bg-error/10 border-error/30 text-error',\n default: 'bg-base-100 border-base-300 text-base-content',\n accent: 'bg-accent/10 border-accent/30 text-accent',\n },\n variant: {\n fill: '',\n outline: 'bg-base-200 border-2',\n soft: 'border-none shadow-none',\n }\n },\n compoundVariants: [\n {\n kind: 'success',\n variant: 'fill',\n class: 'bg-success border-success text-success-content'\n },\n {\n kind: 'info',\n variant: 'fill',\n class: 'bg-info border-info text-info-content'\n },\n {\n kind: 'warning',\n variant: 'fill',\n class: 'bg-warning border-warning text-warning-content'\n },\n {\n kind: 'error',\n variant: 'fill',\n class: 'bg-error border-error text-error-content'\n },\n {\n kind: 'accent',\n variant: 'fill',\n class: 'bg-accent border-accent text-accent-content'\n },\n ],\n defaultVariants: {\n kind: 'info',\n variant: 'soft'\n }\n});\n\nexport type MnAlertVariants = VariantProps<typeof mnAlertVariants>;\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnButtonVariants = tv({\n base: 'inline-flex items-center justify-center hover:cursor-pointer transition-all duration-300 ease-in-out',\n variants: {\n size: {\n sm: 'px-2 py-1 text-sm',\n md: 'px-3 py-1.5 text-base',\n lg: 'px-4 py-2 text-lg',\n },\n\n variant: {\n fill: '',\n outline: 'bg-transparent border',\n text: 'bg-transparent',\n textUnderline: 'bg-transparent underline underline-offset-2',\n },\n\n // Intentionally empty; resolved via compoundVariants\n color: {\n primary: '',\n secondary: '',\n danger: '',\n warning: '',\n success: '',\n accent: '',\n gray: '',\n },\n\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n disabled: {\n true: 'opacity-50 pointer-events-none',\n },\n // Busy state: dim and block interaction like `disabled`, and hint the wait cursor.\n // The spinner itself is rendered in the template (see mn-button.html).\n loading: {\n true: 'opacity-50 pointer-events-none cursor-wait',\n },\n wrap: {\n true: 'whitespace-normal',\n false: 'whitespace-nowrap',\n },\n hover: {\n true: '',\n },\n },\n\n compoundVariants: [\n // Fill — base\n { variant: 'fill', color: 'primary', class: 'bg-primary text-primary-content border border-primary' },\n { variant: 'fill', color: 'secondary', class: 'bg-neutral text-neutral-content border border-neutral' },\n { variant: 'fill', color: 'danger', class: 'bg-error text-error-content border border-error' },\n { variant: 'fill', color: 'warning', class: 'bg-warning text-warning-content border border-warning' },\n { variant: 'fill', color: 'success', class: 'bg-success text-success-content border border-success' },\n { variant: 'fill', color: 'accent', class: 'bg-accent text-accent-content border border-accent' },\n { variant: 'fill', color: 'gray', class: 'bg-base-content/10 text-base-content/70 border border-base-content/10' },\n // Fill — hover\n { variant: 'fill', color: 'primary', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'secondary', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'danger', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'warning', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'success', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'accent', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'gray', hover: true, class: 'hover:bg-base-content/20' },\n // Outline — base\n { variant: 'outline', color: 'primary', class: 'border-primary text-primary' },\n { variant: 'outline', color: 'secondary', class: 'border-neutral text-neutral' },\n { variant: 'outline', color: 'danger', class: 'border-error text-error' },\n { variant: 'outline', color: 'warning', class: 'border-warning text-warning' },\n { variant: 'outline', color: 'success', class: 'border-success text-success' },\n { variant: 'outline', color: 'accent', class: 'border-accent text-accent' },\n { variant: 'outline', color: 'gray', class: 'border-base-content/70 text-base-content/70' },\n // Outline — hover\n { variant: 'outline', color: 'primary', hover: true, class: 'hover:bg-primary/10' },\n { variant: 'outline', color: 'secondary', hover: true, class: 'hover:bg-neutral/10' },\n { variant: 'outline', color: 'danger', hover: true, class: 'hover:bg-error/10' },\n { variant: 'outline', color: 'warning', hover: true, class: 'hover:bg-warning/10' },\n { variant: 'outline', color: 'success', hover: true, class: 'hover:bg-success/10' },\n { variant: 'outline', color: 'accent', hover: true, class: 'hover:bg-accent/10' },\n { variant: 'outline', color: 'gray', hover: true, class: 'hover:bg-base-content/10' },\n // Text — base\n { variant: 'text', color: 'primary', class: 'text-primary' },\n { variant: 'text', color: 'secondary', class: 'text-neutral' },\n { variant: 'text', color: 'danger', class: 'text-error' },\n { variant: 'text', color: 'warning', class: 'text-warning' },\n { variant: 'text', color: 'success', class: 'text-success' },\n { variant: 'text', color: 'accent', class: 'text-accent' },\n { variant: 'text', color: 'gray', class: 'text-base-content/70' },\n // Text — hover\n { variant: 'text', color: 'primary', hover: true, class: 'hover:bg-primary/10' },\n { variant: 'text', color: 'secondary', hover: true, class: 'hover:bg-neutral/10' },\n { variant: 'text', color: 'danger', hover: true, class: 'hover:bg-error/10' },\n { variant: 'text', color: 'warning', hover: true, class: 'hover:bg-warning/10' },\n { variant: 'text', color: 'success', hover: true, class: 'hover:bg-success/10' },\n { variant: 'text', color: 'accent', hover: true, class: 'hover:bg-accent/10' },\n { variant: 'text', color: 'gray', hover: true, class: 'hover:bg-base-content/10' },\n // Text Underline — base\n { variant: 'textUnderline', color: 'primary', class: 'text-primary underline underline-offset-2' },\n { variant: 'textUnderline', color: 'secondary', class: 'text-neutral underline underline-offset-2' },\n { variant: 'textUnderline', color: 'danger', class: 'text-error underline underline-offset-2' },\n { variant: 'textUnderline', color: 'warning', class: 'text-warning underline underline-offset-2' },\n { variant: 'textUnderline', color: 'success', class: 'text-success underline underline-offset-2' },\n { variant: 'textUnderline', color: 'accent', class: 'text-accent underline underline-offset-2' },\n { variant: 'textUnderline', color: 'gray', class: 'text-base-content/70 underline underline-offset-2' },\n // Text Underline — hover\n { variant: 'textUnderline', color: 'primary', hover: true, class: 'hover:bg-primary/10' },\n { variant: 'textUnderline', color: 'secondary', hover: true, class: 'hover:bg-neutral/10' },\n { variant: 'textUnderline', color: 'danger', hover: true, class: 'hover:bg-error/10' },\n { variant: 'textUnderline', color: 'warning', hover: true, class: 'hover:bg-warning/10' },\n { variant: 'textUnderline', color: 'success', hover: true, class: 'hover:bg-success/10' },\n { variant: 'textUnderline', color: 'accent', hover: true, class: 'hover:bg-accent/10' },\n { variant: 'textUnderline', color: 'gray', hover: true, class: 'hover:bg-base-content/10' },\n ],\n\n defaultVariants: {\n size: 'md',\n variant: 'fill',\n color: 'primary',\n borderRadius: 'lg',\n disabled: false,\n loading: false,\n wrap: false,\n hover: true,\n },\n});\n\nexport type MnButtonVariants = VariantProps<typeof mnButtonVariants>;\n","import {Component, HostBinding, Input} from '@angular/core';\nimport {MnButtonTypes} from './mn-buttonTypes';\nimport {mnButtonVariants} from './mn-buttonVariants';\n\n@Component({\n selector: 'button[mnButton], a[mnButton]',\n standalone: true,\n templateUrl: './mn-button.html',\n})\nexport class MnButton {\n @Input() data: Partial<MnButtonTypes> = {};\n\n // A loading button is treated as non-interactive: it blocks clicks and is unfocusable,\n // Bind the computed classes to the host element\n @HostBinding('class')\n get hostClasses(): string {\n return mnButtonVariants({\n size: this.data.size,\n variant: this.data.variant,\n color: this.data.color,\n borderRadius: this.data.borderRadius,\n disabled: this.data.disabled,\n loading: this.data.loading,\n wrap: this.data.wrap,\n hover: this.data.hover,\n });\n }\n\n // Signals assistive tech that the control is busy while a loading action runs.\n @HostBinding('attr.aria-busy')\n get ariaBusy() {\n return this.data.loading ? 'true' : null;\n }\n // For accessibility (works for both <button> and <a>)\n @HostBinding('attr.aria-disabled')\n get ariaDisabled() {\n return this.data.disabled ? 'true' : null;\n }\n\n // Only meaningful for <button>. For <a> it does nothing semantically.\n @HostBinding('attr.disabled')\n get disabledAttr() {\n return this.isBlocked ? '' : null;\n }\n\n // Make disabled/loading anchors unfocusable + prevent activation\n @HostBinding('attr.tabindex')\n get tabIndex() {\n return this.isBlocked ? '-1' : null;\n }\n\n // so an in-flight action cannot be triggered a second time.\n private get isBlocked(): boolean {\n return !!(this.data.disabled || this.data.loading);\n }\n\n}\n","@if (data.loading) {\n <span\n aria-hidden=\"true\"\n class=\"inline-block h-4 w-4 shrink-0 mr-2 animate-spin rounded-full border-2 border-current border-r-transparent\"\n ></span>\n}\n<ng-content></ng-content>\n","\nimport {Component, Input, TemplateRef, ChangeDetectionStrategy, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable } from 'rxjs';\nimport {MnAlertStore} from '../mn-alert.store';\nimport {MnAlert} from '../mn-alert.types';\nimport {mnAlertVariants} from '../mn-alertVariants';\nimport {MnButton} from '../../mn-button/mn-button';\n\nexport type MnAlertTemplateContext = {\n $implicit: MnAlert;\n alert: MnAlert;\n dismiss: () => void;\n}\n\n@Component({\n selector: 'mn-alert-outlet',\n standalone: true,\n imports: [CommonModule, MnButton],\n templateUrl: './mn-alert-outlet.html',\n styleUrl: './mn-alert-outlet.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnAlertOutletComponent {\n @Input() template?: TemplateRef<MnAlertTemplateContext>;\n\n private store = inject(MnAlertStore);\n alerts$: Observable<MnAlert[]> = this.store.alerts$;\n\n constructor() {}\n\n dismissAlert(id: string) {\n this.store.dismiss(id);\n }\n\n trackById = (_: number, a: MnAlert) => a.id;\n\n getAlertClasses(a: MnAlert) {\n return mnAlertVariants({ kind: a.kind, variant: a.variant });\n }\n\n contextFor(a: MnAlert) {\n return {\n $implicit: a,\n alert: a,\n dismiss: () => this.dismissAlert(a.id)\n } as const;\n }\n\n}\n","@if (alerts$ | async; as alerts) {\n <div class=\"fixed top-4 left-0 right-0 z-[9999] flex flex-col gap-3 w-full px-2 sm:px-0 sm:left-auto sm:right-4 sm:max-w-sm\">\n @for (a of alerts; track trackById($index, a)) {\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"contextFor(a)\">\n </ng-container>\n } @else {\n <div [class]=\"getAlertClasses(a)\" [class.extra]=\"a.cssClass\" class=\"relative\">\n <div class=\"flex-1 min-w-0 pr-8\">\n <h4 class=\"font-semibold text-sm\">{{ a.title }}</h4>\n @if (a.subTitle) {\n <p class=\"text-sm mt-1 opacity-90 leading-tight\">{{ a.subTitle }}</p>\n }\n </div>\n <button\n mnButton\n [data]=\"{ size: 'md', variant: 'text' }\"\n (click)=\"dismissAlert(a.id)\"\n class=\"absolute top-2 right-2 shrink-0 !text-current hover:!bg-current/10\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n }\n }\n </div>\n}\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnBadgeVariants = tv({\n base: 'inline-flex items-center rounded-md border font-semibold',\n variants: {\n size: {\n sm: 'px-1.5 py-0.5 text-xs',\n md: 'px-2 py-0.5 text-sm',\n lg: 'px-2.5 py-1 text-base',\n xl: 'px-3 py-1.5 text-lg',\n },\n\n variant: {\n default: '',\n fill: '',\n },\n\n wrap: {\n true: 'whitespace-normal',\n false: 'whitespace-nowrap',\n },\n\n color: {\n primary: '',\n secondary: '',\n danger: '',\n warning: '',\n success: '',\n accent: '',\n lightgray: '',\n },\n },\n\n compoundVariants: [\n // Default (light/transparent)\n { variant: 'default', color: 'primary', class: 'bg-primary/20 border-primary text-primary' },\n { variant: 'default', color: 'secondary', class: 'bg-neutral/20 border-neutral text-neutral' },\n { variant: 'default', color: 'danger', class: 'bg-error/20 border-error text-error' },\n { variant: 'default', color: 'warning', class: 'bg-warning/20 border-warning text-warning' },\n { variant: 'default', color: 'success', class: 'bg-success/20 border-success text-success' },\n { variant: 'default', color: 'accent', class: 'bg-accent/20 border-accent text-accent' },\n { variant: 'default', color: 'lightgray', class: 'bg-base-content/10 border-base-content/70 text-base-content/70' },\n // Fill (solid)\n { variant: 'fill', color: 'primary', class: 'bg-primary border-primary text-primary-content' },\n { variant: 'fill', color: 'secondary', class: 'bg-neutral border-neutral text-neutral-content' },\n { variant: 'fill', color: 'danger', class: 'bg-error border-error text-error-content' },\n { variant: 'fill', color: 'warning', class: 'bg-warning border-warning text-warning-content' },\n { variant: 'fill', color: 'success', class: 'bg-success border-success text-success-content' },\n { variant: 'fill', color: 'accent', class: 'bg-accent border-accent text-accent-content' },\n { variant: 'fill', color: 'lightgray', class: 'bg-base-content/70 border-base-content/70 text-base-100' },\n ],\n\n defaultVariants: {\n size: 'md',\n variant: 'default',\n color: 'primary',\n wrap: false,\n },\n});\n\nexport type MnBadgeVariants = VariantProps<typeof mnBadgeVariants>;\n","import { Component, HostBinding, Input } from '@angular/core';\nimport { MnBadgeTypes } from './mn-badgeTypes';\nimport { mnBadgeVariants } from './mn-badgeVariants';\n\n@Component({\n selector: 'span[mnBadge]',\n standalone: true,\n templateUrl: './mn-badge.html',\n})\nexport class MnBadge {\n @Input() data: Partial<MnBadgeTypes> = {};\n\n @HostBinding('class')\n get hostClasses(): string {\n return mnBadgeVariants({\n size: this.data.size,\n variant: this.data.variant,\n color: this.data.color,\n wrap: this.data.wrap,\n });\n }\n}\n","<ng-content></ng-content>\n","/**\n * MnInputField Adapters\n *\n * This module implements the Adapter Pattern to handle type-specific behavior\n * for different HTML input types in the MnInputField component.\n *\n * The adapter pattern allows the component to support multiple input types\n * (text, number, date, time, etc.) without coupling the component logic to\n * type-specific implementations. Each adapter handles:\n * - Parsing: converting raw string input to the appropriate data type\n * - Formatting: converting typed values back to string for display\n * - Attributes: providing type-specific DOM attributes (min, max, step, inputmode)\n * - Validation: implementing type-specific validation rules\n *\n * This approach keeps the component code clean and makes it easy to add\n * support for new input types by creating new adapters.\n */\n\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\nimport { MnInputDateTimeProps, MnInputProps, MnInputType } from './mn-input-fieldTypes';\n\n/**\n * DOM attributes that can be dynamically set on input elements.\n * These attributes are type-specific and provided by adapters.\n */\nexport type MnDomAttrs = {\n /** Minimum value for date/time/number inputs */\n min?: string | null;\n /** Maximum value for date/time/number inputs */\n max?: string | null;\n /** Step increment for number/date/time inputs */\n step?: string | null;\n /** Mobile keyboard hint (e.g., 'decimal' for number inputs) */\n inputmode?: string | null;\n};\n\n/**\n * Adapter interface for handling input type-specific behavior.\n *\n * Each adapter implementation defines how to handle a specific input type\n * (or group of related types) throughout the component lifecycle.\n *\n * @template TOut - The output type after parsing (e.g., string | null, number | null)\n */\nexport type MnInputAdapter<TOut = string | null> = {\n /**\n * Parses the raw string value from the input element into the typed value\n * that will be sent to the FormControl.\n *\n * @param raw - Raw string value from the input element\n * @returns Typed value to store in the FormControl\n *\n * @example\n * // Text adapter\n * parse('hello') // => 'hello'\n * parse('') // => null\n *\n * // Number adapter\n * parse('42') // => 42\n * parse('') // => null\n * parse('abc') // => null\n */\n parse(raw: string): TOut;\n\n /**\n * Formats the typed value from the FormControl into a string\n * that will be displayed in the input element.\n *\n * @param val - Typed value from the FormControl\n * @returns String representation for the input element's value attribute\n *\n * @example\n * // Text adapter\n * format('hello') // => 'hello'\n * format(null) // => ''\n *\n * // Number adapter\n * format(42) // => '42'\n * format(null) // => ''\n */\n format(val: unknown): string;\n\n /**\n * Returns type-specific DOM attributes for the input element.\n * These attributes are applied dynamically based on the input type and props.\n *\n * @param props - Input field properties\n * @returns Object containing DOM attributes (min, max, step, inputmode)\n *\n * @example\n * // Date adapter with date range\n * attrs({ startDate: '2024-01-01', endDate: '2024-12-31' })\n * // => { min: '2024-01-01', max: '2024-12-31' }\n *\n * // Number adapter\n * attrs({}) // => { inputmode: 'decimal' }\n */\n attrs(props: MnInputProps): MnDomAttrs;\n\n /**\n * Performs type-specific validation on the current input value.\n * This validation runs in addition to Angular's built-in validators.\n *\n * @param props - Input field properties (may contain validation constraints)\n * @param control - The AbstractControl being validated\n * @param currentRaw - Current raw string value from the input element\n * @returns ValidationErrors object if invalid, null if valid\n *\n * @example\n * // Date adapter validation\n * validate(props, control, '2024-06-15')\n * // Returns { mnMin: { min: '2024-07-01', actual: '2024-06-15' } }\n * // if startDate is '2024-07-01'\n */\n validate(props: MnInputProps, control: AbstractControl, currentRaw: string | null): ValidationErrors | null;\n\n /**\n * Applies a mask to the raw input value.\n */\n applyMask?(value: string, mask: string): string;\n}\n\n/**\n * Utility function to convert empty strings to null.\n * This is a common pattern for optional form fields where empty input\n * should be treated as \"no value\" rather than an empty string.\n *\n * @param raw - Raw input string\n * @returns The input string if non-empty, null if empty\n *\n * @example\n * emptyToNull('hello') // => 'hello'\n * emptyToNull('') // => null\n */\nconst emptyToNull = (raw: string): string | null => (raw === '' ? null : raw);\n\n/**\n * Default adapter for text-based input types.\n * Used for: text, email, password, search, tel, url\n *\n * Behavior:\n * - Empty strings are converted to null\n * - Values are stored as strings in the FormControl\n * - No special DOM attributes\n * - No additional validation (relies on Angular's built-in validators)\n * - Supports simple masking (0 for digit, A for alpha, * for any)\n */\nexport const defaultTextAdapter: MnInputAdapter<string | null> = {\n parse: (raw) => emptyToNull(raw),\n format: (val) => (val == null ? '' : String(val)),\n attrs: () => ({}),\n validate: () => null,\n applyMask: (value: string, mask: string): string => {\n if (!mask || !value) return value;\n\n let result = '';\n let maskIndex = 0;\n let dataIndex = 0;\n\n // Remove non-alphanumeric if we want to re-mask from clean data\n // But usually we just want to restrict input.\n // A simple implementation:\n while (maskIndex < mask.length && dataIndex < value.length) {\n const maskChar = mask[maskIndex];\n const dataChar = value[dataIndex];\n\n if (maskChar === '0') {\n if (/\\d/.test(dataChar)) {\n result += dataChar;\n dataIndex++;\n maskIndex++;\n } else {\n dataIndex++; // skip invalid\n }\n } else if (maskChar === 'A') {\n if (/[a-zA-Z]/.test(dataChar)) {\n result += dataChar;\n dataIndex++;\n maskIndex++;\n } else {\n dataIndex++; // skip invalid\n }\n } else if (maskChar === '*') {\n result += dataChar;\n dataIndex++;\n maskIndex++;\n } else {\n result += maskChar;\n if (dataChar === maskChar) {\n dataIndex++;\n }\n maskIndex++;\n }\n }\n\n // Auto-append static characters if next in mask\n while (maskIndex < mask.length && !/[0A*]/.test(mask[maskIndex])) {\n result += mask[maskIndex];\n maskIndex++;\n }\n\n return result;\n }\n};\n\n/**\n * Adapter for date and time input types.\n * Used for: date, time, datetime-local\n *\n * Behavior:\n * - Empty strings are converted to null\n * - Values are stored as ISO 8601 strings in the FormControl\n * - Provides min/max attributes from startDate/endDate props\n * - Validates date/time ranges using string comparison\n *\n * Note: String comparison works for ISO 8601 dates/times because they are\n * lexicographically ordered (e.g., '2024-01-15' < '2024-12-31').\n */\nexport const dateTimeAdapter: MnInputAdapter<string | null> = {\n parse: (raw) => emptyToNull(raw),\n format: (val) => (val == null ? '' : String(val)),\n attrs: (props) => ({\n min: (props as MnInputDateTimeProps).startDate ?? null,\n max: (props as MnInputDateTimeProps).endDate ?? null,\n }),\n validate: (props, _control, currentRaw) => {\n const value = currentRaw;\n if (!value) return null; // Don't validate empty values (use 'required' validator for that)\n\n const min = (props as MnInputDateTimeProps).startDate as string | undefined;\n const max = (props as MnInputDateTimeProps).endDate as string | undefined;\n\n // Validate minimum date/time constraint\n if (min && value < min) {\n return { mnMin: { min, actual: value } };\n }\n\n // Validate maximum date/time constraint\n if (max && value > max) {\n return { mnMax: { max, actual: value } };\n }\n\n return null;\n },\n};\n\n/**\n * Adapter for number input type.\n *\n * Behavior:\n * - Empty strings are converted to null\n * - Valid numbers are parsed to number type\n * - Invalid numbers (NaN, Infinity) are converted to null\n * - Values are stored as numbers (or null) in the FormControl\n * - Sets inputmode='decimal' for optimized mobile keyboards\n * - No additional validation (relies on Angular's built-in validators)\n *\n * Note: The browser's native number input validation handles\n * basic number format validation automatically.\n */\nexport const numberAdapter: MnInputAdapter<number | null> = {\n parse: (raw) => {\n if (raw === '') return null;\n const num = Number(raw);\n return Number.isFinite(num) ? num : null;\n },\n format: (val) => (val == null ? '' : String(val)),\n attrs: () => ({\n inputmode: 'decimal',\n }),\n validate: () => null,\n};\n\n/**\n * Selects the appropriate adapter based on the input type.\n * This is the main factory function used by the MnInputField component\n * to determine which adapter to use for a given input type.\n *\n * @param type - The input type (e.g., 'text', 'email', 'date', 'number')\n * @returns The appropriate adapter instance\n *\n * @example\n * pickAdapter('text') // => defaultTextAdapter\n * pickAdapter('email') // => defaultTextAdapter\n * pickAdapter('date') // => dateTimeAdapter\n * pickAdapter('number') // => numberAdapter\n */\nexport function pickAdapter(type: MnInputType): MnInputAdapter<string | null | number> {\n // Date/time inputs use the dateTimeAdapter for range validation\n if (type === 'date' || type === 'time' || type === 'datetime-local') {\n return dateTimeAdapter;\n }\n\n // Number inputs use the numberAdapter for type conversion\n if (type === 'number') {\n return numberAdapter;\n }\n\n // All other input types use the default text adapter\n return defaultTextAdapter;\n}\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnInputFieldVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 placeholder-base-content/50 text-base-content text-sm outline-none focus:ring-1 focus:ring-primary',\n variants: {\n\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n hover: {\n true: 'hover:cursor-pointer hover:bg-base-200 transition-colors duration-300 ease-in-out',\n },\n disabled: {\n true: 'opacity-50 cursor-not-allowed',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n hover: true,\n }\n});\n\nexport type MnInputVariants = VariantProps<typeof mnInputFieldVariants>;\n","import {Component, Input} from '@angular/core';\n\n@Component({\n selector: 'mn-error-message',\n imports: [],\n templateUrl: './mn-error-message.html',\n})\nexport class MnErrorMessage {\n @Input({ required: true }) errorMessage! :string;\n @Input({ required: true }) id!: string;\n}\n","<div [id]=\"id + '-error'\" class=\"text-red-500 mt-2 text-sm\">\n {{ errorMessage }}\n</div>\n","/**\n * Types for mn-lib configuration.\n */\n\nexport type MnConfigSettings = {\n /** Application or library version. */\n version?: string;\n /** Application or library name. */\n name?: string;\n}\n\nexport type MnConfigFile = {\n /**\n * General settings such as version and name.\n */\n settings?: MnConfigSettings;\n /**\n * Base defaults by component name. Each value is a plain object with inputs/options for that component.\n */\n defaults: Record<string, unknown>;\n /**\n * Nested object tree keyed by section names. Leaf nodes may contain\n * component-name keys (component override objects) and keys starting with '#'\n * representing instance-id overrides.\n */\n overrides: Record<string, unknown>;\n}\n","/**\n * A marker object used in config values to indicate that the value\n * should be resolved via the MnLanguageService.\n *\n * Example in mn-config.json5:\n * label: { $translate: \"form.email.label\" }\n */\nexport type MnTranslatable = {\n $translate: string;\n params?: Record<string, string | number>;\n}\n\n/**\n * A config value that is either a plain value or a translatable marker.\n */\nexport type MnConfigValue<T = string> = T | MnTranslatable;\n\n/**\n * A flat key-value map of translations for a single locale.\n * Supports nested keys via dot notation: \"form.email.label\"\n */\nexport type MnTranslationMap = Record<string, string>;\n\n/**\n * All loaded translations keyed by locale code (e.g. \"en\", \"nl\", \"de\").\n */\nexport type MnTranslations = Record<string, MnTranslationMap>;\n\n/**\n * Configuration for the language provider.\n */\nexport type MnLanguageConfig = {\n /** URL pattern for loading translation files. Use `{locale}` as placeholder. e.g. \"assets/i18n/{locale}.json\" */\n urlPattern: string;\n /** The default/fallback locale. */\n defaultLocale: string;\n /** Locales to preload at bootstrap. */\n preload?: string[];\n /**\n * Optional mapping of domain hostnames to locale codes.\n * When set, the service will use the current domain to determine the initial locale.\n * Example: { \"example.nl\": \"nl\", \"example.de\": \"de\", \"example.com\": \"en\" }\n */\n domainLocaleMap?: Record<string, string>;\n /** Whether to enable debug logging. */\n debug?: boolean;\n}\n\n/**\n * Type guard: checks whether a value is a translatable marker object.\n */\nexport function isTranslatable(value: unknown): value is MnTranslatable {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Record<string, unknown>)['$translate'] === 'string'\n );\n}\n","import {Injectable, inject, ApplicationRef} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, firstValueFrom, Observable } from 'rxjs';\nimport { MnTranslationMap, MnTranslations } from './mn-language.types';\n\n@Injectable({ providedIn: 'root' })\nexport class MnLanguageService {\n private readonly http = inject(HttpClient);\n private readonly appRef = inject(ApplicationRef);\n\n private _translations: MnTranslations = {};\n private _locale$ = new BehaviorSubject<string>('en');\n private _urlPattern: string | null = null;\n private _debug = false;\n\n /** Observable of the current active locale. */\n readonly locale$: Observable<string> = this._locale$.asObservable();\n\n /** Current active locale. */\n get locale(): string {\n return this._locale$.value;\n }\n\n /**\n * Enable or disable debug logging.\n */\n setDebug(enabled: boolean): void {\n this._debug = enabled;\n if (enabled) {\n console.log(`[MnLanguage] Debug mode enabled`);\n }\n }\n\n /**\n * Configure the URL pattern used to fetch translation files.\n * Use `{locale}` as placeholder, e.g. `\"assets/i18n/{locale}.json\"`.\n */\n configure(urlPattern: string): void {\n if (this._debug) {\n console.log(`[MnLanguage] Configured urlPattern: ${urlPattern}`);\n }\n this._urlPattern = urlPattern;\n }\n\n /**\n * Load translations for a locale from the configured URL pattern.\n * If translations are already loaded for this locale, this is a no-op.\n */\n async loadLocale(locale: string): Promise<void> {\n if (this._translations[locale]) return;\n\n if (!this._urlPattern) {\n console.warn(`[MnLanguage] No URL pattern configured. Call configure() or use provideMnLanguage().`);\n return;\n }\n\n const url = this._urlPattern.replace('{locale}', locale);\n if (this._debug) {\n console.log(`[MnLanguage] Loading locale \"${locale}\" from ${url}`);\n }\n\n try {\n const map = await firstValueFrom(\n this.http.get<MnTranslationMap>(url)\n );\n this._translations[locale] = map ?? {};\n if (this._debug) {\n console.log(`[MnLanguage] Loaded locale \"${locale}\"`, this._translations[locale]);\n }\n } catch (err) {\n console.warn(`[MnLanguage] Failed to load translations from ${url}`, err);\n this._translations[locale] = {};\n }\n }\n\n /**\n * Switch the active locale. Loads translations if not yet loaded.\n */\n async setLocale(locale: string): Promise<void> {\n if (this._debug) {\n console.log(`[MnLanguage] Setting locale to \"${locale}\"`);\n }\n await this.loadLocale(locale);\n this._locale$.next(locale);\n this.appRef.tick();\n }\n\n /**\n * Register translations for a locale directly from code (no HTTP needed).\n */\n registerTranslations(locale: string, translations: MnTranslationMap): void {\n this._translations[locale] = {\n ...(this._translations[locale] ?? {}),\n ...translations,\n };\n }\n\n /**\n * Translate a key using the current locale, with optional parameter interpolation.\n * Falls back to the key itself if no translation is found.\n *\n * Interpolation replaces `{{paramName}}` with the provided value.\n */\n translate(key: string, params?: Record<string, string | number>): string {\n const map = this._translations[this.locale] ?? {};\n let value = this.getValueFromMap(map, key);\n\n if (value === undefined) {\n if (this._debug) {\n console.warn(`[MnLanguage] Missing translation for key: \"${key}\" in locale: \"${this.locale}\"`);\n }\n return key;\n }\n\n if (params) {\n for (const [paramKey, paramValue] of Object.entries(params)) {\n value = value.replace(new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'), String(paramValue));\n }\n }\n\n return value;\n }\n\n /**\n * Helper to retrieve a value from a potentially nested translation map using a dot-notated key.\n */\n private getValueFromMap(map: MnTranslationMap, key: string): string | undefined {\n if (map[key] !== undefined) return map[key];\n\n const parts = key.split('.');\n let current: MnTranslationMap | string | undefined = map;\n\n for (const part of parts) {\n if (current === null || typeof current !== 'object') return undefined;\n current = (current as MnTranslationMap)[part];\n }\n\n return typeof current === 'string' ? current : undefined;\n }\n\n /**\n * Shorthand alias for `translate`.\n */\n t(key: string, params?: Record<string, string | number>): string {\n return this.translate(key, params);\n }\n\n /**\n * Resolve the effective default locale from a domain-to-locale map.\n * Matches `window.location.hostname` against the map keys.\n * Returns the mapped locale, or the provided fallback if no match is found.\n */\n resolveLocaleForDomain(domainLocaleMap: Record<string, string> | undefined, fallback: string): string {\n if (!domainLocaleMap || typeof window === 'undefined') return fallback;\n const hostname = window.location.hostname;\n return domainLocaleMap[hostname] ?? fallback;\n }\n}\n","import { APP_INITIALIZER, Provider } from '@angular/core';\nimport { MnLanguageService } from './mn-language.service';\nimport { MnLanguageConfig } from './mn-language.types';\n\n/**\n * Provides an APP_INITIALIZER that configures the MnLanguageService and\n * preloads the requested locales during application bootstrap.\n *\n * Usage in app.config.ts:\n * ...provideMnLanguage({\n * urlPattern: 'assets/i18n/{locale}.json',\n * defaultLocale: 'en',\n * preload: ['en', 'nl'],\n * })\n */\nexport function provideMnLanguage(config: MnLanguageConfig): Provider[] {\n return [\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (svc: MnLanguageService) => async () => {\n if (config.debug) {\n svc.setDebug(true);\n }\n svc.configure(config.urlPattern);\n\n const effectiveLocale = svc.resolveLocaleForDomain(config.domainLocaleMap, config.defaultLocale);\n const localesToLoad = config.preload ?? [effectiveLocale];\n await Promise.all(localesToLoad.map(l => svc.loadLocale(l)));\n await svc.setLocale(effectiveLocale);\n },\n deps: [MnLanguageService],\n },\n ];\n}\n","import {Pipe, PipeTransform, inject} from '@angular/core';\nimport { MnLanguageService } from './mn-language.service';\n\n/**\n * Pipe that translates a key via MnLanguageService.\n *\n * Usage in templates:\n * {{ 'form.email.label' | mnTranslate }}\n * {{ 'greeting' | mnTranslate:{ name: 'World' } }}\n *\n * Note: This pipe is impure so it re-evaluates when the locale changes.\n */\n@Pipe({\n name: 'mnTranslate',\n standalone: true,\n pure: false,\n})\nexport class MnTranslatePipe implements PipeTransform {\n private readonly lang = inject(MnLanguageService);\n\n\n transform(key: string, params?: Record<string, string | number>): string {\n return this.lang.translate(key, params);\n }\n}\n","import {inject, Injectable, signal} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\nimport {MnConfigFile, MnConfigSettings} from './mn-config.types';\nimport {isTranslatable, MnLanguageConfig, MnLanguageService} from '../language';\nimport JSON5 from 'json5';\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MnConfigService {\n private readonly http = inject(HttpClient);\n\n private _config: MnConfigFile | null = null;\n private _settings: MnConfigSettings = {};\n private _debugMode = false;\n\n /** Reactive version counter — incremented on every config load. */\n private _configVersion = signal(0);\n readonly configVersion = this._configVersion.asReadonly();\n\n private readonly lang = inject(MnLanguageService);\n\n /** General settings from the config file (version, name, etc.). */\n get settings(): Readonly<MnConfigSettings> {\n return this._settings;\n }\n\n /**\n * Load the configuration JSON from the provided URL and cache it in memory.\n * Consumers should typically call this via the APP_INITIALIZER helper.\n */\n async load(url: string, debugMode = false): Promise<void> {\n this._debugMode = debugMode;\n this.lang.setDebug(debugMode);\n let text: string;\n\n try {\n text = await firstValueFrom(\n this.http.get(url, { responseType: 'text' })\n );\n } catch (err) {\n console.warn(`[MnConfig] Failed to load config from ${url}`, err);\n this._config = { defaults: {}, overrides: {} };\n return;\n }\n\n let json: unknown;\n\n try {\n json = JSON5.parse(text);\n } catch (err) {\n console.warn(`[MnConfig] Failed to parse JSON5 from ${url}`, err, text);\n json = {};\n }\n\n const cfg = (isPlainObject(json) ? json : {}) as Record<string, unknown>;\n const defaults = isPlainObject(cfg['defaults']) ? cfg['defaults'] : {};\n const overrides: Record<string, unknown> = isPlainObject(cfg['overrides']) ? cfg['overrides'] : {};\n\n const settings: MnConfigSettings = isPlainObject(cfg['settings']) ? cfg['settings'] as MnConfigSettings : {};\n\n this._config = { settings, defaults, overrides };\n this._settings = settings;\n\n // Bootstrap language service from config if a \"language\" section is present.\n // This avoids circular dependency: config reads raw language settings and\n // pushes them into the language service (language service never imports config).\n const langCfg = cfg['language'];\n if (isPlainObject(langCfg) && typeof langCfg['urlPattern'] === 'string') {\n const lc = langCfg as MnLanguageConfig;\n if (this._debugMode) {\n console.log(`[MnConfig] Applying language config from file`, lc);\n }\n this.lang.configure(lc.urlPattern);\n const effectiveLocale = this.lang.resolveLocaleForDomain(lc.domainLocaleMap, lc.defaultLocale);\n const localesToLoad = Array.from(new Set([...(lc.preload ?? []), effectiveLocale]));\n await Promise.all(localesToLoad.map(l => this.lang.loadLocale(l)));\n await this.lang.setLocale(effectiveLocale);\n }\n\n this._configVersion.update(v => v + 1);\n }\n\n /**\n * Load configuration from a pre-parsed object (no HTTP fetch).\n * Used for live preview scenarios where config is pushed via postMessage.\n * Optionally re-bootstraps the language service if a `language` section is present.\n */\n async loadFromObject(config: Record<string, unknown>, bootstrapLanguage = false): Promise<void> {\n const defaults = isPlainObject(config['defaults']) ? config['defaults'] : {};\n const overrides = isPlainObject(config['overrides']) ? config['overrides'] : {};\n const settings: MnConfigSettings = isPlainObject(config['settings']) ? config['settings'] as MnConfigSettings : {};\n\n this._config = { settings, defaults, overrides };\n this._settings = settings;\n\n if (bootstrapLanguage) {\n const langCfg = config['language'];\n if (isPlainObject(langCfg) && typeof langCfg['urlPattern'] === 'string') {\n const lc = langCfg as MnLanguageConfig;\n if (this._debugMode) {\n console.log(`[MnConfig] Applying language config from object`, lc);\n }\n this.lang.configure(lc.urlPattern);\n const effectiveLocale = this.lang.resolveLocaleForDomain(lc.domainLocaleMap, lc.defaultLocale);\n const localesToLoad = Array.from(new Set([...(lc.preload ?? []), effectiveLocale]));\n await Promise.all(localesToLoad.map(l => this.lang.loadLocale(l)));\n await this.lang.setLocale(effectiveLocale);\n }\n }\n\n this._configVersion.update(v => v + 1);\n }\n\n\n /**\n * Resolve a configuration object for a component, optionally scoped to a section path\n * and optionally overridden by an instance id.\n */\n resolve<T extends object = Record<string, unknown>>(\n componentName: string,\n sectionPath: string[] = [],\n instanceId?: string,\n ): T {\n const baseConfig: Record<string, unknown> = isPlainObject(this._config?.defaults)\n ? (isPlainObject((this._config as MnConfigFile).defaults[componentName])\n ? { ...(this._config as MnConfigFile).defaults[componentName] as Record<string, unknown> }\n : {})\n : {};\n\n const leaf = this.walkOverrides(this._config?.overrides ?? {}, sectionPath);\n\n let resolved: Record<string, unknown> = baseConfig;\n\n if (leaf && isPlainObject((leaf as Record<string, unknown>)[componentName])) {\n resolved = this.deepMerge(resolved, (leaf as Record<string, unknown>)[componentName] as Record<string, unknown>);\n }\n\n if (instanceId) {\n const instKey = `#${instanceId}`;\n if (leaf && isPlainObject((leaf as Record<string, unknown>)[instKey])) {\n resolved = this.deepMerge(resolved, (leaf as Record<string, unknown>)[instKey] as Record<string, unknown>);\n }\n }\n\n if (this._debugMode) {\n console.debug(`[MnConfig] Resolving for ${componentName}`, {\n sectionPath,\n instanceId,\n resolved,\n });\n }\n\n return this.resolveTranslatables(resolved) as T;\n }\n\n /**\n * Walk the overrides nested object using the provided section path and return the leaf node.\n * If any segment is missing or the current node is not a plain object, returns undefined.\n */\n walkOverrides(overridesRoot: unknown, sectionPath: string[]): unknown | undefined {\n let node: unknown = overridesRoot;\n for (const segment of sectionPath) {\n if (!isPlainObject(node)) return undefined;\n node = (node as Record<string, unknown>)[segment];\n if (node === undefined) return undefined;\n }\n return node;\n }\n\n /**\n * Recursively walk a resolved config object and replace any `{ $translate: \"key\" }` markers\n * with their translated values from MnLanguageService.\n */\n private resolveTranslatables(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (isTranslatable(value)) {\n out[key] = this.lang.translate(value.$translate, value.params);\n } else if (Array.isArray(value)) {\n out[key] = value.map(item => {\n if (isTranslatable(item)) {\n return this.lang.translate(item.$translate, item.params);\n } else if (isPlainObject(item)) {\n return this.resolveTranslatables(item as Record<string, unknown>);\n }\n return item;\n });\n } else if (isPlainObject(value)) {\n out[key] = this.resolveTranslatables(value as Record<string, unknown>);\n } else {\n out[key] = value;\n }\n }\n return out;\n }\n\n /**\n * Deep merge two plain-object trees. Arrays and non-plain values are replaced by the patch.\n * Does not mutate inputs; returns a new object.\n */\n deepMerge<A extends Record<string, unknown>, B extends Record<string, unknown>>(base: A, patch: B): A & B {\n const out: Record<string, unknown> = {...base};\n for (const key of Object.keys(patch)) {\n const bVal = base[key];\n const pVal = patch[key];\n\n if (isPlainObject(bVal) && isPlainObject(pVal)) {\n out[key] = this.deepMerge(bVal, pVal);\n } else {\n // replace for arrays, primitives, null, undefined, and non-plain objects\n out[key] = pVal;\n }\n }\n return out as A & B;\n }\n}\n","import { APP_INITIALIZER, Provider } from '@angular/core';\nimport { MnConfigService } from './mn-config.service';\n\n/**\n * Provides an APP_INITIALIZER that loads the mn-lib configuration from the given URL\n * during application bootstrap. The consuming application is responsible for providing\n * HttpClient (e.g., via HttpClientModule or provideHttpClient()).\n */\nexport function provideMnConfig(url: string, debugMode = false): Provider[] {\n return [\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (svc: MnConfigService) => () => svc.load(url, debugMode),\n deps: [MnConfigService],\n },\n ];\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Represents the current section path based on nested mn-section directives.\n */\nexport const MN_SECTION_PATH = new InjectionToken<string[]>(\n 'MN_SECTION_PATH',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n/**\n * Represents the current component instance id provided by [mn-instance].\n */\nexport const MN_INSTANCE_ID = new InjectionToken<string | null>(\n 'MN_INSTANCE_ID',\n {\n providedIn: 'root',\n factory: () => null,\n },\n);\n","import { DestroyRef, InjectionToken, Optional, Provider } from '@angular/core';\nimport { MN_INSTANCE_ID, MN_SECTION_PATH } from '../context/mn-context.tokens';\nimport { MnConfigService } from './mn-config.service';\nimport { MnLanguageService } from '../language/mn-language.service';\n\n/**\n * Helper to provide a resolved, typed component config via DI.\n *\n * Usage in a component/module providers:\n * const MY_CFG = new InjectionToken<MyCfg>('MY_CFG');\n * providers: [ provideMnComponentConfig(MY_CFG, 'my-component') ]\n * Then in the component:\n * readonly cfg = inject(MY_CFG)\n *\n * The returned config object is **reactive**: when the active locale changes,\n * all translatable values are re-resolved in place so that templates using\n * `cfg.someLabel` automatically reflect the new language on the next change-detection cycle.\n */\nexport function provideMnComponentConfig<T extends object>(\n token: InjectionToken<T>,\n componentName: string,\n initial?: Partial<T>,\n): Provider {\n return {\n provide: token,\n deps: [\n MnConfigService,\n MnLanguageService,\n DestroyRef,\n [new Optional(), MN_SECTION_PATH],\n [new Optional(), MN_INSTANCE_ID],\n ],\n useFactory: (\n svc: MnConfigService,\n lang: MnLanguageService,\n destroyRef: DestroyRef,\n sectionPath: string[] | null,\n instanceId: string | null,\n ): T => {\n const resolveConfig = (): T => {\n const resolved = svc.resolve<T>(componentName, sectionPath ?? [], instanceId ?? undefined);\n return Object.assign({}, initial ?? {}, resolved);\n };\n\n // Create the initial config object that will be shared by reference.\n const cfg = resolveConfig();\n\n // Re-resolve translatable values whenever the locale changes.\n // skip(1) because the current locale was already used for the initial resolve.\n const sub = lang.locale$.subscribe(() => {\n const updated = resolveConfig();\n // Mutate the existing object in place so all template bindings pick up the new values.\n for (const key of Object.keys(updated)) {\n (cfg as Record<string, unknown>)[key] = (updated as Record<string, unknown>)[key];\n }\n });\n\n destroyRef.onDestroy(() => sub.unsubscribe());\n\n return cfg;\n },\n };\n}\n","import { Attribute, Directive, Input, Optional, SkipSelf } from '@angular/core';\nimport { MN_SECTION_PATH } from './mn-context.tokens';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- kebab-case is intentional: matches the Attribute() token and is stable public API\n selector: '[mn-section]',\n standalone: true,\n providers: [\n {\n provide: MN_SECTION_PATH,\n // Read parent MN_SECTION_PATH from ancestor injector (skipSelf to avoid self-reference),\n // and read the attribute value using Attribute so it's available at provider creation time.\n deps: [[new Optional(), new SkipSelf(), MN_SECTION_PATH], new Attribute('mn-section')],\n useFactory: (parentPath: string[] | null, attr: string | null) => {\n const parent = Array.isArray(parentPath) ? parentPath : [];\n const name = (attr ?? '').trim();\n return name ? [...parent, name] : [...parent];\n },\n },\n ],\n})\nexport class MnSectionDirective {\n /** Section name contributed by this DOM node to the section path */\n @Input('mn-section') mnSection: string | undefined;\n}\n","import { Attribute, Directive, Input } from '@angular/core';\nimport { MN_INSTANCE_ID } from './mn-context.tokens';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- kebab-case is intentional: matches the Attribute() token and is stable public API\n selector: '[mn-instance]',\n standalone: true,\n providers: [\n {\n provide: MN_INSTANCE_ID,\n // Read the attribute at provider creation time using Attribute token; Inputs may not be set yet.\n deps: [new Attribute('mn-instance')],\n useFactory: (attr: string | null) => (attr ?? '').trim() || null,\n },\n ],\n})\nexport class MnInstanceDirective {\n /** Instance id for targeting per-component instance overrides */\n @Input('mn-instance') mnInstance: string | undefined;\n}\n","import {Component, DestroyRef, ElementRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {CommonModule, NgClass} from '@angular/common';\nimport {MnErrorMessageData, MnInputFieldUIConfig, MnInputProps} from './mn-input-fieldTypes';\nimport {AbstractControl, FormsModule, NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {pickAdapter} from './mn-input-field-adapters';\nimport {mnInputFieldVariants} from './mn-input-fieldVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_INPUT_FIELD_CONFIG = new InjectionToken<MnInputFieldUIConfig>('MN_INPUT_FIELD_CONFIG');\n\n/**\n * MnInputField Component\n *\n * A flexible, accessible input field component that implements Angular's ControlValueAccessor\n * and Validator interfaces. Supports multiple input types, custom validation messages,\n * and configurable error display (single or multiple errors).\n *\n * Features:\n * - Works with Angular Reactive Forms (FormControl, FormGroup)\n * - Supports standard and date/time input types\n * - Built-in error messages with internationalization support\n * - Custom error messages per field\n * - Priority-based error display or show all errors\n * - Full accessibility (ARIA attributes)\n * - Type-safe adapter pattern for different input types\n *\n * @example\n * ```typescript\n * <mn-input-field\n * formControlName=\"email\"\n * [props]=\"{\n * id: 'email',\n * type: 'email',\n * label: 'Email Address',\n * size: 'md',\n * borderRadius: 'md',\n * errorMessages: { required: 'Email is required' }\n * }\"\n * ></mn-input-field>\n * ```\n */\n@Component({\n selector: 'mn-lib-input-field',\n standalone: true,\n imports: [CommonModule, NgClass, MnErrorMessage, FormsModule],\n templateUrl: './mn-input-field.html',\n host: {\n // Native inputs (notably `type=\"date\"`) have a platform-specific intrinsic width.\n // Without an explicit host width the inline host collapses to that intrinsic size,\n // so the input's `w-full` (width:100%) resolves against a content-sized box and\n // fails to fill the parent on real mobile devices (desktop devtools hides this\n // because it still renders the control with the desktop engine). Give the host a\n // real width when fullWidth is requested so 100% has something to fill.\n '[style.display]': \"props?.fullWidth ? 'block' : null\",\n '[style.width]': \"props?.fullWidth ? '100%' : null\",\n },\n})\nexport class MnInputField implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n /** Resolved UI configuration for the input field */\n protected uiConfig: MnInputFieldUIConfig = {};\n\n private readonly el = inject(ElementRef);\n\n /** Configuration properties for the input field */\n @Input({ required: true }) props!: MnInputProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Current raw string value of the input element */\n value: string | null = null;\n\n /** Whether the input is disabled */\n isDisabled = false;\n\n /** Callback function to notify Angular forms of value changes */\n private onChange: (val: unknown) => void = () => {\n };\n\n /** Callback function to notify Angular forms when input is touched/blurred */\n private onTouched: () => void = () => {};\n\n /**\n * Built-in default error messages in English.\n * These are used when useBuiltInErrorMessages is true (default).\n * Can be overridden per-field using props.errorMessages.\n */\n private readonly builtInErrorMessages: Record<string, MnErrorMessageData> = {\n required: 'This field is required',\n email: 'Please enter a valid email address',\n minlength: (args) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args) => `Maximum ${args.requiredLength} characters allowed`,\n mnMin: (args) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args) => `Date/time must be up to ${args.max}`,\n };\n\n /**\n * Constructor - Registers this component as the ControlValueAccessor\n * for the injected NgControl (FormControl).\n *\n */\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n\n if (this.props.autoFocus) {\n setTimeout(() => this.focus(), 0);\n }\n }\n\n /**\n * Focuses the input element.\n */\n focus(): void {\n const input = this.el.nativeElement.querySelector('input');\n if (input) input.focus();\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-input-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnInputFieldUIConfig>(\n 'mn-input-field',\n this.sectionPath,\n instanceId\n );\n\n // Allow props to override uiConfig for label and placeholder\n if (this.props) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n /**\n * Gets the appropriate adapter based on the input type.\n * Adapters handle type-specific formatting, parsing, and validation.\n */\n private get adapter() {\n return pickAdapter(this.props.type);\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n /**\n * Writes a new value to the input element (called by Angular Forms).\n * Formats the value using the type-specific adapter.\n *\n * @param val - The value to write (type depends on input type)\n */\n writeValue(val: unknown): void {\n this.value = this.adapter.format(val);\n }\n\n /**\n * Registers a callback function to be called when the input value changes.\n *\n * @param fn - Callback function to notify Angular Forms of changes\n */\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers a callback function to be called when the input is touched/blurred.\n *\n * @param fn - Callback function to notify Angular Forms of touch events\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * Sets the disabled state of the input element.\n *\n * @param isDisabled - Whether the input should be disabled\n */\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n /**\n * Handles input events from the input element.\n * Parses the raw string value and notifies Angular Forms.\n *\n * @param raw - Raw string value from the input element\n */\n handleInput(raw: string): void {\n let finalValue = raw;\n\n // Apply mask if available\n if (this.props.mask && typeof this.adapter.applyMask === 'function') {\n finalValue = this.adapter.applyMask(raw, this.props.mask);\n\n // Force-update the DOM input when the mask stripped characters,\n // because Angular won't re-render if this.value hasn't changed.\n if (finalValue !== raw) {\n const input = this.el.nativeElement.querySelector('input');\n if (input) input.value = finalValue;\n }\n }\n\n this.value = finalValue;\n this.onChange(this.adapter.parse(finalValue));\n }\n\n /**\n * Handles blur events from the input element.\n * Notifies Angular Forms that the input has been touched.\n */\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Validator Implementation ==========\n\n /**\n * Validates the control using the type-specific adapter.\n * Called by Angular Forms during validation.\n *\n * @param control - The AbstractControl to validate\n * @returns ValidationErrors if invalid, null if valid\n */\n validate(control: AbstractControl): ValidationErrors | null {\n return this.adapter.validate(this.props, control, this.value);\n }\n\n // ========== Template Attribute Getters ==========\n\n /**\n * Gets all DOM attributes from the adapter.\n * These are input-type-specific attributes (min, max, step, inputmode).\n */\n get domAttrs() {\n return this.adapter.attrs(this.props);\n }\n\n /** Min attribute for date/time/number inputs */\n get minAttr() {\n return this.domAttrs.min ?? null;\n }\n\n /** Max attribute for date/time/number inputs */\n get maxAttr() {\n return this.domAttrs.max ?? null;\n }\n\n /** Step attribute for number/date/time inputs */\n get stepAttr() {\n return this.domAttrs.step ?? null;\n }\n\n /** Inputmode attribute for mobile keyboard optimization */\n get inputmodeAttr() {\n return this.domAttrs.inputmode ?? null;\n }\n\n // ========== Error Handling ==========\n\n /**\n * Gets the FormControl instance from Angular Forms.\n * Returns null if no control is attached.\n */\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n /**\n * Determines whether to show error messages.\n * Errors are shown when the control is invalid and has been touched or modified.\n */\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n /**\n * Picks the error key to display based on errorPriority.\n * Used when showAllErrors is false (default).\n *\n * @param errors - ValidationErrors object from the control\n * @returns The error key to display\n */\n private pickErrorKey(errors: ValidationErrors): string {\n // If priority is specified, use the first matching error from the priority list\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n // Otherwise, use the first error key\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n /**\n * Resolves a single error message for a specific error key.\n * Checks custom messages, built-in messages, and fallback in order.\n *\n * @param errorKey - The error key (e.g., 'required', 'email')\n * @param errors - All validation errors on the control\n * @returns The resolved error message string\n */\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n\n // Priority: custom (props) > config > built-in > fallback > default\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n // If the message is a function, call it with error arguments\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n // Interpolate {{placeholder}} tokens with error arguments (e.g. {{requiredLength}})\n if (errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)}}/g, (_: string, key: string) =>\n errorArgs[key] !== undefined ? String(errorArgs[key]) : `{{${key}}}`\n );\n }\n return msgDef;\n }\n\n /**\n * Gets all error messages for the current control state.\n * Returns an array of error messages (used when showAllErrors is true).\n *\n * @returns Array of error message strings\n */\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n\n const errorKeys = Object.keys(errors);\n return errorKeys.map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n /**\n * Gets a single error message for the current control state.\n * Uses errorPriority to determine which error to show (when showAllErrors is false).\n *\n * @returns Single error message string, or null if no errors\n */\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n /** Resolved ID for the input element */\n get resolvedId(): string {\n return this.props.id;\n }\n\n /** Resolved name attribute for the input element */\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n /**\n * Computes the CSS classes from tailwind-variants based on the props.\n * Returns the variant classes for styling the input element.\n */\n get inputClasses(): string {\n return mnInputFieldVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n hover: this.isDisabled ? false : this.props.hover,\n disabled: this.isDisabled,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n <!-- Label -->\n @if (uiConfig.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500 \">*</span>\n }\n </label>\n }\n\n <!-- Input Element -->\n <input\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [type]=\"props.type\"\n [attr.placeholder]=\"uiConfig.placeholder || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [attr.autocomplete]=\"props.autocomplete || null\"\n [attr.min]=\"minAttr\"\n [attr.max]=\"maxAttr\"\n [ngModel]=\"value\"\n [ngClass]=\"inputClasses\"\n (input)=\"handleInput(($any($event.target)).value)\"\n (search)=\"handleInput(($any($event.target)).value)\"\n (blur)=\"handleBlur()\"\n />\n\n <!-- Error Messages -->\n @if (showError) {\n <!-- Show all errors mode -->\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n\n }\n }\n }\n</div>\n","import {Component, inject, InjectionToken} from '@angular/core';\nimport {NgOptimizedImage} from '@angular/common';\nimport { MnDualHorizontalImageTypes } from './mn-dual-horizontal-imageTypes';\nimport {provideMnComponentConfig} from '../../config';\n\nexport type MnDualHorizontalImageConfig = {\n images?: MnDualHorizontalImageTypes[];\n noImagesFound?: string;\n}\n\nexport const MN_LIB_DUAL_HORIZONTAL_IMAGE = new InjectionToken<MnDualHorizontalImageConfig>('MN_LIB_DUAL_HORIZONTAL_IMAGE');\n\n\n@Component({\n selector: 'mn-lib-dual-horizontal-image',\n standalone: true,\n imports: [\n NgOptimizedImage\n ],\n providers: [\n provideMnComponentConfig<MnDualHorizontalImageConfig>(MN_LIB_DUAL_HORIZONTAL_IMAGE, 'mn-dual-horizontal-image'),\n ],\n templateUrl: './mn-dual-horizontal-image.html',\n host: {\n class: 'block'\n }\n})\nexport class MnDualHorizontalImage {\n protected readonly componentConfig = inject(MN_LIB_DUAL_HORIZONTAL_IMAGE);\n}\n","<div class=\"flex flex-col w-full -space-y-16 md:-space-y-24 lg:-space-y-24\">\n@for (image of componentConfig.images; track image.id) {\n <div\n class=\"relative aspect-3/2 w-[75%] md:w-[65%]\n overflow-hidden rounded-3xl shadow-md\n first:self-start last:self-end\"\n >\n <img\n [ngSrc]=\"image.url\"\n fill\n class=\"object-cover\"\n [alt]=\"image.alt\"\n />\n </div>\n } @empty {\n <p>{{ componentConfig.noImagesFound ?? 'No images found' }}</p>\n }\n</div>\n\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnInformationCardVariants = tv({\n base: '',\n variants: {\n bottomBorder: {\n true: 'border-b border-b-2 border-primary-500',\n },\n shadow: {\n true: 'shadow-xl',\n },\n textPosition: {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n },\n});\n\nexport type MnInformationCardVariants = VariantProps<typeof mnInformationCardVariants>;\n","import {Component, Input} from '@angular/core';\nimport {MnInformationCardData} from './mn-information-cardTypes';\nimport {mnInformationCardVariants} from './mn-information-cardVariants';\nimport {NgClass} from '@angular/common';\n\n@Component({\n selector: 'mn-lib-information-card',\n standalone: true,\n imports: [\n NgClass\n ],\n templateUrl: './mn-information-card.html',\n})\nexport class MnInformationCard<TExtra = unknown> {\n @Input({ required: true }) data!: MnInformationCardData<TExtra>;\n\n get hostClasses(): string {\n return mnInformationCardVariants({\n bottomBorder: this.data.bottomBorder,\n shadow: this.data.shadow,\n textPosition: this.data.textPosition,\n borderRadius: this.data.borderRadius\n });\n }\n}\n\n","<div class=\"flex flex-col items-center gap-y-4 p-4 size-full\" [ngClass]=\"hostClasses\">\n<ng-content select=\"[header]\"></ng-content>\n<ng-content></ng-content>\n<ng-content select=\"[footer]\"></ng-content>\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnTextareaVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 placeholder-base-content/50 text-base-content text-sm outline-none focus:ring-1 focus:ring-primary',\n variants: {\n\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n }\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n resize: 'vertical',\n }\n});\n\nexport type MnTextareaVariants = VariantProps<typeof mnTextareaVariants>;\n","import {Component, DestroyRef, ElementRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnTextareaErrorMessageData, MnTextareaProps, MnTextareaUIConfig} from './mn-textareaTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnTextareaVariants} from './mn-textareaVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_TEXTAREA_CONFIG = new InjectionToken<MnTextareaUIConfig>('MN_TEXTAREA_CONFIG');\n\n/**\n * MnTextarea Component\n *\n * A flexible, accessible textarea component that implements Angular's ControlValueAccessor\n * and Validator interfaces. Works similarly to MnInputField but uses a textarea element,\n * allowing users to set the height (rows), width (cols), and resize behavior.\n *\n * Features:\n * - Works with Angular Reactive Forms (FormControl, FormGroup)\n * - Configurable rows, cols, and resize behavior\n * - Built-in error messages with internationalization support\n * - Custom error messages per field\n * - Priority-based error display or show all errors\n * - Full accessibility (ARIA attributes)\n *\n * @example\n * ```typescript\n * <mn-textarea\n * formControlName=\"description\"\n * [props]=\"{\n * id: 'description',\n * rows: 5,\n * label: 'Description',\n * size: 'md',\n * borderRadius: 'md',\n * resize: 'vertical',\n * errorMessages: { required: 'Description is required' }\n * }\"\n * ></mn-textarea>\n * ```\n */\n@Component({\n selector: 'mn-lib-textarea',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-textarea.html',\n})\nexport class MnTextarea implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n /** Resolved UI configuration for the textarea */\n protected uiConfig: MnTextareaUIConfig = {};\n\n private readonly el = inject(ElementRef);\n\n /** Configuration properties for the textarea */\n @Input({ required: true }) props!: MnTextareaProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Current raw string value of the textarea element */\n value: string | null = null;\n\n /** Whether the textarea is disabled */\n isDisabled = false;\n\n /** Callback function to notify Angular forms of value changes */\n private onChange: (val: unknown) => void = () => {\n };\n\n /** Callback function to notify Angular forms when textarea is touched/blurred */\n private onTouched: () => void = () => {};\n\n /**\n * Built-in default error messages in English.\n * These are used when useBuiltInErrorMessages is true (default).\n * Can be overridden per-field using props.errorMessages.\n */\n private readonly builtInErrorMessages: Record<string, MnTextareaErrorMessageData> = {\n required: 'This field is required',\n minlength: (args) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args) => `Maximum ${args.requiredLength} characters allowed`,\n };\n\n /**\n * Constructor - Registers this component as the ControlValueAccessor\n * for the injected NgControl (FormControl).\n *\n */\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n\n if (this.props.autoFocus) {\n setTimeout(() => this.focus(), 0);\n }\n }\n\n /**\n * Focuses the textarea element.\n */\n focus(): void {\n const textarea = this.el.nativeElement.querySelector('textarea');\n if (textarea) textarea.focus();\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-textarea-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnTextareaUIConfig>(\n 'mn-textarea',\n this.sectionPath,\n instanceId\n );\n\n // Allow props to override uiConfig for label and placeholder\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n if (this.props.placeholder) {\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n /**\n * Writes a new value to the textarea element (called by Angular Forms).\n *\n * @param val - The value to write\n */\n writeValue(val: unknown): void {\n this.value = val != null ? String(val) : null;\n }\n\n /**\n * Registers a callback function to be called when the textarea value changes.\n *\n * @param fn - Callback function to notify Angular Forms of changes\n */\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers a callback function to be called when the textarea is touched/blurred.\n *\n * @param fn - Callback function to notify Angular Forms of touch events\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * Sets the disabled state of the textarea element.\n *\n * @param isDisabled - Whether the textarea should be disabled\n */\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n /**\n * Handles input events from the textarea element.\n * Notifies Angular Forms of the new value.\n *\n * @param raw - Raw string value from the textarea element\n */\n handleInput(raw: string): void {\n this.value = raw;\n this.onChange(raw);\n }\n\n /**\n * Handles blur events from the textarea element.\n * Notifies Angular Forms that the textarea has been touched.\n */\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Error Handling ==========\n\n /**\n * Gets the FormControl instance from Angular Forms.\n * Returns null if no control is attached.\n */\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n /**\n * Determines whether to show error messages.\n * Errors are shown when the control is invalid and has been touched or modified.\n */\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n /**\n * Picks the error key to display based on errorPriority.\n * Used when showAllErrors is false (default).\n *\n * @param errors - ValidationErrors object from the control\n * @returns The error key to display\n */\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n /**\n * Resolves a single error message for a specific error key.\n *\n * @param errorKey - The error key (e.g., 'required', 'minlength')\n * @param errors - All validation errors on the control\n * @returns The resolved error message string\n */\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n // Interpolate {{placeholder}} tokens with validation error args\n if (errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)}}/g, (_, key) => errorArgs[key] ?? _);\n }\n return msgDef;\n }\n\n /**\n * Gets all error messages for the current control state.\n *\n * @returns Array of error message strings\n */\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n\n const errorKeys = Object.keys(errors);\n return errorKeys.map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n /**\n * Gets a single error message for the current control state.\n *\n * @returns Single error message string, or null if no errors\n */\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n /** Resolved ID for the textarea element */\n get resolvedId(): string {\n return this.props.id;\n }\n\n /** Resolved name attribute for the textarea element */\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n /**\n * Computes the CSS classes from tailwind-variants based on the props.\n * Returns the variant classes for styling the textarea element.\n */\n get textareaClasses(): string {\n return mnTextareaVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n resize: this.props.resize,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n <!-- Label -->\n @if (uiConfig.label || props.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500 \">*</span>\n }\n </label>\n }\n\n <!-- Textarea Element -->\n <textarea\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [attr.placeholder]=\"uiConfig.placeholder || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [attr.autocomplete]=\"props.autocomplete || null\"\n [attr.rows]=\"props.rows ?? null\"\n [attr.cols]=\"props.cols ?? null\"\n [ngClass]=\"textareaClasses\"\n (input)=\"handleInput(($any($event.target)).value)\"\n (blur)=\"handleBlur()\"\n >{{ value ?? '' }}</textarea>\n\n <!-- Error Messages -->\n @if (showError) {\n <!-- Show all errors mode -->\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import {tv, type VariantProps} from 'tailwind-variants';\n\n/**\n * Tailwind-variants definition for the MnFileInput component.\n *\n * Mirrors the styling vocabulary of {@link mnInputFieldVariants} (size,\n * borderRadius, shadow, fullWidth, disabled) so a file input visually matches the\n * rest of the input family, and adds a `dropzone` toggle for the large dashed\n * drop area used by the default display mode.\n */\nexport const mnFileInputVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 text-base-content text-sm outline-none transition-colors duration-300 ease-in-out',\n variants: {\n /** Inner padding scale of the clickable control. */\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n /** Corner rounding of the control. */\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n /** Drop shadow toggle. */\n shadow: {\n true: 'shadow-lg',\n },\n /** Stretch the control to the full width of its container. */\n fullWidth: {\n true: 'w-full',\n },\n /** Renders the control as a large dashed dropzone with a hover accent. */\n dropzone: {\n true: 'flex flex-col items-center justify-center gap-2 p-6 border-2 border-dashed text-center cursor-pointer hover:border-primary',\n },\n /** Dimmed, non-interactive appearance. */\n disabled: {\n true: 'opacity-50 cursor-not-allowed pointer-events-none',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'lg',\n },\n});\n\n/** Variant prop types derived from {@link mnFileInputVariants}. */\nexport type MnFileInputVariants = VariantProps<typeof mnFileInputVariants>;\n","import {Component, computed, DestroyRef, EventEmitter, inject, Input, OnInit, Output, signal,} from '@angular/core';\nimport {CommonModule, NgClass} from '@angular/common';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {skip} from 'rxjs';\nimport {\n MnFileInputDisplayMode,\n MnFileInputErrorMessageData,\n MnFileInputProps,\n MnFileInputUIConfig,\n} from './mn-file-inputTypes';\nimport {mnFileInputVariants} from './mn-file-inputVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {LucideFile, LucideImagePlus, LucideTrash2, LucideUpload, LucideX} from '@lucide/angular';\nimport {MnConfigService} from '../../config';\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from '../../context';\nimport {MnLanguageService} from '../../language';\nimport {MnValidationErrorArgs} from '../../shared/types';\n\n/** A single renderable entry in the file input (a newly-selected file or an existing image). */\nexport type MnFileDisplayItem = {\n /** File name (new files) or a derived name (existing images). */\n name: string;\n /** Whether the entry should render as an image preview. */\n isImage: boolean;\n /** Object-URL (new image files) or saved URL (existing images), else null. */\n previewUrl: string | null;\n /** Human-readable size for new files, else null. */\n sizeLabel: string | null;\n /** Index used by the remove action. */\n index: number;\n /** True for an already-saved image passed via `currentUrl(s)`. */\n existing: boolean;\n};\n\n/**\n * MnFileInput Component\n *\n * A generic, accessible file input that implements Angular's ControlValueAccessor.\n * It styles selection to match the rest of the input family, shows image previews\n * (and a file icon + name for non-images), supports single or multiple selection,\n * several display layouts, and client-side `accept` / `maxSize` / `maxFiles` limits.\n *\n * The form control value is the plain selection: `File | null` (single) or\n * `File[]` (multiple). An optional `currentUrl`/`currentUrls` renders an\n * already-saved image; removing it leaves the value untouched and emits `cleared`.\n *\n * @example\n * ```html\n * <mn-lib-file-input\n * formControlName=\"image\"\n * [props]=\"{ id: 'image', label: 'Cover', accept: 'image/*', displayMode: 'dropzone' }\"\n * (cleared)=\"onRemoveExisting()\">\n * </mn-lib-file-input>\n * ```\n */\n@Component({\n selector: 'mn-lib-file-input',\n standalone: true,\n imports: [CommonModule, NgClass, MnErrorMessage, LucideFile, LucideImagePlus, LucideTrash2, LucideUpload, LucideX],\n templateUrl: './mn-file-input.html',\n})\nexport class MnFileInput implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n /** Configuration properties for the file input. */\n @Input({required: true}) props!: MnFileInputProps;\n /** Emits whenever the selected file(s) change (in addition to the form control). */\n @Output() filesChange = new EventEmitter<File | File[] | null>();\n /** Emits when the user removes an already-saved image (`currentUrl(s)`). */\n @Output() cleared = new EventEmitter<void>();\n /** Resolved UI configuration for the file input. */\n protected uiConfig: MnFileInputUIConfig = {};\n /** Currently selected files (always an array internally). */\n protected readonly files = signal<File[]>([]);\n /** Transient message for a rejected selection (accept/maxSize/maxFiles). */\n protected readonly internalError = signal<string | null>(null);\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, {optional: true}) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, {optional: true});\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n /** Object-URL previews aligned to {@link files}; null for non-image entries. */\n private readonly previewUrls = signal<(string | null)[]>([]);\n /** True once the user removed the single existing image. */\n private readonly currentCleared = signal(false);\n /** Indices of removed existing images (multiple mode). */\n private readonly removedExisting = signal<Set<number>>(new Set());\n /** Renderable entries: existing images (when nothing newer hides them) then new files. */\n readonly displayItems = computed<MnFileDisplayItem[]>(() => {\n const items: MnFileDisplayItem[] = [];\n\n if (this.props.multiple) {\n const urls = this.props.currentUrls ?? [];\n const removed = this.removedExisting();\n urls.forEach((url, i) => {\n if (!removed.has(i)) items.push(this.existingItem(url, i));\n });\n } else if (this.files().length === 0 && this.props.currentUrl && !this.currentCleared()) {\n items.push(this.existingItem(this.props.currentUrl, 0));\n }\n\n const previews = this.previewUrls();\n this.files().forEach((file, i) => {\n items.push({\n name: file.name,\n isImage: this.isImage(file),\n previewUrl: previews[i] ?? null,\n sizeLabel: this.humanFileSize(file.size),\n index: i,\n existing: false,\n });\n });\n\n return items;\n });\n /** Disabled state pushed by the forms API. */\n private formDisabled = false;\n /**\n * Built-in default error messages in English.\n * Used when `useBuiltInErrorMessages` is true (default); overridable per-field.\n */\n private readonly builtInErrorMessages: Record<string, MnFileInputErrorMessageData> = {\n required: 'This field is required',\n accept: 'This file type is not allowed',\n maxSize: (args) => `File is too large (max ${args.max})`,\n maxFiles: (args) => `Too many files (max ${args.max})`,\n };\n\n /** Registers this component as the ControlValueAccessor for the injected control. */\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n /** The effective display mode. */\n get displayMode(): MnFileInputDisplayMode {\n return this.props.displayMode ?? 'dropzone';\n }\n\n /** Whether the control is disabled (via props or the forms API). */\n get isDisabled(): boolean {\n return this.formDisabled || !!this.props.disabled;\n }\n\n /** Native `accept` attribute value, or null for no restriction when unset. */\n get acceptAttr(): string | null {\n return this.props.accept ?? null;\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n /** Resolved id for the file input element. */\n get resolvedId(): string {\n return this.props.id;\n }\n\n /** Resolved name attribute for the file input element. */\n get resolvedName(): string | null {\n return this.props.name ?? null;\n }\n\n /** Tailwind-variant classes for the clickable control. */\n get controlClasses(): string {\n return mnFileInputVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth ?? (this.displayMode !== 'compact'),\n dropzone: this.displayMode === 'dropzone',\n disabled: this.isDisabled,\n });\n }\n\n /** The attached form control, if any. */\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n // ========== Selection handling ==========\n\n /** Whether to show control validation errors. */\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n /** All control error messages (used when `showAllErrors` is true). */\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map((key) => this.resolveControlError(key, errors));\n }\n\n /** Single control error message (priority-aware). */\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n return this.resolveControlError(this.pickErrorKey(errors), errors);\n }\n\n ngOnInit(): void {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => this.resolveConfig());\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n this.destroyRef.onDestroy(() => this.revokeAll());\n }\n\n /**\n * Writes a value from the form into the control.\n * @param val A `File`, an array of `File`, or null/undefined.\n */\n writeValue(val: unknown): void {\n const next = Array.isArray(val) ? val.filter((f): f is File => f instanceof File)\n : val instanceof File ? [val]\n : [];\n this.setFiles(next);\n }\n\n /**\n * Registers the form's change callback.\n * @param fn Callback invoked with the new value.\n */\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers the form's touched callback.\n * @param fn Callback invoked when the control is touched.\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n // ========== Derived view state ==========\n\n /**\n * Sets the disabled state of the control.\n * @param isDisabled Whether the control should be disabled.\n */\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled = isDisabled;\n }\n\n /**\n * Handles a file-picker change: validates the incoming files against the\n * configured limits and updates the selection.\n * @param event The native change event from the hidden file input.\n */\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n const incoming = Array.from(input.files ?? []);\n input.value = '';\n if (incoming.length === 0) return;\n this.addFiles(incoming);\n }\n\n /**\n * Removes a newly-selected file by index.\n * @param index Index into the current selection.\n */\n removeFile(index: number): void {\n const next = this.files().filter((_, i) => i !== index);\n this.internalError.set(null);\n this.setFiles(next);\n this.emit();\n }\n\n /**\n * Removes an already-saved image and notifies the consumer via `cleared`.\n * @param index Index of the existing image (0 in single mode).\n */\n removeExisting(index: number): void {\n if (this.props.multiple) {\n const set = new Set(this.removedExisting());\n set.add(index);\n this.removedExisting.set(set);\n } else {\n this.currentCleared.set(true);\n }\n this.cleared.emit();\n this.onTouched();\n }\n\n /** Whether the attached control carries a `required` validator. */\n protected isRequired(): boolean {\n return this.control?.hasValidator(Validators.required) ?? false;\n }\n\n /** Stable track key for a display item across renders. */\n protected itemKey(item: MnFileDisplayItem): string {\n return `${item.existing ? 'e' : 'f'}-${item.index}`;\n }\n\n /** Whether a file should render as an image. */\n protected isImage(file: File): boolean {\n return (file.type ?? '').startsWith('image/');\n }\n\n /** Callback to notify Angular forms of value changes. */\n private onChange: (val: unknown) => void = () => {\n };\n\n // ========== Error handling (control validators) ==========\n\n /** Callback to notify Angular forms when the control is touched. */\n private onTouched: () => void = () => {\n };\n\n /** Resolves UI strings from config, layering built-in defaults and prop overrides. */\n private resolveConfig(): void {\n const instanceId = this.explicitInstanceId || `mn-file-input-${this.props.id}`;\n const resolved = this.configService.resolve<MnFileInputUIConfig>(\n 'mn-file-input',\n this.sectionPath,\n instanceId,\n );\n\n const builtIn: MnFileInputUIConfig = {\n dropzoneHint: 'Click to upload or drag and drop',\n replaceLabel: 'Replace',\n removeLabel: 'Remove',\n };\n\n this.uiConfig = {...builtIn, ...resolved};\n if (this.props.label) this.uiConfig = {...this.uiConfig, label: this.props.label};\n if (this.props.dropzoneHint) this.uiConfig = {...this.uiConfig, dropzoneHint: this.props.dropzoneHint};\n if (this.props.replaceLabel) this.uiConfig = {...this.uiConfig, replaceLabel: this.props.replaceLabel};\n if (this.props.removeLabel) this.uiConfig = {...this.uiConfig, removeLabel: this.props.removeLabel};\n }\n\n /**\n * Validates and merges newly-picked files into the current selection.\n * @param incoming The files chosen by the user.\n */\n private addFiles(incoming: File[]): void {\n this.internalError.set(null);\n let errorKey: string | null = null;\n let errorArgs: MnValidationErrorArgs = {};\n\n let accepted = incoming.filter((f) => this.matchesAccept(f));\n if (accepted.length < incoming.length) errorKey = 'accept';\n\n if (this.props.maxSize != null) {\n const max = this.props.maxSize;\n const withinSize = accepted.filter((f) => f.size <= max);\n if (withinSize.length < accepted.length) {\n errorKey = 'maxSize';\n errorArgs = {max: this.humanFileSize(max)};\n }\n accepted = withinSize;\n }\n\n let next = this.props.multiple ? [...this.files(), ...accepted] : accepted.slice(-1);\n\n if (this.props.multiple && this.props.maxFiles != null && next.length > this.props.maxFiles) {\n next = next.slice(0, this.props.maxFiles);\n errorKey = 'maxFiles';\n errorArgs = {max: this.props.maxFiles};\n }\n\n if (errorKey) this.internalError.set(this.resolveMessage(errorKey, errorArgs));\n\n this.setFiles(next);\n this.emit();\n }\n\n /** Replaces the internal selection and rebuilds image previews. */\n private setFiles(next: File[]): void {\n this.revokeAll();\n this.files.set(next);\n this.previewUrls.set(next.map((f) => (this.isImage(f) ? URL.createObjectURL(f) : null)));\n }\n\n /** Emits the current value to the form and any listeners. */\n private emit(): void {\n const value = this.props.multiple ? this.files() : (this.files()[0] ?? null);\n this.onChange(value);\n this.onTouched();\n this.filesChange.emit(value);\n }\n\n /** Revokes any outstanding object-URL previews to avoid leaks. */\n private revokeAll(): void {\n for (const url of this.previewUrls()) {\n if (url) URL.revokeObjectURL(url);\n }\n }\n\n /** Builds a display item for an already-saved image. */\n private existingItem(url: string, index: number): MnFileDisplayItem {\n return {\n name: this.fileNameFromUrl(url),\n isImage: true,\n previewUrl: url,\n sizeLabel: null,\n index,\n existing: true,\n };\n }\n\n /** Picks which control error key to display. */\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) return key;\n }\n }\n return Object.keys(errors)[0];\n }\n\n // ========== Helpers ==========\n\n /** Resolves a control error key to a message, interpolating its args. */\n private resolveControlError(key: string, errors: ValidationErrors): string {\n return this.resolveMessage(key, errors[key] as MnValidationErrorArgs);\n }\n\n /**\n * Resolves a message for an error key using the same precedence as the other\n * inputs: custom props > config > built-in > fallback > default.\n */\n private resolveMessage(key: string, args: MnValidationErrorArgs | undefined): string {\n const customMsg = this.props.errorMessages?.[key];\n const configMsg = this.uiConfig.errorMessages?.[key];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[key] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(args ?? {}, {});\n }\n if (args && typeof args === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)}}/g, (_match: string, token: string) => {\n const value = (args as Record<string, unknown>)[token];\n return value !== undefined ? String(value) : `{{${token}}}`;\n });\n }\n return msgDef;\n }\n\n /** Checks a file against the configured `accept` filter (extensions and MIME globs). */\n private matchesAccept(file: File): boolean {\n const accept = this.props.accept;\n if (!accept) return true;\n const tokens = accept.split(',').map((t) => t.trim().toLowerCase()).filter(Boolean);\n if (tokens.length === 0) return true;\n const name = file.name.toLowerCase();\n const type = (file.type ?? '').toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token);\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, -1));\n return type === token;\n });\n }\n\n /** Formats a byte count as a human-readable size. */\n private humanFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n /** Derives a display name from a URL (last path segment). */\n private fileNameFromUrl(url: string): string {\n const clean = url.split('?')[0].split('#')[0];\n const segment = clean.substring(clean.lastIndexOf('/') + 1);\n return segment || 'image';\n }\n}\n","<div [class.w-full]=\"props.fullWidth !== false && displayMode !== 'compact'\" class=\"flex flex-col\">\n <!-- Label -->\n @if (uiConfig.label) {\n <label [attr.for]=\"resolvedId\" class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\">\n <p>{{ uiConfig.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <!-- Hidden native file input shared by every trigger -->\n <input\n #fileInput\n (change)=\"onFileSelected($event)\"\n [accept]=\"acceptAttr\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || null\"\n [attr.multiple]=\"props.multiple || null\"\n [attr.name]=\"resolvedName\"\n [disabled]=\"isDisabled\"\n [id]=\"resolvedId\"\n class=\"hidden\"\n type=\"file\"\n />\n\n @switch (displayMode) {\n <!-- Compact: inline button + filename chips -->\n @case ('compact') {\n <div class=\"flex flex-wrap items-center gap-2\">\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n [ngClass]=\"controlClasses\"\n class=\"inline-flex items-center gap-2 cursor-pointer hover:bg-base-200\"\n type=\"button\">\n <svg lucideUpload [size]=\"18\"></svg>\n <span class=\"text-sm\">{{ uiConfig.replaceLabel }}</span>\n </button>\n @for (item of displayItems(); track itemKey(item)) {\n <span class=\"inline-flex items-center gap-1 text-sm text-base-content/70\">\n @if (item.isImage && item.previewUrl) {\n <img [src]=\"item.previewUrl\" alt=\"\" class=\"h-6 w-6 rounded object-cover\"/>\n } @else {\n <svg lucideFile [size]=\"16\" class=\"text-base-content/50\"></svg>\n }\n <span class=\"max-w-40 truncate\">{{ item.name }}</span>\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"text-base-content/50 hover:text-error cursor-pointer\"\n type=\"button\">\n <svg lucideX [size]=\"14\"></svg>\n </button>\n </span>\n }\n </div>\n }\n\n <!-- List: compact rows of file icon + name + size -->\n @case ('list') {\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n [ngClass]=\"controlClasses\"\n class=\"flex flex-row items-center justify-center gap-2 cursor-pointer hover:bg-base-200\"\n type=\"button\">\n <svg lucideUpload [size]=\"18\"></svg>\n <span class=\"text-sm\">{{ uiConfig.replaceLabel }}</span>\n </button>\n @if (displayItems().length > 0) {\n <div class=\"mt-2 flex flex-col gap-1\">\n @for (item of displayItems(); track itemKey(item)) {\n <div class=\"flex items-center gap-2 rounded-lg bg-base-200 px-3 py-1.5 text-sm\">\n <svg lucideFile [size]=\"16\" class=\"text-base-content/50\"></svg>\n <span class=\"flex-1 truncate text-base-content\">{{ item.name }}</span>\n @if (item.sizeLabel) {\n <span class=\"text-base-content/50\">{{ item.sizeLabel }}</span>\n }\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"text-base-content/50 hover:text-error cursor-pointer\"\n type=\"button\">\n <svg lucideX [size]=\"16\"></svg>\n </button>\n </div>\n }\n </div>\n }\n }\n\n <!-- Thumbnail: grid of tiles with overlay remove + add tile -->\n @case ('thumbnail') {\n <div class=\"flex flex-wrap gap-3\">\n @for (item of displayItems(); track itemKey(item)) {\n <div class=\"relative h-24 w-24 overflow-hidden rounded-xl border border-base-300 bg-base-100\">\n @if (item.isImage && item.previewUrl) {\n <img [src]=\"item.previewUrl\" alt=\"\" class=\"h-full w-full object-cover\"/>\n } @else {\n <div class=\"flex h-full w-full flex-col items-center justify-center gap-1 p-1 text-center\">\n <svg lucideFile [size]=\"22\" class=\"text-base-content/50\"></svg>\n <span class=\"w-full truncate text-xs text-base-content/60\">{{ item.name }}</span>\n </div>\n }\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"btn btn-circle btn-xs absolute top-1 right-1 border-none bg-black/60 text-white hover:bg-black/80\"\n type=\"button\">\n <svg lucideX [size]=\"14\"></svg>\n </button>\n </div>\n }\n @if (props.multiple || displayItems().length === 0) {\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n class=\"flex h-24 w-24 flex-col items-center justify-center gap-1 rounded-xl border-2 border-dashed border-base-300 text-base-content/50 hover:border-primary cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed\"\n type=\"button\">\n <svg lucideImagePlus [size]=\"22\"></svg>\n </button>\n }\n </div>\n }\n\n <!-- Dropzone (default): large dashed area + preview rows -->\n @default {\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n [ngClass]=\"controlClasses\"\n type=\"button\">\n <svg lucideImagePlus [size]=\"28\" class=\"text-base-content/40\"></svg>\n <span class=\"text-sm text-base-content/60\">{{ uiConfig.dropzoneHint }}</span>\n </button>\n @if (displayItems().length > 0) {\n <div class=\"mt-2 flex flex-col gap-2\">\n @for (item of displayItems(); track itemKey(item)) {\n <div class=\"flex items-center gap-3 rounded-lg bg-base-200 p-2\">\n @if (item.isImage && item.previewUrl) {\n <img [src]=\"item.previewUrl\" alt=\"\" class=\"h-12 w-12 rounded-md object-cover\"/>\n } @else {\n <svg lucideFile [size]=\"24\" class=\"text-base-content/50\"></svg>\n }\n <span class=\"flex-1 truncate text-sm text-base-content\">{{ item.name }}</span>\n @if (item.sizeLabel) {\n <span class=\"text-sm text-base-content/50\">{{ item.sizeLabel }}</span>\n }\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"btn btn-circle btn-sm btn-ghost text-base-content/60 hover:text-error\"\n type=\"button\">\n <svg lucideTrash2 [size]=\"16\"></svg>\n </button>\n </div>\n }\n </div>\n }\n }\n }\n\n <!-- Selection-limit error (accept / maxSize / maxFiles) -->\n @if (internalError(); as msg) {\n <mn-error-message [errorMessage]=\"msg\" [id]=\"resolvedId + '-selection'\"></mn-error-message>\n }\n\n <!-- Control validation errors -->\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n</div>\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnCheckboxVariants = tv({\n base: 'mn-checkbox',\n variants: {\n size: {\n xs: 'size-4 p-0.5',\n sm: 'size-5 p-[0.1875rem]',\n md: 'size-6 p-1',\n lg: 'size-7 p-[0.3125rem]',\n xl: 'size-8 p-1.5',\n },\n color: {\n primary: 'border-primary checked:bg-primary indeterminate:bg-primary focus-visible:outline-primary text-primary-content',\n secondary: 'border-secondary checked:bg-secondary indeterminate:bg-secondary focus-visible:outline-secondary text-secondary-content',\n accent: 'border-accent checked:bg-accent indeterminate:bg-accent focus-visible:outline-accent text-accent-content',\n neutral: 'border-neutral checked:bg-neutral indeterminate:bg-neutral focus-visible:outline-neutral text-neutral-content',\n info: 'border-info checked:bg-info indeterminate:bg-info focus-visible:outline-info text-info-content',\n success: 'border-success checked:bg-success indeterminate:bg-success focus-visible:outline-success text-success-content',\n warning: 'border-warning checked:bg-warning indeterminate:bg-warning focus-visible:outline-warning text-warning-content',\n error: 'border-error checked:bg-error indeterminate:bg-error focus-visible:outline-error text-error-content',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n color: 'primary',\n borderRadius: 'sm',\n },\n});\n\nexport const mnCheckboxWrapperVariants = tv({\n base: 'text-base-content',\n variants: {\n size: {\n xs: 'text-sm',\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n fullWidth: {\n true: 'w-full',\n },\n hover: {\n true: 'hover:bg-base-200 rounded-md transition-colors duration-200 ease-in-out px-2 -mx-2',\n },\n },\n defaultVariants: {\n size: 'md',\n hover: false,\n },\n});\n\nexport type MnCheckboxVariants = VariantProps<typeof mnCheckboxVariants>;\nexport type MnCheckboxWrapperVariants = VariantProps<typeof mnCheckboxWrapperVariants>;\n","import {\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n InjectionToken,\n Input,\n OnChanges,\n OnInit,\n Output\n} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnCheckboxErrorMessageData, MnCheckboxProps, MnCheckboxUIConfig} from './mn-checkboxTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnCheckboxVariants, mnCheckboxWrapperVariants} from './mn-checkboxVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_CHECKBOX_CONFIG = new InjectionToken<MnCheckboxUIConfig>('MN_CHECKBOX_CONFIG');\n\n@Component({\n selector: 'mn-lib-checkbox',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-checkbox.html',\n styleUrl: './mn-checkbox.css',\n})\nexport class MnCheckbox implements OnInit, OnChanges {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n protected uiConfig: MnCheckboxUIConfig = {};\n\n @Input({ required: true }) props!: MnCheckboxProps;\n\n /** Direct checked binding for non-form usage */\n @Input() checked?: boolean;\n\n /** Emits when checked state changes (for non-form usage) */\n @Output() checkedChange = new EventEmitter<boolean>();\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n value = false;\n isDisabled = false;\n\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnCheckboxErrorMessageData> = {\n required: 'This field is required',\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-checkbox-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnCheckboxUIConfig>(\n 'mn-checkbox',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n writeValue(val: unknown): void {\n this.value = !!val;\n }\n\n /** Sync value from checked input when not using forms */\n ngOnChanges(): void {\n if (this.checked !== undefined) {\n this.value = this.checked;\n }\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n handleChange(checked: boolean): void {\n this.value = checked;\n this.onChange(checked);\n this.checkedChange.emit(checked);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Error Handling ==========\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n return msgDef;\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get checkboxClasses(): string {\n return mnCheckboxVariants({\n size: this.props.size,\n color: this.props.color,\n borderRadius: this.props.borderRadius,\n });\n }\n\n get wrapperClasses(): string {\n return mnCheckboxWrapperVariants({\n size: this.props.size,\n fullWidth: this.props.fullWidth,\n hover: this.props.hover,\n });\n }\n}\n","<div [class.is-fullwidth]=\"props.fullWidth\" class=\"flex flex-col items-start\">\n <label [attr.for]=\"resolvedId\" [ngClass]=\"wrapperClasses\"\n class=\"flex flex-row items-center gap-x-2 select-none cursor-pointer\">\n <input\n type=\"checkbox\"\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [checked]=\"value\"\n [ngClass]=\"checkboxClasses\"\n (change)=\"handleChange($any($event.target).checked)\"\n (blur)=\"handleBlur()\"\n />\n @if (uiConfig.label || props.label) {\n <span class=\"flex flex-row items-center gap-x-0.5\">\n <span>{{ uiConfig.label || props.label }}</span>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n }\n </label>\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1 mt-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnDatetimeVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 placeholder-base-content/50 cursor-pointer text-base-content text-sm',\n variants: {\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'px-2 py-1.5',\n md: 'px-3 py-2',\n lg: 'px-4 py-3',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n hover: {\n true: 'hover:cursor-pointer hover:bg-base-200 transition-colors duration-300 ease-in-out',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n hover: true,\n },\n});\n\nexport type MnDatetimeVariants = VariantProps<typeof mnDatetimeVariants>;\n","import {Component, DestroyRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnDatetimeErrorMessageData, MnDatetimeMode, MnDatetimeProps, MnDatetimeUIConfig} from './mn-datetimeTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnDatetimeVariants} from './mn-datetimeVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_DATETIME_CONFIG = new InjectionToken<MnDatetimeUIConfig>('MN_DATETIME_CONFIG');\n\n@Component({\n selector: 'mn-lib-datetime',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-datetime.html',\n styles: `input::-webkit-calendar-picker-indicator { cursor: pointer; }`,\n host: {\n // Native date/time inputs have a platform-specific intrinsic width. Without an\n // explicit host width the inline host collapses to that intrinsic size, so the\n // input's `w-full` (width:100%) resolves against a content-sized box and fails to\n // fill the parent on real mobile devices (desktop devtools hides this because it\n // still renders the control with the desktop engine). Give the host a real width\n // when fullWidth is requested so 100% has something to fill.\n '[style.display]': \"props?.fullWidth ? 'block' : null\",\n '[style.width]': \"props?.fullWidth ? '100%' : null\",\n },\n})\nexport class MnDatetime implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n protected uiConfig: MnDatetimeUIConfig = {};\n\n @Input({ required: true }) props!: MnDatetimeProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n value: string | null = null;\n isDisabled = false;\n\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnDatetimeErrorMessageData> = {\n required: 'This field is required',\n mnMin: (args) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args) => `Date/time must be up to ${args.max}`,\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-datetime-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnDatetimeUIConfig>(\n 'mn-datetime',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n if (this.props.placeholder) {\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n writeValue(val: unknown): void {\n if (val != null) {\n let str = String(val);\n // Convert ISO 8601 strings (e.g. \"2025-01-01T10:00:00.000Z\") to datetime-local format\n if (str.includes('T') && (str.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(str))) {\n const date = new Date(str);\n if (!isNaN(date.getTime())) {\n const pad = (n: number) => n.toString().padStart(2, '0');\n str = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\n }\n }\n this.value = str;\n } else {\n this.value = null;\n }\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n handleInput(raw: string): void {\n this.value = raw;\n this.onChange(raw);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n handleClick(input: HTMLInputElement): void {\n try {\n input.showPicker();\n } catch {\n // picker already open (icon click) or browser restriction\n }\n }\n\n // ========== Error Handling ==========\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n return msgDef;\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get resolvedMode(): MnDatetimeMode {\n return this.props.mode ?? 'datetime-local';\n }\n\n get inputClasses(): string {\n return mnDatetimeVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n hover: this.props.hover,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n @if (uiConfig.label || props.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <input\n #dateInput\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [type]=\"resolvedMode\"\n [attr.placeholder]=\"uiConfig.placeholder || props.placeholder || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [attr.min]=\"props.min || null\"\n [attr.max]=\"props.max || null\"\n [attr.step]=\"props.step || null\"\n [value]=\"value ?? ''\"\n [ngClass]=\"inputClasses\"\n (click)=\"handleClick(dateInput)\"\n (input)=\"handleInput(($any($event.target)).value)\"\n (blur)=\"handleBlur()\"\n />\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnMultiSelectVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 text-base-content text-sm cursor-pointer',\n variants: {\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n },\n});\n\nexport type MnMultiSelectVariants = VariantProps<typeof mnMultiSelectVariants>;\n","import {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n inject,\n InjectionToken,\n Input,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnMultiSelectProps, MnMultiSelectOption, MnMultiSelectErrorMessageData, MnMultiSelectUIConfig} from './mn-multi-selectTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnMultiSelectVariants} from './mn-multi-selectVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnButton} from '../mn-button';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\nimport {LucideX} from \"@lucide/angular\";\n\nexport const MN_MULTI_SELECT_CONFIG = new InjectionToken<MnMultiSelectUIConfig>('MN_MULTI_SELECT_CONFIG');\n\n@Component({\n selector: 'mn-lib-multi-select',\n standalone: true,\n imports: [NgClass, MnErrorMessage, MnButton, LucideX],\n templateUrl: './mn-multi-select.html',\n})\nexport class MnMultiSelect implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n protected uiConfig: MnMultiSelectUIConfig = {};\n\n @Input({ required: true }) props!: MnMultiSelectProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly elRef = inject(ElementRef);\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Reference to the trigger element for positioning the dropdown */\n @ViewChild('trigger', { static: false }) triggerRef!: ElementRef<HTMLElement>;\n\n /** Currently selected values */\n selectedValues: unknown[] = [];\n isOpen = false;\n isDisabled = false;\n searchTerm = '';\n\n /** Dropdown position calculated from trigger bounding rect */\n dropdownStyle: { top: string; left: string; width: string } = { top: '0px', left: '0px', width: '0px' };\n\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnMultiSelectErrorMessageData> = {\n required: 'At least one option must be selected',\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-multi-select-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnMultiSelectUIConfig>(\n 'mn-multi-select',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n if (this.props.placeholder) {\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n writeValue(val: unknown): void {\n this.selectedValues = Array.isArray(val) ? val : [];\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Dropdown Logic ==========\n\n toggle(): void {\n if (this.isDisabled) return;\n this.isOpen = !this.isOpen;\n if (this.isOpen) {\n this.updateDropdownPosition();\n } else {\n this.searchTerm = '';\n }\n }\n\n /** Calculates the fixed position for the dropdown based on the trigger element */\n private updateDropdownPosition(): void {\n if (!this.triggerRef) return;\n const rect = this.triggerRef.nativeElement.getBoundingClientRect();\n this.dropdownStyle = {\n top: `${rect.bottom}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event): void {\n if (!this.elRef.nativeElement.contains(event.target)) {\n if (this.isOpen) {\n this.isOpen = false;\n this.searchTerm = '';\n }\n }\n }\n\n /** Closes the dropdown when the page or a scrollable parent is scrolled */\n @HostListener('window:scroll', [])\n @HostListener('window:resize', [])\n onWindowScrollOrResize(): void {\n if (this.isOpen) {\n this.isOpen = false;\n this.searchTerm = '';\n }\n }\n\n toggleOption(option: MnMultiSelectOption): void {\n if (option.disabled) return;\n\n const index = this.selectedValues.indexOf(option.value);\n if (index > -1) {\n this.selectedValues = this.selectedValues.filter(v => v !== option.value);\n } else {\n if (this.props.maxSelections && this.selectedValues.length >= this.props.maxSelections) {\n return;\n }\n this.selectedValues = [...this.selectedValues, option.value];\n }\n this.onChange(this.selectedValues);\n }\n\n removeOption(option: MnMultiSelectOption, event: Event): void {\n event.stopPropagation();\n this.selectedValues = this.selectedValues.filter(v => v !== option.value);\n this.onChange(this.selectedValues);\n }\n\n isSelected(option: MnMultiSelectOption): boolean {\n return this.selectedValues.includes(option.value);\n }\n\n isMaxReached(option: MnMultiSelectOption): boolean {\n if (!this.props.maxSelections) return false;\n return this.selectedValues.length >= this.props.maxSelections && !this.isSelected(option);\n }\n\n onSearch(term: string): void {\n this.searchTerm = term;\n }\n\n get filteredOptions(): MnMultiSelectOption[] {\n if (!this.searchTerm) return this.props.options;\n const lower = this.searchTerm.toLowerCase();\n return this.props.options.filter(o => o.label.toLowerCase().includes(lower));\n }\n\n get selectedOptions(): MnMultiSelectOption[] {\n return this.props.options.filter(o => this.selectedValues.includes(o.value));\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Error Handling ==========\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n // Interpolate {{placeholder}} tokens with validation error args\n if (typeof msgDef === 'string' && errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => errorArgs[key] ?? _);\n }\n return msgDef;\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get triggerClasses(): string {\n return mnMultiSelectVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n @if (uiConfig.label || props.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <!-- Trigger -->\n <div\n #trigger\n [id]=\"resolvedId\"\n [ngClass]=\"triggerClasses\"\n class=\"relative\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"isOpen ? resolvedId + '-listbox' : null\"\n role=\"combobox\"\n tabindex=\"0\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle(); $event.preventDefault()\"\n (blur)=\"handleBlur()\"\n >\n <div class=\"flex flex-row items-center gap-x-2 flex-wrap min-h-6\">\n @if (selectedOptions.length === 0) {\n <span class=\"text-base-content/50\">{{ uiConfig.placeholder || props.placeholder || 'Select...' }}</span>\n } @else {\n @for (opt of selectedOptions; track opt.value) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <span class=\"inline-flex items-center gap-x-1 bg-base-200 border border-accent text-base-content text-xs pl-2 py-0.5 rounded-md cursor-pointer\"\n (click)=\"removeOption(opt, $event)\">\n {{ opt.label }}\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary', hover: false }\"\n type=\"button\"\n class=\"text-base-content/50 cursor-pointer\"\n (click)=\"removeOption(opt, $event)\"\n [attr.aria-label]=\"'Remove ' + opt.label\"\n ><svg lucideX [size]=\"18\"></svg></button>\n </span>\n }\n }\n </div>\n <div class=\"absolute right-2 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg class=\"w-4 h-4 text-base-content/50\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 12\">\n <path fill=\"currentColor\" d=\"M6 8L1 3h10z\"/>\n </svg>\n </div>\n </div>\n\n <!-- Dropdown -->\n @if (isOpen) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div\n [id]=\"resolvedId + '-listbox'\"\n aria-multiselectable=\"true\"\n role=\"listbox\"\n class=\"fixed z-9999 bg-base-100 border border-base-300 rounded-md shadow-lg max-h-60 overflow-auto\"\n [style.top]=\"dropdownStyle.top\"\n [style.left]=\"dropdownStyle.left\"\n [style.width]=\"dropdownStyle.width\"\n (click)=\"$event.stopPropagation()\"\n >\n @if (props.searchable) {\n <div class=\"p-2 border-b border-base-300\">\n <input\n type=\"text\"\n class=\"w-full p-1.5 text-sm border border-base-300 rounded-md outline-none focus:border-primary-500 bg-base-200 text-base-content placeholder-base-content/50\"\n [placeholder]=\"props.searchPlaceholder || 'Search...'\"\n [value]=\"searchTerm\"\n (input)=\"onSearch(($any($event.target)).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n @for (opt of filteredOptions; track opt.value) {\n <div\n (keyup.enter)=\"toggleOption(opt)\"\n (keyup.space)=\"toggleOption(opt)\"\n [attr.aria-selected]=\"isSelected(opt)\"\n class=\"flex items-center gap-x-2 px-3 py-2 text-sm cursor-pointer text-base-content hover:bg-base-200\"\n [class.opacity-50]=\"opt.disabled || isMaxReached(opt)\"\n [class.pointer-events-none]=\"opt.disabled || isMaxReached(opt)\"\n (click)=\"toggleOption(opt); $event.stopPropagation()\"\n role=\"option\"\n tabindex=\"0\"\n >\n <input\n type=\"checkbox\"\n class=\"w-4 h-4 accent-primary pointer-events-none\"\n [checked]=\"isSelected(opt)\"\n [disabled]=\"opt.disabled || isMaxReached(opt)\"\n tabindex=\"-1\"\n />\n <span>{{ opt.label }}</span>\n </div>\n }\n @if (filteredOptions.length === 0) {\n <div class=\"px-3 py-2 text-sm text-base-content/50\">{{ uiConfig.noOptionsFound || 'No options found' }}</div>\n }\n </div>\n }\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1 mt-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnSelectVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 text-base-content text-sm cursor-pointer hover:bg-base-200 transition-colors duration-300',\n variants: {\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n },\n});\n\nexport type MnSelectVariants = VariantProps<typeof mnSelectVariants>;\n","import {Component, DestroyRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnSelectErrorMessageData, MnSelectOption, MnSelectProps, MnSelectUIConfig} from './mn-selectTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnSelectVariants} from './mn-selectVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_SELECT_CONFIG = new InjectionToken<MnSelectUIConfig>('MN_SELECT_CONFIG');\n\n@Component({\n selector: 'mn-lib-select',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-select.html',\n host: {\n // Without an explicit host width the inline host collapses to its content size, so\n // the control's `w-full` (width:100%) resolves against a content-sized box and fails\n // to fill the parent. Give the host a real width when fullWidth is requested.\n '[style.display]': \"props?.fullWidth ? 'block' : null\",\n '[style.width]': \"props?.fullWidth ? '100%' : null\",\n },\n})\nexport class MnSelect implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n @Input({required: true}) props!: MnSelectProps;\n /** Currently selected value */\n selectedValue: unknown = null;\n isDisabled = false;\n protected uiConfig: MnSelectUIConfig = {};\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, {optional: true}) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, {optional: true});\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly builtInErrorMessages: Record<string, MnSelectErrorMessageData> = {\n required: 'Please select an option',\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n get selectedOption(): MnSelectOption | undefined {\n return this.props.options.find(o => o.value === this.selectedValue);\n }\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get selectClasses(): string {\n return mnSelectVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n });\n }\n\n // ========== Select Logic ==========\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n writeValue(val: unknown): void {\n // Treat empty string as null so the placeholder is shown and the control stays properly invalid\n this.selectedValue = (val === '' || val == null) ? null : val;\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Error Handling ==========\n\n /** Returns the index of an option, used as the <option> value attribute */\n optionIndex(option: MnSelectOption): string {\n return String(this.props.options.indexOf(option));\n }\n\n /** Handles native select change event */\n onSelectChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n const index = parseInt(target.value, 10);\n if (isNaN(index) || index < 0 || index >= this.props.options.length) {\n this.selectedValue = null;\n this.onChange(null);\n return;\n }\n const option = this.props.options[index];\n if (option.disabled) return;\n this.selectedValue = option.value;\n this.onChange(this.selectedValue);\n }\n\n isSelected(option: MnSelectOption): boolean {\n return this.selectedValue === option.value;\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private onChange: (val: unknown) => void = () => {\n };\n\n private onTouched: () => void = () => {\n };\n\n // ========== Resolved Properties ==========\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-select-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnSelectUIConfig>(\n 'mn-select',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = {...this.uiConfig, label: this.props.label};\n }\n if (this.props.placeholder) {\n this.uiConfig = {...this.uiConfig, placeholder: this.props.placeholder};\n }\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n if (errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/{{(\\w+)}}/g, (_, key) => errorArgs[key] ?? _);\n }\n return msgDef;\n }\n}\n","<div [class.is-fullwidth]=\"props.fullWidth\" class=\"flex flex-col h-full\">\n @if (uiConfig.label || props.label) {\n <label [attr.for]=\"resolvedId\" class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <select\n (blur)=\"handleBlur()\"\n (change)=\"onSelectChange($event)\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [disabled]=\"isDisabled\"\n [id]=\"resolvedId\"\n [name]=\"resolvedName\"\n [ngClass]=\"selectClasses\"\n >\n @if (props.placeholder || uiConfig.placeholder) {\n <option [selected]=\"selectedValue === null\" [value]=\"''\" disabled>\n {{ uiConfig.placeholder || props.placeholder }}\n </option>\n }\n @for (opt of props.options; track opt.value) {\n <option\n [disabled]=\"opt.disabled\"\n [selected]=\"isSelected(opt)\"\n [value]=\"optionIndex(opt)\"\n >{{ opt.label }}\n </option>\n }\n </select>\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1 mt-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import {TemplateRef, Type} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {AsyncValidatorFn, ValidatorFn} from '@angular/forms';\nimport {TableDataSource} from '../mn-table';\n\nexport { Type, TemplateRef };\n\n// =========================\n// Enums / Value Types\n// =========================\n\nexport enum ModalKind {\n WIZARD = 'wizard',\n FORM = 'form',\n CONFIRMATION = 'confirmation',\n CUSTOM = 'custom',\n}\n\nexport enum ModalSize {\n SM = 'sm',\n MD = 'md',\n LG = 'lg',\n XL = 'xl',\n FULL = 'full',\n}\n\nexport enum CloseMode {\n ALLOWED = 'allowed',\n GUARDED = 'guarded',\n DISABLED = 'disabled',\n}\n\nexport enum BackdropMode {\n HIDE = 'hide',\n STATIC = 'static',\n CLOSABLE = 'closable',\n}\n\nexport enum KeyboardMode {\n ENABLED = 'enabled',\n DISABLED = 'disabled',\n}\n\nexport enum ModalIntent {\n NEUTRAL = 'neutral',\n INFO = 'info',\n SUCCESS = 'success',\n WARNING = 'warning',\n DANGER = 'danger',\n}\n\nexport enum WizardFlowMode {\n LINEAR = 'linear',\n FREE = 'free',\n}\n\nexport enum FormLayoutMode {\n SINGLE_COLUMN = 'single-column',\n TWO_COLUMN = 'two-column',\n INLINE = 'inline',\n}\n\nexport enum SubmitMode {\n ONCE = 'once',\n RETRYABLE = 'retryable',\n}\n\nexport enum ConfirmationTone {\n DEFAULT = 'default',\n WARNING = 'warning',\n DANGER = 'danger',\n}\n\nexport enum FieldKind {\n TEXT = 'text',\n NUMBER = 'number',\n SELECT = 'select',\n CHECKBOX = 'checkbox',\n DATE = 'date',\n TEXTAREA = 'textarea',\n DATETIME = 'datetime',\n MULTI_SELECT = 'multi-select',\n MULTI_SELECT_TABLE = 'multi-select-table',\n SINGLE_SELECT_TABLE = 'single-select-table',\n PASSWORD = 'password',\n FILE = 'file',\n COLOR = 'color',\n RATING = 'rating',\n SLIDER = 'slider',\n CUSTOM = 'custom',\n}\n\nexport enum FieldAppearance {\n OUTLINE = 'outline',\n FILLED = 'filled',\n GHOST = 'ghost',\n}\n\nexport enum SelectionMode {\n SINGLE = 'single',\n MULTIPLE = 'multiple',\n}\n\nexport enum OptionState {\n ENABLED = 'enabled',\n DISABLED = 'disabled',\n}\n\nexport enum ActionStyle {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n DANGER = 'danger',\n GHOST = 'ghost',\n}\n\nexport enum StepState {\n PENDING = 'pending',\n ACTIVE = 'active',\n COMPLETE = 'complete',\n DISABLED = 'disabled',\n HIDDEN = 'hidden',\n}\n\nexport enum NavigationDirection {\n FORWARD = 'forward',\n BACKWARD = 'backward',\n DIRECT = 'direct',\n}\n\nexport enum ModalCloseReason {\n COMPLETED = 'completed',\n CANCELLED = 'cancelled',\n DISMISSED = 'dismissed',\n BACKDROP = 'backdrop',\n ESCAPE = 'escape',\n PROGRAMMATIC = 'programmatic',\n GUARD_REJECTED = 'guard_rejected',\n}\n\nexport enum ValidationStatus {\n VALID = 'valid',\n INVALID = 'invalid',\n PENDING = 'pending',\n}\n\nexport enum ValidationCode {\n REQUIRED = 'required',\n MIN = 'min',\n MAX = 'max',\n PATTERN = 'pattern',\n CUSTOM = 'custom',\n}\n\n// =========================\n// Value Objects & Types\n// =========================\n\nexport type ModalStepId = string;\nexport type ModalInputMap = Record<string, unknown>;\n\n// =========================\n// Conditional Field Types\n// =========================\n\n/**\n * A condition function that receives the current form values and returns\n * whether the field should be visible.\n */\nexport type FieldVisibilityCondition<TModel = unknown> = (formValue: Partial<TModel>) => boolean;\n\n/**\n * A condition function that receives the current form values and returns\n * whether the field should be required.\n */\nexport type FieldRequiredCondition<TModel = unknown> = (formValue: Partial<TModel>) => boolean;\n\n// =========================\n// Cross-Field Validation\n// =========================\n\n/**\n * A form-level validator that receives the entire form value\n * and returns an error map or null.\n */\nexport type FormValidator<TModel = unknown> = (formValue: Partial<TModel>) => Record<string, string> | null;\n\n// =========================\n// Async DataSource Types\n// =========================\n\n/**\n * A data source that asynchronously loads options for select/multi-select fields.\n * Can optionally depend on other field values to reload.\n */\nexport type FieldDataSource<TValue = unknown, TModel = unknown> = {\n /** Load options, optionally based on current form values */\n load(formValue?: Partial<TModel>): Promise<SelectOption<TValue>[]> | SelectOption<TValue>[];\n /** Keys of other fields that trigger a reload when their value changes */\n dependsOn?: KeyOf<TModel>[];\n}\n\n// =========================\n// Validation Types\n// =========================\n\nexport type ValidationResult = {\n status: ValidationStatus;\n code?: ValidationCode;\n message?: string;\n}\n\nexport type StepValidator = {\n validate(): Promise<ValidationResult> | ValidationResult;\n}\n\nexport type FieldValidator = {\n validate(value: unknown): Promise<ValidationResult> | ValidationResult;\n}\n\nexport type StepGuard = {\n canEnter(): Promise<boolean> | boolean;\n canExit(): Promise<boolean> | boolean;\n}\n\n// =========================\n// Modal Result & Events\n// =========================\n\nexport type ModalCloseEvent<TResult = unknown> = {\n reason: ModalCloseReason;\n result?: TResult;\n}\n\nexport type ModalRef<TResult = unknown> = {\n afterClosed$: Observable<ModalCloseEvent<TResult>>;\n close(result?: TResult): void;\n dismiss(reason: ModalCloseReason): void;\n update(config: Partial<BaseModalConfig<TResult>>): void;\n}\n\n// =========================\n// Handlers\n// =========================\n\nexport type ModalResultHandler<TResult = unknown> = {\n handle(result: TResult): Promise<void> | void;\n}\n\nexport type WizardStepChangeEvent = {\n previousStepId?: ModalStepId;\n currentStepId: ModalStepId;\n direction: NavigationDirection;\n}\n\nexport type WizardStepChangeHandler = {\n handle(event: WizardStepChangeEvent): Promise<void> | void;\n}\n\n// =========================\n// Wizard Types\n// =========================\n\nexport type StepBodyConfig = Type<unknown> | TemplateRef<unknown> | string;\n\nexport type WizardStepConfig<TModel = unknown> = {\n id: ModalStepId;\n title: string;\n state?: StepState;\n body?: StepBodyConfig;\n fields?: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n fieldGroups?: FormFieldGroup<TModel>[];\n formValidators?: FormValidator<TModel>[];\n groupValidators?: ValidatorFn[];\n initialValue?: Partial<TModel>;\n guard?: StepGuard;\n validators?: StepValidator[];\n /** Custom label for the 'Next' button on this step */\n nextLabel?: string;\n /** Custom label for the 'Back' button on this step */\n backLabel?: string;\n /** Whether to hide the 'Back' button on this step */\n hideBack?: boolean;\n /** Condition to show/hide this entire step based on aggregated wizard data */\n visible?: (aggregatedData: Record<ModalStepId, Record<string, unknown>>) => boolean;\n}\n\nexport type WizardResult = {\n status: ModalCloseReason;\n visitedStepIds: ModalStepId[];\n payload?: Record<ModalStepId, Record<string, unknown>>;\n}\n\n// =========================\n// Form Types\n// =========================\n\ntype KeyOf<T> = unknown extends T ? string : keyof T & string;\n\nexport type SelectOption<TValue = unknown> = {\n label: string;\n value: TValue;\n state?: OptionState;\n}\n\nexport type TextFieldConfig<TModel = unknown> = {\n kind: FieldKind.TEXT;\n key: KeyOf<TModel>;\n label: string;\n appearance?: FieldAppearance;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n placeholder?: string;\n /** Whether this field is read-only (display only) */\n readOnly?: boolean;\n /** Whether this field is disabled */\n disabled?: boolean;\n /** Condition to show/hide this field based on other field values */\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n /** Input mask (e.g., '(000) 000-0000') */\n mask?: string;\n /** Autocomplete attribute */\n autocomplete?: string;\n /** Whether to focus this field when the modal opens */\n autoFocus?: boolean;\n /** When to update the form control value and run validation */\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type NumberFieldConfig<TModel = unknown> = {\n kind: FieldKind.NUMBER;\n key: KeyOf<TModel>;\n label: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n placeholder?: string;\n min?: number;\n max?: number;\n step?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type SelectFieldConfig<TModel = unknown, TValue = unknown> = {\n kind: FieldKind.SELECT;\n key: KeyOf<TModel>;\n label: string;\n options: SelectOption<TValue>[];\n selectionMode?: SelectionMode;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n /** Async data source for loading options dynamically */\n dataSource?: FieldDataSource<TValue, TModel>;\n}\n\nexport type CheckboxFieldConfig<TModel = unknown> = {\n kind: FieldKind.CHECKBOX;\n key: KeyOf<TModel>;\n label: string;\n defaultValue?: boolean;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type DateFieldConfig<TModel = unknown> = {\n kind: FieldKind.DATE;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n minDate?: string;\n maxDate?: string;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type TextareaFieldConfig<TModel = unknown> = {\n kind: FieldKind.TEXTAREA;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n rows?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type DatetimeFieldConfig<TModel = unknown> = {\n kind: FieldKind.DATETIME;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n mode?: 'date' | 'time' | 'datetime-local';\n min?: string;\n max?: string;\n step?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type MultiSelectFieldConfig<TModel = unknown, TValue = unknown> = {\n kind: FieldKind.MULTI_SELECT;\n key: KeyOf<TModel>;\n label: string;\n options: SelectOption<TValue>[];\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n searchable?: boolean;\n searchPlaceholder?: string;\n maxSelections?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n /** Async data source for loading options dynamically */\n dataSource?: FieldDataSource<TValue, TModel>;\n}\n\nexport type PasswordFieldConfig<TModel = unknown> = {\n kind: FieldKind.PASSWORD;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type MultiSelectTableFieldConfig<TModel = unknown, TRow = unknown> = {\n kind: FieldKind.MULTI_SELECT_TABLE;\n key: KeyOf<TModel>;\n label: string;\n /** The TableDataSource that powers the mn-table. selectionMode will be forced to 'multi'. */\n tableDataSource: TableDataSource<TRow>;\n /** Function to extract the value stored in the form from a selected row (default: getID) */\n getRowValue?: (row: TRow) => unknown;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type SingleSelectTableFieldConfig<TModel = unknown, TRow = unknown> = {\n kind: FieldKind.SINGLE_SELECT_TABLE;\n key: KeyOf<TModel>;\n label: string;\n /** The TableDataSource that powers the mn-table. selectionMode will be forced to 'single'. */\n tableDataSource: TableDataSource<TRow>;\n /** Function to extract the value stored in the form from a selected row (default: getID) */\n getRowValue?: (row: TRow) => unknown;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type ColorFieldConfig<TModel = unknown> = {\n kind: FieldKind.COLOR;\n key: KeyOf<TModel>;\n label: string;\n /** Default color value (hex string, e.g., '#ff0000') */\n defaultValue?: string;\n /** Predefined color swatches to show */\n swatches?: string[];\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type RatingFieldConfig<TModel = unknown> = {\n kind: FieldKind.RATING;\n key: KeyOf<TModel>;\n label: string;\n /** Maximum rating value (default: 5) */\n max?: number;\n /** Icon to use for rating (default: 'star') */\n icon?: 'star' | 'heart' | 'circle';\n /** Allow half-star ratings (default: false) */\n allowHalf?: boolean;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type SliderFieldConfig<TModel = unknown> = {\n kind: FieldKind.SLIDER;\n key: KeyOf<TModel>;\n label: string;\n /** Minimum value (default: 0) */\n min?: number;\n /** Maximum value (default: 100) */\n max?: number;\n /** Step increment (default: 1) */\n step?: number;\n /** Whether to show the current value label (default: true) */\n showValue?: boolean;\n /** Unit label displayed after the value (e.g., '%', 'px') */\n unit?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type FileFieldConfig<TModel = unknown> = {\n kind: FieldKind.FILE;\n key: KeyOf<TModel>;\n label: string;\n /** Accepted file types (e.g., '.pdf,.jpg,image/*') */\n accept?: string;\n /** Allow multiple file selection */\n multiple?: boolean;\n /** Maximum file size in bytes */\n maxSize?: number;\n /** Maximum number of files (when multiple is true) */\n maxFiles?: number;\n /** How the selection is displayed (default: 'dropzone') */\n displayMode?: 'dropzone' | 'thumbnail' | 'list' | 'compact';\n /** Hint shown inside the empty dropzone */\n dropzoneHint?: string;\n /** Label for the \"choose/replace file\" affordance */\n replaceLabel?: string;\n /** Accessible label for the per-file remove button */\n removeLabel?: string;\n /** URL of an already-saved image to preview when no new file is selected (single mode) */\n currentUrl?: string | null;\n /** URLs of already-saved images to preview when nothing is selected (multiple mode) */\n currentUrls?: string[] | null;\n /**\n * Called when the user removes an already-saved image (`currentUrl`/`currentUrls`).\n * The form value stays null; use this to record the removal intent (e.g. to send\n * a \"clear image\" instruction to the API on submit).\n */\n onClear?: () => void;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type CustomFieldConfig<TModel = unknown> = {\n kind: FieldKind.CUSTOM;\n key: KeyOf<TModel>;\n component: Type<unknown>;\n inputs?: ModalInputMap;\n label?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type FormFieldConfig<TModel = unknown> =\n | TextFieldConfig<TModel>\n | NumberFieldConfig<TModel>\n | SelectFieldConfig<TModel>\n | CheckboxFieldConfig<TModel>\n | DateFieldConfig<TModel>\n | TextareaFieldConfig<TModel>\n | DatetimeFieldConfig<TModel>\n | MultiSelectFieldConfig<TModel>\n | MultiSelectTableFieldConfig<TModel, unknown>\n | SingleSelectTableFieldConfig<TModel, unknown>\n | PasswordFieldConfig<TModel>\n | FileFieldConfig<TModel>\n | ColorFieldConfig<TModel>\n | RatingFieldConfig<TModel>\n | SliderFieldConfig<TModel>\n | CustomFieldConfig<TModel>;\n\nexport type AnimationOptions = {\n type: 'slide' | 'fade' | 'zoom';\n duration?: number; // ms\n}\n\n// =========================\n// Form Layout Types\n// =========================\n\nexport type FormRowField<TModel = unknown> = {\n field: FormFieldConfig<TModel>;\n span?: number; // Number of columns this field spans (default: 1)\n}\n\nexport type FormRow<TModel = unknown> = {\n columns?: number; // Number of columns in this row (default: 1 = full width)\n fields: FormRowField<TModel>[];\n}\n\n// =========================\n// Field Group / Section Types\n// =========================\n\nexport type FormFieldGroup<TModel = unknown> = {\n /** Section header title */\n title: string;\n /** Optional description below the section header */\n description?: string;\n /** Fields in this group */\n fields: FormFieldConfig<TModel>[];\n /** Optional rows layout for this group */\n rows?: FormRow<TModel>[];\n /** Condition to show/hide this entire group based on form values */\n visible?: FieldVisibilityCondition<TModel>;\n}\n\n// =========================\n// Action Types\n// =========================\n\nexport type ConfirmationActionConfig<TResult = unknown> = {\n label: string;\n style?: ActionStyle;\n handler?: ModalResultHandler<TResult>;\n}\n\nexport type CancellationActionConfig = {\n label: string;\n style?: ActionStyle;\n reason?: ModalCloseReason;\n}\n\n// =========================\n// Footer Action Types\n// =========================\n\nexport type ModalFooterAction<TResult = unknown> = {\n label: string;\n style?: ActionStyle;\n /** Position in the footer: 'left' or 'right' (default: 'right') */\n position?: 'left' | 'right';\n /** Whether this action closes the modal */\n closesModal?: boolean;\n /** Close reason when this action closes the modal */\n closeReason?: ModalCloseReason;\n /** Handler called when the action is clicked */\n handler?: (modalRef: ModalRef<TResult>) => Promise<void> | void;\n /** Whether the button is disabled */\n disabled?: boolean;\n}\n\n// =========================\n// Polling / Async Types\n// =========================\n\nexport type ModalPollingConfig<TResult = unknown> = {\n /** Polling interval in milliseconds */\n interval: number;\n /** Function called on each poll tick */\n onPoll: (modalRef: ModalRef<TResult>) => Promise<boolean | void> | boolean | void;\n /** Whether to start polling immediately (default: true) */\n autoStart?: boolean;\n /** Maximum number of poll attempts (undefined = unlimited) */\n maxAttempts?: number;\n}\n\n// =========================\n// Base Config\n// =========================\n\n// =========================\n// i18n / Localization\n// =========================\n\nexport type ModalI18nLabels = {\n /** Submit button label (default: 'Submit') */\n submit?: string;\n /** Cancel button label (default: 'Cancel') */\n cancel?: string;\n /** Next button label for wizard (default: 'Next') */\n next?: string;\n /** Back button label for wizard (default: 'Back') */\n back?: string;\n /** Close button label (default: 'Close') */\n close?: string;\n /** Complete button label for wizard (default: 'Complete') */\n complete?: string;\n /** Submitting state label (default: 'Submitting...') */\n submitting?: string;\n /** Completing state label (default: 'Completing...') */\n completing?: string;\n /** Loading label (default: 'Loading...') */\n loading?: string;\n /** Select placeholder (default: 'Select...') */\n selectPlaceholder?: string;\n /** File upload prompt (default: 'Click or drag files here') */\n fileUploadPrompt?: string;\n /** Confirm button label (default: 'Confirm') */\n confirm?: string;\n}\n\n// =========================\n// Cancel / Dismiss Handler\n// =========================\n\nexport type ModalCancelHandler<_TResult = unknown> = (reason: ModalCloseReason) => Promise<void> | void;\n\nexport type BaseModalConfig<TResult = unknown> = {\n kind: ModalKind;\n title?: string;\n subtitle?: string;\n description?: string;\n /** Width of the modal (uses ModalSize enum) */\n sizeWidth?: ModalSize;\n /** Height of the modal (uses ModalSize enum) */\n sizeHeight?: ModalSize;\n closeMode?: CloseMode;\n closeGuard?: () => Promise<boolean> | boolean;\n backdrop?: BackdropMode;\n keyboard?: KeyboardMode;\n intent?: ModalIntent;\n resultType?: TResult;\n /** Custom footer actions (overrides default footer) */\n footerActions?: ModalFooterAction<TResult>[];\n /** Polling configuration for periodic async operations */\n polling?: ModalPollingConfig<TResult>;\n /** Handler called when the modal is cancelled or dismissed */\n readOnly?: boolean;\n disabled?: boolean;\n onCancel?: ModalCancelHandler<TResult>;\n /** i18n labels for buttons and UI text */\n i18n?: ModalI18nLabels;\n /** Animation configuration */\n animation?: AnimationOptions | AnimationOptions['type'];\n /**\n * Whether the modal renders as a bottom sheet on small screens (< 640px).\n * Defaults to true. Set to false to keep it a centered dialog on mobile.\n */\n mobileBottomSheet?: boolean;\n\n /** Custom component to render in the modal body */\n component?: Type<unknown>;\n /** Custom template to render in the modal body */\n template?: TemplateRef<unknown>;\n /** Inputs for the custom component */\n inputs?: ModalInputMap;\n}\n\n// =========================\n// Specialized Configs\n// =========================\n\nexport type WizardBeforeCompleteValidator<TResult = unknown> = (\n payload: Record<ModalStepId, Record<string, unknown>>\n) => Promise<Partial<Record<keyof TResult & string, string>> | null> | Partial<Record<keyof TResult & string, string>> | null;\n\nexport type WizardModalConfig<TResult = WizardResult> = {\n kind: ModalKind.WIZARD;\n steps: WizardStepConfig[];\n startStepId?: ModalStepId;\n flow?: WizardFlowMode;\n onStepChange?: WizardStepChangeHandler;\n onComplete?: ModalResultHandler<TResult>;\n /** Cross-step validators run before wizard completion */\n onBeforeComplete?: WizardBeforeCompleteValidator<TResult>[];\n /** Global initial values for all steps */\n initialValue?: Partial<TResult>;\n} & BaseModalConfig<TResult>\n\nexport type FormModalConfig<TModel = unknown, TResult = TModel> = {\n kind: ModalKind.FORM;\n body?: StepBodyConfig;\n fields: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n layout?: FormLayoutMode;\n initialValue?: Partial<TModel>;\n submitMode?: SubmitMode;\n onComplete?: ModalResultHandler<TResult>;\n /** Form-level validators for cross-field validation */\n formValidators?: FormValidator<TModel>[];\n /** Angular FormGroup-level validators (e.g., Validators.required on the group) */\n groupValidators?: ValidatorFn[];\n /** Field groups with section headers */\n fieldGroups?: FormFieldGroup<TModel>[];\n} & BaseModalConfig<TResult>\n\nexport type ConfirmationModalConfig<TResult = boolean> = {\n kind: ModalKind.CONFIRMATION;\n message: string;\n tone?: ConfirmationTone;\n confirm?: ConfirmationActionConfig<TResult>;\n cancel?: CancellationActionConfig;\n\n // Form-like capabilities for hybrid confirmation modals\n body?: StepBodyConfig;\n fields?: FormFieldConfig<unknown>[];\n rows?: FormRow<unknown>[];\n fieldGroups?: FormFieldGroup<unknown>[];\n formValidators?: FormValidator<unknown>[];\n groupValidators?: ValidatorFn[];\n initialValue?: Partial<unknown>;\n} & BaseModalConfig<TResult>\n\nexport type CustomModalConfig<TResult = unknown> = {\n kind: ModalKind.CUSTOM;\n onComplete?: ModalResultHandler<TResult>;\n} & BaseModalConfig<TResult>\n\n// =========================\n// Union Root Config\n// =========================\n\nexport type ModalConfig<TResult = unknown, TModel = unknown> =\n | WizardModalConfig<TResult>\n | FormModalConfig<TModel, TResult>\n | ConfirmationModalConfig<TResult>\n | CustomModalConfig<TResult>;\n","import {InjectionToken} from '@angular/core';\n\n/**\n * Intensity of a haptic impact. Mirrors the three impact weights exposed by most\n * native haptic engines (e.g. Capacitor Haptics `ImpactStyle`) without binding the\n * library to any particular implementation.\n */\nexport type MnHapticStyle = 'light' | 'medium' | 'heavy';\n\n/**\n * Abstraction over a native haptic feedback engine.\n *\n * The modal feature deliberately does NOT depend on Capacitor (or any other native\n * bridge) so the library stays usable in plain web apps. Consumers that run inside a\n * native shell provide an implementation of this handler through {@link MN_HAPTICS};\n * when no handler is provided the modal simply skips haptic feedback.\n */\nexport type MnHapticsHandler = {\n /**\n * Triggers a transient impact-style haptic.\n * @param style Intensity of the impact.\n */\n impact(style: MnHapticStyle): void;\n}\n\n/**\n * Optional DI token used by the bottom sheet to emit haptic feedback on native\n * platforms (sheet open, swipe-dismiss, and snap-back). Provide a {@link MnHapticsHandler}\n * at the application root to enable it; leave unprovided on the web (the modal injects it\n * with `{ optional: true }` and no-ops when absent).\n */\nexport const MN_HAPTICS = new InjectionToken<MnHapticsHandler>('MN_HAPTICS');\n","import {Validators, ValidatorFn} from '@angular/forms';\nimport {\n FormFieldConfig,\n FormFieldGroup,\n FormRow,\n FormRowField,\n FormValidator,\n StepBodyConfig,\n} from '../mn-modal.types';\n\n/**\n * Shared interface for configurations that support form layouts.\n */\nexport type FormContainerConfig<TModel = unknown> = {\n fields?: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n fieldGroups?: FormFieldGroup<TModel>[];\n formValidators?: FormValidator<TModel>[];\n groupValidators?: ValidatorFn[];\n initialValue?: Partial<TModel>;\n body?: StepBodyConfig;\n}\n\ntype WithAutoFocus = { autoFocus?: boolean };\ntype WithValidators = { validators?: ValidatorFn[] };\n\n/**\n * A self-referential type so that field-group builder methods can be chained.\n * e.g. g.field(...).field(...).field(...)\n */\nexport type ChainableGroupBuilder<TModel> = FormLayoutBuilder<TModel, ChainableGroupBuilder<TModel>>;\n\n/**\n * A builder class that provides form layout capabilities (fields, rows, groups).\n * This can be used as a delegate to avoid code duplication between FormModalBuilder and StepBuilder.\n */\nexport class FormLayoutBuilder<TModel = unknown, TParent = unknown> {\n private currentRow: FormRowField<TModel>[] = [];\n private currentRowColumns = 1;\n\n constructor(\n private readonly config: FormContainerConfig<TModel>,\n private parent: TParent\n ) {\n this.config.fields = this.config.fields || [];\n this.config.rows = this.config.rows || [];\n }\n\n /**\n * Add a custom body/content to the form/step.\n */\n body(body: StepBodyConfig): TParent {\n this.config.body = body;\n return this.parent;\n }\n\n /**\n * Add a field as a full-width row (single column).\n */\n field(field: FormFieldConfig<TModel>): TParent {\n this.flushCurrentRow();\n this.config.fields = this.config.fields || [];\n this.config.fields.push(field);\n this.config.rows = this.config.rows || [];\n this.config.rows.push({\n columns: 1,\n fields: [{ field, span: 1 }],\n });\n return this.parent;\n }\n\n /**\n * Start a new row with the specified number of columns.\n * All subsequent `addToRow()` calls will add fields to this row.\n */\n row(columns = 2): TParent {\n this.flushCurrentRow();\n this.currentRowColumns = columns;\n return this.parent;\n }\n\n /**\n * Add a field to the current row started by `row()`.\n * @param field - The field configuration\n * @param span - How many columns this field should span (default: 1)\n */\n addToRow(field: FormFieldConfig<TModel>, span = 1): TParent {\n this.config.fields = this.config.fields || [];\n this.config.fields.push(field);\n this.currentRow.push({ field, span });\n return this.parent;\n }\n\n /**\n * Declarative way to add a row.\n * @example\n * .addRow(2, row => {\n * row.add({ kind: FieldKind.TEXT, key: 'first', ... });\n * row.add({ kind: FieldKind.TEXT, key: 'last', ... });\n * })\n */\n addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): TParent {\n this.flushCurrentRow();\n const rowFields: FormRowField<TModel>[] = [];\n buildFn({\n add: (field: FormFieldConfig<TModel>, span = 1) => {\n this.config.fields = this.config.fields || [];\n this.config.fields.push(field);\n rowFields.push({ field, span });\n },\n });\n\n if (rowFields.length > 0) {\n this.config.rows = this.config.rows || [];\n this.config.rows.push({\n columns,\n fields: rowFields,\n });\n }\n return this.parent;\n }\n\n /**\n * Add a field group with a section header.\n */\n fieldGroup(group: FormFieldGroup<TModel>): TParent;\n /**\n * Add a field group using a functional builder.\n */\n fieldGroup(\n title: string,\n buildFn: (group: ChainableGroupBuilder<TModel>) => void\n ): TParent;\n /**\n * Add a field group with title, description, and a functional builder.\n */\n fieldGroup(\n title: string,\n description: string,\n buildFn: (group: ChainableGroupBuilder<TModel>) => void\n ): TParent;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: ChainableGroupBuilder<TModel>) => void),\n arg3?: (group: ChainableGroupBuilder<TModel>) => void\n ): TParent {\n this.flushCurrentRow();\n\n if (typeof arg1 !== 'string') {\n const group = arg1;\n this.processFieldGroup(group);\n return this.parent;\n }\n\n const title = arg1;\n let description: string | undefined;\n let buildFn: (group: ChainableGroupBuilder<TModel>) => void;\n\n if (typeof arg2 === 'string') {\n description = arg2;\n buildFn = arg3!;\n } else {\n buildFn = arg2!;\n }\n\n const groupConfig: FormContainerConfig<TModel> = {\n fields: [],\n rows: [],\n };\n const groupBuilder = new FormLayoutBuilder<TModel, ChainableGroupBuilder<TModel>>(\n groupConfig,\n null as unknown as ChainableGroupBuilder<TModel>\n );\n (groupBuilder as ChainableGroupBuilder<TModel>).parent = groupBuilder as ChainableGroupBuilder<TModel>;\n buildFn(groupBuilder as ChainableGroupBuilder<TModel>);\n groupBuilder.flushCurrentRow();\n\n const group: FormFieldGroup<TModel> = {\n title,\n description,\n fields: groupConfig.fields || [],\n rows: groupConfig.rows || [],\n };\n\n this.processFieldGroup(group);\n return this.parent;\n }\n\n private processFieldGroup(group: FormFieldGroup<TModel>): void {\n if (!this.config.fieldGroups) {\n this.config.fieldGroups = [];\n }\n\n // Also add group fields to the flat fields array for form control creation\n this.config.fields = this.config.fields || [];\n const fields = this.config.fields;\n group.fields.forEach((f) => fields.push(f));\n\n // Build rows for the group if not provided\n if (!group.rows || group.rows.length === 0) {\n group.rows = group.fields.map((f) => ({\n columns: 1,\n fields: [{ field: f, span: 1 }],\n }));\n }\n\n this.config.fieldGroups.push(group);\n }\n\n /**\n * Add form-level validators for cross-field validation.\n */\n formValidators(validators: FormValidator<TModel>[]): TParent {\n this.config.formValidators = validators;\n return this.parent;\n }\n\n /**\n * Add Angular FormGroup-level validators.\n */\n groupValidators(validators: ValidatorFn[]): TParent {\n this.config.groupValidators = validators;\n return this.parent;\n }\n\n /**\n * Set initial value for fields.\n */\n initialValue(value: Partial<TModel>): TParent {\n this.config.initialValue = value;\n return this.parent;\n }\n\n /**\n * Set the field to be focused when the form initializes.\n */\n focus(key: keyof TModel): TParent {\n this.config.fields?.forEach(f => {\n (f as WithAutoFocus).autoFocus = false;\n });\n this.config.fieldGroups?.forEach(g => {\n g.fields.forEach(f => {\n (f as WithAutoFocus).autoFocus = false;\n });\n });\n\n const field = this.config.fields?.find(f => (f as unknown as { key: keyof TModel }).key === key);\n if (field) {\n (field as WithAutoFocus).autoFocus = true;\n }\n return this.parent;\n }\n\n /**\n * Wraps a field with a fluent API for validation.\n */\n fieldWithValidators(field: FormFieldConfig<TModel>): FieldValidatorBuilder<TModel, TParent> {\n const fieldWithV = field as WithValidators;\n fieldWithV.validators = fieldWithV.validators || [];\n this.field(field);\n return new FieldValidatorBuilder(field, this.parent);\n }\n\n /**\n * Flushes any pending fields in the current row to the configuration.\n */\n flushCurrentRow(): void {\n if (this.currentRow.length > 0) {\n this.config.rows!.push({\n columns: this.currentRowColumns,\n fields: [...this.currentRow],\n });\n this.currentRow = [];\n this.currentRowColumns = 1;\n }\n }\n}\n\n/**\n * A builder for adding validation rules to a field fluently.\n */\nexport class FieldValidatorBuilder<TModel = unknown, TParent = unknown> {\n constructor(\n private field: FormFieldConfig<TModel>,\n private parent: TParent\n ) {\n (this.field as WithValidators).validators = (this.field as WithValidators).validators || [];\n }\n\n required(_message?: string): this {\n (this.field as WithValidators).validators!.push(Validators.required);\n return this;\n }\n\n minLength(length: number): this {\n (this.field as WithValidators).validators!.push(Validators.minLength(length));\n return this;\n }\n\n maxLength(length: number): this {\n (this.field as WithValidators).validators!.push(Validators.maxLength(length));\n return this;\n }\n\n pattern(pattern: string | RegExp): this {\n (this.field as WithValidators).validators!.push(Validators.pattern(pattern));\n return this;\n }\n\n email(): this {\n (this.field as WithValidators).validators!.push(Validators.email);\n return this;\n }\n\n min(value: number): this {\n (this.field as WithValidators).validators!.push(Validators.min(value));\n return this;\n }\n\n max(value: number): this {\n (this.field as WithValidators).validators!.push(Validators.max(value));\n return this;\n }\n\n /**\n * Add a custom validator.\n */\n custom(validator: ValidatorFn): this {\n (this.field as WithValidators).validators!.push(validator);\n return this;\n }\n\n /**\n * Return to the parent builder.\n */\n done(): TParent {\n return this.parent;\n }\n}\n","import {\n WizardStepConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormValidator,\n StepBodyConfig,\n StepState,\n StepGuard,\n StepValidator,\n ModalStepId,\n} from '../mn-modal.types';\nimport {FormLayoutBuilder, ChainableGroupBuilder} from './form-layout.builder';\nimport {ValidatorFn} from '@angular/forms';\n\nexport class StepBuilder<TModel = unknown> {\n private config: WizardStepConfig<TModel>;\n private layoutBuilder: FormLayoutBuilder<TModel, this>;\n\n constructor(id: string, title: string) {\n this.config = {\n id,\n title,\n fields: [],\n state: StepState.PENDING,\n };\n this.layoutBuilder = new FormLayoutBuilder(this.config, this);\n }\n\n body(body: StepBodyConfig): this {\n this.config.body = body;\n return this;\n }\n\n state(state: StepState): this {\n this.config.state = state;\n return this;\n }\n\n guard(guard: StepGuard): this {\n this.config.guard = guard;\n return this;\n }\n\n validators(validators: StepValidator[]): this {\n this.config.validators = validators;\n return this;\n }\n\n field(field: FormFieldConfig<TModel>): this {\n return this.layoutBuilder.field(field);\n }\n\n row(columns = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n addToRow(field: FormFieldConfig<TModel>, span = 1): this {\n return this.layoutBuilder.addToRow(field, span);\n }\n\n addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): this {\n return this.layoutBuilder.addRow(columns, buildFn);\n }\n\n fieldGroup(group: FormFieldGroup<TModel>): this;\n fieldGroup(title: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(title: string, description: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: ChainableGroupBuilder<TModel>) => void),\n arg3?: (group: ChainableGroupBuilder<TModel>) => void\n ): this {\n if (typeof arg1 !== 'string') {\n return this.layoutBuilder.fieldGroup(arg1);\n }\n if (typeof arg2 === 'string') {\n return this.layoutBuilder.fieldGroup(arg1, arg2, arg3!);\n }\n return this.layoutBuilder.fieldGroup(arg1, arg2!);\n }\n\n formValidators(validators: FormValidator<TModel>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n initialValue(value: Partial<TModel>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n visible(\n condition: (aggregatedData: Record<ModalStepId, Record<string, unknown>>) => boolean\n ): this {\n this.config.visible = condition;\n return this;\n }\n\n nextLabel(label: string): this {\n this.config.nextLabel = label;\n return this;\n }\n\n backLabel(label: string): this {\n this.config.backLabel = label;\n return this;\n }\n\n hideBack(hide = true): this {\n this.config.hideBack = hide;\n return this;\n }\n\n build(): WizardStepConfig<TModel> {\n this.layoutBuilder.flushCurrentRow();\n return this.config;\n }\n}\n","import {\n ChainableGroupBuilder,\n FieldValidatorBuilder,\n FormContainerConfig,\n FormLayoutBuilder\n} from './form-layout.builder';\nimport {\n AnimationOptions,\n BackdropMode,\n BaseModalConfig,\n CloseMode,\n FormFieldConfig,\n FormFieldGroup,\n KeyboardMode,\n ModalCancelHandler,\n ModalFooterAction,\n ModalI18nLabels,\n ModalInputMap,\n ModalIntent,\n ModalPollingConfig,\n ModalSize,\n StepBodyConfig,\n TemplateRef,\n Type,\n} from '../mn-modal.types';\nimport {ValidatorFn} from '@angular/forms';\n\nexport abstract class BaseModalBuilder<TConfig extends BaseModalConfig<TResult> & FormContainerConfig<TModel>, TResult = unknown, TModel = unknown> {\n protected config: TConfig;\n protected layoutBuilder: FormLayoutBuilder<TModel, this>;\n\n protected constructor(initialConfig: TConfig) {\n this.config = initialConfig;\n this.layoutBuilder = new FormLayoutBuilder<TModel, this>(\n this.config,\n this\n );\n }\n\n title(title: string): this {\n this.config.title = title;\n return this;\n }\n\n subtitle(subtitle: string): this {\n this.config.subtitle = subtitle;\n return this;\n }\n\n description(description: string): this {\n this.config.description = description;\n return this;\n }\n\n closeGuard(guard: () => Promise<boolean> | boolean): this {\n this.config.closeGuard = guard;\n return this;\n }\n\n /** Set the width of the modal */\n sizeWidth(size: ModalSize): this {\n this.config.sizeWidth = size;\n return this;\n }\n\n /** Set the height of the modal */\n sizeHeight(size: ModalSize): this {\n this.config.sizeHeight = size;\n return this;\n }\n\n closeMode(mode: CloseMode): this {\n this.config.closeMode = mode;\n return this;\n }\n\n backdrop(mode: BackdropMode): this {\n this.config.backdrop = mode;\n return this;\n }\n\n keyboard(mode: KeyboardMode): this {\n this.config.keyboard = mode;\n return this;\n }\n\n intent(intent: ModalIntent): this {\n this.config.intent = intent;\n return this;\n }\n\n readOnly(readOnly = true): this {\n this.config.readOnly = readOnly;\n return this;\n }\n\n disabled(disabled = true): this {\n this.config.disabled = disabled;\n return this;\n }\n\n footerActions(actions: ModalFooterAction<TResult>[]): this {\n this.config.footerActions = actions;\n return this;\n }\n\n polling(config: ModalPollingConfig<TResult>): this {\n this.config.polling = config;\n return this;\n }\n\n onCancel(handler: ModalCancelHandler<TResult>): this {\n this.config.onCancel = handler;\n return this;\n }\n\n i18n(labels: ModalI18nLabels): this {\n this.config.i18n = labels;\n return this;\n }\n\n component(component: Type<unknown>): this {\n this.config.component = component;\n return this;\n }\n\n template(template: TemplateRef<unknown>): this {\n this.config.template = template;\n return this;\n }\n\n inputs(inputs: ModalInputMap): this {\n this.config.inputs = inputs;\n return this;\n }\n\n animation(animation: AnimationOptions | AnimationOptions['type']): this {\n this.config.animation = animation;\n return this;\n }\n\n /**\n * Control whether the modal renders as a bottom sheet on small screens (< 640px).\n * Enabled by default; pass `false` to keep a centered dialog on mobile.\n */\n mobileBottomSheet(enabled = true): this {\n this.config.mobileBottomSheet = enabled;\n return this;\n }\n\n /**\n * Add a custom body/content to the modal.\n */\n body(body: StepBodyConfig): this {\n return this.layoutBuilder.body(body);\n }\n\n /**\n * Add a field.\n */\n field(field: FormFieldConfig<TModel>): this {\n return this.layoutBuilder.field(field);\n }\n\n /**\n * Add a field with a fluent validation builder.\n */\n fieldWithValidators(field: FormFieldConfig<TModel>): FieldValidatorBuilder<TModel, this> {\n return this.layoutBuilder.fieldWithValidators(field);\n }\n\n /**\n * Start a new row.\n */\n row(columns = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n /**\n * Add a field to the current row.\n */\n addToRow(field: FormFieldConfig<TModel>, span = 1): this {\n return this.layoutBuilder.addToRow(field, span);\n }\n\n /**\n * Declarative way to add a row.\n */\n addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): this {\n return this.layoutBuilder.addRow(columns, buildFn);\n }\n\n /**\n * Add a field group.\n */\n fieldGroup(group: FormFieldGroup<TModel>): this;\n fieldGroup(title: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(title: string, description: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: ChainableGroupBuilder<TModel>) => void),\n arg3?: (group: ChainableGroupBuilder<TModel>) => void\n ): this {\n if (typeof arg1 !== 'string') {\n return this.layoutBuilder.fieldGroup(arg1);\n }\n if (typeof arg2 === 'string') {\n return this.layoutBuilder.fieldGroup(arg1, arg2, arg3!);\n }\n return this.layoutBuilder.fieldGroup(arg1, arg2!);\n }\n\n groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n build(): Readonly<TConfig> {\n this.layoutBuilder.flushCurrentRow();\n return Object.freeze({ ...this.config });\n }\n}\n","import {BaseModalBuilder} from './base-modal.builder';\nimport {StepBuilder} from './step.builder';\nimport {\n ModalKind,\n ModalResultHandler,\n ModalStepId,\n WizardBeforeCompleteValidator,\n WizardFlowMode,\n WizardModalConfig,\n WizardResult,\n WizardStepChangeHandler,\n WizardStepConfig,\n} from '../mn-modal.types';\n\nexport class WizardModalBuilder<TResult = WizardResult> extends BaseModalBuilder<\n WizardModalConfig<TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.WIZARD,\n steps: [],\n } as unknown as WizardModalConfig<TResult>);\n }\n\n /**\n * Set initial values for the entire wizard.\n * Note: This will be merged with individual step initial values.\n */\n initialValue(value: Partial<TResult>): this {\n this.config.initialValue = value;\n return this;\n }\n\n /**\n * Description is not supported for wizard modals.\n * Use step-level body text instead.\n */\n override description(_description: string): this {\n return this;\n }\n\n step<TStepModel = unknown>(\n step: WizardStepConfig<TStepModel> | ((builder: StepBuilder<TStepModel>) => void)\n ): this {\n if (typeof step === 'function') {\n const builder = new StepBuilder<TStepModel>('', '');\n step(builder);\n const builtStep = builder.build();\n this.config.steps.push(builtStep as unknown as WizardStepConfig<unknown>);\n } else {\n this.config.steps.push(step as unknown as WizardStepConfig<unknown>);\n }\n return this;\n }\n\n addStep<TStepModel = unknown>(\n title: string,\n buildFn: (builder: StepBuilder<TStepModel>) => void,\n id?: ModalStepId\n ): this {\n const stepId = id || `step-${this.config.steps.length}`;\n const builder = new StepBuilder<TStepModel>(stepId, title);\n buildFn(builder);\n const builtStep = builder.build();\n this.config.steps.push(builtStep as unknown as WizardStepConfig<unknown>);\n return this;\n }\n\n startAt(stepId: ModalStepId): this {\n this.config.startStepId = stepId;\n return this;\n }\n\n flow(mode: WizardFlowMode): this {\n this.config.flow = mode;\n return this;\n }\n\n onStepChange(handler: WizardStepChangeHandler): this {\n this.config.onStepChange = handler;\n return this;\n }\n\n onComplete(handler: ModalResultHandler<TResult>): this {\n this.config.onComplete = handler;\n return this;\n }\n\n onBeforeComplete(validators: WizardBeforeCompleteValidator<TResult>[]): this {\n this.config.onBeforeComplete = validators;\n return this;\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport {\n FormModalConfig,\n ModalKind,\n FormFieldConfig,\n FormLayoutMode,\n SubmitMode,\n ModalResultHandler,\n FormValidator,\n MultiSelectTableFieldConfig,\n SingleSelectTableFieldConfig,\n} from '../mn-modal.types';\nimport {ValidatorFn} from '@angular/forms';\n\nexport class FormModalBuilder<TModel = unknown, TResult = TModel> extends BaseModalBuilder<\n FormModalConfig<TModel, TResult>,\n TResult,\n TModel\n> {\n constructor() {\n super({\n kind: ModalKind.FORM,\n fields: [],\n rows: [],\n });\n }\n\n /**\n * Override to also accept table field configs with a concrete TRow (BehaviorSubject is invariant,\n * so TableDataSource<TeamMember> is not assignable to TableDataSource<unknown>).\n */\n override field(field: FormFieldConfig<TModel>): this;\n override field<TRow>(field: MultiSelectTableFieldConfig<TModel, TRow> | SingleSelectTableFieldConfig<TModel, TRow>): this;\n override field<TRow = unknown>(\n field: FormFieldConfig<TModel> | MultiSelectTableFieldConfig<TModel, TRow> | SingleSelectTableFieldConfig<TModel, TRow>\n ): this {\n return super.field(field as FormFieldConfig<TModel>);\n }\n\n layout(mode: FormLayoutMode): this {\n this.config.layout = mode;\n return this;\n }\n\n initialValue(value: Partial<TModel>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n submitMode(mode: SubmitMode): this {\n this.config.submitMode = mode;\n return this;\n }\n\n onComplete(handler: ModalResultHandler<TResult>): this {\n this.config.onComplete = handler;\n return this;\n }\n\n formValidators(validators: FormValidator<TModel>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n override groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n override build(): Readonly<FormModalConfig<TModel, TResult>> {\n return super.build();\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport {\n ConfirmationModalConfig,\n ModalKind,\n ConfirmationTone,\n ConfirmationActionConfig,\n CancellationActionConfig,\n FormValidator,\n} from '../mn-modal.types';\nimport {ValidatorFn} from '@angular/forms';\n\nexport class ConfirmationModalBuilder<TResult = boolean> extends BaseModalBuilder<\n ConfirmationModalConfig<TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.CONFIRMATION,\n message: '',\n fields: [],\n rows: [],\n });\n }\n\n message(text: string): this {\n this.config.message = text;\n return this;\n }\n\n tone(tone: ConfirmationTone): this {\n this.config.tone = tone;\n return this;\n }\n\n confirmAction(action: ConfirmationActionConfig<TResult>): this {\n this.config.confirm = action;\n return this;\n }\n\n cancelAction(action: CancellationActionConfig): this {\n this.config.cancel = action;\n return this;\n }\n\n initialValue(value: Partial<unknown>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n formValidators(validators: FormValidator<unknown>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n override groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n override build(): Readonly<ConfirmationModalConfig<TResult>> {\n return super.build();\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport {\n CustomModalConfig,\n ModalKind,\n ModalResultHandler,\n} from '../mn-modal.types';\n\nexport class CustomModalBuilder<TResult = unknown> extends BaseModalBuilder<\n CustomModalConfig<TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.CUSTOM,\n });\n }\n\n onComplete(handler: ModalResultHandler<TResult>): this {\n this.config.onComplete = handler;\n return this;\n }\n}\n","import { WizardModalBuilder } from './wizard-modal.builder';\nimport { FormModalBuilder } from './form-modal.builder';\nimport { ConfirmationModalBuilder } from './confirmation-modal.builder';\nimport { CustomModalBuilder } from './custom-modal.builder';\nimport {WizardResult} from '../mn-modal.types';\n\nexport class ModalBuilder {\n static wizard<TResult = WizardResult>(): WizardModalBuilder<TResult> {\n return new WizardModalBuilder<TResult>();\n }\n\n static form<TModel = unknown, TResult = TModel>(): FormModalBuilder<TModel, TResult> {\n return new FormModalBuilder<TModel, TResult>();\n }\n\n static confirmation<TResult = boolean>(): ConfirmationModalBuilder<TResult> {\n return new ConfirmationModalBuilder<TResult>();\n }\n\n static custom<TResult = unknown>(): CustomModalBuilder<TResult> {\n return new CustomModalBuilder<TResult>();\n }\n}\n","import { Observable, Subject } from 'rxjs';\nimport {ComponentRef} from '@angular/core';\nimport {\n ModalRef,\n ModalCloseEvent,\n ModalCloseReason,\n BaseModalConfig,\n} from './mn-modal.types';\n\nexport class MnModalRef<TResult = unknown> implements ModalRef<TResult> {\n private readonly closeSubject = new Subject<ModalCloseEvent<TResult>>();\n public readonly afterClosed$: Observable<ModalCloseEvent<TResult>> = this.closeSubject.asObservable();\n\n constructor(\n private componentRef: ComponentRef<unknown>,\n private config: BaseModalConfig<TResult>\n ) {}\n\n close(result?: TResult): void {\n const event: ModalCloseEvent<TResult> = {\n reason: ModalCloseReason.COMPLETED,\n result,\n };\n this.animateAndDestroy(event);\n }\n\n dismiss(reason: ModalCloseReason): void {\n const event: ModalCloseEvent<TResult> = {\n reason,\n };\n this.animateAndDestroy(event);\n }\n\n private async animateAndDestroy(event: ModalCloseEvent<TResult>): Promise<void> {\n const shell = this.componentRef.instance as { startClosing?: () => Promise<void> };\n if (shell && typeof shell.startClosing === 'function') {\n await shell.startClosing();\n }\n this.closeSubject.next(event);\n this.closeSubject.complete();\n this.destroy();\n }\n\n update(config: Partial<BaseModalConfig<TResult>>): void {\n Object.assign(this.config, config);\n // Trigger change detection on the shell component\n this.componentRef.changeDetectorRef.detectChanges();\n }\n\n get component(): unknown {\n return this.componentRef.instance;\n }\n\n private destroy(): void {\n this.componentRef.destroy();\n }\n}\n","import {\n Directive,\n Input,\n ViewContainerRef,\n OnInit,\n OnDestroy,\n ComponentRef,\n Type,\n forwardRef,\n inject\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { ModalInputMap } from '../../mn-modal.types';\n\n@Directive({\n selector: '[mnCustomFieldHost]',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MnCustomFieldHostDirective),\n multi: true,\n },\n ],\n})\nexport class MnCustomFieldHostDirective implements OnInit, OnDestroy, ControlValueAccessor {\n private vcr = inject(ViewContainerRef);\n\n @Input() component!: Type<unknown>;\n @Input() inputs?: ModalInputMap;\n\n private componentRef?: ComponentRef<unknown>;\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n ngOnInit(): void {\n if (!this.component) return;\n\n this.vcr.clear();\n this.componentRef = this.vcr.createComponent(this.component);\n\n // Pass inputs to the component\n if (this.inputs) {\n Object.entries(this.inputs).forEach(([key, value]) => {\n (this.componentRef!.instance as Record<string, unknown>)[key] = value;\n });\n }\n\n // Wire up value accessor if the component supports it\n const instance = this.componentRef.instance as {\n registerOnChange?: (fn: (val: unknown) => void) => void;\n registerOnTouched?: (fn: () => void) => void;\n };\n if (typeof instance.registerOnChange === 'function') {\n instance.registerOnChange((val: unknown) => this.onChange(val));\n }\n if (typeof instance.registerOnTouched === 'function') {\n instance.registerOnTouched(() => this.onTouched());\n }\n }\n\n ngOnDestroy(): void {\n this.componentRef?.destroy();\n }\n\n writeValue(val: unknown): void {\n const instance = this.componentRef?.instance as { writeValue?: (val: unknown) => void };\n if (instance && typeof instance.writeValue === 'function') {\n instance.writeValue(val);\n }\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n const instance = this.componentRef?.instance as { setDisabledState?: (isDisabled: boolean) => void };\n if (instance && typeof instance.setDisabledState === 'function') {\n instance.setDisabledState(isDisabled);\n }\n }\n}\n","import {TemplateRef} from '@angular/core';\nimport {MnSkeletonProps} from '../mn-skeleton';\nimport {MnCollectionLabels, MnSelectableCollectionDataSource} from '../mn-collection';\n\n// ── Column Sort Type ──\nexport enum ColumnSortType {\n ALPHABETICAL = 'ALPHABETICAL',\n NUMERICAL = 'NUMERICAL',\n DATE = 'DATE',\n NONE = 'NONE',\n}\n\n// ── Sort State ──\nexport type SortState = {\n columnKey: string;\n direction: 'asc' | 'desc';\n}\n\n// ── Appearance ──\nexport type TableAppearance = {\n striped?: boolean;\n hover?: boolean;\n compact?: boolean;\n bordered?: boolean;\n}\n\n// ── Column Filter Type ──\nexport type ColumnFilterType = 'text' | 'select';\n\n// ── Column Filter Option ──\nexport type ColumnFilterOption = {\n label: string;\n value: string;\n}\n\n// ── Column Skeleton ──\n/**\n * Customizes the loading-skeleton placeholder rendered in a column's cells.\n * Either a partial {@link MnSkeletonProps} (shape/width/height/animated) or a\n * `TemplateRef` for a fully custom placeholder. When omitted, a text-shaped\n * skeleton at 75% width is used (matching the previous default).\n */\nexport type ColumnSkeleton = Partial<MnSkeletonProps> | TemplateRef<unknown>;\n\n// ── Column Definition ──\nexport type ColumnDefinition<T> = {\n key: string;\n header: string | TemplateRef<unknown>;\n /** Translation key for the column header. When set, mn-table resolves it via MnLanguageService and keeps it updated on locale change. */\n headerKey?: string;\n cell: ((row: T) => string) | TemplateRef<unknown>;\n /** Alternative cell renderer shown below the given breakpoint. When set, `cell` is hidden below this breakpoint and `cellSm` is shown instead. */\n cellSm?: { below: 'sm' | 'md' | 'lg'; cell: ((row: T) => string) | TemplateRef<unknown> };\n sortType?: ColumnSortType;\n getRawValueToSort?: (row: T) => unknown;\n width?: string;\n align?: 'left' | 'center' | 'right';\n hiddenBelow?: 'sm' | 'md' | 'lg';\n /** Whether this column supports per-column filtering. */\n filterable?: boolean;\n /** Type of filter input: 'text' for free-text, 'select' for dropdown. Defaults to 'text'. */\n filterType?: ColumnFilterType;\n /** Options for 'select' filter type. */\n filterOptions?: ColumnFilterOption[];\n /** Placeholder text for the filter input. */\n filterPlaceholder?: string;\n /** Translation key for the filter placeholder. When set, mn-table resolves it via MnLanguageService. */\n filterPlaceholderKey?: string;\n /** Whether the filter input is disabled. */\n filterDisabled?: boolean;\n /** Autocomplete attribute for the filter input. */\n filterAutocomplete?: string;\n /** Maximum character length for text filter inputs. */\n filterMaxLength?: number;\n /** Custom filter function. Receives the row and the current filter value. */\n filterFn?: (row: T, filterValue: string) => boolean;\n /** Customizes the loading-skeleton placeholder shown in this column's cells while data loads. */\n skeleton?: ColumnSkeleton;\n}\n\n// ── Table Data Source ──\nexport type TableDataSource<T> = MnSelectableCollectionDataSource<T> & {\n columns: ColumnDefinition<T>[];\n\n // Sorting\n defaultSort?: SortState;\n\n // Row interaction\n onRowClick?: (row: T) => void;\n\n // Appearance\n appearance?: TableAppearance;\n\n // Toolbar\n /** Template rendered on the left side of the toolbar (before the search field). */\n toolbarLeftTemplate?: TemplateRef<unknown>;\n /** Template rendered on the right side of the toolbar (after the search field). */\n toolbarRightTemplate?: TemplateRef<unknown>;\n\n // Responsive filters\n /**\n * Label for the toggle button that opens the stacked filter panel on small\n * screens (below 640px). Defaults to \"Filters\".\n */\n filtersLabel?: string;\n /** Translation key for {@link filtersLabel}. Resolved via MnLanguageService. */\n filtersLabelKey?: string;\n /**\n * Label for the action that resets every column filter in the small-screen\n * panel. Defaults to \"Clear all\".\n */\n clearFiltersLabel?: string;\n /** Translation key for {@link clearFiltersLabel}. Resolved via MnLanguageService. */\n clearFiltersLabelKey?: string;\n}\n\n/** @deprecated Use {@link MnCollectionLabels}. */\nexport type TableLabels = MnCollectionLabels;\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnSkeletonVariants = tv({\n base: 'bg-base-300 relative overflow-hidden',\n variants: {\n shape: {\n // Each shape carries a sensible default size so a bare <mn-skeleton> stays\n // visible. The width/height inputs are applied as inline styles, which win\n // over these utility classes whenever the consumer supplies dimensions.\n rectangle: 'rounded-md h-4',\n circle: 'rounded-full h-10 w-10',\n text: 'rounded h-4',\n },\n },\n defaultVariants: {\n shape: 'rectangle',\n },\n});\n\nexport type MnSkeletonVariantProps = VariantProps<typeof mnSkeletonVariants>;\n","import {Component, HostBinding, Input} from '@angular/core';\nimport {MnSkeletonProps} from './mn-skeletonTypes';\nimport {mnSkeletonVariants} from './mn-skeletonVariants';\n\n@Component({\n selector: 'mn-skeleton',\n standalone: true,\n templateUrl: './mn-skeleton.html',\n styleUrls: ['./mn-skeleton.css'],\n})\nexport class MnSkeleton {\n @Input() data: Partial<MnSkeletonProps> = {};\n\n // Skeletons are decorative loading placeholders; hide them from assistive tech.\n // The container that swaps skeleton↔content should carry aria-busy / a live region.\n @HostBinding('attr.aria-hidden') readonly ariaHidden = 'true';\n\n @HostBinding('class')\n get hostClasses(): string {\n return mnSkeletonVariants({shape: this.data.shape});\n }\n\n @HostBinding('style.width')\n get width(): string | null {\n return this.data.width ?? null;\n }\n\n @HostBinding('style.height')\n get height(): string | null {\n return this.data.height ?? null;\n }\n\n get isAnimated(): boolean {\n return this.data.animated !== false;\n }\n}\n","@if (isAnimated) {\n <span class=\"mn-skeleton-shimmer-bar\"></span>\n}\n","import {Directive, ElementRef, Input, OnChanges, Renderer2, inject} from '@angular/core';\n\n/**\n * Attribute directive that applies responsive-hiding classes to table cells/headers.\n * Hides the element by default and shows it as `table-cell` at the specified breakpoint.\n *\n * Uses a static class map so Tailwind CSS can detect the full class names at build time.\n *\n * Usage: `<td [mnHiddenBelow]=\"column.hiddenBelow\">`\n */\n@Directive({\n selector: '[mnHiddenBelow]',\n standalone: true,\n})\nexport class MnHiddenBelowDirective implements OnChanges {\n /** The breakpoint below which the element is hidden. */\n @Input() mnHiddenBelow: 'sm' | 'md' | 'lg' | undefined;\n\n private readonly el = inject(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private appliedClasses: string[] = [];\n\n /** Static mapping of breakpoints to their full Tailwind class names. */\n private readonly classMap: Record<string, string[]> = {\n sm: ['hidden', 'sm:table-cell'],\n md: ['hidden', 'md:table-cell'],\n lg: ['hidden', 'lg:table-cell'],\n };\n\n ngOnChanges(): void {\n // Remove previously applied classes\n for (const cls of this.appliedClasses) {\n this.renderer.removeClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = [];\n\n if (this.mnHiddenBelow && this.classMap[this.mnHiddenBelow]) {\n const classes = this.classMap[this.mnHiddenBelow];\n for (const cls of classes) {\n this.renderer.addClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = classes;\n }\n }\n}\n","import {Directive, ElementRef, inject, Input, OnChanges, Renderer2} from '@angular/core';\n\n/**\n * Attribute directive that hides an element below the given breakpoint and shows it at/above.\n * Uses `hidden` + `{bp}:inline` so the element is invisible on small screens.\n *\n * Usage: `<span [mnShowAbove]=\"'sm'\">`\n */\n@Directive({\n selector: '[mnShowAbove]',\n standalone: true,\n})\nexport class MnShowAboveDirective implements OnChanges {\n /** The breakpoint at/above which the element becomes visible. */\n @Input() mnShowAbove: 'sm' | 'md' | 'lg' | undefined;\n\n private readonly el = inject(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private appliedClasses: string[] = [];\n\n /** Static mapping of breakpoints to their full Tailwind class names. */\n private readonly classMap: Record<string, string[]> = {\n sm: ['hidden', 'sm:inline'],\n md: ['hidden', 'md:inline'],\n lg: ['hidden', 'lg:inline'],\n };\n\n ngOnChanges(): void {\n for (const cls of this.appliedClasses) {\n this.renderer.removeClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = [];\n\n if (this.mnShowAbove && this.classMap[this.mnShowAbove]) {\n const classes = this.classMap[this.mnShowAbove];\n for (const cls of classes) {\n this.renderer.addClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = classes;\n }\n }\n}\n","import {Directive, ElementRef, inject, Input, OnChanges, Renderer2} from '@angular/core';\n\n/**\n * Attribute directive that shows an element below the given breakpoint and hides it at/above.\n * Uses `inline` by default + `{bp}:hidden` so the element is only visible on small screens.\n *\n * Usage: `<span [mnShowBelow]=\"'sm'\">`\n */\n@Directive({\n selector: '[mnShowBelow]',\n standalone: true,\n})\nexport class MnShowBelowDirective implements OnChanges {\n /** The breakpoint below which the element is visible. */\n @Input() mnShowBelow: 'sm' | 'md' | 'lg' | undefined;\n\n private readonly el = inject(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private appliedClasses: string[] = [];\n\n /** Static mapping of breakpoints to their full Tailwind class names. */\n private readonly classMap: Record<string, string[]> = {\n sm: ['inline', 'sm:hidden'],\n md: ['inline', 'md:hidden'],\n lg: ['inline', 'lg:hidden'],\n };\n\n ngOnChanges(): void {\n for (const cls of this.appliedClasses) {\n this.renderer.removeClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = [];\n\n if (this.mnShowBelow && this.classMap[this.mnShowBelow]) {\n const classes = this.classMap[this.mnShowBelow];\n for (const cls of classes) {\n this.renderer.addClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = classes;\n }\n }\n}\n","import {TemplateRef} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\n\n// ── Pagination Strategy ──\nexport type PaginationStrategy = {\n hasMoreRows: boolean;\n loadMore: () => Promise<void>;\n reset?: () => void;\n}\n\nexport type CursorPaginationStrategy = {\n endCursor?: string;\n} & PaginationStrategy\n\nexport type OffsetPaginationStrategy = {\n currentPage: number;\n pageSize: number;\n totalItems?: number;\n} & PaginationStrategy\n\n// ── Data lifecycle state ──\n/**\n * Lifecycle state of a collection's data, driving which chrome the component\n * renders: skeleton placeholders ({@link LOADING}), the rows or empty state\n * ({@link RETRIEVED}), or an error placeholder ({@link ERROR}).\n *\n * Because the components are zoneless and OnPush, a consumer that flips `state`\n * to `ERROR` (or `RETRIEVED`) must also emit on `dataRows` (e.g. `dataRows.next([])`)\n * so the component runs change detection and re-reads the new state.\n */\nexport enum MnCollectionState {\n /** Data is being (re)loaded; skeleton placeholders are shown. */\n LOADING = 'LOADING',\n /** Data has loaded (possibly empty); rows or the empty state are shown. */\n RETRIEVED = 'RETRIEVED',\n /** Loading failed; the error placeholder is shown. */\n ERROR = 'ERROR',\n}\n\n// ── Pagination Mode ──\nexport type PaginationMode =\n | 'none'\n | 'load-more'\n | 'paginated'\n | 'client-side-pagination'\n | 'infinite-scroll';\n\n// ── Shared Labels / i18n ──\nexport type MnCollectionLabels = {\n loadMore?: string;\n /** Translation key for the \"Load more\" button label. */\n loadMoreKey?: string;\n rowsPerPage?: string;\n /** Translation key for the \"Rows per page\" label. */\n rowsPerPageKey?: string;\n}\n\n/**\n * Chrome shared by every MnLib collection component (table, list, grid):\n * data, search, pagination, loading/skeleton, empty state and i18n. Component\n * data sources ({@link import('../mn-table').TableDataSource},\n * {@link import('../mn-list').ListDataSource},\n * {@link import('../mn-grid').GridDataSource}) extend this with their own\n * rendering contract (columns / item template / card template).\n */\nexport type MnCollectionDataSource<T> = {\n dataRows: BehaviorSubject<T[]>;\n getID: (row: T) => string;\n\n emptyMessage: string;\n /** Translation key for the empty message. When set, the component resolves it via MnLanguageService. */\n emptyMessageKey?: string;\n emptyTemplate?: TemplateRef<unknown>;\n\n /**\n * Lifecycle state of the data, controlling loading / error / empty rendering.\n * Defaults to {@link MnCollectionState.RETRIEVED} when not set.\n */\n state?: MnCollectionState;\n /** Number of placeholder rows rendered while data is loading. Defaults to 5. */\n skeletonRowCount?: number;\n\n /** Message shown in the error placeholder when {@link state} is ERROR. */\n errorMessage?: string;\n /** Translation key for {@link errorMessage}; resolved via MnLanguageService. */\n errorMessageKey?: string;\n /** Custom template rendered in place of the default error placeholder. */\n errorTemplate?: TemplateRef<unknown>;\n\n // Search\n canSearch: boolean;\n searchPlaceholder?: string;\n /** Translation key for the search placeholder. When set, the component resolves it via MnLanguageService. */\n searchPlaceholderKey?: string;\n isInSearch?: (row: T, searchValue: string) => boolean;\n searchForAdditionalItems?: (searchValue: string) => Promise<T[]>;\n\n /**\n * Callback invoked when the user types in the search box (server-side search).\n * When provided, the component skips client-side filtering and delegates to the consumer.\n */\n onServerSearch?: (searchValue: string) => void;\n\n // Pagination\n paginationMode?: PaginationMode;\n paginationStrategy?: PaginationStrategy;\n loadAdditionalRows?: () => Promise<T[]>;\n\n /** Number of items per page when paginationMode is 'paginated'. Defaults to 10. */\n pageSize?: number;\n\n /** Options for the page-size selector dropdown. Defaults to [5, 10, 25, 50]. */\n pageSizeOptions?: number[];\n\n /** Callback invoked when the user changes the page size via the dropdown. */\n onPageSizeChange?: (newSize: number) => void;\n\n /**\n * Total number of items on the server.\n * When set, pagination and infinite-scroll use this instead of filteredItems.length.\n */\n totalItems?: number;\n\n /**\n * Callback invoked when the user navigates to a different page.\n * When provided, the component delegates pagination to the consumer (server-side).\n */\n onPageChange?: (page: number) => void;\n\n /**\n * Callback invoked when the user scrolls to the bottom in infinite-scroll mode.\n * When provided, the component delegates loading more rows to the consumer (server-side).\n */\n onLoadMore?: () => void;\n\n // Labels / i18n\n labels?: MnCollectionLabels;\n}\n\n/**\n * Adds row/item selection to {@link MnCollectionDataSource}. Used by components\n * that support selection (table, list); grid intentionally omits it.\n */\nexport type MnSelectableCollectionDataSource<T> = MnCollectionDataSource<T> & {\n selectionMode?: 'none' | 'single' | 'multi';\n selectedRows?: BehaviorSubject<T[]>;\n /** IDs to pre-select when the component initializes. */\n initialSelectedIds?: string[];\n}\n","import {\n afterEveryRender,\n ChangeDetectorRef,\n Directive,\n DoCheck,\n ElementRef,\n inject,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n} from '@angular/core';\nimport {debounceTime, skip, Subject, Subscription} from 'rxjs';\nimport {MnLanguageService} from '../../language';\nimport {MnSelectOption} from '../mn-select';\nimport {MnCollectionDataSource, MnCollectionState} from './mn-collection.types';\n\n/**\n * Shared chrome for MnLib collection components (table, list, grid):\n * data subscription, client/server search, every pagination mode, load-more,\n * skeleton-row count, empty-state plumbing, common i18n key resolution and\n * toolbar change-detection.\n *\n * Concrete components extend this (or {@link MnSelectableCollectionBase}) and\n * implement only their rendering. The class is decorated `@Directive()` so it can\n * declare `@Input`s and use `inject()` while remaining abstract.\n *\n * Init runs in a fixed order (see {@link ngOnInit}); subclasses hook in via the\n * `protected` template methods rather than overriding `ngOnInit`.\n */\n@Directive()\nexport abstract class MnCollectionBase<T, DS extends MnCollectionDataSource<T>>\n implements OnInit, OnDestroy, DoCheck {\n @Input() dataSource!: DS;\n\n filteredItems: T[] = [];\n paginatedItems: T[] = [];\n searchValue = '';\n loadingMoreRows = false;\n\n currentPage = 1;\n pageSize = 10;\n\n /**\n * Measured pixel height of the body container, applied as a `min-height` floor\n * while a server reload is in flight so the container can't collapse when the\n * data rows are swapped for skeletons. Released in {@link ngDoCheck} the moment\n * the loading state clears. `0` means no lock.\n */\n lockedMinHeight = 0;\n\n /**\n * Measured pixel height of one full page, applied as a persistent `min-height` floor\n * while paginated so a short page (the last page, or after a row is removed/filtered)\n * can't collapse the body and jump the layout below it. Blank space fills the remaindernpm\n * at the bottom. Captured once a full page is actually on screen; `0` means unmeasured.\n * Distinct from the transient {@link lockedMinHeight} reload lock — both combine in\n * {@link bodyMinHeight} via `Math.max`.\n */\n fullPageHeight = 0;\n\n /** Write-once guard so {@link fullPageHeight} is measured once per pageSize. */\n private pageHeightMeasured = false;\n\n protected readonly cdr = inject(ChangeDetectorRef);\n protected readonly lang = inject(MnLanguageService);\n /** Prefix used in validation error messages, e.g. `MnList`. Overridden by subclasses. */\n protected readonly componentName: string = 'MnCollection';\n private dataSubscription?: Subscription;\n private searchSubject = new Subject<string>();\n private searchSubscription?: Subscription;\n private langSubscription?: Subscription;\n /** Tracks the previous toolbar template reference for change detection. */\n private previousToolbarTemplate?: TemplateRef<unknown>;\n\n constructor() {\n // Measure the body's height once a full page is on screen and cache it as the persistent\n // {@link fullPageHeight} floor. Runs after every render (outside change detection, so\n // writing the bound field can't trigger `ExpressionChangedAfterItHasBeenChecked`); the\n // {@link pageHeightMeasured} guard limits the actual measurement to once per pageSize.\n afterEveryRender(() => {\n if (this.pageHeightMeasured || !this.isPaginated || this.isLoadingState) return;\n if (this.paginatedItems.length !== this.pageSize) return;\n const el = this.collectionBody?.nativeElement;\n if (!el) return;\n this.fullPageHeight = el.offsetHeight;\n this.pageHeightMeasured = true;\n this.cdr.markForCheck();\n });\n }\n\n // ── Data lifecycle state ──\n\n /**\n * Single source of truth for the data lifecycle: the explicit\n * {@link MnCollectionDataSource.state}, defaulting to RETRIEVED when unset.\n * Every internal loading check routes through this.\n */\n get collectionState(): MnCollectionState {\n return this.dataSource.state ?? MnCollectionState.RETRIEVED;\n }\n\n /** Whether the collection is currently loading (skeleton placeholders shown). */\n get isLoadingState(): boolean {\n return this.collectionState === MnCollectionState.LOADING;\n }\n\n /** Whether loading failed (the error placeholder is shown instead of rows/empty). */\n get isErrorState(): boolean {\n return this.collectionState === MnCollectionState.ERROR;\n }\n\n // ── Template-method hooks ──\n\n /** Whether the component delegates search to the consumer (server-side). */\n get isServerSearched(): boolean {\n return !!this.dataSource.onServerSearch;\n }\n\n get isPaginated(): boolean {\n const mode = this.dataSource.paginationMode;\n return mode === 'paginated' || mode === 'client-side-pagination';\n }\n\n /** Whether the component delegates pagination to the consumer (server-side). */\n get isServerPaginated(): boolean {\n const mode = this.dataSource.paginationMode ?? 'load-more';\n return mode === 'paginated' || mode === 'load-more';\n }\n\n get showLoadMore(): boolean {\n const mode = this.dataSource.paginationMode ?? 'load-more';\n // Server-side load-more: check if there are more items to load.\n if (this.dataSource.onLoadMore) {\n const totalItems = this.dataSource.totalItems ?? 0;\n return mode === 'load-more' && this.filteredItems.length < totalItems;\n }\n const strategy = this.dataSource.paginationStrategy;\n const hasMore = strategy ? strategy.hasMoreRows : !!this.dataSource.loadAdditionalRows;\n return mode === 'load-more' && hasMore;\n }\n\n // ── Height stabilization ──\n\n /**\n * The measured full-page {@link fullPageHeight} floor, but only while it should apply:\n * paginated, not loading, with rows present. Keeps a short page from collapsing the body.\n */\n get reservedPageHeight(): number {\n if (this.isPaginated && !this.isLoadingState && this.filteredItems.length > 0) {\n return this.fullPageHeight;\n }\n return 0;\n }\n\n /**\n * `min-height` (px) applied to the body: the larger of the transient reload lock and the\n * persistent full-page floor, so neither can shrink the body below the other. `null` clears it.\n */\n get bodyMinHeight(): number | null {\n return Math.max(this.lockedMinHeight, this.reservedPageHeight) || null;\n }\n\n // ── Lifecycle ──\n\n /** Total number of items, accounting for server-side pagination. */\n get totalItemCount(): number {\n if (this.isServerPaginated && this.dataSource.totalItems != null) {\n return this.dataSource.totalItems;\n }\n return this.filteredItems.length;\n }\n\n get totalPages(): number {\n return Math.max(1, Math.ceil(this.totalItemCount / this.pageSize));\n }\n\n get resolvedPageSizeOptions(): number[] {\n return this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n }\n\n // ── Search ──\n\n /** Page-size options formatted for mn-select. */\n get pageSizeSelectOptions(): MnSelectOption<number>[] {\n return this.resolvedPageSizeOptions.map(opt => ({label: String(opt), value: opt}));\n }\n\n get visiblePages(): number[] {\n const total = this.totalPages;\n const current = this.currentPage;\n const maxVisible = 3;\n let start = Math.max(1, current - Math.floor(maxVisible / 2));\n let end = start + maxVisible - 1;\n if (end > total) {\n end = total;\n start = Math.max(1, end - maxVisible + 1);\n }\n const pages: number[] = [];\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n return pages;\n }\n\n // ── Pagination ──\n /**\n * Body container wrapping the skeleton/data swap region, used to measure its\n * height for {@link lockBodyHeight}. Implemented by each component with a\n * `@ViewChild('collectionBody')` so the template reference resolves there.\n */\n protected abstract collectionBody?: ElementRef<HTMLElement>;\n\n /** The toolbar template whose identity is watched in change detection. */\n protected abstract get trackedToolbarTemplate(): TemplateRef<unknown> | undefined;\n\n get skeletonRows(): number[] {\n // Explicit override wins; otherwise match the rows currently on screen so the\n // skeleton fills the same space on a reload; fall back to 5 on the first load.\n const count = this.dataSource.skeletonRowCount ?? (this.paginatedItems.length || 5);\n return Array.from({length: count});\n }\n\n ngOnInit(): void {\n this.validateDataSource();\n this.resolveTranslationKeys();\n this.pageSize = this.dataSource.pageSize ?? 10;\n this.beforeInitialFilter();\n\n this.applyFilter(false);\n\n // Skip the initial BehaviorSubject emission (already handled above).\n this.dataSubscription = this.dataSource.dataRows.pipe(skip(1)).subscribe(() => {\n this.applyFilter(false);\n this.cdr.markForCheck();\n });\n\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(300))\n .subscribe(value => {\n this.searchValue = value;\n this.applyFilter(true);\n this.cdr.markForCheck();\n });\n\n // Re-resolve translation keys whenever the locale changes.\n this.langSubscription = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveTranslationKeys();\n this.cdr.markForCheck();\n });\n }\n\n ngDoCheck(): void {\n // Release the height lock as soon as loading ends — same CD cycle that clears\n // the skeleton, so the lock can never outlive the skeleton it protects.\n if (this.lockedMinHeight && !this.isLoadingState) {\n this.lockedMinHeight = 0;\n }\n const currentTemplate = this.trackedToolbarTemplate;\n if (currentTemplate !== this.previousToolbarTemplate) {\n this.previousToolbarTemplate = currentTemplate;\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n this.dataSubscription?.unsubscribe();\n this.searchSubscription?.unsubscribe();\n this.langSubscription?.unsubscribe();\n }\n\n onSearch(searchString: string): void {\n this.currentPage = 1;\n if (this.isServerSearched) {\n this.lockBodyHeight();\n this.searchValue = searchString;\n this.dataSource.onServerSearch?.(searchString);\n this.cdr.markForCheck();\n } else {\n this.searchSubject.next(searchString);\n }\n }\n\n goToPage(page: number): void {\n if (page < 1 || page > this.totalPages) return;\n this.currentPage = page;\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else {\n this.lockBodyHeight();\n this.dataSource.onPageChange?.(page);\n }\n this.cdr.markForCheck();\n }\n\n onPageSizeChange(newSize: number): void {\n this.invalidatePageHeight();\n this.pageSize = newSize;\n this.currentPage = 1;\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else {\n this.lockBodyHeight();\n this.dataSource.onPageSizeChange?.(newSize);\n }\n this.cdr.markForCheck();\n }\n\n loadMoreRows(): void {\n // Server-side infinite scroll: delegate to consumer callback.\n if (this.dataSource.onLoadMore) {\n this.dataSource.onLoadMore();\n return;\n }\n\n if (!this.dataSource.loadAdditionalRows || this.loadingMoreRows) return;\n\n this.loadingMoreRows = true;\n const promise = (this.searchValue && this.searchValue.length > 0 && this.dataSource.searchForAdditionalItems)\n ? this.dataSource.searchForAdditionalItems(this.searchValue)\n : this.dataSource.loadAdditionalRows();\n\n promise\n .then(rows => this.processLoadedRows(rows))\n .catch(() => this.loadingMoreRows = false);\n }\n\n isTemplateRef(value: unknown): value is TemplateRef<unknown> {\n return value instanceof TemplateRef;\n }\n\n trackByID = (_index: number, item: T): string => {\n return this.dataSource.getID(item);\n };\n\n // ── Skeleton ──\n\n /** Applies search/sort/filtering and pagination to the current rows. */\n protected abstract applyFilter(searchForItems: boolean): void;\n\n // ── Template helpers ──\n\n /** Runs after pageSize is set but before the first {@link applyFilter}. */\n protected beforeInitialFilter(): void {\n // no-op by default\n }\n\n /**\n * Resolves translation keys to display strings via {@link MnLanguageService}.\n * Subclasses override to resolve their own keys; call `super` to keep these.\n */\n protected resolveTranslationKeys(): void {\n if (this.dataSource.emptyMessageKey) {\n this.dataSource.emptyMessage = this.lang.t(this.dataSource.emptyMessageKey);\n }\n if (this.dataSource.errorMessageKey) {\n this.dataSource.errorMessage = this.lang.t(this.dataSource.errorMessageKey);\n }\n if (this.dataSource.searchPlaceholderKey) {\n this.dataSource.searchPlaceholder = this.lang.t(this.dataSource.searchPlaceholderKey);\n }\n if (this.dataSource.labels) {\n if (this.dataSource.labels.loadMoreKey) {\n this.dataSource.labels.loadMore = this.lang.t(this.dataSource.labels.loadMoreKey);\n }\n if (this.dataSource.labels.rowsPerPageKey) {\n this.dataSource.labels.rowsPerPage = this.lang.t(this.dataSource.labels.rowsPerPageKey);\n }\n }\n }\n\n // ── Shared internals ──\n\n /**\n * Captures the body container's current height into {@link lockedMinHeight} so it\n * holds while a server reload swaps the data rows for skeletons. Must be called\n * while the old rows are still rendered (before delegating to the consumer), and\n * only locks when rows are present — the first load has nothing to preserve.\n */\n protected lockBodyHeight(): void {\n const el = this.collectionBody?.nativeElement;\n if (el && this.paginatedItems.length > 0) {\n this.lockedMinHeight = el.offsetHeight;\n }\n }\n\n /**\n * Drops the cached {@link fullPageHeight} floor so it is re-measured on the next full page.\n * Must run whenever the page size changes (the old floor is for a different row count).\n */\n protected invalidatePageHeight(): void {\n this.fullPageHeight = 0;\n this.pageHeightMeasured = false;\n }\n\n protected applyPagination(): void {\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n const start = (this.currentPage - 1) * this.pageSize;\n this.paginatedItems = this.filteredItems.slice(start, start + this.pageSize);\n } else {\n // Server always provides the correct page/slice — no client-side slicing.\n this.paginatedItems = this.filteredItems;\n }\n }\n\n /** Client-side search filtering shared by list and grid. */\n protected applySearchFilter(items: T[]): T[] {\n if (!this.isServerSearched && this.dataSource.isInSearch && this.dataSource.canSearch && this.searchValue && this.searchValue.length > 0) {\n const term = this.searchValue.toLowerCase();\n return items.filter(row => this.dataSource.isInSearch!(row, term));\n }\n return items;\n }\n\n protected processLoadedRows(rows: T[]): void {\n const merged = [...new Map(\n [...this.dataSource.dataRows.value, ...rows].map(item => [this.dataSource.getID(item), item])\n ).values()];\n this.dataSource.dataRows.next(merged);\n this.loadingMoreRows = false;\n this.applyFilter(false);\n }\n\n protected validateDataSource(): void {\n const mode = this.dataSource.paginationMode;\n if (mode === 'paginated') {\n if (!this.dataSource.onPageChange) {\n throw new Error(`[${this.componentName}] paginationMode is 'paginated' but 'onPageChange' callback is missing. Server-side pagination requires 'onPageChange'.`);\n }\n if (this.dataSource.totalItems == null) {\n throw new Error(`[${this.componentName}] paginationMode is 'paginated' but 'totalItems' is missing. Server-side pagination requires 'totalItems'.`);\n }\n }\n if (mode === 'load-more' || mode === 'infinite-scroll') {\n if (!this.dataSource.onLoadMore && !this.dataSource.loadAdditionalRows && !this.dataSource.paginationStrategy) {\n throw new Error(`[${this.componentName}] paginationMode is '${mode}' but no load-more mechanism is provided. Provide 'onLoadMore', 'loadAdditionalRows', or 'paginationStrategy'.`);\n }\n }\n // Validate pageSize is one of pageSizeOptions when pagination is active\n if (mode && mode !== 'none') {\n const options = this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n const size = this.dataSource.pageSize ?? 10;\n if (!options.includes(size)) {\n throw new Error(`[${this.componentName}] pageSize '${size}' is not one of the allowed pageSizeOptions [${options.join(', ')}]. pageSize must be one of pageSizeOptions.`);\n }\n }\n }\n}\n","import {Directive, EventEmitter, Output} from '@angular/core';\nimport {MnCollectionBase} from './mn-collection-base.directive';\nimport {MnSelectableCollectionDataSource} from './mn-collection.types';\n\n/**\n * Extends {@link MnCollectionBase} with single/multi row selection, shared by\n * components that support it (table, list). Grid extends the plain base instead.\n */\n@Directive()\nexport abstract class MnSelectableCollectionBase<\n T,\n DS extends MnSelectableCollectionDataSource<T>,\n> extends MnCollectionBase<T, DS> {\n @Output() selectionChange = new EventEmitter<T[]>();\n\n selectedIds = new Set<string>();\n\n get allSelected(): boolean {\n return this.filteredItems.length > 0 && this.selectedIds.size === this.filteredItems.length;\n }\n\n get hasSelection(): boolean {\n return (this.dataSource.selectionMode ?? 'none') !== 'none';\n }\n\n get isMultiSelect(): boolean {\n return this.dataSource.selectionMode === 'multi';\n }\n\n isSelected(item: T): boolean {\n return this.selectedIds.has(this.dataSource.getID(item));\n }\n\n toggle(item: T): void {\n const id = this.dataSource.getID(item);\n const mode = this.dataSource.selectionMode ?? 'none';\n\n if (mode === 'single') {\n this.selectedIds.clear();\n this.selectedIds.add(id);\n } else if (mode === 'multi') {\n if (this.selectedIds.has(id)) {\n this.selectedIds.delete(id);\n } else {\n this.selectedIds.add(id);\n }\n }\n\n this.emitSelection();\n }\n\n toggleAll(): void {\n if (this.selectedIds.size === this.filteredItems.length) {\n this.selectedIds.clear();\n } else {\n this.filteredItems.forEach(item => this.selectedIds.add(this.dataSource.getID(item)));\n }\n this.emitSelection();\n }\n\n /** Seeds selection from `initialSelectedIds` before the first filter pass. */\n protected override beforeInitialFilter(): void {\n super.beforeInitialFilter();\n if (this.dataSource.initialSelectedIds?.length) {\n for (const id of this.dataSource.initialSelectedIds) {\n this.selectedIds.add(id);\n }\n this.emitSelection();\n }\n }\n\n protected emitSelection(): void {\n const rows = (this.dataSource.dataRows.value ?? []).filter(r => this.selectedIds.has(this.dataSource.getID(r)));\n this.dataSource.selectedRows?.next(rows);\n this.selectionChange.emit(rows);\n }\n}\n","import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {MnButton} from '../mn-button';\nimport {MnSelect, MnSelectOption} from '../mn-select';\nimport {MnCollectionLabels} from './mn-collection.types';\n\n/**\n * Presentational pagination footer shared by every MnLib collection component\n * (table, list, grid): the load-more button, the page-size selector and the\n * page navigator. It holds no state — the host component owns pagination state\n * (via {@link import('./mn-collection-base.directive').MnCollectionBase}) and\n * reacts to the outputs.\n */\n@Component({\n selector: 'mn-collection-pagination',\n standalone: true,\n imports: [MnButton, MnSelect, FormsModule],\n templateUrl: './mn-collection-pagination.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnCollectionPagination {\n /** Prefix for the page-size select's id, keeping it unique per host. */\n @Input() idPrefix = 'mn-collection';\n\n @Input() isPaginated = false;\n @Input() isServerPaginated = false;\n @Input() showLoadMore = false;\n @Input() loadingMoreRows = false;\n\n @Input() currentPage = 1;\n @Input() pageSize = 10;\n @Input() totalPages = 1;\n @Input() totalItemCount = 0;\n @Input() visiblePages: number[] = [];\n @Input() pageSizeSelectOptions: MnSelectOption<number>[] = [];\n @Input() labels?: MnCollectionLabels;\n\n @Output() loadMore = new EventEmitter<void>();\n @Output() pageChange = new EventEmitter<number>();\n @Output() pageSizeChange = new EventEmitter<number>();\n\n get showPagination(): boolean {\n return this.isPaginated && (this.totalPages > 1 || this.isServerPaginated);\n }\n}\n","<!-- Load more button -->\n@if (showLoadMore) {\n <div class=\"flex justify-center py-4\">\n <button\n (click)=\"loadMore.emit()\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'primary' }\"\n [disabled]=\"loadingMoreRows\"\n class=\"px-4 py-1.5 text-sm rounded border border-primary-500 text-primary-500 hover:bg-primary-100 transition-colors disabled:opacity-50\"\n mnButton\n >\n @if (loadingMoreRows) {\n <span\n class=\"inline-block w-3 h-3 border-2 border-primary-500 border-t-transparent rounded-full animate-spin mr-2\"></span>\n }\n {{ labels?.loadMore || 'Load more' }}\n </button>\n </div>\n}\n\n<!-- Pagination controls -->\n@if (showPagination) {\n <div class=\"flex items-center justify-center md:justify-between px-2 py-3 text-sm text-base-content\">\n @if (pageSizeSelectOptions.length > 1) {\n <div class=\"hidden md:flex items-center gap-2\">\n <span>{{ labels?.rowsPerPage || 'Items per page:' }}</span>\n <mn-lib-select\n (ngModelChange)=\"pageSizeChange.emit($event)\"\n [ngModel]=\"pageSize\"\n [props]=\"{\n id: idPrefix + '-page-size',\n options: pageSizeSelectOptions,\n size: 'sm'\n }\"\n ></mn-lib-select>\n </div>\n } @else {\n <div class=\"hidden md:block\"></div>\n }\n\n <div class=\"flex items-center gap-1\">\n <span class=\"text-xs mr-2 hidden md:inline\">{{ (currentPage - 1) * pageSize + 1 }}\n – {{ currentPage * pageSize > totalItemCount ? totalItemCount : currentPage * pageSize }}\n of {{ totalItemCount }}</span>\n\n <button\n (click)=\"pageChange.emit(1)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\n [disabled]=\"currentPage === 1\"\n aria-label=\"First page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >«\n </button>\n\n <button\n (click)=\"pageChange.emit(currentPage - 1)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\n [disabled]=\"currentPage === 1\"\n aria-label=\"Previous page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >‹\n </button>\n\n @for (page of visiblePages; track page) {\n <button\n (click)=\"pageChange.emit(page)\"\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\n [attr.aria-label]=\"'Page ' + page\"\n [data]=\"{ size: 'sm', variant: 'text', color: page === currentPage ? 'primary' : 'gray' }\"\n class=\"px-2.5 py-1 rounded underline underline-offset-2 transition-colors text-xs\"\n mnButton\n >{{ page }}\n </button>\n }\n\n <button\n (click)=\"pageChange.emit(currentPage + 1)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\n [disabled]=\"currentPage === totalPages\"\n aria-label=\"Next page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >›\n </button>\n\n <button\n (click)=\"pageChange.emit(totalPages)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\n [disabled]=\"currentPage === totalPages\"\n aria-label=\"Last page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >»\n </button>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {ColumnDefinition, ColumnSortType, SortState, TableDataSource} from './mn-table.types';\nimport {MnSkeleton, MnSkeletonProps} from '../mn-skeleton';\nimport {MnSelect, MnSelectOption} from '../mn-select';\nimport {MnCheckbox} from '../mn-checkbox';\nimport {MnHiddenBelowDirective} from './mn-hidden-below.directive';\nimport {MnShowAboveDirective} from './mn-show-above.directive';\nimport {MnShowBelowDirective} from './mn-show-below.directive';\nimport {MnInputField} from '../mn-input-field';\nimport {FormsModule} from '@angular/forms';\nimport {MnCollectionPagination, MnSelectableCollectionBase} from '../mn-collection';\nimport {MnButton} from '../mn-button';\nimport {LucideFilter, LucideFunnel, LucideX} from '@lucide/angular';\n\n/** Map of column key to its current filter value. */\nexport type ColumnFilterState = Record<string, string | undefined>;\n\n@Component({\n selector: 'mn-table',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, MnCheckbox, MnHiddenBelowDirective, MnShowAboveDirective, MnShowBelowDirective, MnInputField, MnSelect, MnSkeleton, FormsModule, MnCollectionPagination, MnButton, LucideFilter, LucideX, LucideFunnel],\n templateUrl: './mn-table.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnTable<T = object>\n extends MnSelectableCollectionBase<T, TableDataSource<T>> {\n @Output() sortChange = new EventEmitter<SortState | null>();\n @Output() rowClick = new EventEmitter<T>();\n\n currentSort: SortState | null = null;\n\n /** Per-column filter values keyed by column key. */\n columnFilters: ColumnFilterState = {};\n\n /** Viewport width (px) below which the inline filter row collapses into a panel. */\n private static readonly FILTER_COLLAPSE_WIDTH = 640;\n\n /**\n * True when the viewport is narrow enough that the per-column filter inputs no\n * longer fit under their headers; the inline row is then replaced by a toggle\n * button and a stacked filter panel.\n */\n protected filtersCollapsed = false;\n\n /** Whether the small-screen filter panel is currently expanded. */\n protected filtersPanelOpen = false;\n\n protected override readonly componentName = 'MnTable';\n\n protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined {\n return this.dataSource?.toolbarLeftTemplate;\n }\n\n @ViewChild('collectionBody') protected collectionBody?: ElementRef<HTMLElement>;\n\n /** Updates a column filter value and re-applies filtering. */\n onColumnFilter(columnKey: string, value: string): void {\n this.columnFilters[columnKey] = value;\n this.currentPage = 1;\n this.applyFilter(false);\n this.cdr.markForCheck();\n }\n\n /** Filter options formatted for mn-select for a given column. */\n getFilterSelectOptions(column: ColumnDefinition<T>): MnSelectOption<string>[] {\n const placeholder = column.filterPlaceholder ?? 'All';\n return [\n {label: placeholder, value: ''},\n ...(column.filterOptions ?? []).map(opt => ({label: opt.label, value: String(opt.value)})),\n ];\n }\n\n // ── Column Filters ──\n\n /** Whether any column has filtering enabled. */\n get hasColumnFilters(): boolean {\n return this.dataSource.columns.some(c => c.filterable);\n }\n\n /** Whether at least one column filter is active. */\n get hasActiveFilters(): boolean {\n return this.dataSource.columns.some(col => col.filterable && !!this.columnFilters[col.key]);\n }\n\n /** Label for the small-screen filters toggle button. */\n get filtersButtonLabel(): string {\n return this.dataSource.filtersLabel ?? 'Filters';\n }\n\n /** Label for the \"clear all filters\" action in the small-screen panel. */\n get clearFiltersButtonLabel(): string {\n return this.dataSource.clearFiltersLabel ?? 'Clear all';\n }\n\n /** Opens/closes the stacked filter panel shown on small screens. */\n toggleFiltersPanel(): void {\n this.filtersPanelOpen = !this.filtersPanelOpen;\n }\n\n /** Resets every column filter and re-applies filtering. */\n clearAllFilters(): void {\n for (const col of this.dataSource.columns) {\n if (col.filterable) this.columnFilters[col.key] = '';\n }\n this.currentPage = 1;\n this.applyFilter(false);\n this.cdr.markForCheck();\n }\n\n /** True when the viewport is below the filter-collapse breakpoint. */\n private isFilterViewport(): boolean {\n return typeof window !== 'undefined' && window.innerWidth < MnTable.FILTER_COLLAPSE_WIDTH;\n }\n\n /**\n * Recomputes whether the inline filter row should collapse into the panel.\n * Closes the panel when returning to the wide layout so reopened state never\n * leaks across the breakpoint. Marks for check only when the layout flips.\n */\n private updateFilterLayout(reflow: boolean): void {\n const collapsed = this.isFilterViewport();\n if (collapsed === this.filtersCollapsed) return;\n this.filtersCollapsed = collapsed;\n if (!collapsed) this.filtersPanelOpen = false;\n if (reflow) this.cdr.markForCheck();\n }\n\n sort(column: ColumnDefinition<T>): void {\n if (!column.sortType || column.sortType === ColumnSortType.NONE) return;\n\n if (this.currentSort?.columnKey === column.key) {\n this.currentSort = this.currentSort.direction === 'asc'\n ? {columnKey: column.key, direction: 'desc'}\n : null;\n } else {\n this.currentSort = {columnKey: column.key, direction: 'asc'};\n }\n\n this.sortChange.emit(this.currentSort);\n this.applyFilter(false);\n }\n\n onRowClick(row: T): void {\n if (this.hasSelection) {\n this.toggle(row);\n }\n this.dataSource.onRowClick?.(row);\n this.rowClick.emit(row);\n }\n\n // ── Sorting ──\n\n /**\n * Resolves the skeleton placeholder config for a column's cells.\n * Falls back to a text-shaped bar at 75% width (the previous default); any\n * fields the column provides override that default.\n */\n getColumnSkeletonData(column: ColumnDefinition<T>): Partial<MnSkeletonProps> {\n const skeleton = column.skeleton;\n const overrides = skeleton && !this.isTemplateRef(skeleton) ? skeleton : {};\n return {shape: 'text', width: '75%', ...overrides};\n }\n\n getSortIcon(column: ColumnDefinition<T>): string {\n if (!this.currentSort || this.currentSort.columnKey !== column.key) return '';\n return this.currentSort.direction === 'asc' ? '▲' : '▼';\n }\n\n isSortable(column: ColumnDefinition<T>): boolean {\n return !!column.sortType && column.sortType !== ColumnSortType.NONE;\n }\n\n // ── Row interaction ──\n\n /** Rows shown per page on mobile (< md). Forced regardless of any configured pageSize. */\n private static readonly MOBILE_PAGE_SIZE = 10;\n\n /** Page size to use at/above the `md` breakpoint (consumer's pageSize, or the user's selection). */\n private desktopPageSize = 10;\n\n /** True when the viewport is below the `md` (768px) breakpoint. */\n private isMobileViewport(): boolean {\n return typeof window !== 'undefined' && window.innerWidth < 768;\n }\n\n /**\n * Applies the breakpoint-appropriate page size: {@link MOBILE_PAGE_SIZE} below `md`,\n * the desktop size at/above it. When the size actually changes, client-side tables\n * re-slice locally and server-side tables ask the consumer to refetch, so the\n * rendered rows update in every pagination mode (used at init and on window resize).\n */\n private applyResponsivePageSize(reflow: boolean): void {\n const target = this.isMobileViewport() ? MnTable.MOBILE_PAGE_SIZE : this.desktopPageSize;\n if (target === this.pageSize) return;\n this.invalidatePageHeight();\n this.pageSize = target;\n this.currentPage = 1;\n\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else if (this.isServerPaginated) {\n // Server owns the slice — tell the consumer to refetch with the new size.\n this.dataSource.onPageSizeChange?.(target);\n }\n\n if (reflow) this.cdr.markForCheck();\n }\n\n /** Re-evaluate responsive page size and filter layout when the viewport changes. */\n @HostListener('window:resize')\n protected onWindowResize(): void {\n this.applyResponsivePageSize(true);\n this.updateFilterLayout(true);\n }\n\n /** Tracks the desktop page size when the user picks one (selector only shows at >= md). */\n override onPageSizeChange(newSize: number): void {\n this.desktopPageSize = newSize;\n super.onPageSizeChange(newSize);\n }\n\n /** Sets sort/filter state seeded from the data source before the first filter pass. */\n protected override beforeInitialFilter(): void {\n super.beforeInitialFilter();\n\n // Force the mobile row count below `md`; use the consumer's pageSize (or 10) above it.\n this.desktopPageSize = this.dataSource.pageSize ?? 10;\n this.applyResponsivePageSize(false);\n\n // Seed the filter layout for the initial viewport (no markForCheck pre-render).\n this.updateFilterLayout(false);\n\n this.currentSort = this.dataSource.defaultSort ?? null;\n for (const col of this.dataSource.columns) {\n if (col.filterable) {\n this.columnFilters[col.key] = '';\n }\n }\n }\n\n // ── Template helpers ──\n\n getCellValue(column: ColumnDefinition<T>, row: T): string {\n if (typeof column.cell === 'function') return column.cell(row);\n return '';\n }\n\n /** Returns the small-screen cell value for a column with cellSm defined. */\n getCellSmValue(column: ColumnDefinition<T>, row: T): string {\n if (column.cellSm && typeof column.cellSm.cell === 'function') return column.cellSm.cell(row);\n return '';\n }\n\n trackByKey = (_index: number, column: ColumnDefinition<T>): string => {\n return column.key;\n };\n\n // ── Table CSS classes ──\n\n readonly tableClasses = 'w-full border-collapse overflow-y-hidden';\n\n get totalColumnCount(): number {\n let count = this.dataSource.columns.length;\n if (this.hasSelection) count++;\n return count;\n }\n\n // ── Skeleton ──\n\n /**\n * Resolves table-specific translation keys (column headers/filters) plus the\n * shared keys handled by the base.\n */\n protected override resolveTranslationKeys(): void {\n super.resolveTranslationKeys();\n for (const col of this.dataSource.columns) {\n if (col.headerKey) {\n col.header = this.lang.t(col.headerKey);\n }\n if (col.filterPlaceholderKey) {\n col.filterPlaceholder = this.lang.t(col.filterPlaceholderKey);\n }\n }\n if (this.dataSource.filtersLabelKey) {\n this.dataSource.filtersLabel = this.lang.t(this.dataSource.filtersLabelKey);\n }\n if (this.dataSource.clearFiltersLabelKey) {\n this.dataSource.clearFiltersLabel = this.lang.t(this.dataSource.clearFiltersLabelKey);\n }\n }\n\n // ── Filtering & sorting ──\n\n protected applyFilter(searchForItems: boolean): void {\n let items = this.applySearchFilter(this.dataSource.dataRows.value ?? []);\n\n // Per-column filters\n for (const col of this.dataSource.columns) {\n const filterValue = this.columnFilters[col.key];\n if (!col.filterable || !filterValue) continue;\n\n if (col.filterFn) {\n items = items.filter(row => col.filterFn!(row, filterValue));\n } else {\n const term = filterValue.toLowerCase();\n items = items.filter(row => {\n const cellValue = typeof col.cell === 'function' ? col.cell(row) : '';\n return (cellValue ?? '').toLowerCase().includes(term);\n });\n }\n }\n\n items = this.applySorting(items);\n this.filteredItems = items;\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n\n private applySorting(items: T[]): T[] {\n if (!this.currentSort) return items;\n\n const column = this.dataSource.columns.find(c => c.key === this.currentSort!.columnKey);\n if (!column || !column.sortType || column.sortType === ColumnSortType.NONE) return items;\n\n const getValue = column.getRawValueToSort ?? ((row: T) => {\n if (typeof column.cell === 'function') return column.cell(row);\n return '';\n });\n\n const dir = this.currentSort.direction === 'asc' ? 1 : -1;\n\n return [...items].sort((a, b) => {\n const va = getValue(a);\n const vb = getValue(b);\n\n if (va == null && vb == null) return 0;\n if (va == null) return 1;\n if (vb == null) return -1;\n\n switch (column.sortType) {\n case ColumnSortType.ALPHABETICAL:\n return String(va).localeCompare(String(vb)) * dir;\n case ColumnSortType.NUMERICAL:\n return (Number(va) - Number(vb)) * dir;\n case ColumnSortType.DATE:\n return (new Date(va as string | number).getTime() - new Date(vb as string | number).getTime()) * dir;\n default:\n return 0;\n }\n });\n }\n}\n","<!-- Toolbar: custom toolbar template + search -->\n<div class=\"flex flex-col min-[375px]:flex-row min-[375px]:items-center justify-between gap-2 mb-3\">\n <div class=\"flex items-center gap-2 w-full min-[375px]:w-auto\">\n @if (dataSource.toolbarLeftTemplate) {\n <div class=\"flex flex-col w-full min-[375px]:w-auto min-[375px]:flex-row\">\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarLeftTemplate\"></ng-container>\n </div>\n }\n </div>\n <div class=\"flex flex-col min-[375px]:flex-row min-[375px]:items-center gap-2 w-full min-[375px]:flex-1 min-[480px]:flex-none min-[480px]:w-auto\">\n @if (dataSource.canSearch) {\n <mn-lib-input-field\n class=\"w-full min-[375px]:flex-1 min-[480px]:max-w-64\"\n [props]=\"{\n id: 'mn-table-search',\n type: 'search',\n label: '',\n placeholder: dataSource.searchPlaceholder ?? 'Search...',\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true\n }\"\n [ngModel]=\"searchValue\"\n (ngModelChange)=\"onSearch($event)\"\n ></mn-lib-input-field>\n }\n @if (dataSource.toolbarRightTemplate) {\n <div class=\"flex flex-col w-full min-[375px]:w-auto min-[375px]:flex-row\">\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarRightTemplate\"></ng-container>\n </div>\n }\n <!-- Small-screen filter toggle: replaces the inline per-column filter row below 640px -->\n @if (hasColumnFilters && filtersCollapsed) {\n <button\n type=\"button\"\n mnButton\n [data]=\"{ variant: 'outline', color: 'gray', size: 'sm', borderRadius: 'md', hover: true }\"\n class=\"w-full min-[375px]:w-auto gap-1.5\"\n [class.border-primary]=\"hasActiveFilters\"\n [class.text-primary]=\"hasActiveFilters\"\n [attr.aria-expanded]=\"filtersPanelOpen\"\n aria-controls=\"mn-table-filters-panel\"\n (click)=\"toggleFiltersPanel()\"\n >\n <svg lucideFunnel [size]=\"15\"></svg>\n <span>{{ filtersButtonLabel }}</span>\n </button>\n }\n </div>\n</div>\n\n<!-- Small-screen filter panel: stacked, full-width fields decoupled from column widths -->\n@if (hasColumnFilters && filtersCollapsed) {\n <div\n id=\"mn-table-filters-panel\"\n class=\"grid transition-all duration-200 ease-out motion-reduce:transition-none\"\n [style.grid-template-rows]=\"filtersPanelOpen ? '1fr' : '0fr'\"\n >\n <div class=\"overflow-hidden\" [attr.inert]=\"filtersPanelOpen ? null : ''\">\n <div class=\"flex flex-col gap-3 rounded-md border border-base-300 bg-base-100 p-3 mb-3\">\n @for (column of dataSource.columns; track column.key) {\n @if (column.filterable) {\n <div class=\"flex flex-col gap-1\">\n <label\n class=\"text-xs font-medium text-base-content/70\"\n [attr.for]=\"'mn-table-filter-' + column.key\"\n >\n @if (isTemplateRef(column.header)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.header)\"></ng-container>\n } @else {\n {{ column.header }}\n }\n </label>\n @if ((column.filterType ?? 'text') === 'text') {\n <mn-lib-input-field\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n type: 'text',\n label: '',\n placeholder: column.filterPlaceholder ?? '',\n autocomplete: column.filterAutocomplete ?? undefined,\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true,\n hover: true\n }\"\n [ngModel]=\"columnFilters[column.key]\"\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n ></mn-lib-input-field>\n } @else if (column.filterType === 'select') {\n <mn-lib-select\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n [ngModel]=\"columnFilters[column.key] ?? ''\"\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n options: getFilterSelectOptions(column),\n size: 'sm',\n fullWidth: true\n }\"\n ></mn-lib-select>\n }\n </div>\n }\n }\n @if (hasActiveFilters) {\n <button\n type=\"button\"\n mnButton\n [data]=\"{ variant: 'text', color: 'gray', size: 'sm', borderRadius: 'md', hover: true }\"\n class=\"self-start gap-1\"\n (click)=\"clearAllFilters()\"\n >\n <svg lucideX [size]=\"14\"></svg>\n <span>{{ clearFiltersButtonLabel }}</span>\n </button>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Table wrapper with horizontal scroll -->\n<div #collectionBody [style.min-height.px]=\"bodyMinHeight\" aria-label=\"Data table\" class=\"overflow-x-auto\"\n role=\"region\">\n <table [class]=\"tableClasses\">\n <thead>\n <tr class=\"bg-base-100\">\n <!-- Selection checkbox column header -->\n @if (hasSelection) {\n <th class=\"w-10 text-center text-sm bg-base-200 px-2 py-2\">\n @if (isMultiSelect) {\n <mn-lib-checkbox\n (checkedChange)=\"toggleAll()\"\n [checked]=\"allSelected\"\n [props]=\"{ id: 'mn-table-select-all', size: 'sm' }\"\n ></mn-lib-checkbox>\n }\n </th>\n }\n\n <!-- Data columns -->\n @for (column of dataSource.columns; track column.key) {\n <th\n class=\"text-sm px-2 py-1 md:px-4 md:py-2 whitespace-nowrap\"\n [class.cursor-pointer]=\"isSortable(column)\"\n [class.select-none]=\"isSortable(column)\"\n [class.hover:bg-base-200]=\"isSortable(column)\"\n [class.text-left]=\"(column.align ?? 'left') === 'left'\"\n [class.text-center]=\"column.align === 'center'\"\n [class.text-right]=\"column.align === 'right'\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n [style.width]=\"column.width ?? null\"\n [attr.aria-sort]=\"currentSort?.columnKey === column.key ? (currentSort!.direction === 'asc' ? 'ascending' : 'descending') : null\"\n (click)=\"sort(column)\"\n >\n <span class=\"inline-flex items-center gap-1\">\n @if (isTemplateRef(column.header)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.header)\"></ng-container>\n } @else {\n <span>{{ column.header }}</span>\n }\n @if (isSortable(column)) {\n <span class=\"text-[0.65rem] opacity-70 min-w-3 inline-block\">{{ getSortIcon(column) }}</span>\n }\n </span>\n </th>\n }\n\n </tr>\n\n <!-- Per-column filter row (wide screens only; collapses into a panel below 640px) -->\n @if (hasColumnFilters && !filtersCollapsed) {\n <tr class=\"bg-base-100 border-b border-base-300\">\n @if (hasSelection) {\n <th class=\"px-2 py-1 \"></th>\n }\n @for (column of dataSource.columns; track column.key) {\n <th\n class=\"px-4 py-2\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n >\n @if (column.filterable) {\n @if ((column.filterType ?? 'text') === 'text') {\n <mn-lib-input-field\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n type: 'text',\n label: '',\n placeholder: column.filterPlaceholder ?? '',\n autocomplete: column.filterAutocomplete ?? undefined,\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true,\n hover: true\n }\"\n [ngModel]=\"columnFilters[column.key]\"\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n ></mn-lib-input-field>\n } @else if (column.filterType === 'select') {\n <mn-lib-select\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n [ngModel]=\"columnFilters[column.key] ?? ''\"\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n options: getFilterSelectOptions(column),\n size: 'sm',\n fullWidth: true\n }\"\n (click)=\"$event.stopPropagation()\"\n ></mn-lib-select>\n }\n }\n </th>\n }\n </tr>\n }\n </thead>\n\n <tbody>\n <!-- Loading state -->\n @if (isLoadingState) {\n @for (_ of skeletonRows; track $index) {\n <tr>\n @if (hasSelection) {\n <td class=\"px-2 py-3\">\n <mn-skeleton [data]=\"{ shape: 'rectangle', width: '1rem', height: '1rem' }\"></mn-skeleton>\n </td>\n }\n @for (column of dataSource.columns; track column.key) {\n <td class=\"px-4 py-3\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n [style.width]=\"column.width ?? null\"\n >\n @if (isTemplateRef(column.skeleton)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.skeleton)\"></ng-container>\n } @else {\n <mn-skeleton [data]=\"getColumnSkeletonData(column)\"></mn-skeleton>\n }\n </td>\n }\n </tr>\n }\n } @else if (isErrorState) {\n <!-- Error state -->\n <tr class=\"bg-base-100\">\n <td [attr.colspan]=\"totalColumnCount\" class=\"text-center text-xs py-8\">\n @if (dataSource.errorTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.errorTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-error\">\n <p class=\"text-sm\">{{ dataSource.errorMessage }}</p>\n </div>\n }\n </td>\n </tr>\n } @else {\n <!-- Empty state -->\n @if (filteredItems.length === 0) {\n <tr class=\"bg-base-100\">\n <td [attr.colspan]=\"totalColumnCount\" class=\"text-center text-xs py-8\">\n @if (dataSource.emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.emptyTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-base-content/50\">\n <p class=\"text-sm\">{{ dataSource.emptyMessage }}</p>\n </div>\n }\n </td>\n </tr>\n }\n\n <!-- Data rows -->\n @for (row of paginatedItems; track trackByID($index, row); let odd = $odd; let last = $last) {\n <tr\n class=\"bg-base-100 transition-colors duration-150 hover:cursor-pointer\"\n [ngClass]=\"{'bg-primary/10': isSelected(row)}\"\n [class.bg-base-200]=\"!isSelected(row) && odd && dataSource.appearance?.striped\"\n [class.hover:bg-base-200]=\"dataSource.appearance?.hover !== false\"\n [class.cursor-pointer]=\"!!dataSource.onRowClick\"\n [class.border-b]=\"!last\"\n [class.border-base-300]=\"!last\"\n [class.border-b-1]=\"last\"\n [class.border-black]=\"last\"\n [class.shadow-3xl]=\"last\"\n (click)=\"onRowClick(row)\"\n >\n <!-- Selection checkbox -->\n @if (hasSelection) {\n <td (click)=\"$event.stopPropagation()\" class=\"w-10 text-center px-2 py-2\">\n <mn-lib-checkbox\n (checkedChange)=\"toggle(row)\"\n [checked]=\"isSelected(row)\"\n [props]=\"{ id: 'mn-table-row-' + $index, size: 'sm' }\"\n ></mn-lib-checkbox>\n </td>\n }\n\n <!-- Data cells -->\n @for (column of dataSource.columns; track column.key) {\n <td\n class=\"text-xs px-2 py-1 md:px-4 md:py-2\"\n [class.text-left]=\"(column.align ?? 'left') === 'left'\"\n [class.text-center]=\"column.align === 'center'\"\n [class.text-right]=\"column.align === 'right'\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n [style.width]=\"column.width ?? null\"\n >\n @if (column.cellSm) {\n <!-- Default cell: hidden below the cellSm breakpoint -->\n <span [mnShowAbove]=\"column.cellSm.below\">\n @if (isTemplateRef(column.cell)) {\n <ng-container [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"\n [ngTemplateOutlet]=\"$any(column.cell)\"></ng-container>\n } @else {\n {{ getCellValue(column, row) }}\n }\n </span>\n <!-- Small cell: shown only below the cellSm breakpoint -->\n <span [mnShowBelow]=\"column.cellSm.below\">\n @if (isTemplateRef(column.cellSm.cell)) {\n <ng-container [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"\n [ngTemplateOutlet]=\"$any(column.cellSm.cell)\"></ng-container>\n } @else {\n {{ getCellSmValue(column, row) }}\n }\n </span>\n } @else {\n @if (isTemplateRef(column.cell)) {\n <ng-container [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"\n [ngTemplateOutlet]=\"$any(column.cell)\"></ng-container>\n } @else {\n {{ getCellValue(column, row) }}\n }\n }\n </td>\n }\n\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n<!-- Load more + pagination -->\n<mn-collection-pagination\n (loadMore)=\"loadMoreRows()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n [currentPage]=\"currentPage\"\n [isPaginated]=\"isPaginated\"\n [isServerPaginated]=\"isServerPaginated\"\n [labels]=\"dataSource.labels\"\n [loadingMoreRows]=\"loadingMoreRows\"\n [pageSizeSelectOptions]=\"pageSizeSelectOptions\"\n [pageSize]=\"pageSize\"\n [showLoadMore]=\"showLoadMore\"\n [totalItemCount]=\"totalItemCount\"\n [totalPages]=\"totalPages\"\n [visiblePages]=\"visiblePages\"\n idPrefix=\"mn-table\"\n></mn-collection-pagination>\n","import {\n Component,\n Input,\n OnInit,\n Type,\n ViewChild,\n ViewContainerRef,\n ComponentRef,\n TemplateRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnModalRef } from '../../mn-modal-ref';\nimport { CustomModalConfig } from '../../mn-modal.types';\n\n@Component({\n selector: 'mn-custom-body-host',\n standalone: true,\n imports: [CommonModule],\n template: '<ng-container #container></ng-container>',\n})\nexport class MnCustomBodyHostComponent implements OnInit {\n @Input() config!: CustomModalConfig;\n @Input() modalRef!: MnModalRef<unknown>;\n\n @ViewChild('container', { read: ViewContainerRef }) container!: ViewContainerRef;\n\n private componentRef?: ComponentRef<unknown>;\n\n ngOnInit(): void {\n setTimeout(() => this.loadContent(), 0);\n }\n\n private loadContent(): void {\n if (!this.container) return;\n\n this.container.clear();\n\n if (this.config.component) {\n this.attachComponent(this.config.component);\n } else if (this.config.template) {\n this.attachTemplate(this.config.template);\n }\n }\n\n attachComponent(component: Type<unknown>): void {\n this.componentRef = this.container.createComponent(component);\n\n // Pass inputs to the component\n if (this.config.inputs) {\n Object.entries(this.config.inputs).forEach(([key, value]) => {\n (this.componentRef!.instance as Record<string, unknown>)[key] = value;\n });\n }\n\n // Pass modalRef if the component has a modalRef property\n const instance = this.componentRef.instance as Record<string, unknown>;\n if (instance && 'modalRef' in instance) {\n instance['modalRef'] = this.modalRef;\n }\n }\n\n attachTemplate(template: TemplateRef<unknown>): void {\n this.container.createEmbeddedView(template, {\n $implicit: this.modalRef,\n modalRef: this.modalRef,\n });\n }\n}\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n Type,\n ViewChildren,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {\n AbstractControlOptions,\n FormBuilder,\n FormGroup,\n ReactiveFormsModule,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {Subscription} from 'rxjs';\nimport {MnModalRef} from '../../mn-modal-ref';\nimport {\n FieldDataSource,\n FieldKind,\n FieldRequiredCondition,\n FieldVisibilityCondition,\n FileFieldConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormModalConfig,\n FormRow,\n ModalCloseReason,\n ModalI18nLabels,\n ModalInputMap,\n MultiSelectTableFieldConfig,\n RatingFieldConfig,\n SelectOption,\n SingleSelectTableFieldConfig,\n SliderFieldConfig,\n SubmitMode,\n} from '../../mn-modal.types';\nimport {MnButton} from '../../../mn-button';\nimport {MnInputField} from '../../../mn-input-field';\nimport {MnCheckbox} from '../../../mn-checkbox';\nimport {MnDatetime} from '../../../mn-datetime';\nimport {MnMultiSelect} from '../../../mn-multi-select';\nimport {MnTextarea} from '../../../mn-textarea';\nimport {MnFileInput} from '../../../mn-file-input';\nimport {MnSelect, MnSelectOption, MnSelectProps} from '../../../mn-select';\nimport {MnCustomFieldHostDirective} from './mn-custom-field-host.directive';\nimport {MnLanguageService} from '../../../../language';\nimport {MnTable, TableDataSource} from '../../../mn-table';\nimport {MnCustomBodyHostComponent} from '../mn-custom-body-host/mn-custom-body-host.component';\n\n/**\n * A structural \"view\" over the {@link FormFieldConfig} discriminated union that\n * exposes every member-specific property as optional. The template and several\n * helpers need to read properties that only exist on some union members (e.g.\n * `placeholder`, `swatches`, `mode`, `dataSource`, `validators`). Casting the\n * field to this view keeps that access type-checked without resorting to `any`.\n */\ntype FormFieldView<TModel> = FormFieldConfig<TModel> & {\n label?: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: ValidatorFn[];\n updateOn?: 'change' | 'blur' | 'submit';\n options?: SelectOption[];\n dataSource?: FieldDataSource;\n disabled?: boolean;\n readOnly?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n defaultValue?: unknown;\n mask?: string;\n autocomplete?: string;\n minDate?: string;\n maxDate?: string;\n mode?: 'date' | 'time' | 'datetime-local';\n min?: number | string;\n max?: number | string;\n step?: number;\n rows?: number;\n searchable?: boolean;\n searchPlaceholder?: string;\n maxSelections?: number;\n swatches?: string[];\n showValue?: boolean;\n unit?: string;\n accept?: string;\n multiple?: boolean;\n displayMode?: 'dropzone' | 'thumbnail' | 'list' | 'compact';\n dropzoneHint?: string;\n replaceLabel?: string;\n removeLabel?: string;\n currentUrl?: string | null;\n currentUrls?: string[] | null;\n onClear?: () => void;\n // Non-optional in the view: the template only reads these inside the\n // matching @case/@if guards where the runtime value is always present.\n // Keeping them non-undefined avoids spurious template type errors that the\n // previous `any` cast masked, without changing runtime behavior.\n maxSize: number;\n maxFiles?: number;\n component: Type<unknown>;\n inputs?: ModalInputMap;\n};\n\n@Component({\n selector: 'mn-form-body',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MnButton, MnInputField, MnCheckbox, MnDatetime, MnMultiSelect, MnTextarea, MnFileInput, MnSelect, MnCustomFieldHostDirective, MnTable, MnCustomBodyHostComponent],\n templateUrl: './mn-form-body.component.html',\n styleUrls: ['./mn-form-body.component.css'],\n})\nexport class MnFormBodyComponent<TModel = unknown, TResult = TModel> implements OnInit, OnDestroy, AfterViewInit {\n private fb = inject(FormBuilder);\n\n @Input() config!: FormModalConfig<TModel, TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n @Input() hideFooter = false;\n @Input() hideCustomBody = false;\n @Output() formStatusChange = new EventEmitter<string>();\n\n @ViewChildren(MnInputField) inputFields?: QueryList<MnInputField>;\n @ViewChildren(MnTextarea) textareas?: QueryList<MnTextarea>;\n\n form!: FormGroup;\n rows: FormRow<TModel>[] = [];\n fieldGroups: FormFieldGroup<TModel>[] = [];\n isSubmitting = false;\n readonly FieldKind = FieldKind;\n readonly ModalCloseReason = ModalCloseReason;\n\n /** Cross-field validation errors: { fieldKey: errorMessage } */\n formErrors: Record<string, string> = {};\n\n /** Track which fields are currently visible (for conditional fields) */\n fieldVisibility: Record<string, boolean> = {};\n\n /** Track which fields are currently conditionally required */\n fieldConditionallyRequired: Record<string, boolean> = {};\n\n /** Track loading state per field for async data sources */\n fieldLoading: Record<string, boolean> = {};\n\n /** Dynamic options loaded from data sources */\n fieldOptions: Record<string, SelectOption[]> = {};\n\n private valueChangesSubscription?: Subscription;\n\n asField(field: FormFieldConfig<TModel>): FormFieldView<TModel> {\n return field as FormFieldView<TModel>;\n }\n\n asKey(key: keyof TModel | string): string {\n return key as string;\n }\n\n // The template builds untyped `props` object literals and passes them to\n // strongly-typed child component `[props]` inputs. There is no single static\n // type for those literals, so this identity bridge must return `any` to keep\n // the template assignment-compatible. This is a genuine template-bridge case.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n asAny(val: unknown): any {\n return val;\n }\n\n hasRequiredValidator(field: FormFieldConfig<TModel>): boolean {\n const view = field as FormFieldView<TModel>;\n // Check if conditionallyRequired is currently active\n if (view.conditionallyRequired) {\n const formValue = (this.form?.value ?? {}) as Partial<TModel>;\n if (view.conditionallyRequired(formValue)) return true;\n }\n const validators = view.validators;\n if (!validators) return false;\n // Check if Validators.required is in the array by testing a dummy control\n const control = this.fb.control(null, validators);\n const errors = control.errors;\n return errors != null && 'required' in errors;\n }\n\n /** Store table data sources keyed by field key for template access */\n tableDataSources: Record<string, TableDataSource<unknown>> = {};\n\n private languageService = inject(MnLanguageService);\n\n private static readonly DEFAULT_LABELS: Record<string, string> = {\n submit: 'Submit',\n cancel: 'Cancel',\n submitting: 'Submitting...',\n selectPlaceholder: 'Select...',\n loading: 'Loading...',\n fileUploadPrompt: 'Click or drag files here',\n fieldRequired: 'This field is required',\n loadingOptions: 'Loading options...',\n accepted: 'Accepted:',\n maxSize: 'Max size:',\n };\n\n private resolveLabel(i18nValue: string | undefined, key: string): string {\n if (i18nValue) return i18nValue;\n const translated = this.languageService.translate(`common.${key}`);\n return translated === `common.${key}` ? MnFormBodyComponent.DEFAULT_LABELS[key] : translated;\n }\n\n /** Resolved i18n labels with defaults, falling back to translated keys */\n get labels() {\n // The config's i18n map may carry extra keys beyond ModalI18nLabels (e.g.\n // fieldRequired, loadingOptions), so widen the type to expose them as\n // declared optional properties (keeps dot access type-checked).\n const i18n: ModalI18nLabels &\n Partial<Record<'fieldRequired' | 'loadingOptions' | 'accepted' | 'maxSize', string>> =\n this.config.i18n || {};\n return {\n submit: this.resolveLabel(i18n.submit, 'submit'),\n cancel: this.resolveLabel(i18n.cancel, 'cancel'),\n submitting: this.resolveLabel(i18n.submitting, 'submitting'),\n selectPlaceholder: this.resolveLabel(i18n.selectPlaceholder, 'selectPlaceholder'),\n loading: this.resolveLabel(i18n.loading, 'loading'),\n fileUploadPrompt: this.resolveLabel(i18n.fileUploadPrompt, 'fileUploadPrompt'),\n fieldRequired: this.resolveLabel(i18n.fieldRequired, 'fieldRequired'),\n loadingOptions: this.resolveLabel(i18n.loadingOptions, 'loadingOptions'),\n accepted: this.resolveLabel(i18n.accepted, 'accepted'),\n maxSize: this.resolveLabel(i18n.maxSize, 'maxSize'),\n };\n }\n\n ngOnInit(): void {\n this.initializeForm();\n this.buildRows();\n this.initializeVisibility();\n this.initializeDataSources();\n this.initializeTableFields();\n this.subscribeToValueChanges();\n\n if (this.config.disabled || this.config.readOnly) {\n this.form.disable();\n }\n\n // Emit initial status\n setTimeout(() => {\n this.formStatusChange.emit(this.form.status);\n });\n }\n\n ngAfterViewInit(): void {\n // Small delay to ensure children are fully rendered and MnModalShell hasn't just stolen focus\n setTimeout(() => {\n this.applyAutoFocus();\n }, 100);\n }\n\n public applyAutoFocus(): void {\n const autoFocusField = this.config.fields.find(f => (f as FormFieldView<TModel>).autoFocus);\n if (!autoFocusField) return;\n\n const key = autoFocusField.key as string;\n\n // Small delay to ensure browser is ready to focus\n setTimeout(() => {\n // Try finding in MnInputField components\n const inputField = this.inputFields?.find(f => f.props.id === key);\n if (inputField) {\n inputField.focus();\n return;\n }\n\n // Try finding in MnTextarea components\n const textarea = this.textareas?.find(f => f.props?.id === key);\n if (textarea) {\n textarea.focus();\n return;\n }\n\n // Fallback to native element if possible\n const el = document.getElementById(key);\n if (el) el.focus();\n }, 50);\n }\n\n ngOnDestroy(): void {\n this.valueChangesSubscription?.unsubscribe();\n }\n\n private initializeForm(): void {\n const formControls: Record<string, [unknown, AbstractControlOptions]> = {};\n\n this.config.fields.forEach(field => {\n const fieldConfig = field as FormFieldView<TModel>;\n let initialValue: unknown = this.config.initialValue?.[field.key as keyof TModel] ?? null;\n\n // Handle checkbox default values\n if (field.kind === FieldKind.CHECKBOX && initialValue === null) {\n initialValue = fieldConfig.defaultValue ?? false;\n }\n\n const validators = fieldConfig.validators || [];\n const asyncValidators = fieldConfig.asyncValidators || [];\n const updateOn = fieldConfig.updateOn || 'change';\n\n formControls[field.key as string] = [\n initialValue,\n {\n validators,\n asyncValidators,\n updateOn\n }\n ];\n });\n\n this.form = this.fb.group(formControls);\n\n // Apply Angular FormGroup-level validators\n if (this.config.groupValidators && this.config.groupValidators.length > 0) {\n this.form.setValidators(this.config.groupValidators);\n this.form.updateValueAndValidity();\n }\n\n // Apply disabled/readOnly state to controls\n this.config.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n const control = this.form.get(field.key as string);\n if (control && (fieldView.disabled || fieldView.readOnly)) {\n control.disable();\n }\n });\n }\n\n isFieldReadOnly(field: FormFieldConfig<TModel>): boolean {\n return this.config.readOnly === true || (field as FormFieldView<TModel>).readOnly === true;\n }\n\n isFieldDisabled(field: FormFieldConfig<TModel>): boolean {\n return this.config.disabled === true || (field as FormFieldView<TModel>).disabled === true;\n }\n\n /** Track which field groups are currently visible */\n groupVisibility: Record<string, boolean> = {};\n\n private buildRows(): void {\n if (this.config.rows && this.config.rows.length > 0) {\n this.rows = this.config.rows;\n } else {\n // Create rows for fields that are not in any row or group\n const fieldsInGroups = new Set<string>();\n (this.config.fieldGroups || []).forEach(g => {\n (g.rows || []).forEach(r => r.fields.forEach(f => fieldsInGroups.add(f.field.key as string)));\n // Also check if group has flat fields list (compatibility)\n if (g.fields) {\n g.fields.forEach(f => fieldsInGroups.add(f.key as string));\n }\n });\n\n const fieldsInRows = new Set<string>();\n (this.config.rows || []).forEach(r => r.fields.forEach(f => fieldsInRows.add(f.field.key as string)));\n\n const standaloneFields = this.config.fields.filter(f => !fieldsInGroups.has(f.key as string) && !fieldsInRows.has(f.key as string));\n\n if (standaloneFields.length > 0) {\n this.rows = standaloneFields.map(field => ({\n columns: 1,\n fields: [{ field, span: 1 }],\n }));\n }\n }\n // Build field groups\n this.fieldGroups = this.config.fieldGroups || [];\n // Initialize group visibility\n this.initializeGroupVisibility();\n }\n\n private initializeGroupVisibility(): void {\n this.fieldGroups.forEach((group, index) => {\n const key = group.title || `group-${index}`;\n const isVisible = group.visible ? group.visible(this.form.value) : true;\n this.groupVisibility[key] = isVisible;\n // If group is hidden, clear validators on its fields\n if (!isVisible) {\n group.fields.forEach(field => {\n const control = this.form.get(field.key as string);\n if (control) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n }\n });\n }\n });\n }\n\n private updateGroupVisibility(): void {\n const formValue = this.form.value;\n this.fieldGroups.forEach((group, index) => {\n const key = group.title || `group-${index}`;\n const wasVisible = this.groupVisibility[key];\n const isVisible = group.visible ? group.visible(formValue) : true;\n this.groupVisibility[key] = isVisible;\n\n if (!isVisible && wasVisible) {\n // Group became hidden — clear validators on its fields\n group.fields.forEach(field => {\n const control = this.form.get(field.key as string);\n if (control) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n }\n });\n } else if (isVisible && !wasVisible) {\n // Group became visible — restore validators\n group.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n const validators = fieldView.validators || [];\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValidators(validators);\n control.updateValueAndValidity({ emitEvent: false });\n }\n });\n }\n });\n }\n\n isGroupVisible(group: FormFieldGroup<TModel>): boolean {\n const key = group.title || `group-${this.fieldGroups.indexOf(group)}`;\n return this.groupVisibility[key];\n }\n\n // =========================\n // Feature 1: Conditional/Dynamic Fields\n // =========================\n\n private initializeVisibility(): void {\n const formValue = this.form.value as Partial<TModel>;\n this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldView = field as FormFieldView<TModel>;\n const isVisible = fieldView.visible ? fieldView.visible(formValue) : true;\n this.fieldVisibility[key] = isVisible;\n\n // If initially hidden, clear validators so they don't block submit\n if (!isVisible) {\n const control = this.form.get(key);\n if (control) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n }\n } else if (fieldView.conditionallyRequired) {\n // Initialize conditionallyRequired state for visible fields\n const isRequired = fieldView.conditionallyRequired(formValue);\n this.fieldConditionallyRequired[key] = isRequired;\n if (isRequired) {\n const control = this.form.get(key);\n if (control) {\n const validators = this.buildValidators(fieldView, formValue);\n control.setValidators(validators);\n control.updateValueAndValidity({emitEvent: false});\n }\n }\n }\n });\n }\n\n private updateVisibility(): void {\n const formValue = this.form.value as Partial<TModel>;\n this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldView = field as FormFieldView<TModel>;\n const wasVisible = this.fieldVisibility[key];\n const isVisible = fieldView.visible ? fieldView.visible(formValue) : true;\n this.fieldVisibility[key] = isVisible;\n\n // When a field becomes hidden, clear its validators so it doesn't block submit\n const control = this.form.get(key);\n if (control) {\n if (!isVisible && wasVisible) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n } else if (isVisible && !wasVisible) {\n // Restore validators (including conditionallyRequired if active)\n const validators = this.buildValidators(fieldView, formValue);\n control.setValidators(validators);\n control.updateValueAndValidity({emitEvent: false});\n } else if (isVisible) {\n // Update conditionallyRequired for visible fields\n this.updateConditionallyRequired(fieldView, formValue);\n }\n }\n });\n }\n\n /**\n * Builds the full validator array for a field, including conditionallyRequired.\n * @param field The field configuration view.\n * @param formValue The current form values.\n * @returns Array of validators to apply.\n */\n private buildValidators(field: FormFieldView<TModel>, formValue: Partial<TModel>): ValidatorFn[] {\n const baseValidators = field.validators ? [...field.validators] : [];\n if (field.conditionallyRequired && field.conditionallyRequired(formValue)) {\n if (!baseValidators.includes(Validators.required)) {\n baseValidators.push(Validators.required);\n }\n }\n return baseValidators;\n }\n\n /**\n * Updates the conditionallyRequired state for a single field and adjusts validators.\n * @param field The field configuration view.\n * @param formValue The current form values.\n */\n private updateConditionallyRequired(field: FormFieldView<TModel>, formValue: Partial<TModel>): void {\n if (!field.conditionallyRequired) return;\n const key = field.key as string;\n const wasRequired = this.fieldConditionallyRequired[key] ?? false;\n const isRequired = field.conditionallyRequired(formValue);\n this.fieldConditionallyRequired[key] = isRequired;\n\n if (isRequired !== wasRequired) {\n const control = this.form.get(key);\n if (control) {\n const validators = this.buildValidators(field, formValue);\n control.setValidators(validators);\n control.updateValueAndValidity({emitEvent: false});\n }\n }\n }\n\n isFieldVisible(field: FormFieldConfig<TModel>): boolean {\n return this.fieldVisibility[field.key as string];\n }\n\n // =========================\n // Feature 2: Cross-Field Validation\n // =========================\n\n private runFormValidators(): void {\n this.formErrors = {};\n if (!this.config.formValidators) return;\n\n const formValue = this.form.value;\n for (const validator of this.config.formValidators) {\n const errors = validator(formValue);\n if (errors) {\n Object.assign(this.formErrors, errors);\n }\n }\n }\n\n getFieldError(key: string): string | null {\n return this.formErrors[key] || null;\n }\n\n get hasFormErrors(): boolean {\n return Object.keys(this.formErrors).length > 0;\n }\n\n // =========================\n // Feature 3: Async Data Sources\n // =========================\n\n private initializeDataSources(): void {\n this.config.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n if (fieldView.dataSource) {\n this.loadFieldOptions(field.key as string, fieldView.dataSource, this.form.value as Partial<TModel>);\n }\n });\n }\n\n isFieldLoading(key: string): boolean {\n return this.fieldLoading[key];\n }\n\n /** Get options for a field — uses dataSource options if available, otherwise static options */\n getFieldOptions(field: FormFieldConfig<TModel>): SelectOption[] {\n const key = field.key as string;\n if (this.fieldOptions[key] !== undefined) {\n return this.fieldOptions[key];\n }\n return (field as FormFieldView<TModel>).options || [];\n }\n\n /** Convert SelectOption[] to MnSelectOption[] for mn-lib-select */\n getSelectOptions(field: FormFieldConfig<TModel>): MnSelectOption[] {\n return this.getFieldOptions(field).map(o => ({\n label: o.label,\n value: o.value,\n disabled: o.state === 'disabled',\n }));\n }\n\n getSelectProps(field: FormFieldConfig<TModel>): MnSelectProps {\n return {\n id: field.key as string,\n label: this.asField(field).label,\n placeholder: this.isFieldLoading(field.key as string) ? this.labels.loading : this.labels.selectPlaceholder,\n options: this.getSelectOptions(field),\n fullWidth: true,\n };\n }\n\n private async loadFieldOptions(key: string, dataSource: FieldDataSource, formValue: Partial<TModel>): Promise<void> {\n this.fieldLoading[key] = true;\n try {\n this.fieldOptions[key] = await dataSource.load(formValue);\n } catch (error) {\n console.error(`Failed to load options for field '${key}':`, error);\n this.fieldOptions[key] = [];\n } finally {\n this.fieldLoading[key] = false;\n }\n }\n\n // =========================\n // Feature: Multi-Select Table Fields\n // =========================\n\n private initializeTableFields(): void {\n this.config.fields.forEach(field => {\n if (field.kind === FieldKind.MULTI_SELECT_TABLE) {\n const tableField = field as MultiSelectTableFieldConfig<TModel>;\n const ds = tableField.tableDataSource;\n // Force multi selection mode\n ds.selectionMode = 'multi';\n\n // Pre-select rows from the form's initial value\n const control = this.form.get(field.key as string);\n if (control && Array.isArray(control.value) && control.value.length > 0) {\n ds.initialSelectedIds = control.value.map((v: unknown) => String(v));\n } else if (control && control.value === null) {\n control.setValue([], { emitEvent: false });\n }\n\n this.tableDataSources[field.key as string] = ds;\n } else if (field.kind === FieldKind.SINGLE_SELECT_TABLE) {\n const tableField = field as SingleSelectTableFieldConfig<TModel>;\n const ds = tableField.tableDataSource;\n // Force single selection mode\n ds.selectionMode = 'single';\n\n // Pre-select row from the form's initial value\n const control = this.form.get(field.key as string);\n if (control && control.value != null) {\n ds.initialSelectedIds = [String(control.value)];\n }\n\n this.tableDataSources[field.key as string] = ds;\n }\n });\n }\n\n onTableSelectionChange(field: FormFieldConfig<TModel>, selectedRows: unknown[]): void {\n if (field.kind === FieldKind.SINGLE_SELECT_TABLE) {\n const tableField = field as SingleSelectTableFieldConfig<TModel>;\n const getVal = tableField.getRowValue || tableField.tableDataSource.getID;\n const value = selectedRows.length > 0 ? getVal(selectedRows[0]) : null;\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(value);\n control.markAsTouched();\n }\n } else {\n const tableField = field as MultiSelectTableFieldConfig<TModel>;\n const getVal = tableField.getRowValue || tableField.tableDataSource.getID;\n const values = selectedRows.map(row => getVal(row));\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(values);\n control.markAsTouched();\n }\n }\n }\n\n // =========================\n // Feature: Rating Fields\n // =========================\n\n getRatingRange(field: FormFieldConfig<TModel>): number[] {\n const max = (field as RatingFieldConfig<TModel>).max || 5;\n return Array.from({ length: max }, (_, i) => i + 1);\n }\n\n setRating(field: FormFieldConfig<TModel>, value: number): void {\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(value);\n control.markAsTouched();\n }\n }\n\n getRatingValue(field: FormFieldConfig<TModel>): number {\n return this.form.get(field.key as string)?.value || 0;\n }\n\n // =========================\n // Feature: Slider Fields\n // =========================\n\n onSliderChange(field: FormFieldConfig<TModel>, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseFloat(input.value);\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(value);\n control.markAsTouched();\n }\n }\n\n getSliderValue(field: FormFieldConfig<TModel>): number {\n const f = field as SliderFieldConfig<TModel>;\n return this.form.get(field.key as string)?.value ?? f.min ?? 0;\n }\n\n // =========================\n // Feature: Color Fields\n // =========================\n\n onColorChange(field: FormFieldConfig<TModel>, event: Event): void {\n const input = event.target as HTMLInputElement;\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(input.value);\n control.markAsTouched();\n }\n }\n\n setColorFromSwatch(field: FormFieldConfig<TModel>, color: string): void {\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(color);\n control.markAsTouched();\n }\n }\n\n getColorValue(field: FormFieldConfig<TModel>): string {\n return this.form.get(field.key as string)?.value || '#000000';\n }\n\n // =========================\n // Value Changes Subscription\n // =========================\n\n private subscribeToValueChanges(): void {\n // Initialize previousFormValue with current form state to avoid false \"changed\" on first emission\n this.previousFormValue = { ...this.form.value };\n\n this.valueChangesSubscription = this.form.valueChanges.subscribe(formValue => {\n // Update conditional visibility\n this.updateVisibility();\n\n // Update group visibility\n this.updateGroupVisibility();\n\n // Run cross-field validators\n this.runFormValidators();\n\n // Reload data sources that depend on changed fields\n this.reloadDependentDataSources(formValue);\n\n // Emit status change\n this.formStatusChange.emit(this.form.status);\n });\n }\n\n private previousFormValue: Partial<TModel> = {};\n\n private reloadDependentDataSources(formValue: Partial<TModel>): void {\n this.config.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n const dataSource: FieldDataSource | undefined = fieldView.dataSource;\n if (!dataSource?.dependsOn) return;\n\n // Check if any dependency changed\n const changed = dataSource.dependsOn.some(depKey => {\n return formValue[depKey as keyof TModel] !== this.previousFormValue[depKey as keyof TModel];\n });\n\n if (changed) {\n this.loadFieldOptions(field.key as string, dataSource, formValue);\n }\n });\n this.previousFormValue = { ...formValue };\n }\n\n // =========================\n // Feature: File Upload Fields\n // =========================\n\n /**\n * Invokes a FILE field's `onClear` callback when its existing image is removed.\n * FILE fields render {@link MnFileInput}, which owns selection/validation and\n * writes the value (`File | File[] | null`) straight to the form control.\n * @param field The field whose existing image was cleared.\n */\n onFileCleared(field: FormFieldConfig<TModel>): void {\n (field as FileFieldConfig<TModel>).onClear?.();\n }\n\n async submit(): Promise<void> {\n // Run cross-field validators before submit\n this.runFormValidators();\n\n if (this.form.invalid || this.isSubmitting || this.hasFormErrors) {\n this.form.markAllAsTouched();\n return;\n }\n\n if (this.config.submitMode === SubmitMode.ONCE) {\n this.isSubmitting = true;\n }\n\n const formValue = this.form.value as TResult;\n\n try {\n if (this.config.onComplete) {\n await this.config.onComplete.handle(formValue);\n }\n this.modalRef.close(formValue);\n } catch (error) {\n // Always allow retry on error, regardless of submit mode\n this.isSubmitting = false;\n console.error('Form submission error:', error);\n }\n }\n}\n","@if ((config.component || config.template) && !hideCustomBody) {\n <mn-custom-body-host\n [config]=\"asAny(config)\"\n [modalRef]=\"asAny(modalRef)\"\n class=\"mb-6 block\"\n ></mn-custom-body-host>\n}\n\n<form (ngSubmit)=\"submit()\" [formGroup]=\"form\" class=\"flex flex-col gap-6 h-full\">\n <!-- Shared field rendering template (must be inside form for formControlName) -->\n <ng-template #fieldTemplate let-rowField>\n @switch (rowField.field.kind) {\n @case (FieldKind.TEXT) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'text',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n mask: asField(rowField.field).mask,\n autocomplete: asField(rowField.field).autocomplete,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.NUMBER) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'number',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.PASSWORD) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'password',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.SELECT) {\n <div class=\"flex flex-col\">\n <mn-lib-select\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"getSelectProps(rowField.field)\"\n ></mn-lib-select>\n @if (isFieldLoading(asKey(rowField.field.key))) {\n <div class=\"flex items-center gap-1 pl-2 pt-1\">\n <div class=\"w-4 h-4 border-2 border-base-300 border-t-blue-500 rounded-full animate-spin\"></div>\n </div>\n }\n @if (getFieldError(asKey(rowField.field.key))) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ getFieldError(asKey(rowField.field.key)) }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.CHECKBOX) {\n <div>\n <mn-lib-checkbox\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n disabled: isFieldDisabled(rowField.field) || isFieldReadOnly(rowField.field)\n })\"\n ></mn-lib-checkbox>\n </div>\n }\n\n @case (FieldKind.DATE) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'date',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n startDate: asField(rowField.field).minDate,\n endDate: asField(rowField.field).maxDate,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.DATETIME) {\n <div>\n <mn-lib-datetime\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n mode: asField(rowField.field).mode || 'datetime-local',\n min: asField(rowField.field).min,\n max: asField(rowField.field).max,\n step: asField(rowField.field).step,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-datetime>\n </div>\n }\n\n @case (FieldKind.TEXTAREA) {\n <div>\n <mn-lib-textarea\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n rows: asField(rowField.field).rows || 4,\n resize: 'vertical',\n autocomplete: asField(rowField.field).autocomplete,\n readonly: isFieldReadOnly(rowField.field)\n })\"\n ></mn-lib-textarea>\n </div>\n }\n\n @case (FieldKind.MULTI_SELECT) {\n <div>\n @if (isFieldLoading(asKey(rowField.field.key))) {\n <div class=\"flex items-center gap-2 py-2 text-sm text-base-content/50\">\n <div class=\"w-4 h-4 border-2 border-base-300 border-t-blue-500 rounded-full animate-spin\"></div>\n {{ labels.loadingOptions }}\n </div>\n }\n @if (!isFieldLoading(asKey(rowField.field.key))) {\n <mn-lib-multi-select\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n options: getFieldOptions(rowField.field),\n searchable: asField(rowField.field).searchable,\n searchPlaceholder: asField(rowField.field).searchPlaceholder,\n maxSelections: asField(rowField.field).maxSelections,\n disabled: isFieldDisabled(rowField.field) || isFieldReadOnly(rowField.field)\n })\"\n ></mn-lib-multi-select>\n }\n @if (getFieldError(asKey(rowField.field.key))) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ getFieldError(asKey(rowField.field.key)) }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.MULTI_SELECT_TABLE) {\n <ng-container [ngTemplateOutlet]=\"selectTableTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n }\n\n @case (FieldKind.SINGLE_SELECT_TABLE) {\n <ng-container [ngTemplateOutlet]=\"selectTableTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n }\n\n @case (FieldKind.COLOR) {\n <div class=\"flex flex-col gap-1\">\n <label [for]=\"'field-' + asKey(rowField.field.key)\"\n class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n <div class=\"flex items-center gap-3\">\n <input\n type=\"color\"\n [id]=\"'field-' + asKey(rowField.field.key)\"\n class=\"w-10 h-10 rounded-lg border border-base-300 cursor-pointer p-0.5\"\n [value]=\"getColorValue(rowField.field)\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (input)=\"onColorChange(rowField.field, $event)\"\n />\n <span class=\"text-sm text-base-content/60 font-mono\">{{ getColorValue(rowField.field) }}</span>\n </div>\n @if (asField(rowField.field).swatches) {\n <div class=\"flex gap-1.5 mt-1\">\n @for (swatch of asField(rowField.field).swatches; track swatch) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n type=\"button\"\n class=\"w-6 h-6 rounded-md border border-base-300 cursor-pointer transition-transform hover:scale-110\"\n [style.background-color]=\"swatch\"\n [class.ring-2]=\"getColorValue(rowField.field) === swatch\"\n [class.ring-blue-500]=\"getColorValue(rowField.field) === swatch\"\n (click)=\"setColorFromSwatch(rowField.field, swatch)\"\n [attr.aria-label]=\"'Select color ' + swatch\"\n ></button>\n }\n </div>\n }\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.RATING) {\n <div class=\"flex flex-col gap-1\">\n <span [id]=\"'rating-label-' + asKey(rowField.field.key)\"\n class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n <div [attr.aria-labelledby]=\"'rating-label-' + asKey(rowField.field.key)\" class=\"flex items-center gap-1\"\n role=\"group\">\n @for (star of getRatingRange(rowField.field); track star) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n type=\"button\"\n class=\"text-2xl cursor-pointer transition-colors focus:outline-none\"\n [class.text-yellow-400]=\"star <= getRatingValue(rowField.field)\"\n [class.text-base-300]=\"star > getRatingValue(rowField.field)\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (click)=\"setRating(rowField.field, star)\"\n >\n ★\n </button>\n }\n <span class=\"text-sm text-base-content/50 ml-2\">{{ getRatingValue(rowField.field) }} / {{ asField(rowField.field).max || 5 }}</span>\n </div>\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.SLIDER) {\n <div class=\"flex flex-col gap-1\">\n <label [for]=\"'field-' + asKey(rowField.field.key)\"\n class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n <div class=\"flex items-center gap-3\">\n <input\n type=\"range\"\n [id]=\"'field-' + asKey(rowField.field.key)\"\n class=\"flex-1 h-2 bg-base-200 rounded-lg appearance-none cursor-pointer accent-blue-500\"\n [attr.min]=\"asField(rowField.field).min ?? 0\"\n [attr.max]=\"asField(rowField.field).max ?? 100\"\n [attr.step]=\"asField(rowField.field).step ?? 1\"\n [value]=\"getSliderValue(rowField.field)\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (input)=\"onSliderChange(rowField.field, $event)\"\n />\n @if (asField(rowField.field).showValue !== false) {\n <span class=\"text-sm text-base-content/60 min-w-[3rem] text-right\">\n {{ getSliderValue(rowField.field) }}{{ asField(rowField.field).unit || '' }}\n </span>\n }\n </div>\n <div class=\"flex justify-between text-xs text-base-content/40 px-1\">\n <span>{{ asField(rowField.field).min ?? 0 }}</span>\n <span>{{ asField(rowField.field).max ?? 100 }}</span>\n </div>\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.FILE) {\n <div>\n <mn-lib-file-input\n (cleared)=\"onFileCleared(rowField.field)\"\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n accept: asField(rowField.field).accept,\n multiple: asField(rowField.field).multiple,\n maxFiles: asField(rowField.field).maxFiles,\n maxSize: asField(rowField.field).maxSize,\n displayMode: asField(rowField.field).displayMode,\n dropzoneHint: asField(rowField.field).dropzoneHint,\n replaceLabel: asField(rowField.field).replaceLabel,\n removeLabel: asField(rowField.field).removeLabel,\n currentUrl: asField(rowField.field).currentUrl,\n currentUrls: asField(rowField.field).currentUrls,\n disabled: isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\n })\"\n ></mn-lib-file-input>\n </div>\n }\n\n @case (FieldKind.CUSTOM) {\n <div>\n <ng-container\n mnCustomFieldHost\n [component]=\"asField(rowField.field).component\"\n [inputs]=\"asField(rowField.field).inputs\"\n [formControlName]=\"asKey(rowField.field.key)\"\n ></ng-container>\n </div>\n }\n\n @default {\n <div></div>\n }\n }\n\n <!-- Show cross-field error below any field that has one -->\n @if (getFieldError(asKey(rowField.field.key)) && rowField.field.kind !== FieldKind.SELECT && rowField.field.kind !== FieldKind.MULTI_SELECT) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ getFieldError(asKey(rowField.field.key)) }}\n </div>\n }\n </ng-template>\n\n <!-- Shared template for MULTI_SELECT_TABLE and SINGLE_SELECT_TABLE -->\n <ng-template #selectTableTemplate let-rowField>\n <div class=\"flex flex-col gap-1\">\n @if (asField(rowField.field).label) {\n <span class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n }\n <mn-table\n [dataSource]=\"tableDataSources[asKey(rowField.field.key)]\"\n [attr.aria-label]=\"asField(rowField.field).label || null\"\n (selectionChange)=\"onTableSelectionChange(rowField.field, $event)\"\n ></mn-table>\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n </ng-template>\n\n <!-- Field Groups (sections with headers) -->\n @if (fieldGroups.length > 0) {\n <div class=\"flex flex-col gap-6\">\n @for (group of fieldGroups; track group.title) {\n <div class=\"flex flex-col gap-4\" [style.display]=\"isGroupVisible(group) ? '' : 'none'\">\n <div class=\"border-b border-base-300 pb-2\">\n <h3 class=\"text-base font-semibold text-base-content\">{{ group.title }}</h3>\n @if (group.description) {\n <p class=\"text-sm text-base-content/50 mt-0.5\">{{ group.description }}</p>\n }\n </div>\n @for (row of group.rows; track $index) {\n <div [style.--mn-form-cols]=\"row.columns || 1\" class=\"grid gap-4 mn-form-row\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div [style.--mn-form-span]=\"rowField.span || 1\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\"\n class=\"flex flex-col gap-2 mn-form-cell\">\n <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Standard rows (no groups) -->\n @if (rows.length > 0) {\n <div class=\"flex flex-col gap-4\">\n @for (row of rows; track $index) {\n <div [style.--mn-form-cols]=\"row.columns || 1\" class=\"grid gap-4 mn-form-row\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div [style.--mn-form-span]=\"rowField.span || 1\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\"\n class=\"flex flex-col gap-2 mn-form-cell\">\n <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Form-level errors (not tied to a specific field) -->\n @if (formErrors['_form']) {\n <div class=\"text-red-500 text-sm px-2 py-1 bg-red-50 rounded-md\">\n {{ formErrors['_form'] }}\n </div>\n }\n\n @if (!hideFooter) {\n <div class=\"flex gap-3 pt-4 pb-6 border-t border-base-300 mt-auto sticky bottom-0 bg-base-100 z-10\">\n <button\n mnButton\n type=\"button\"\n [data]=\"{ variant: 'outline', color: 'secondary' }\"\n (mousedown)=\"modalRef.dismiss(ModalCloseReason.CANCELLED)\"\n >\n {{ labels.cancel }}\n </button>\n\n <div class=\"flex-1\"></div>\n\n <button\n mnButton\n type=\"submit\"\n [data]=\"{ variant: 'fill', color: 'primary', disabled: form.invalid || isSubmitting }\"\n [disabled]=\"form.invalid || isSubmitting\"\n >\n {{ isSubmitting ? labels.submitting : labels.submit }}\n </button>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnButton } from '../../../mn-button/mn-button';\nimport {MnButtonTypes} from '../../../mn-button/mn-buttonTypes';\nimport { ModalFooterAction, ActionStyle } from '../../mn-modal.types';\n\n@Component({\n selector: 'mn-footer-actions',\n standalone: true,\n imports: [CommonModule, MnButton],\n host: { class: 'contents' },\n template: `\n @for (action of leftActions; track action.label) {\n <button\n mnButton\n [data]=\"getButtonData(action)\"\n [disabled]=\"action.disabled || false\"\n (click)=\"actionClick.emit(action)\"\n >\n {{ action.label }}\n </button>\n }\n\n <div class=\"flex-1\"></div>\n\n @for (action of rightActions; track action.label) {\n <button\n mnButton\n [data]=\"getButtonData(action)\"\n [disabled]=\"action.disabled || false\"\n (click)=\"actionClick.emit(action)\"\n >\n {{ action.label }}\n </button>\n }\n `,\n})\nexport class MnFooterActionsComponent<TResult = unknown> {\n @Input() actions: ModalFooterAction<TResult>[] = [];\n @Output() actionClick = new EventEmitter<ModalFooterAction<TResult>>();\n\n get leftActions(): ModalFooterAction<TResult>[] {\n return this.actions.filter(a => a.position === 'left');\n }\n\n get rightActions(): ModalFooterAction<TResult>[] {\n return this.actions.filter(a => a.position !== 'left');\n }\n\n getButtonData(action: ModalFooterAction<TResult>): Partial<MnButtonTypes> {\n switch (action.style) {\n case ActionStyle.PRIMARY:\n return { variant: 'fill', color: 'primary', disabled: action.disabled };\n case ActionStyle.DANGER:\n return { variant: 'fill', color: 'danger', disabled: action.disabled };\n case ActionStyle.GHOST:\n return { variant: 'text', color: 'secondary', disabled: action.disabled };\n case ActionStyle.SECONDARY:\n default:\n return { variant: 'outline', color: 'secondary', disabled: action.disabled };\n }\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n ViewChildren,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {Subscription} from 'rxjs';\nimport {MnModalRef} from '../../mn-modal-ref';\nimport {\n ActionStyle,\n FormModalConfig,\n ModalCloseReason,\n ModalFooterAction,\n ModalKind,\n ModalRef,\n ModalSize,\n ModalStepId,\n NavigationDirection,\n WizardFlowMode,\n WizardModalConfig,\n WizardResult,\n WizardStepConfig,\n} from '../../mn-modal.types';\nimport {MnButton, MnButtonTypes} from '../../../mn-button';\nimport {MnFormBodyComponent} from '../mn-form-body/mn-form-body.component';\nimport {MnCustomBodyHostComponent} from '../mn-custom-body-host/mn-custom-body-host.component';\nimport {MnFooterActionsComponent} from '../mn-footer-actions/mn-footer-actions.component';\nimport {MnLanguageService} from '../../../../language';\n\n@Component({\n selector: 'mn-wizard-body',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MnButton, MnFormBodyComponent, MnCustomBodyHostComponent, MnFooterActionsComponent],\n templateUrl: './mn-wizard-body.component.html',\n styleUrls: ['./mn-wizard-body.component.css'],\n})\nexport class MnWizardBodyComponent implements OnInit, AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() config!: WizardModalConfig;\n @Input() modalRef!: MnModalRef<WizardResult>;\n\n @ViewChildren(MnFormBodyComponent) formBodies!: QueryList<MnFormBodyComponent>;\n @ViewChildren('stepWrapper') stepWrappers!: QueryList<ElementRef<HTMLElement>>;\n\n currentStepId!: ModalStepId;\n visitedStepIds: ModalStepId[] = [];\n isCurrentStepValid = true;\n isCompleting = false;\n wizardErrors: Record<string, string> = {};\n\n /**\n * Min-height (px) for the step container, sized to the tallest step so the\n * modal does not jump when navigating between steps. Monotonic — only grows.\n */\n measuredMinHeight = 0;\n\n private languageService = inject(MnLanguageService);\n\n private static readonly DEFAULT_LABELS: Record<string, string> = {\n next: 'Next',\n back: 'Back',\n close: 'Close',\n complete: 'Complete',\n completing: 'Completing...',\n };\n\n private resolveLabel(i18nValue: string | undefined, key: string): string {\n if (i18nValue) return i18nValue;\n const translated = this.languageService.translate(`common.${key}`);\n return translated === `common.${key}` ? MnWizardBodyComponent.DEFAULT_LABELS[key] : translated;\n }\n\n /** Resolved i18n labels with defaults, falling back to translated keys */\n get labels() {\n const i18n = (this.config as { i18n?: Record<string, string> }).i18n || {};\n return {\n next: this.resolveLabel(i18n['next'], 'next'),\n back: this.resolveLabel(i18n['back'], 'back'),\n close: this.resolveLabel(i18n['close'], 'close'),\n complete: this.resolveLabel(i18n['complete'], 'complete'),\n completing: this.resolveLabel(i18n['completing'], 'completing'),\n };\n }\n\n /** Pre-built form configs keyed by step id — only for steps that have fields */\n stepFormConfigs: Record<ModalStepId, FormModalConfig<unknown, unknown>> = {};\n\n private statusSubscription?: Subscription;\n private formBodiesSubscription?: Subscription;\n\n ngOnInit(): void {\n // Pre-build form configs for all form-driven steps\n for (const step of this.config.steps) {\n if (step.fields && step.fields.length > 0) {\n // Merge top-level initialValue with step-level initialValue\n const mergedInitialValue = {\n ...(this.config.initialValue || {}),\n ...(step.initialValue || {})\n };\n\n this.stepFormConfigs[step.id] = {\n kind: ModalKind.FORM,\n fields: step.fields,\n rows: step.rows,\n fieldGroups: step.fieldGroups,\n formValidators: step.formValidators,\n groupValidators: step.groupValidators,\n initialValue: mergedInitialValue,\n readOnly: this.config.readOnly,\n disabled: this.config.disabled\n } as FormModalConfig<unknown, unknown>;\n }\n }\n\n this.currentStepId = this.config.startStepId || this.config.steps[0]?.id;\n if (this.currentStepId) {\n this.visitedStepIds.push(this.currentStepId);\n }\n }\n\n ngAfterViewInit(): void {\n // Subscribe to form bodies list changes to track validity\n this.formBodiesSubscription = this.formBodies.changes.subscribe(() => {\n this.trackCurrentStepValidity();\n // Apply autofocus when form bodies change (e.g. step navigation)\n setTimeout(() => {\n this.getCurrentFormBody()?.applyAutoFocus();\n }, 100);\n // Re-measure in case dynamic field visibility changed a step's height\n this.measureTallestStep();\n });\n // Initial validity check\n this.trackCurrentStepValidity();\n\n // Pre-size the modal to the tallest step so it does not jump between steps.\n // All steps are already rendered (display:none), so this is a pure layout\n // read — it creates no components and triggers no data loads or autofocus.\n setTimeout(() => this.measureTallestStep(), 0);\n // A second pass catches content that grows after async data sources resolve.\n setTimeout(() => this.measureTallestStep(), 300);\n }\n\n isTextBody(step: WizardStepConfig): boolean {\n return typeof step.body === 'string';\n }\n\n ngOnDestroy(): void {\n this.statusSubscription?.unsubscribe();\n this.formBodiesSubscription?.unsubscribe();\n }\n\n /**\n * Measures every step's natural height and records the tallest as\n * {@link measuredMinHeight}. Monotonic: the value only ever grows, so a\n * re-measure can never shrink the modal. Skipped when the modal has an\n * explicit height or is full-size (those are already fixed-height).\n */\n private measureTallestStep(): void {\n if (this.config.sizeHeight || this.config.sizeWidth === ModalSize.FULL) return;\n const wrappers = this.stepWrappers?.toArray().map(ref => ref.nativeElement) ?? [];\n if (wrappers.length === 0) return;\n\n // Synchronous pre-paint pass: show one step at a time, read its height,\n // then restore the original display values (so there is no visible flicker).\n const originalDisplay = wrappers.map(el => el.style.display);\n let tallest = 0;\n for (let i = 0; i < wrappers.length; i++) {\n for (let j = 0; j < wrappers.length; j++) {\n wrappers[j].style.display = i === j ? 'block' : 'none';\n }\n tallest = Math.max(tallest, wrappers[i].offsetHeight);\n }\n wrappers.forEach((el, i) => (el.style.display = originalDisplay[i]));\n\n if (tallest > this.measuredMinHeight) {\n this.measuredMinHeight = tallest;\n this.cdr.detectChanges();\n }\n }\n\n /** Get visible steps (filtered by visibility condition) */\n get visibleSteps(): WizardStepConfig[] {\n return this.config.steps.filter(s => this.isStepVisible(s));\n }\n\n isStepVisible(step: WizardStepConfig): boolean {\n if (!step.visible) return true;\n return step.visible(this.getAggregatedData());\n }\n\n get currentStep() {\n return this.config.steps.find(s => s.id === this.currentStepId);\n }\n\n get currentVisibleIndex(): number {\n return this.visibleSteps.findIndex(s => s.id === this.currentStepId);\n }\n\n get currentStepIndex(): number {\n return this.config.steps.findIndex(s => s.id === this.currentStepId);\n }\n\n get canGoBack(): boolean {\n return this.currentVisibleIndex > 0;\n }\n\n get canGoNext(): boolean {\n return this.currentVisibleIndex < this.visibleSteps.length - 1;\n }\n\n get isLastStep(): boolean {\n return this.currentVisibleIndex === this.visibleSteps.length - 1;\n }\n\n /** Index of the current step for the progress line */\n get currentProgressIndex(): number {\n return this.currentVisibleIndex;\n }\n\n get isFreeFlow(): boolean {\n return this.config.flow === WizardFlowMode.FREE;\n }\n\n canNavigateToStep(step: WizardStepConfig): boolean {\n if (!this.isFreeFlow) return false;\n return this.isStepVisible(step);\n }\n\n async goToStep(step: WizardStepConfig): Promise<void> {\n if (!this.canNavigateToStep(step)) return;\n if (step.id === this.currentStepId) return;\n\n // Validate current step's form before allowing direct step navigation\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form.invalid) {\n formBody.form.markAllAsTouched();\n return;\n }\n\n const previousStepId = this.currentStepId;\n this.currentStepId = step.id;\n\n if (!this.visitedStepIds.includes(this.currentStepId)) {\n this.visitedStepIds.push(this.currentStepId);\n }\n\n await this.notifyStepChange(previousStepId, NavigationDirection.DIRECT);\n this.trackCurrentStepValidity();\n }\n\n /** Find the MnFormBodyComponent for the current step */\n private getCurrentFormBody(): MnFormBodyComponent | undefined {\n if (!this.formBodies) return undefined;\n // formBodies only contains entries for steps that have stepFormConfigs\n // We need to find which form body index corresponds to the current step\n const formStepIds = this.config.steps\n .filter(s => this.stepFormConfigs[s.id])\n .map(s => s.id);\n const formIndex = formStepIds.indexOf(this.currentStepId);\n if (formIndex === -1) return undefined;\n return this.formBodies.toArray()[formIndex];\n }\n\n private trackCurrentStepValidity(): void {\n // Unsubscribe from previous\n this.statusSubscription?.unsubscribe();\n this.statusSubscription = undefined;\n\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form) {\n this.isCurrentStepValid = formBody.form.valid;\n this.statusSubscription = formBody.form.statusChanges.subscribe(() => {\n this.isCurrentStepValid = formBody.form.valid;\n this.cdr.detectChanges();\n });\n } else {\n this.isCurrentStepValid = true;\n }\n this.cdr.detectChanges();\n }\n\n async next(): Promise<void> {\n if (!this.canGoNext) return;\n\n const currentStep = this.currentStep;\n\n // Validate embedded form if present\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form.invalid) {\n formBody.form.markAllAsTouched();\n return;\n }\n\n if (currentStep?.guard?.canExit) {\n const canExit = await currentStep.guard.canExit();\n if (!canExit) return;\n }\n\n if (currentStep?.validators) {\n for (const validator of currentStep.validators) {\n const result = await validator.validate();\n if (result.status === 'invalid') return;\n }\n }\n\n // Find next visible step\n const nextStep = this.visibleSteps[this.currentVisibleIndex + 1];\n if (!nextStep) return;\n\n if (nextStep.guard?.canEnter) {\n const canEnter = await nextStep.guard.canEnter();\n if (!canEnter) return;\n }\n\n const previousStepId = this.currentStepId;\n this.currentStepId = nextStep.id;\n\n if (!this.visitedStepIds.includes(this.currentStepId)) {\n this.visitedStepIds.push(this.currentStepId);\n }\n\n await this.notifyStepChange(previousStepId, NavigationDirection.FORWARD);\n this.trackCurrentStepValidity();\n }\n\n async back(): Promise<void> {\n if (!this.canGoBack) {\n // Call onCancel handler if configured\n if (this.config.onCancel) {\n await this.config.onCancel(ModalCloseReason.CANCELLED);\n }\n this.modalRef.dismiss(ModalCloseReason.CANCELLED);\n return;\n }\n\n const prevStep = this.visibleSteps[this.currentVisibleIndex - 1];\n const previousStepId = this.currentStepId;\n\n // Remove current step from visited so the circle resets\n this.visitedStepIds = this.visitedStepIds.filter(id => id !== this.currentStepId);\n\n this.currentStepId = prevStep.id;\n\n await this.notifyStepChange(previousStepId, NavigationDirection.BACKWARD);\n this.trackCurrentStepValidity();\n }\n\n async complete(): Promise<void> {\n if (this.isCompleting) return;\n\n const currentStep = this.currentStep;\n\n // Validate embedded form if present\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form.invalid) {\n formBody.form.markAllAsTouched();\n return;\n }\n\n if (currentStep?.validators) {\n for (const validator of currentStep.validators) {\n const result = await validator.validate();\n if (result.status === 'invalid') return;\n }\n }\n\n this.isCompleting = true;\n this.wizardErrors = {};\n this.cdr.detectChanges();\n\n try {\n const aggregatedData = this.getAggregatedData();\n\n // Run cross-step validators (onBeforeComplete)\n if (this.config.onBeforeComplete) {\n for (const validator of this.config.onBeforeComplete) {\n const errors = await validator(aggregatedData);\n if (errors) {\n this.wizardErrors = { ...this.wizardErrors, ...errors };\n }\n }\n if (Object.keys(this.wizardErrors).length > 0) {\n this.isCompleting = false;\n this.cdr.detectChanges();\n return;\n }\n }\n\n const result: WizardResult = {\n status: ModalCloseReason.COMPLETED,\n visitedStepIds: this.visitedStepIds,\n payload: aggregatedData,\n };\n\n if (this.config.onComplete) {\n await this.config.onComplete.handle(result);\n }\n\n this.modalRef.close(result);\n } catch (error) {\n this.isCompleting = false;\n this.cdr.detectChanges();\n console.error('Wizard completion error:', error);\n }\n }\n\n /** Collect form data from all form-driven steps, namespaced by step ID */\n private getAggregatedData(): Record<ModalStepId, Record<string, unknown>> {\n const aggregated: Record<ModalStepId, Record<string, unknown>> = {};\n if (!this.formBodies) return aggregated;\n\n const formStepIds = this.config.steps\n .filter(s => this.stepFormConfigs[s.id])\n .map(s => s.id);\n\n this.formBodies.toArray().forEach((fb, index) => {\n if (fb.form && formStepIds[index]) {\n aggregated[formStepIds[index]] = { ...fb.form.value };\n }\n });\n\n return aggregated;\n }\n\n /**\n * Maps a footer action's ActionStyle to mnButton data props.\n * @param action The footer action configuration.\n */\n getFooterActionButtonData(action: ModalFooterAction<unknown>): Partial<MnButtonTypes> {\n switch (action.style) {\n case ActionStyle.DANGER:\n return { variant: 'outline', color: 'danger' };\n case ActionStyle.PRIMARY:\n return { variant: 'fill', color: 'primary' };\n case ActionStyle.SECONDARY:\n return { variant: 'outline', color: 'secondary' };\n case ActionStyle.GHOST:\n return {variant: 'text', color: 'secondary'};\n default:\n return { variant: 'outline', color: 'secondary' };\n }\n }\n\n /**\n * Handles a custom footer action click.\n * @param action The footer action configuration.\n */\n async handleFooterAction(action: ModalFooterAction<unknown>): Promise<void> {\n if (action.handler) {\n await action.handler(this.modalRef as unknown as ModalRef<unknown>);\n }\n if (action.closesModal) {\n this.modalRef.close((action.closeReason || ModalCloseReason.PROGRAMMATIC) as unknown as WizardResult);\n }\n }\n\n private async notifyStepChange(previousStepId: ModalStepId, direction: NavigationDirection): Promise<void> {\n if (this.config.onStepChange) {\n await this.config.onStepChange.handle({\n previousStepId,\n currentStepId: this.currentStepId,\n direction,\n });\n }\n }\n}\n","<div class=\"flex flex-col flex-auto min-h-0\">\n @if (config.component || config.template) {\n <mn-custom-body-host\n [config]=\"$any(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"block flex-none px-6 pt-6\"\n ></mn-custom-body-host>\n }\n\n <!-- Steps header — fixed (does not scroll with the step body) -->\n <div class=\"flex-none px-6 pt-2 pb-4 border-b border-base-300 bg-base-100\">\n <div class=\"relative flex items-start\">\n <!-- Background line spanning from first circle center to last circle center -->\n <div\n [style.left]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n [style.right]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n class=\"absolute top-3.75 h-1 bg-base-300 z-0\"\n ></div>\n\n <!-- Progress fill line -->\n @if (visibleSteps.length > 1) {\n <div\n [style.left]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n [style.width]=\"'calc(' + (currentProgressIndex / (visibleSteps.length - 1)) * (100 - 100 / visibleSteps.length) + '%)'\"\n class=\"absolute top-3.75 h-1 bg-success z-1 transition-all duration-500\"\n ></div>\n }\n\n @for (step of visibleSteps; track step.id; let i = $index; ) {\n <div\n (keyup.enter)=\"isFreeFlow ? goToStep(step) : null\"\n (click)=\"isFreeFlow ? goToStep(step) : null\"\n [attr.tabindex]=\"isFreeFlow && canNavigateToStep(step) ? 0 : null\"\n [class.cursor-pointer]=\"isFreeFlow && canNavigateToStep(step)\"\n class=\"relative flex flex-col items-center gap-1 z-10 w-0 flex-1\"\n >\n <div\n [ngClass]=\"{\n 'bg-primary text-primary-content': step.id === currentStepId,\n 'bg-success text-success-content': visitedStepIds.includes(step.id) && step.id !== currentStepId,\n 'bg-base-200 text-base-content/50': !visitedStepIds.includes(step.id) && step.id !== currentStepId\n }\"\n class=\"w-8 h-8 rounded-full flex items-center justify-center font-semibold transition-all text-sm\"\n >{{ i + 1 }}\n </div>\n <div\n [ngClass]=\"{\n 'text-base-content font-semibold': step.id === currentStepId,\n 'text-base-content/50': step.id !== currentStepId\n }\"\n class=\"text-xs text-center whitespace-nowrap hidden sm:block\"\n >{{ step.title }}\n </div>\n\n </div>\n }\n </div>\n </div>\n\n <!-- Step body — the only scrolling region in the wizard -->\n <div class=\"flex-auto min-h-0 overflow-y-auto px-6 py-6\">\n <div [style.min-height]=\"measuredMinHeight ? measuredMinHeight + 'px' : null\" class=\"min-h-48\">\n @for (step of config.steps; track step.id) {\n <div #stepWrapper [style.display]=\"step.id === currentStepId ? 'block' : 'none'\">\n <h3 class=\"text-lg font-semibold text-base-content mb-4\">{{ step.title }}</h3>\n <div class=\"text-base-content/80\">\n <!-- Form step -->\n @if (stepFormConfigs[step.id]) {\n <mn-form-body\n [config]=\"stepFormConfigs[step.id]\"\n [modalRef]=\"$any(modalRef)\"\n [hideFooter]=\"true\"\n [hideCustomBody]=\"true\"\n ></mn-form-body>\n }\n\n <!-- Text body -->\n @if (!stepFormConfigs[step.id] && isTextBody(step)) {\n <div>\n {{ step.body }}\n </div>\n }\n\n <!-- Dynamic content container for component/template bodies -->\n <ng-container #dynamicContainer></ng-container>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Wizard-level errors (from onBeforeComplete) — fixed, above the footer -->\n @if (wizardErrors && (wizardErrors | keyvalue).length > 0) {\n <div class=\"flex flex-col gap-1 mx-6 mb-2 px-2 py-2 bg-red-50 rounded-md\">\n @for (err of wizardErrors | keyvalue; track err.key) {\n <div class=\"text-red-500 text-sm\">\n {{ err.value }}\n </div>\n }\n </div>\n }\n\n <!-- Footer — fixed (does not scroll with the step body) -->\n <div class=\"flex-none flex gap-3 px-6 pt-4 pb-6 border-t border-base-300 bg-base-100\">\n @if (!currentStep?.hideBack) {\n <button\n mnButton\n [data]=\"{ variant: 'outline', color: 'secondary' }\"\n (click)=\"back()\"\n >\n {{ currentStep?.backLabel || (canGoBack ? labels.back : labels.close) }}\n </button>\n }\n\n <!-- Custom footer actions -->\n @if (config.footerActions) {\n <mn-footer-actions\n [actions]=\"config.footerActions\"\n (actionClick)=\"handleFooterAction($any($event))\"\n ></mn-footer-actions>\n } @else {\n <div class=\"flex-1\"></div>\n }\n\n @if (!isLastStep) {\n <button\n mnButton\n [data]=\"{ variant: 'fill', color: 'primary', disabled: !isCurrentStepValid }\"\n (click)=\"next()\"\n >\n {{ currentStep?.nextLabel || labels.next }}\n </button>\n }\n\n @if (isLastStep) {\n <button\n mnButton\n [data]=\"{ variant: 'fill', color: 'primary', disabled: !isCurrentStepValid || isCompleting }\"\n [disabled]=\"!isCurrentStepValid || isCompleting\"\n (click)=\"complete()\"\n >\n {{ currentStep?.nextLabel || (isCompleting ? labels.completing : labels.complete) }}\n </button>\n }\n </div>\n</div>\n","import {ChangeDetectorRef, Component, Input, OnInit, ViewChild, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MnModalRef } from '../../mn-modal-ref';\nimport {\n ConfirmationModalConfig,\n ConfirmationTone,\n ActionStyle,\n ModalCloseReason,\n} from '../../mn-modal.types';\nimport { MnButton } from '../../../mn-button/mn-button';\nimport { MnFormBodyComponent } from '../mn-form-body/mn-form-body.component';\nimport { MnCustomBodyHostComponent } from '../mn-custom-body-host/mn-custom-body-host.component';\nimport { MnLanguageService } from '../../../../language/mn-language.service';\n\n@Component({\n selector: 'mn-confirmation-body',\n standalone: true,\n imports: [CommonModule, MnButton, MnFormBodyComponent, MnCustomBodyHostComponent, ReactiveFormsModule],\n templateUrl: './mn-confirmation-body.component.html',\n styleUrls: ['./mn-confirmation-body.component.css'],\n})\nexport class MnConfirmationBodyComponent<TResult = boolean> implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() config!: ConfirmationModalConfig<TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n\n @ViewChild(MnFormBodyComponent) formBody?: MnFormBodyComponent;\n\n confirmButtonStatus = 'VALID';\n hasFormFields = false;\n\n private languageService = inject(MnLanguageService);\n\n ngOnInit(): void {\n this.hasFormFields = !!(\n (this.config.fields && this.config.fields.length > 0) ||\n (this.config.fieldGroups && this.config.fieldGroups.length > 0) ||\n (this.config.rows && this.config.rows.length > 0)\n );\n }\n\n onFormStatusChange(status: string): void {\n this.confirmButtonStatus = status;\n this.cdr.markForCheck();\n this.cdr.detectChanges();\n }\n\n async confirm(): Promise<void> {\n if (this.hasFormFields && this.formBody?.form.invalid) {\n this.formBody.form.markAllAsTouched();\n return;\n }\n\n const result = (this.hasFormFields ? this.formBody?.form.value : true) as TResult;\n\n if (this.config.confirm?.handler) {\n await this.config.confirm.handler.handle(result);\n }\n\n this.modalRef.close(result);\n }\n\n cancel(): void {\n const reason = this.config.cancel?.reason || ModalCloseReason.CANCELLED;\n this.modalRef.dismiss(reason);\n }\n\n private resolveLabel(value: string | undefined, key: string, fallback: string): string {\n if (value) return value;\n const translated = this.languageService.translate(`common.${key}`);\n return translated === `common.${key}` ? fallback : translated;\n }\n\n get confirmLabel(): string {\n return this.resolveLabel(this.config.confirm?.label, 'confirm', 'Confirm');\n }\n\n get cancelLabel(): string {\n return this.resolveLabel(this.config.cancel?.label, 'cancel', 'Cancel');\n }\n\n get confirmStyle(): ActionStyle {\n return this.config.confirm?.style || ActionStyle.PRIMARY;\n }\n\n get cancelStyle(): ActionStyle {\n return this.config.cancel?.style || ActionStyle.SECONDARY;\n }\n\n get toneClass(): string {\n switch (this.config.tone) {\n case ConfirmationTone.WARNING:\n return 'tone-warning';\n case ConfirmationTone.DANGER:\n return 'tone-danger';\n default:\n return 'tone-default';\n }\n }\n\n getButtonColor(style: ActionStyle): 'primary' | 'secondary' | 'danger' | 'warning' | 'success' {\n switch (style) {\n case ActionStyle.PRIMARY:\n return 'primary';\n case ActionStyle.DANGER:\n return 'danger';\n case ActionStyle.GHOST:\n return 'secondary';\n default:\n return 'secondary';\n }\n }\n\n getButtonVariant(style: ActionStyle): 'fill' | 'outline' | 'text' {\n switch (style) {\n case ActionStyle.PRIMARY:\n case ActionStyle.DANGER:\n return 'fill';\n case ActionStyle.GHOST:\n return 'text';\n default:\n return 'outline';\n }\n }\n get isConfirmDisabled(): boolean {\n if (this.hasFormFields) {\n return this.confirmButtonStatus !== 'VALID';\n }\n return false;\n }\n}\n","<div class=\"flex flex-col gap-6\" [ngClass]=\"toneClass\">\n <!-- Custom Content (Component or Template) -->\n @if (config.component || config.template) {\n <mn-custom-body-host\n [config]=\"$any(config)\"\n [modalRef]=\"$any(modalRef)\"\n ></mn-custom-body-host>\n }\n\n <div class=\"flex flex-col items-center text-center gap-6\">\n @if (config.tone === 'warning' || config.tone === 'danger') {\n <div\n class=\"w-12 h-12 rounded-full flex items-center justify-center\"\n [ngClass]=\"{\n 'bg-blue-100 text-blue-500': config.tone !== 'warning' && config.tone !== 'danger',\n 'bg-amber-100 text-amber-500': config.tone === 'warning',\n 'bg-red-100 text-red-500': config.tone === 'danger'\n }\">\n @if (config.tone === 'warning') {\n <svg\n class=\"w-6 h-6\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"\n />\n </svg>\n }\n @if (config.tone === 'danger') {\n <svg\n class=\"w-6 h-6\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n />\n </svg>\n }\n </div>\n }\n\n @if (config.message) {\n <div class=\"text-base text-base-content/80 leading-relaxed max-w-[28rem]\">\n {{ config.message }}\n </div>\n }\n </div>\n\n <!-- Form Fields / Rows -->\n @if (hasFormFields) {\n <mn-form-body\n [config]=\"$any(config)\"\n [modalRef]=\"$any(modalRef)\"\n [hideFooter]=\"true\"\n [hideCustomBody]=\"true\"\n (formStatusChange)=\"onFormStatusChange($event)\"\n ></mn-form-body>\n }\n\n <div class=\"flex gap-3 w-full pb-6 sticky bottom-0 bg-base-100 z-10\">\n <button\n mnButton\n [data]=\"{\n variant: getButtonVariant(cancelStyle),\n color: getButtonColor(cancelStyle)\n }\"\n (click)=\"cancel()\"\n >\n {{ cancelLabel }}\n </button>\n\n <div class=\"flex-1\"></div>\n\n <button\n mnButton\n [data]=\"{\n variant: getButtonVariant(confirmStyle),\n color: getButtonColor(confirmStyle),\n disabled: isConfirmDisabled\n }\"\n [disabled]=\"isConfirmDisabled\"\n (click)=\"confirm()\"\n >\n {{ confirmLabel }}\n </button>\n </div>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n Input,\n OnDestroy,\n OnInit,\n signal\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MnModalRef} from '../../mn-modal-ref';\nimport {\n ActionStyle,\n BackdropMode,\n CloseMode,\n ConfirmationModalConfig,\n CustomModalConfig,\n FormModalConfig,\n KeyboardMode,\n ModalCloseReason,\n ModalConfig,\n ModalFooterAction,\n ModalKind,\n ModalSize,\n WizardModalConfig,\n} from '../../mn-modal.types';\nimport {MnWizardBodyComponent} from '../mn-wizard-body/mn-wizard-body.component';\nimport {MnFormBodyComponent} from '../mn-form-body/mn-form-body.component';\nimport {MnConfirmationBodyComponent} from '../mn-confirmation-body/mn-confirmation-body.component';\nimport {MnCustomBodyHostComponent} from '../mn-custom-body-host/mn-custom-body-host.component';\nimport {MnFooterActionsComponent} from '../mn-footer-actions/mn-footer-actions.component';\nimport {MnButton} from '../../../mn-button';\nimport {LucideX} from '@lucide/angular';\nimport {MN_HAPTICS} from '../../mn-modal-haptics';\n\n@Component({\n selector: 'mn-modal-shell',\n standalone: true,\n imports: [\n CommonModule,\n MnWizardBodyComponent,\n MnFormBodyComponent,\n MnConfirmationBodyComponent,\n MnCustomBodyHostComponent,\n MnFooterActionsComponent,\n MnButton,\n LucideX,\n ],\n templateUrl: './mn-modal-shell.component.html',\n styleUrls: ['./mn-modal-shell.component.css'],\n})\nexport class MnModalShellComponent<TResult = unknown> implements OnInit, AfterViewInit, OnDestroy {\n private el = inject<ElementRef<HTMLElement>>(ElementRef);\n private cdr = inject(ChangeDetectorRef);\n /** Downward release speed (px/ms) above which a short drag still dismisses — a \"flick\".\n * Native sheets dismiss on a quick flick regardless of distance, not just a long drag. */\n private static readonly FLICK_VELOCITY = 0.5;\n\n @Input() config!: ModalConfig<TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n\n isClosing = false;\n /**\n * Whether another modal is stacked on top of this one. Set imperatively by\n * `MnModalService` on the already-rendered shell below the newly opened one, so it must\n * be a signal: mutating a plain field there changes the host `[class]` after the view was\n * checked (NG0100 ExpressionChangedAfterItHasBeenChecked) and does not schedule change\n * detection in a zoneless app. A signal write both notifies the host binding and schedules CD.\n */\n readonly isStacked = signal(false);\n readonly ModalKind = ModalKind;\n private previouslyFocusedElement: HTMLElement | null = null;\n private focusTrapListener: ((e: KeyboardEvent) => void) | null = null;\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private pollAttempts = 0;\n\n ngOnInit(): void {\n this.startPollingIfConfigured();\n }\n /** Minimum drag distance (px) that must accompany a flick, so an incidental fast tap\n * on the grabber never dismisses. Below the distance threshold, only a flick dismisses. */\n private static readonly FLICK_MIN_DISTANCE = 32;\n\n ngOnDestroy(): void {\n this.removeFocusTrap();\n this.stopPolling();\n // Restore focus to previously focused element\n if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.focus === 'function') {\n this.previouslyFocusedElement.focus();\n }\n }\n\n private setupFocusTrap(): void {\n this.focusTrapListener = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const focusable = this.el.nativeElement.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n this.el.nativeElement.addEventListener('keydown', this.focusTrapListener);\n }\n\n private removeFocusTrap(): void {\n if (this.focusTrapListener) {\n this.el.nativeElement.removeEventListener('keydown', this.focusTrapListener);\n this.focusTrapListener = null;\n }\n }\n\n asWizard(config: ModalConfig<TResult>): WizardModalConfig {\n return config as unknown as WizardModalConfig;\n }\n\n asForm(config: ModalConfig<TResult>): FormModalConfig {\n return config as unknown as FormModalConfig;\n }\n\n asConfirmation(config: ModalConfig<TResult>): ConfirmationModalConfig {\n return config as unknown as ConfirmationModalConfig;\n }\n\n asCustom(config: ModalConfig<TResult>): CustomModalConfig {\n return config as unknown as CustomModalConfig;\n }\n\n private static readonly SWIPE_DISMISS_THRESHOLD = 150;\n /** Optional native haptic engine. Absent on the web — every call is null-guarded. */\n private haptics = inject(MN_HAPTICS, {optional: true});\n /** The two most recent (y, timestamp) pointer samples, used to estimate the release\n * velocity for flick-to-dismiss. `t` uses the event timestamp (monotonic, no Date). */\n private lastSample: { y: number; t: number } | null = null;\n\n /** Upper bound for the close wait if no animation/transition end event fires\n * (e.g. an animation was suppressed). Must stay longer than the slowest close\n * path (mobile sheet slide-down 0.45s, swipe glide 0.3s) so it never preempts. */\n private static readonly CLOSE_FALLBACK_MS = 700;\n\n /** Whether this modal renders as a bottom sheet on small screens (default: true). */\n get isMobileSheet(): boolean {\n return this.config.mobileBottomSheet !== false;\n }\n\n /**\n * Triggers the closing animation and resolves once it has actually finished.\n *\n * Deferred via setTimeout to avoid NG0100 when called during a CD cycle.\n * Rather than guess a fixed duration (the old hardcoded 150ms truncated the\n * mobile slide-down, which runs 250ms — and the swipe glide, 300ms), we wait\n * for the container's `animationend`/`transitionend` and tear down then. A\n * fallback timeout guarantees resolution if no such event fires, and we\n * short-circuit entirely under reduced motion (the CSS collapses to instant).\n */\n startClosing(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(() => {\n this.isClosing = true;\n // @HostBinding('class') updates are flushed when the host view is checked\n // (appRef.tick), not by a bare detectChanges() on this dynamically-created\n // root component. Relying on CD alone means the `.closing` class — and thus\n // the slide-down animation — never lands in a zoneless app and is timing-\n // fragile elsewhere. Apply it directly so the close animation is reliable.\n this.el.nativeElement.classList.add('closing');\n this.cdr.detectChanges();\n\n if (this.prefersReducedMotion()) {\n resolve();\n return;\n }\n\n const container = this.el.nativeElement.querySelector('.modal-container') as HTMLElement | null;\n if (!container) {\n resolve();\n return;\n }\n\n let settled = false;\n const done = (event?: Event): void => {\n // Ignore end events bubbling up from descendant animations/transitions.\n if (event && event.target !== container) return;\n if (settled) return;\n settled = true;\n container.removeEventListener('animationend', done);\n container.removeEventListener('transitionend', done);\n clearTimeout(fallback);\n resolve();\n };\n\n // Normal close ends via a keyframe (animationend); the swipe-dismiss\n // glide ends via the transform transition (transitionend).\n container.addEventListener('animationend', done);\n container.addEventListener('transitionend', done);\n // `done` only runs asynchronously, after this assignment completes.\n const fallback = setTimeout(done, MnModalShellComponent.CLOSE_FALLBACK_MS);\n });\n });\n }\n\n private prefersReducedMotion(): boolean {\n return typeof window !== 'undefined'\n && typeof window.matchMedia === 'function'\n && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: Event): void {\n if (this.config.keyboard === KeyboardMode.ENABLED) {\n this.handleClose(ModalCloseReason.ESCAPE);\n if (event && event.preventDefault) {\n event.preventDefault();\n }\n }\n }\n\n onBackdropClick(): void {\n const shouldClose = this.config.backdrop === BackdropMode.CLOSABLE\n || (this.isMobileSheet && this.config.backdrop !== BackdropMode.STATIC);\n if (shouldClose) {\n this.handleClose(ModalCloseReason.BACKDROP);\n }\n }\n\n onCloseButtonClick(): void {\n this.handleClose(ModalCloseReason.DISMISSED);\n }\n /** True once a swipe has crossed the dismiss threshold — slides the sheet off-screen\n * via the transform transition instead of replaying the slide-up keyframe. */\n swipeDismissing = false;\n\n // =========================\n // Mobile bottom-sheet swipe-to-dismiss (via the grabber handle)\n // =========================\n /** Current downward drag offset (px) applied to the sheet while swiping. */\n sheetDragY = 0;\n /** True while the user is actively dragging the grabber (disables snap transition). */\n isDraggingSheet = false;\n private prevSample: { y: number; t: number } | null = null;\n\n @HostBinding('class') get hostClasses(): string {\n const size = this.config.sizeWidth || ModalSize.MD;\n // `closing` is intentionally NOT derived here. startClosing() adds the\n // `.closing` class imperatively (classList.add) for reliable, zoneless-safe\n // application. Deriving it from `isClosing` in this getter as well makes the\n // host class string flip value after the view has been checked, which throws\n // NG0100 (ExpressionChangedAfterItHasBeenCheckedError) in dev. Angular's class\n // binding only manages the tokens it emits, so it leaves the imperatively\n // added `.closing` untouched.\n const animType = typeof this.config.animation === 'string'\n ? this.config.animation\n : this.config.animation?.type || 'slide';\n const animation = ` anim-${animType}`;\n const stacked = this.isStacked() ? ' is-stacked' : '';\n const mobileSheet = this.isMobileSheet ? ' mobile-sheet' : '';\n const swiping = this.swipeDismissing ? ' swipe-dismissing' : '';\n return `modal-shell modal-${size}${animation}${stacked}${mobileSheet}${swiping}`;\n }\n private dragStartY = 0;\n\n /** Whether the sheet can be dismissed at all (drives whether the swipe is armed). */\n private get canClose(): boolean {\n return this.config.closeMode !== CloseMode.DISABLED;\n }\n\n /** Tailwind's `sm` breakpoint — below this the modal renders as a bottom sheet. */\n private static readonly SHEET_MAX_WIDTH = 639.98;\n\n ngAfterViewInit(): void {\n this.previouslyFocusedElement = document.activeElement as HTMLElement;\n this.setupFocusTrap();\n // Focus the modal container\n const container = this.el.nativeElement.querySelector('.modal-container') as HTMLElement;\n if (container) {\n container.focus();\n }\n }\n\n onSheetPointerDown(event: PointerEvent): void {\n if (!this.isMobileSheet || !this.canClose) return;\n // Only a bottom sheet (mobile-width viewport) can be swiped away.\n if (window.innerWidth > MnModalShellComponent.SHEET_MAX_WIDTH) return;\n // Don't hijack drags that begin on an interactive control (e.g. the close button).\n if ((event.target as HTMLElement).closest('button')) return;\n this.isDraggingSheet = true;\n this.dragStartY = event.clientY;\n // Seed the velocity samples so a fast flick that releases on the first move still\n // has a baseline to measure against.\n this.lastSample = {y: event.clientY, t: event.timeStamp};\n this.prevSample = this.lastSample;\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n }\n\n onSheetPointerMove(event: PointerEvent): void {\n if (!this.isDraggingSheet) return;\n // Only track downward movement.\n this.sheetDragY = Math.max(0, event.clientY - this.dragStartY);\n // Roll the sample window forward so pointer-up can read the latest instantaneous speed.\n this.prevSample = this.lastSample;\n this.lastSample = {y: event.clientY, t: event.timeStamp};\n }\n\n async onSheetPointerUp(): Promise<void> {\n if (!this.isDraggingSheet) return;\n this.isDraggingSheet = false;\n\n if (this.shouldDismissSheet()) {\n const closed = await this.handleClose(ModalCloseReason.DISMISSED);\n if (closed) {\n // A confirmed dismissal gets a slightly firmer tick than the open tap.\n this.haptics?.impact('medium');\n // Continue the gesture: glide the sheet the rest of the way down rather than\n // snapping back to 0 and replaying the slide-up keyframe (which looked un-animated).\n this.swipeDismissing = true;\n this.sheetDragY = window.innerHeight;\n this.cdr.detectChanges();\n } else {\n this.snapBack(); // guard rejected — spring back\n }\n } else {\n this.snapBack(); // not far enough / not a flick — spring back\n }\n\n this.lastSample = null;\n this.prevSample = null;\n }\n\n /** Whether the release should dismiss: a long-enough drag OR a fast downward flick. */\n private shouldDismissSheet(): boolean {\n if (this.sheetDragY > MnModalShellComponent.SWIPE_DISMISS_THRESHOLD) {\n return true;\n }\n return this.releaseVelocity() > MnModalShellComponent.FLICK_VELOCITY\n && this.sheetDragY > MnModalShellComponent.FLICK_MIN_DISTANCE;\n }\n\n /** Downward release speed (px/ms) from the last two pointer samples. Positive means\n * moving down. Returns 0 when there is no usable sample window. */\n private releaseVelocity(): number {\n if (!this.lastSample || !this.prevSample) return 0;\n const dt = this.lastSample.t - this.prevSample.t;\n if (dt <= 0) return 0;\n return (this.lastSample.y - this.prevSample.y) / dt;\n }\n\n /** Springs the sheet back to its resting position after a drag that didn't dismiss. */\n private snapBack(): void {\n this.sheetDragY = 0;\n }\n\n /** Attempts to dismiss the modal. Resolves true if it was actually dismissed,\n * false if blocked by a DISABLED close mode or a rejected close guard. */\n private async handleClose(reason: ModalCloseReason): Promise<boolean> {\n if (this.config.closeMode === CloseMode.DISABLED) {\n return false;\n }\n\n if (this.config.closeMode === CloseMode.GUARDED) {\n if (this.config.closeGuard) {\n const allowed = await this.config.closeGuard();\n if (!allowed) return false;\n }\n }\n\n this.modalRef.dismiss(reason);\n return true;\n }\n\n get showBackdrop(): boolean {\n return this.config.backdrop !== BackdropMode.HIDE;\n }\n\n get containerSizeClass(): string {\n switch (this.config.sizeWidth || ModalSize.MD) {\n case ModalSize.SM: return 'w-96';\n case ModalSize.MD: return 'w-[32rem]';\n case ModalSize.LG: return 'w-[48rem]';\n case ModalSize.XL: return 'w-[64rem]';\n case ModalSize.FULL: return 'w-[95vw]';\n default: return 'w-[32rem]';\n }\n }\n\n get containerHeightStyle(): string | null {\n if (this.config.sizeWidth === ModalSize.FULL && !this.config.sizeHeight) {\n return '95vh';\n }\n if (!this.config.sizeHeight) return null;\n switch (this.config.sizeHeight) {\n case ModalSize.SM: return '30vh';\n case ModalSize.MD: return '50vh';\n case ModalSize.LG: return '70vh';\n case ModalSize.XL: return '85vh';\n case ModalSize.FULL: return '95vh';\n default: return null;\n }\n }\n\n get showCloseButton(): boolean {\n return this.config.closeMode !== CloseMode.DISABLED;\n }\n\n // =========================\n // Footer Actions\n // =========================\n\n get hasCustomFooterActions(): boolean {\n return !!this.config.footerActions && this.config.footerActions.length > 0;\n }\n\n get leftFooterActions(): ModalFooterAction<TResult>[] {\n return (this.config.footerActions || []).filter(a => a.position === 'left');\n }\n\n get rightFooterActions(): ModalFooterAction<TResult>[] {\n return (this.config.footerActions || []).filter(a => a.position !== 'left');\n }\n\n async onFooterAction(action: ModalFooterAction<TResult>): Promise<void> {\n if (action.disabled) return;\n if (action.handler) {\n await action.handler(this.modalRef);\n }\n if (action.closesModal) {\n if (action.closeReason === ModalCloseReason.COMPLETED) {\n this.modalRef.close();\n } else {\n this.modalRef.dismiss(action.closeReason || ModalCloseReason.DISMISSED);\n }\n }\n }\n\n getActionButtonColor(style?: ActionStyle): 'primary' | 'secondary' | 'danger' | 'warning' | 'success' {\n switch (style) {\n case ActionStyle.PRIMARY: return 'primary';\n case ActionStyle.DANGER: return 'danger';\n case ActionStyle.GHOST: return 'secondary';\n default: return 'secondary';\n }\n }\n\n getActionButtonVariant(style?: ActionStyle): 'fill' | 'outline' | 'text' {\n switch (style) {\n case ActionStyle.PRIMARY:\n case ActionStyle.DANGER: return 'fill';\n case ActionStyle.GHOST: return 'text';\n default: return 'outline';\n }\n }\n\n // =========================\n // Polling\n // =========================\n\n private startPollingIfConfigured(): void {\n const polling = this.config.polling;\n if (!polling) return;\n if (polling.autoStart === false) return;\n this.startPolling();\n }\n\n private startPolling(): void {\n const polling = this.config.polling;\n if (!polling) return;\n\n this.pollingTimer = setInterval(async () => {\n this.pollAttempts++;\n try {\n const shouldStop = await polling.onPoll(this.modalRef);\n if (shouldStop === true) {\n this.stopPolling();\n }\n } catch (e) {\n console.error('Polling error:', e);\n }\n if (polling.maxAttempts && this.pollAttempts >= polling.maxAttempts) {\n this.stopPolling();\n }\n }, polling.interval);\n }\n\n private stopPolling(): void {\n if (this.pollingTimer) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n}\n","@if (showBackdrop) {\n <!-- The backdrop is a visual overlay — keyboard dismiss is handled at component level via Escape key -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div class=\"modal-backdrop absolute inset-0 bg-black/50 animate-[fadeIn_0.2s_ease-in-out]\" (click)=\"onBackdropClick()\"></div>\n}\n\n<!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events -->\n<div\n class=\"modal-container relative bg-base-100 rounded-lg shadow-xl max-h-[90vh] overflow-hidden flex flex-col\"\n [class.sheet-dragging]=\"isDraggingSheet\"\n [ngClass]=\"containerSizeClass\"\n [style.height]=\"containerHeightStyle\"\n [style.transform]=\"sheetDragY ? 'translateY(' + sheetDragY + 'px)' : null\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"config.title ? 'mn-modal-title' : null\"\n [attr.aria-describedby]=\"config.description ? 'mn-modal-description' : null\"\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n>\n @if (isMobileSheet) {\n <!-- Drag handle for swipe-to-dismiss, visible only on mobile bottom sheets -->\n <div\n (pointercancel)=\"onSheetPointerUp()\"\n (pointerdown)=\"onSheetPointerDown($event)\"\n (pointermove)=\"onSheetPointerMove($event)\"\n (pointerup)=\"onSheetPointerUp()\"\n class=\"sm:hidden flex justify-center pt-2 pb-1 touch-none cursor-grab\"\n >\n <div class=\"h-1.5 w-10 rounded-full bg-base-300\"></div>\n </div>\n }\n\n <!-- On mobile the whole header doubles as a swipe-to-dismiss surface (drags that\n start on the close button are ignored). The grabber above is the visual cue. -->\n <div [class.border-b]=\"config.kind !== ModalKind.WIZARD\"\n [class.border-base-300]=\"config.kind !== ModalKind.WIZARD\"\n (pointercancel)=\"onSheetPointerUp()\"\n (pointerdown)=\"onSheetPointerDown($event)\"\n (pointermove)=\"onSheetPointerMove($event)\"\n (pointerup)=\"onSheetPointerUp()\"\n [class.cursor-grab]=\"isMobileSheet\"\n [class.sm:cursor-auto]=\"isMobileSheet\"\n [class.sm:touch-auto]=\"isMobileSheet\"\n [class.touch-none]=\"isMobileSheet\"\n class=\"flex items-center justify-between p-6\">\n <div class=\"flex flex-col gap-0.5\">\n @if (config.title) {\n <h2 class=\"m-0 text-xl font-semibold text-base-content\" id=\"mn-modal-title\">{{ config.title }}</h2>\n }\n @if (config.subtitle) {\n <p class=\"m-0 text-sm text-base-content/60 font-normal\">{{ config.subtitle }}</p>\n }\n </div>\n @if (showCloseButton) {\n <div [class]=\"isMobileSheet ? 'hidden sm:flex' : ''\">\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'gray', hover: true, borderRadius: 'md' }\"\n type=\"button\"\n class=\"w-8 h-8\"\n (click)=\"onCloseButtonClick()\"\n aria-label=\"Close modal\"\n >\n <svg lucideX [size]=\"18\"></svg>\n </button>\n </div>\n }\n </div>\n @if (config.description) {\n <p class=\"m-0 px-6 text-sm text-base-content/60 leading-relaxed\" id=\"mn-modal-description\">{{ config.description }}</p>\n }\n\n @if (config.kind === ModalKind.WIZARD) {\n <!-- Wizard manages its own internal scrolling so the steps header and footer\n stay fixed while only the step body scrolls. No padding/scroll here. -->\n <div class=\"flex-auto min-h-0 overflow-hidden flex flex-col\">\n <mn-wizard-body\n [config]=\"asWizard(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"flex-auto min-h-0 flex flex-col\"\n ></mn-wizard-body>\n </div>\n } @else {\n <div class=\"flex-1 overflow-y-auto px-6 pt-6\">\n @if (config.kind === ModalKind.FORM) {\n <mn-form-body\n [config]=\"asForm(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"block h-full\"\n ></mn-form-body>\n }\n\n @if (config.kind === ModalKind.CONFIRMATION) {\n <mn-confirmation-body\n [config]=\"asConfirmation(config)\"\n [modalRef]=\"$any(modalRef)\"\n ></mn-confirmation-body>\n }\n\n @if (config.kind === ModalKind.CUSTOM) {\n <mn-custom-body-host\n [config]=\"asCustom(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"block pb-6\"\n ></mn-custom-body-host>\n }\n </div>\n }\n\n <!-- Custom Footer Actions (not for wizard modals, they render their own) -->\n @if (hasCustomFooterActions && config.kind !== ModalKind.WIZARD) {\n <div class=\"flex gap-3 p-6 border-t border-base-300\">\n <mn-footer-actions\n [actions]=\"config.footerActions || []\"\n (actionClick)=\"onFooterAction($event)\"\n ></mn-footer-actions>\n </div>\n }\n</div>\n","import {ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, Injectable,} from '@angular/core';\nimport {MnModalRef} from './mn-modal-ref';\nimport {ModalConfig} from './mn-modal.types';\nimport {MnModalShellComponent} from './components/mn-modal-shell/mn-modal-shell.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MnModalService {\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private readonly modalStack: MnModalRef<unknown>[] = [];\n\n open<TResult = unknown, TModel = unknown>(config: ModalConfig<TResult, TModel>): MnModalRef<TResult> {\n // Create the modal shell component\n const componentRef = createComponent(MnModalShellComponent, {\n environmentInjector: this.injector,\n }) as unknown as ComponentRef<MnModalShellComponent<TResult>>;\n\n // TModel is erased at the shell boundary — the shell only needs TResult\n componentRef.instance.config = config as ModalConfig<TResult>;\n\n // Create modal ref\n const modalRef = new MnModalRef<TResult>(componentRef, config as ModalConfig<TResult>);\n componentRef.instance.modalRef = modalRef;\n\n // Update stack and dim previous modal\n if (this.modalStack.length > 0) {\n const prevModal = this.modalStack[this.modalStack.length - 1];\n (prevModal.component as MnModalShellComponent<unknown>).isStacked.set(true);\n }\n this.modalStack.push(modalRef as unknown as MnModalRef<unknown>);\n\n // Attach to application\n this.appRef.attachView(componentRef.hostView);\n const domElem = componentRef.location.nativeElement;\n document.body.appendChild(domElem);\n\n // Clean up on close\n modalRef.afterClosed$.subscribe(() => {\n this.appRef.detachView(componentRef.hostView);\n domElem.remove();\n\n // Update stack\n const index = this.modalStack.indexOf(modalRef as unknown as MnModalRef<unknown>);\n if (index > -1) {\n this.modalStack.splice(index, 1);\n if (this.modalStack.length > 0) {\n const topModal = this.modalStack[this.modalStack.length - 1];\n (topModal.component as MnModalShellComponent<unknown>).isStacked.set(false);\n }\n }\n });\n\n return modalRef;\n }\n}\n","// Types\nexport * from './mn-modal.types';\n\n// Haptics (optional native feedback hook)\nexport * from './mn-modal-haptics';\n\n// Builders\nexport * from './builder';\n\n// Service\nexport { MnModalService } from './mn-modal.service';\nexport { MnModalRef } from './mn-modal-ref';\n\n// Components\nexport { MnModalShellComponent } from './components/mn-modal-shell/mn-modal-shell.component';\nexport { MnWizardBodyComponent } from './components/mn-wizard-body/mn-wizard-body.component';\nexport { MnFormBodyComponent } from './components/mn-form-body/mn-form-body.component';\nexport { MnConfirmationBodyComponent } from './components/mn-confirmation-body/mn-confirmation-body.component';\nexport { MnCustomBodyHostComponent } from './components/mn-custom-body-host/mn-custom-body-host.component';\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {ListDataSource} from './mn-list.types';\nimport {MnCheckbox} from '../mn-checkbox';\nimport {MnSkeleton, MnSkeletonProps} from '../mn-skeleton';\nimport {MnCollectionPagination, MnSelectableCollectionBase} from '../mn-collection';\n\n/** Default skeleton lines reproducing the previous two-bar placeholder. */\nconst DEFAULT_LIST_SKELETON_LINES: Partial<MnSkeletonProps>[] = [\n {shape: 'text', width: '75%'},\n {shape: 'text', width: '50%', height: '0.75rem'},\n];\n\n@Component({\n selector: 'mn-list',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, MnCheckbox, MnSkeleton, MnCollectionPagination],\n templateUrl: './mn-list.component.html',\n styleUrl: './mn-list.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnList<T = unknown>\n extends MnSelectableCollectionBase<T, ListDataSource<T>> {\n @Output() itemClick = new EventEmitter<T>();\n\n protected override readonly componentName = 'MnList';\n\n /** Skeleton lines rendered for each placeholder item, falling back to the default two-bar layout. */\n get skeletonLines(): Partial<MnSkeletonProps>[] {\n const skeleton = this.dataSource.skeleton;\n if (skeleton && !this.isTemplateRef(skeleton)) {\n return skeleton.lines;\n }\n return DEFAULT_LIST_SKELETON_LINES;\n }\n\n // ── Item interaction ──\n\n onItemClick(item: T): void {\n this.dataSource.onItemClick?.(item);\n this.itemClick.emit(item);\n }\n\n // ── Skeleton ──\n\n protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined {\n return this.dataSource?.toolbarTemplate;\n }\n\n @ViewChild('collectionBody') protected collectionBody?: ElementRef<HTMLElement>;\n\n // ── Filtering ──\n\n protected applyFilter(searchForItems: boolean): void {\n this.filteredItems = this.applySearchFilter(this.dataSource.dataRows.value);\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n}\n","<!-- Toolbar: search + custom toolbar template -->\n<div class=\"flex flex-row items-center justify-end gap-2 mb-3\">\n @if (dataSource.canSearch) {\n <div>\n <input\n type=\"text\"\n class=\"input input-sm rounded border border-base-300 bg-base-200 px-3 py-1.5 text-sm text-base-content placeholder-base-content/50 focus:outline-none focus:border-primary-500 w-full max-w-xs\"\n [placeholder]=\"dataSource.searchPlaceholder ?? 'Search...'\"\n (input)=\"onSearch($any($event.target).value)\"\n aria-label=\"Search list\"\n />\n </div>\n }\n @if (dataSource.toolbarTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarTemplate\"></ng-container>\n }\n</div>\n\n<!-- List wrapper -->\n<div\n #collectionBody\n [style.min-height.px]=\"bodyMinHeight\"\n class=\"w-full\"\n [class.border]=\"dataSource.appearance?.bordered\"\n [class.border-base-300]=\"dataSource.appearance?.bordered\"\n [class.rounded]=\"dataSource.appearance?.bordered\"\n role=\"list\"\n aria-label=\"Data list\"\n>\n <!-- Loading state -->\n @if (isLoadingState) {\n @for (_ of skeletonRows; track $index) {\n <div [class.py-2]=\"dataSource.appearance?.compact\" class=\"px-4 py-3\" role=\"listitem\">\n @if (isTemplateRef(dataSource.skeleton)) {\n <ng-container [ngTemplateOutlet]=\"$any(dataSource.skeleton)\"></ng-container>\n } @else {\n <div class=\"flex flex-col gap-1\">\n @for (line of skeletonLines; track $index) {\n <mn-skeleton [data]=\"line\"></mn-skeleton>\n }\n </div>\n }\n </div>\n @if (!$last && (dataSource.appearance?.dividers !== false)) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\n } @else if (isErrorState) {\n <!-- Error state -->\n <div class=\"text-center text-xs py-8\" role=\"listitem\">\n @if (dataSource.errorTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.errorTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-error\">\n <p class=\"text-sm\">{{ dataSource.errorMessage }}</p>\n </div>\n }\n </div>\n } @else {\n <!-- Empty state -->\n @if (filteredItems.length === 0) {\n <div class=\"text-center text-xs py-8\" role=\"listitem\">\n @if (dataSource.emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.emptyTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-base-content/50\">\n <p class=\"text-sm\">{{ dataSource.emptyMessage }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Select all (multi-select) -->\n @if (isMultiSelect && filteredItems.length > 0) {\n <div class=\"flex items-center gap-2 px-4 py-2 bg-base-200 text-sm\">\n <mn-lib-checkbox\n (checkedChange)=\"toggleAll()\"\n [checked]=\"allSelected\"\n [props]=\"{ id: 'mn-list-select-all', label: 'Select all', size: 'sm' }\"\n ></mn-lib-checkbox>\n </div>\n @if (dataSource.appearance?.dividers !== false) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\n\n <!-- Data items -->\n @for (item of paginatedItems; track trackByID($index, item); let odd = $odd; let last = $last) {\n <div\n class=\"flex items-center gap-2 bg-base-100 transition-colors duration-150\"\n [ngClass]=\"{'bg-primary/10': isSelected(item)}\"\n [class.bg-base-200]=\"!isSelected(item) && odd && dataSource.appearance?.dividers !== false\"\n [class.hover:bg-base-200]=\"dataSource.appearance?.hover !== false\"\n [class.cursor-pointer]=\"!!dataSource.onItemClick\"\n [class.px-4]=\"true\"\n [class.py-3]=\"!dataSource.appearance?.compact\"\n [class.py-2]=\"dataSource.appearance?.compact\"\n role=\"listitem\"\n (keyup.enter)=\"onItemClick(item)\"\n (click)=\"onItemClick(item)\"\n [attr.tabindex]=\"dataSource.onItemClick ? 0 : null\"\n >\n <!-- Selection checkbox -->\n @if (hasSelection) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div (click)=\"$event.stopPropagation()\" class=\"shrink-0\">\n <mn-lib-checkbox\n (checkedChange)=\"toggle(item)\"\n [checked]=\"isSelected(item)\"\n [props]=\"{ id: 'mn-list-item-' + $index, size: 'sm' }\"\n ></mn-lib-checkbox>\n </div>\n }\n\n <!-- Item content via template -->\n <div class=\"flex-1 min-w-0\">\n <ng-container\n [ngTemplateOutlet]=\"dataSource.itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item, data: item }\"\n ></ng-container>\n </div>\n </div>\n @if (!last && (dataSource.appearance?.dividers !== false)) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\n }\n</div>\n\n<!-- Load more + pagination -->\n<mn-collection-pagination\n (loadMore)=\"loadMoreRows()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n [currentPage]=\"currentPage\"\n [isPaginated]=\"isPaginated\"\n [isServerPaginated]=\"isServerPaginated\"\n [labels]=\"dataSource.labels\"\n [loadingMoreRows]=\"loadingMoreRows\"\n [pageSizeSelectOptions]=\"pageSizeSelectOptions\"\n [pageSize]=\"pageSize\"\n [showLoadMore]=\"showLoadMore\"\n [totalItemCount]=\"totalItemCount\"\n [totalPages]=\"totalPages\"\n [visiblePages]=\"visiblePages\"\n idPrefix=\"mn-list\"\n></mn-collection-pagination>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {FormsModule} from '@angular/forms';\nimport {GridDataSource} from './mn-grid.types';\nimport {MnSkeleton, MnSkeletonProps} from '../mn-skeleton';\nimport {MnInputField} from '../mn-input-field';\nimport {MnCollectionBase, MnCollectionPagination} from '../mn-collection';\n\n/** Default card skeleton: an image block plus two text bars. */\nconst DEFAULT_GRID_SKELETON_LINES: Partial<MnSkeletonProps>[] = [\n {shape: 'rectangle', width: '100%', height: '8rem'},\n {shape: 'text', width: '75%'},\n {shape: 'text', width: '50%', height: '0.75rem'},\n];\n\n/**\n * Responsive card-grid component. Shares the collection chrome (search, every\n * pagination mode, loading skeleton, empty state, toolbar, i18n) with\n * {@link import('../mn-list').MnList} and {@link import('../mn-table').MnTable}\n * via {@link MnCollectionBase}, and lays items out as cards instead of rows.\n * Selection is intentionally not supported.\n */\n@Component({\n selector: 'mn-grid',\n standalone: true,\n imports: [NgTemplateOutlet, FormsModule, MnSkeleton, MnInputField, MnCollectionPagination],\n templateUrl: './mn-grid.component.html',\n styleUrl: './mn-grid.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnGrid<T = unknown> extends MnCollectionBase<T, GridDataSource<T>> {\n @Output() itemClick = new EventEmitter<T>();\n\n protected override readonly componentName = 'MnGrid';\n\n /** Whether the grid uses auto-fit (minCardWidth) instead of explicit columns. */\n get isAutoLayout(): boolean {\n return !!this.dataSource.layout?.minCardWidth;\n }\n\n // ── Layout ──\n\n /** Skeleton lines for the default/lines placeholder; null when a custom template is used. */\n get skeletonLines(): Partial<MnSkeletonProps>[] {\n const skeleton = this.dataSource.skeleton;\n if (skeleton && !this.isTemplateRef(skeleton)) {\n return skeleton.lines;\n }\n return DEFAULT_GRID_SKELETON_LINES;\n }\n\n // ── Item interaction ──\n\n protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined {\n return this.dataSource?.toolbarTemplate;\n }\n\n @ViewChild('collectionBody') protected collectionBody?: ElementRef<HTMLElement>;\n\n // ── Skeleton ──\n\n onItemClick(item: T): void {\n this.dataSource.onItemClick?.(item);\n this.itemClick.emit(item);\n }\n\n // ── Filtering ──\n\n protected applyFilter(searchForItems: boolean): void {\n let items = this.applySearchFilter(this.dataSource.dataRows.value ?? []);\n\n // Preview cap: show only the first `maxItems` cards (pager stays hidden).\n const maxItems = this.dataSource.layout?.maxItems;\n if (maxItems != null) {\n items = items.slice(0, maxItems);\n }\n\n this.filteredItems = items;\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n}\n","<!-- Toolbar: search + custom toolbar template -->\n@if (dataSource.canSearch || dataSource.toolbarTemplate) {\n <div class=\"flex flex-row items-center justify-end gap-2 mb-3\">\n @if (dataSource.canSearch) {\n <mn-lib-input-field\n (ngModelChange)=\"onSearch($event)\"\n [ngModel]=\"searchValue\"\n [props]=\"{\n id: 'mn-grid-search',\n type: 'search',\n label: '',\n placeholder: dataSource.searchPlaceholder ?? 'Search...',\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true\n }\"\n class=\"w-full max-w-xs\"\n ></mn-lib-input-field>\n }\n @if (dataSource.toolbarTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarTemplate\"></ng-container>\n }\n </div>\n}\n\n<!-- Body: skeleton/data swap region. Wrapper holds its height during a server reload. -->\n<div #collectionBody [style.min-height.px]=\"bodyMinHeight\">\n<!-- Loading state -->\n @if (isLoadingState) {\n <div\n [class.mn-grid--auto]=\"isAutoLayout\"\n [style.--mn-grid-cols-base]=\"dataSource.layout?.cols?.base\"\n [style.--mn-grid-cols-lg]=\"dataSource.layout?.cols?.lg\"\n [style.--mn-grid-cols-md]=\"dataSource.layout?.cols?.md\"\n [style.--mn-grid-cols-sm]=\"dataSource.layout?.cols?.sm\"\n [style.--mn-grid-cols-xl]=\"dataSource.layout?.cols?.xl\"\n [style.--mn-grid-gap]=\"dataSource.layout?.gap\"\n [style.--mn-grid-min]=\"dataSource.layout?.minCardWidth\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n class=\"mn-grid\"\n role=\"list\"\n >\n @for (_ of skeletonRows; track $index) {\n <div role=\"listitem\">\n @if (isTemplateRef(dataSource.skeleton)) {\n <ng-container [ngTemplateOutlet]=\"$any(dataSource.skeleton)\"></ng-container>\n } @else {\n <div class=\"flex flex-col gap-2 p-4 border border-base-300 rounded-lg\">\n @for (line of skeletonLines; track $index) {\n <mn-skeleton [data]=\"line\"></mn-skeleton>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else if (isErrorState) {\n <!-- Error state -->\n @if (dataSource.errorTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.errorTemplate\"></ng-container>\n } @else {\n <div\n class=\"flex items-center justify-center min-h-[6rem] py-8 rounded-xl border border-dashed border-error/30 bg-base-100\">\n <p class=\"text-sm text-error\">{{ dataSource.errorMessage }}</p>\n </div>\n }\n} @else {\n <!-- Empty state: a caller-provided template/component (rendered unwrapped, full\n control over its own layout) or, when none is given, the default text. -->\n @if (filteredItems.length === 0) {\n @if (dataSource.emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.emptyTemplate\"></ng-container>\n } @else {\n <div\n class=\"flex items-center justify-center min-h-[6rem] py-8 rounded-xl border border-dashed border-base-content/15 bg-base-100\">\n <p class=\"text-sm text-base-content/40\">{{ dataSource.emptyMessage }}</p>\n </div>\n }\n } @else {\n <!-- Card grid -->\n <div\n [class.mn-grid--auto]=\"isAutoLayout\"\n [style.--mn-grid-cols-base]=\"dataSource.layout?.cols?.base\"\n [style.--mn-grid-cols-lg]=\"dataSource.layout?.cols?.lg\"\n [style.--mn-grid-cols-md]=\"dataSource.layout?.cols?.md\"\n [style.--mn-grid-cols-sm]=\"dataSource.layout?.cols?.sm\"\n [style.--mn-grid-cols-xl]=\"dataSource.layout?.cols?.xl\"\n [style.--mn-grid-gap]=\"dataSource.layout?.gap\"\n [style.--mn-grid-min]=\"dataSource.layout?.minCardWidth\"\n aria-label=\"Card grid\"\n class=\"mn-grid\"\n role=\"list\"\n >\n @for (item of paginatedItems; track trackByID($index, item)) {\n <div\n (click)=\"onItemClick(item)\"\n (keyup.enter)=\"onItemClick(item)\"\n [attr.tabindex]=\"dataSource.onItemClick ? 0 : null\"\n [class.cursor-pointer]=\"!!dataSource.onItemClick\"\n class=\"transition-colors duration-150\"\n role=\"listitem\"\n >\n <ng-container\n [ngTemplateOutletContext]=\"{ $implicit: item, data: item }\"\n [ngTemplateOutlet]=\"dataSource.cardTemplate\"\n ></ng-container>\n </div>\n }\n </div>\n }\n}\n</div>\n\n<!-- Load more + pagination -->\n<mn-collection-pagination\n (loadMore)=\"loadMoreRows()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n [currentPage]=\"currentPage\"\n [isPaginated]=\"isPaginated\"\n [isServerPaginated]=\"isServerPaginated\"\n [labels]=\"dataSource.labels\"\n [loadingMoreRows]=\"loadingMoreRows\"\n [pageSizeSelectOptions]=\"pageSizeSelectOptions\"\n [pageSize]=\"pageSize\"\n [showLoadMore]=\"showLoadMore\"\n [totalItemCount]=\"totalItemCount\"\n [totalPages]=\"totalPages\"\n [visiblePages]=\"visiblePages\"\n idPrefix=\"mn-grid\"\n></mn-collection-pagination>\n","import { InjectionToken } from '@angular/core';\nimport { CalendarEvent } from './calendar-event.model';\nimport { provideMnComponentConfig } from '../../../config/mn-component-config.providers';\n\n/**\n * Available calendar view modes.\n */\nexport enum CalendarView {\n MONTH = 'MONTH',\n WEEK = 'WEEK',\n DAY = 'DAY'\n}\n\n/**\n * Configuration for the calendar component.\n * All properties are optional — sensible defaults are provided.\n * Can be supplied via the `CALENDAR_CONFIG` injection token or through\n * the `provideMnComponentConfig` helper using component name `'mn-calendar'`.\n */\nexport type CalendarConfig = {\n /** First visible hour in week/day views (0–23). Default: `7`. */\n startHour: number;\n /** Last visible hour in week/day views (1–24, exclusive). Default: `22`. */\n endHour: number;\n /** BCP 47 locale tag used for date/time formatting (e.g. `'en-US'`, `'nl-NL'`). Default: `'en-US'`. */\n locale: string;\n /** Label for the \"Today\" navigation button. Default: `'Today'`. */\n todayLabel: string;\n /** Title shown above the upcoming-events sidebar. Default: `'Upcoming events'`. */\n upcomingEventsTitle: string;\n /** Message shown when there are no upcoming events. Default: `'No upcoming events'`. */\n noUpcomingEvents: string;\n /** Display labels for each calendar view mode. */\n viewLabels: Record<string, string>;\n /** Abbreviated day names starting from Monday (length 7). Derived from `locale` when not set. */\n shortDayNames: string[];\n /** Full day names starting from Monday (length 7). Derived from `locale` when not set. */\n longDayNames: string[];\n /** Screen-width breakpoint (px) below which only day view is shown. Default: `768`. */\n mobileBreakpoint: number;\n}\n\n/**\n * Builds locale-derived day name arrays from a BCP 47 locale string.\n * Uses January 1 2024 (a Monday) as the reference date.\n */\nfunction buildDayNames(locale: string): { short: string[]; long: string[] } {\n const base = new Date(2024, 0, 1); // 2024-01-01 is a Monday\n const short: string[] = [];\n const long: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date(base);\n d.setDate(base.getDate() + i);\n short.push(d.toLocaleDateString(locale, { weekday: 'short' }));\n long.push(d.toLocaleDateString(locale, { weekday: 'long' }));\n }\n return { short, long };\n}\n\n/** Default calendar configuration values. */\nexport const DEFAULT_CALENDAR_CONFIG: CalendarConfig = (() => {\n const locale = 'en-US';\n const names = buildDayNames(locale);\n return {\n startHour: 7,\n endHour: 22,\n locale,\n todayLabel: 'Today',\n upcomingEventsTitle: 'Upcoming events',\n noUpcomingEvents: 'No upcoming events',\n viewLabels: { MONTH: 'Month', WEEK: 'Week', DAY: 'Day' },\n shortDayNames: names.short,\n longDayNames: names.long,\n mobileBreakpoint: 768,\n };\n})();\n\n/**\n * Injection token for the resolved calendar configuration.\n *\n * Prefer using {@link MN_CALENDAR_CONFIG} with `provideMnComponentConfig`\n * so that settings can be managed via `mn-config.json5`. This token is\n * kept for backward compatibility and manual `providers` usage.\n *\n * @example\n * ```ts\n * providers: [\n * { provide: CALENDAR_CONFIG, useValue: { startHour: 8, endHour: 20, locale: 'nl-NL' } }\n * ]\n * ```\n */\nexport const CALENDAR_CONFIG = new InjectionToken<CalendarConfig>('CalendarConfig', {\n providedIn: 'root',\n factory: () => DEFAULT_CALENDAR_CONFIG\n});\n\n/**\n * Injection token resolved via `MnConfigService` (the `mn-config.json5` system).\n *\n * Use the helper {@link provideMnCalendarConfig} in the component's `providers`\n * array so that calendar settings are read from the config file and support\n * `$translate` markers, section scoping, and instance-id overrides.\n *\n * Component name in the config file: `'mn-calendar'`.\n *\n * @example\n * ```json5\n * // mn-config.json5\n * {\n * defaults: {\n * \"mn-calendar\": {\n * startHour: 8,\n * endHour: 20,\n * locale: \"nl-NL\",\n * todayLabel: { $translate: \"calendar.today\" }\n * }\n * }\n * }\n * ```\n */\nexport const MN_CALENDAR_CONFIG = new InjectionToken<CalendarConfig>('MN_CALENDAR_CONFIG');\n\n/** Component name used to look up calendar settings in `mn-config.json5`. */\nexport const MN_CALENDAR_COMPONENT_NAME = 'mn-calendar';\n\n/**\n * Provider helper that wires the calendar into the `mn-config` system.\n *\n * Add this to the `providers` array of the component (or module) that hosts\n * `<mn-calendar-view>`. It reads defaults and overrides from `mn-config.json5`\n * under the key `\"mn-calendar\"` and provides them via {@link MN_CALENDAR_CONFIG}.\n *\n * @param initial — optional partial defaults merged before config-file values.\n */\nexport function provideMnCalendarConfig(initial?: Partial<CalendarConfig>) {\n return provideMnComponentConfig<CalendarConfig>(MN_CALENDAR_CONFIG, MN_CALENDAR_COMPONENT_NAME, initial);\n}\n\n/**\n * Merges a partial config with defaults, re-deriving day names from locale when needed.\n */\nexport function resolveCalendarConfig(partial?: Partial<CalendarConfig>): CalendarConfig {\n if (!partial) return { ...DEFAULT_CALENDAR_CONFIG };\n const locale = partial.locale ?? DEFAULT_CALENDAR_CONFIG.locale;\n const names = buildDayNames(locale);\n return {\n ...DEFAULT_CALENDAR_CONFIG,\n ...partial,\n locale,\n shortDayNames: partial.shortDayNames ?? names.short,\n longDayNames: partial.longDayNames ?? names.long,\n };\n}\n\n/**\n * Represents a half-hour row in the week/day time grid.\n */\nexport type HourRow = {\n /** The hour value (e.g. 7, 8, …). */\n hour: number;\n /** CSS grid row start (1-based). */\n topRow: number;\n /** CSS grid row end (1-based, exclusive). */\n bottomRow: number;\n}\n\n/**\n * Represents a single day column in the week view header.\n */\nexport type ColumnDay = {\n /** The date this column represents. */\n date: Date;\n /** Abbreviated day name (e.g. \"Mon\"). */\n dayName: string;\n /** Day-of-month number (1–31). */\n dayNumber: number;\n /** Whether this column is today. */\n isToday: boolean;\n}\n\n/**\n * Represents a single cell in the month grid.\n */\nexport type MonthItem = {\n /** The date this cell represents. */\n date: Date;\n /** Day-of-month number (1–31). */\n dayNumber: number;\n /** Whether this date belongs to the currently focused month. */\n isCurrentMonth: boolean;\n /** Whether this date is today. */\n isToday: boolean;\n /** Events occurring on this date. */\n events: CalendarEvent[];\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Abstraction for date/time formatting used by calendar components.\n *\n * The library ships a default implementation ({@link DefaultCalendarDateFormatter})\n * that uses `Intl.DateTimeFormat`. Consumers can provide their own implementation\n * (e.g. wrapping `@ngx-translate`) via the {@link CALENDAR_DATE_FORMATTER} token.\n *\n * Locale-independent settings (day names, view labels, \"Today\" label) have been\n * moved to {@link CalendarConfig} so they can be configured declaratively.\n */\nexport type CalendarDateFormatter = {\n /** Formats an hour + minute pair (e.g. `9, 0` → `\"09:00 AM\"`). */\n formatTimeI(hour: number, minute: number): Promise<string>;\n /** Formats the time portion of a Date. Returns `''` for `undefined`. */\n formatTime(date: Date | undefined): Promise<string>;\n /** Formats a full date-time string as an Observable. */\n formatDateTime(date: Date): Observable<string>;\n /** Formats a date-only string as an Observable. */\n formatDate(date: Date): Observable<string>;\n /** Formats a Date as `YYYY-MM-DD` for `<input type=\"date\">`. */\n formatDateForFormControl(date: Date): string;\n /** Returns `true` when both dates fall on the same calendar day. */\n isSameDay(date1: Date, date2: Date): boolean;\n /** Formats a Date as \"Month Year\" (e.g. \"January 2026\"). */\n formatMonthName(date: Date): Promise<string>;\n}\n\n/**\n * Injection token for the calendar date formatter.\n *\n * @example\n * ```ts\n * providers: [\n * { provide: CALENDAR_DATE_FORMATTER, useClass: MyCustomFormatter }\n * ]\n * ```\n */\nexport const CALENDAR_DATE_FORMATTER = new InjectionToken<CalendarDateFormatter>('CalendarDateFormatter');\n","import {Injectable, inject} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { CalendarDateFormatter } from './calendar-date-formatter';\nimport { CALENDAR_CONFIG, CalendarConfig, DEFAULT_CALENDAR_CONFIG } from '../models/calendar-config.model';\n\n/**\n * Default implementation of {@link CalendarDateFormatter} that uses the\n * browser's `Intl.DateTimeFormat` API for locale-aware formatting.\n *\n * The locale is read from the injected {@link CALENDAR_CONFIG}. If no config\n * is provided, `'en-US'` is used as the fallback.\n *\n * This service has no dependency on `@ngx-translate` or any other i18n library,\n * so the calendar library works out of the box. Consumers can replace it with\n * their own implementation via the `CALENDAR_DATE_FORMATTER` injection token.\n */\n@Injectable()\nexport class DefaultCalendarDateFormatter implements CalendarDateFormatter {\n private readonly locale: string;\n\n constructor() {\n const config = inject<CalendarConfig | null>(CALENDAR_CONFIG, {optional: true});\n\n this.locale = config?.locale ?? DEFAULT_CALENDAR_CONFIG.locale;\n }\n\n /** Formats an hour and minute pair into a locale time string (e.g. \"09:00 AM\"). */\n formatTimeI(hour: number, minute: number): Promise<string> {\n const date = new Date();\n date.setHours(hour, minute, 0, 0);\n return Promise.resolve(\n date.toLocaleTimeString(this.locale, { hour: '2-digit', minute: '2-digit' })\n );\n }\n\n /** Formats the time portion of a Date (e.g. \"2:30 PM\"). Returns empty string for undefined. */\n formatTime(date: Date | undefined): Promise<string> {\n if (!date) return Promise.resolve('');\n return Promise.resolve(\n date.toLocaleTimeString(this.locale, { hour: '2-digit', minute: '2-digit' })\n );\n }\n\n /** Formats a Date as a full date-time string (e.g. \"May 15, 2026, 02:30 PM\"). */\n formatDateTime(date: Date): Observable<string> {\n return of(\n date.toLocaleString(this.locale, {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: '2-digit', minute: '2-digit'\n })\n );\n }\n\n /** Formats a Date as a date-only string (e.g. \"May 15, 2026\"). */\n formatDate(date: Date): Observable<string> {\n return of(\n date.toLocaleDateString(this.locale, {\n year: 'numeric', month: 'short', day: 'numeric'\n })\n );\n }\n\n /** Formats a Date as `YYYY-MM-DD` for use in `<input type=\"date\">` controls. */\n formatDateForFormControl(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n }\n\n /** Returns `true` if both dates fall on the same calendar day. */\n isSameDay(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear()\n && date1.getMonth() === date2.getMonth()\n && date1.getDate() === date2.getDate();\n }\n\n /** Formats a Date as \"Month Year\" (e.g. \"January 2026\"). */\n formatMonthName(date: Date): Promise<string> {\n return Promise.resolve(\n date.toLocaleString(this.locale, { month: 'long', year: 'numeric' })\n );\n }\n}\n","import { Component, Input, OnDestroy, OnInit, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, Subject, takeUntil } from 'rxjs';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarConfig, DEFAULT_CALENDAR_CONFIG, MonthItem, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\n\n/**\n * Month grid view showing a 7×6 grid of day cells.\n *\n * Each cell displays the day number and up to 3 coloured dots representing\n * events on that day. Clicking a cell emits `dayClicked`.\n */\n@Component({\n selector: 'mn-calendar-month',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './calendar-month.component.html',\n styles: [`\n .calendar-month { width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden; }\n .month-header {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n text-align: center;\n font-weight: 600;\n font-size: 13px;\n padding: 8px 0;\n border-bottom: 1px solid var(--color-base-300);\n }\n .month-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n grid-template-rows: repeat(6, 1fr);\n flex: 1;\n min-height: 0;\n }\n .month-cell {\n min-height: 0;\n padding: 4px 8px;\n border: 1px solid var(--color-base-200);\n cursor: pointer;\n transition: background 0.15s;\n }\n .month-cell:hover { background: var(--color-base-200); }\n .month-cell.other-month { opacity: 0.4; }\n .month-cell.today .day-number {\n background: var(--color-primary);\n color: var(--color-primary-content, white);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .day-number { font-size: 13px; font-weight: 500; }\n .month-events { display: flex; gap: 2px; flex-wrap: wrap; margin-top: 4px; }\n .month-event-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n .more-events { font-size: 10px; color: var(--color-base-content, #6b7280); opacity: 0.6; }\n `]\n})\nexport class CalendarMonthComponent implements OnInit, OnDestroy {\n /** The date whose month is displayed. */\n @Input() focusDay!: Date;\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Observable that emits when the focus day changes. */\n @Input() focusDayChanged!: Observable<Date>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Emits the date of a clicked day cell. */\n @Output() dayClicked = new EventEmitter<Date>();\n\n monthItems: MonthItem[] = [];\n longDayNames: string[];\n\n private events: CalendarEvent[] = [];\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n\n constructor() {\n this.formatter = new DefaultCalendarDateFormatter();\n this.longDayNames = DEFAULT_CALENDAR_CONFIG.longDayNames;\n }\n\n ngOnInit() {\n const resolved = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.longDayNames = resolved.longDayNames;\n this.buildMonth();\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.events = events;\n this.buildMonth();\n });\n }\n\n if (this.focusDayChanged) {\n this.focusDayChanged.pipe(takeUntil(this.destroy$)).subscribe(date => {\n this.focusDay = date;\n this.buildMonth();\n });\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Emits the clicked day's date. */\n onDayClick(date: Date) {\n this.dayClicked.emit(date);\n }\n\n /** trackBy for day name headers. */\n trackByDayName(index: number): number {\n return index;\n }\n\n /** trackBy for month grid cells. */\n trackByMonthItem(_index: number, item: MonthItem): number {\n return item.date.getTime();\n }\n\n /** trackBy for event dots. */\n trackByEventDot(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n\n /** Builds the 42-cell month grid (6 rows × 7 columns). */\n private buildMonth() {\n if (!this.focusDay) return;\n\n const year = this.focusDay.getFullYear();\n const month = this.focusDay.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n\n let startOffset = firstDay.getDay() - 1;\n if (startOffset < 0) startOffset = 6;\n\n const today = new Date();\n this.monthItems = [];\n\n for (let i = startOffset - 1; i >= 0; i--) {\n const date = new Date(year, month, -i);\n this.monthItems.push(this.createMonthItem(date, false, today));\n }\n\n for (let d = 1; d <= lastDay.getDate(); d++) {\n const date = new Date(year, month, d);\n this.monthItems.push(this.createMonthItem(date, true, today));\n }\n\n const remaining = 42 - this.monthItems.length;\n for (let i = 1; i <= remaining; i++) {\n const date = new Date(year, month + 1, i);\n this.monthItems.push(this.createMonthItem(date, false, today));\n }\n }\n\n private createMonthItem(date: Date, isCurrentMonth: boolean, today: Date): MonthItem {\n const isToday = this.formatter.isSameDay(date, today);\n const dayEvents = this.events.filter(e =>\n this.formatter.isSameDay(e.startTime, date) ||\n this.formatter.isSameDay(e.endTime, date) ||\n (e.startTime < date && e.endTime > date)\n );\n\n return {\n date,\n dayNumber: date.getDate(),\n isCurrentMonth,\n isToday,\n events: dayEvents\n };\n }\n}\n","<div class=\"calendar-month\" role=\"grid\" aria-label=\"Month view\">\n <div class=\"month-header\">\n @for (day of longDayNames; track day) {\n <div class=\"day-header\" role=\"columnheader\">{{ day }}</div>\n }\n </div>\n <div class=\"month-grid\">\n @for (item of monthItems; track item.date.getTime()) {\n <div\n class=\"month-cell\"\n [class.other-month]=\"!item.isCurrentMonth\"\n [class.today]=\"item.isToday\"\n (keyup.enter)=\"onDayClick(item.date)\"\n (click)=\"onDayClick(item.date)\"\n tabindex=\"0\"\n role=\"gridcell\"\n [attr.aria-label]=\"item.date.toDateString()\">\n <span class=\"day-number\">{{ item.dayNumber }}</span>\n <div class=\"month-events\">\n @for (event of item.events.slice(0, 3); track $index) {\n <div\n class=\"month-event-dot\"\n [style.background-color]=\"event.color.primaryColor\"\n [title]=\"event.title\">\n </div>\n }\n @if (item.events.length > 3) {\n <span class=\"more-events\">+{{ item.events.length - 3 }}</span>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { CalendarEvent } from '../models/calendar-event.model';\n\n/**\n * Service that computes the visual layout of calendar events within a\n * time-grid (week or day view).\n *\n * Responsibilities:\n * - Splitting multi-day events into per-day segments.\n * - Assigning non-overlapping column indices to concurrent events.\n * - Computing the width (column span) each event should occupy.\n *\n * This service is stateless — all state is passed via method parameters.\n * Provide it per-component (not root) so each view gets its own instance.\n */\n@Injectable()\nexport class CalendarEventLayoutService {\n\n /**\n * Returns `true` when two time ranges overlap (exclusive boundaries).\n */\n eventsOverlap(startA: Date, endA: Date, startB: Date, endB: Date): boolean {\n return startA < endB && startB < endA;\n }\n\n /**\n * Returns all events whose time range overlaps the given `[start, end)` window.\n */\n getAllEventsOnSpecificTime(events: CalendarEvent[], start: Date, end: Date): CalendarEvent[] {\n return events.filter(e =>\n this.eventsOverlap(e.startTime, e.endTime, start, end)\n );\n }\n\n /**\n * Splits multi-day events into per-day segments that fit within the\n * visible hour range (`startHour`–`endHour`) and date range.\n *\n * Single-day events are shallow-copied as-is. Multi-day events produce\n * one segment per day with `continued` / `continuedEnd` flags set.\n */\n calculateMultiDayEvents(\n events: CalendarEvent[],\n startHour: number,\n endHour: number,\n rangeStart: Date,\n rangeEnd: Date\n ): CalendarEvent[] {\n const result: CalendarEvent[] = [];\n\n for (const event of events) {\n const eventStart = new Date(event.startTime);\n const eventEnd = new Date(event.endTime);\n\n if (eventStart.toDateString() === eventEnd.toDateString()) {\n result.push({ ...event });\n continue;\n }\n\n const current = new Date(eventStart);\n let isFirst = true;\n\n while (current < eventEnd && current < rangeEnd) {\n if (current >= rangeStart) {\n const dayStart = new Date(current);\n const dayEnd = new Date(current);\n\n if (isFirst) {\n dayEnd.setHours(endHour, 0, 0, 0);\n } else {\n dayStart.setHours(startHour, 0, 0, 0);\n if (current.toDateString() === eventEnd.toDateString()) {\n dayEnd.setHours(eventEnd.getHours(), eventEnd.getMinutes(), 0, 0);\n } else {\n dayEnd.setHours(endHour, 0, 0, 0);\n }\n }\n\n result.push({\n ...event,\n startTime: isFirst ? eventStart : dayStart,\n endTime: current.toDateString() === eventEnd.toDateString() ? eventEnd : dayEnd,\n continued: !isFirst,\n continuedEnd: current.toDateString() !== eventEnd.toDateString()\n });\n }\n\n isFirst = false;\n current.setDate(current.getDate() + 1);\n current.setHours(0, 0, 0, 0);\n }\n }\n\n return result;\n }\n\n /**\n * Assigns a zero-based `column` index to each event so that overlapping\n * events occupy different columns.\n *\n * Events are processed in start-time order (longest duration first for ties).\n * Each event gets the earliest column not already occupied by an overlapping event.\n */\n assignColumnsToEvents(events: CalendarEvent[]): void {\n const sorted = [...events].sort((a, b) => {\n const diff = a.startTime.getTime() - b.startTime.getTime();\n if (diff !== 0) return diff;\n return (b.endTime.getTime() - b.startTime.getTime()) - (a.endTime.getTime() - a.startTime.getTime());\n });\n\n for (const event of sorted) {\n event.column = this.findEarliestPossibleColumn(event, sorted);\n }\n }\n\n /**\n * Assigns a `width` (column span) to each event, expanding it to fill\n * unused columns to its right within the overlapping group.\n */\n assignWidthsToEvents(events: CalendarEvent[], scanStart: Date, scanEnd: Date): void {\n for (const event of events) {\n const overlapping = this.getAllEventsOnSpecificTime(events, event.startTime, event.endTime);\n const maxCol = Math.max(...overlapping.map(e => e.column ?? 0));\n const biggestPossible = this.findBiggestPossibleWidth(event, events, scanStart, scanEnd);\n event.width = Math.max(1, biggestPossible);\n\n if ((event.column ?? 0) + event.width > maxCol + 1) {\n event.width = maxCol + 1 - (event.column ?? 0);\n }\n if (event.width < 1) event.width = 1;\n }\n }\n\n /** Finds the lowest column index not occupied by any overlapping event. */\n private findEarliestPossibleColumn(event: CalendarEvent, allEvents: CalendarEvent[]): number {\n const overlapping = allEvents.filter(e =>\n e !== event\n && e.column !== undefined\n && this.eventsOverlap(e.startTime, e.endTime, event.startTime, event.endTime)\n );\n\n let column = 0;\n while (overlapping.some(e => e.column === column)) {\n column++;\n }\n return column;\n }\n\n /** Computes the maximum width an event can span without overlapping a neighbour to its right. */\n private findBiggestPossibleWidth(\n event: CalendarEvent,\n allEvents: CalendarEvent[],\n _scanStart: Date,\n _scanEnd: Date\n ): number {\n const overlapping = this.getAllEventsOnSpecificTime(allEvents, event.startTime, event.endTime);\n const maxCol = Math.max(...overlapping.map(e => e.column ?? 0));\n const totalColumns = maxCol + 1;\n\n const occupiedCols = overlapping\n .filter(e => e !== event && (e.column ?? 0) > (event.column ?? 0))\n .map(e => e.column ?? 0);\n\n if (occupiedCols.length === 0) {\n return totalColumns - (event.column ?? 0);\n }\n\n return Math.min(...occupiedCols) - (event.column ?? 0);\n }\n}\n","/**\n * Static utility methods for calendar grid positioning.\n */\nexport class CalendarUtility {\n /**\n * Converts a weekday (from `Date.getDay()`) to a 1-based Monday-first column index.\n * Monday = 1, Tuesday = 2, …, Sunday = 7.\n */\n static getCorrectColumn(date: Date): number {\n const day = date.getDay();\n return day === 0 ? 7 : day;\n }\n\n /**\n * Converts an hour + minute pair to a 1-based CSS grid row index\n * within a half-hour grid starting at `startHour`.\n *\n * Each hour occupies two rows (one per 30-minute slot).\n * Formula: `(hour - startHour) * 2 + (minute >= 30 ? 1 : 0) + 1`\n *\n * @returns Grid row number (minimum 1).\n */\n static getCorrectRow(hour: number, minute: number, startHour: number): number {\n const hourOffset = hour - startHour;\n const row = hourOffset * 2 + (minute >= 30 ? 1 : 0) + 1;\n return Math.max(1, row);\n }\n}\n","import {ChangeDetectorRef, Component, OnInit, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CALENDAR_DATE_FORMATTER, CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\n\n/**\n * Default event renderer used when no custom component is provided.\n *\n * Displays the event title, formatted time range, and optional description\n * with the event's colour scheme applied as background and left-border accent.\n */\n@Component({\n selector: 'mn-calendar-event-default',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './calendar-event-default.component.html',\n styles: [`\n .calendar-event-default {\n padding: 4px 8px;\n border-left: 3px solid var(--color-primary, #3b82f6);\n border-radius: 4px;\n font-size: 12px;\n height: 100%;\n overflow: hidden;\n cursor: pointer;\n }\n .event-title {\n font-weight: 600;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: inherit;\n }\n .event-time {\n font-size: 11px;\n opacity: 0.85;\n color: inherit;\n }\n .event-description {\n font-size: 11px;\n opacity: 0.75;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: inherit;\n }\n `]\n})\nexport class CalendarEventDefaultComponent implements CalendarEventData, OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** The event to render. Set by {@link CalendarEventComponent} after creation. */\n event!: CalendarEvent;\n formattedTime = '';\n\n private formatter: CalendarDateFormatter;\n\n constructor() {\n const formatter = inject<CalendarDateFormatter | null>(CALENDAR_DATE_FORMATTER, {optional: true});\n\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\n }\n\n async ngOnInit() {\n if (this.event) {\n const start = await this.formatter.formatTime(this.event.startTime);\n const end = await this.formatter.formatTime(this.event.endTime);\n this.formattedTime = `${start} - ${end}`;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"calendar-event-default\" [style.background-color]=\"event.color.secondaryColor\" [style.border-left-color]=\"event.color.primaryColor\" [style.color]=\"event.color.primaryColor\">\n <div class=\"event-title\">{{ event.title }}</div>\n <div class=\"event-time\">{{ formattedTime }}</div>\n @if (event.description) {\n <div class=\"event-description\">{{ event.description }}</div>\n }\n</div>\n","import {\n Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef,\n AfterViewInit, Type, OnChanges, SimpleChanges\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarEventDefaultComponent } from '../calendar-event-default/calendar-event-default.component';\n\n/**\n * Dynamic event renderer that injects a custom or default event component\n * into its view container.\n *\n * The component to render is resolved in this order:\n * 1. `customComponent` input (set on the parent week/day view)\n * 2. `event.component` (per-event override)\n * 3. {@link CalendarEventDefaultComponent} (library default)\n */\n@Component({\n selector: 'mn-calendar-event',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './calendar-event.component.html',\n styles: [`\n .calendar-event-wrapper {\n height: 100%;\n width: 100%;\n }\n `]\n})\nexport class CalendarEventComponent implements AfterViewInit, OnChanges {\n /** The event data to render. */\n @Input() event!: CalendarEvent;\n /** Optional custom component type that overrides the default renderer. */\n @Input() customComponent?: Type<CalendarEventData>;\n /** Emits when the rendered event is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n @ViewChild('eventContainer', { read: ViewContainerRef, static: true }) eventContainer!: ViewContainerRef;\n\n private rendered = false;\n\n ngAfterViewInit() {\n this.renderComponent();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (this.rendered && (changes['event'] || changes['customComponent'])) {\n this.renderComponent();\n }\n }\n\n /** Emits the event click. */\n onEventClick() {\n this.eventClicked.emit(this.event);\n }\n\n /** Creates the event component dynamically and sets its `event` property. */\n private renderComponent() {\n if (!this.eventContainer) return;\n this.eventContainer.clear();\n const component = this.customComponent ?? this.event?.component ?? CalendarEventDefaultComponent;\n const ref = this.eventContainer.createComponent(component);\n (ref.instance as CalendarEventData).event = this.event;\n ref.changeDetectorRef.detectChanges();\n this.rendered = true;\n }\n}\n","<div (click)=\"onEventClick()\" (keyup.enter)=\"onEventClick()\" class=\"calendar-event-wrapper\" tabindex=\"0\">\n <ng-template #eventContainer></ng-template>\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Output,\n EventEmitter,\n Type,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, Subject, takeUntil } from 'rxjs';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarConfig, ColumnDay, DEFAULT_CALENDAR_CONFIG, HourRow, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\nimport { CalendarEventLayoutService } from '../../services/calendar-event-layout.service';\nimport { CalendarUtility } from '../../utils/calendar-utils';\nimport { CalendarEventComponent } from '../calendar-event/calendar-event.component';\n\n/** Extended hour row with a pre-resolved display label. */\ntype DisplayHourRow = {\n hourLabel: string;\n} & HourRow\n\n/**\n * Week grid view showing 7 day columns with half-hour time slots.\n *\n * Overlapping events within the same day are laid out in sub-columns\n * so they appear side-by-side rather than stacked.\n */\n@Component({\n selector: 'mn-calendar-week',\n standalone: true,\n imports: [CommonModule, CalendarEventComponent],\n templateUrl: './calendar-week.component.html',\n providers: [CalendarEventLayoutService],\n styles: [`\n .calendar-week { width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden; }\n .week-header {\n display: grid;\n border-bottom: 1px solid var(--color-base-300);\n }\n .time-gutter-header { min-width: 60px; }\n .day-column-header {\n text-align: center;\n padding: 8px 4px;\n font-size: 13px;\n }\n .day-column-header.today { color: var(--color-primary); font-weight: 700; }\n .day-name { display: block; font-size: 11px; text-transform: uppercase; color: var(--color-base-content, #6b7280); opacity: 0.7; }\n .day-number { font-size: 18px; font-weight: 600; }\n .week-body { display: grid; grid-template-columns: 60px 1fr; flex: 1; min-height: 0; overflow: hidden; align-items: stretch; }\n .time-gutter {\n display: grid;\n height: 100%;\n min-height: 0;\n }\n .hour-label {\n font-size: 11px;\n color: var(--color-base-content, #6b7280); opacity: 0.7;\n text-align: right;\n padding-right: 8px;\n display: flex;\n align-items: start;\n min-height: 0;\n overflow: hidden;\n }\n .week-grid {\n display: grid;\n position: relative;\n grid-auto-rows: 1fr;\n height: 100%;\n min-height: 0;\n }\n .hour-line {\n border-top: 1px solid var(--color-base-200);\n pointer-events: none;\n min-height: 0;\n }\n .week-event {\n z-index: 1;\n padding: 1px 2px;\n overflow: hidden;\n min-height: 0;\n }\n .current-time-line {\n position: relative;\n z-index: 2;\n pointer-events: none;\n }\n .current-time-dot {\n width: 8px;\n height: 8px;\n background: var(--color-error, #ef4444);\n border-radius: 50%;\n position: absolute;\n left: -4px;\n top: -4px;\n }\n .current-time-rule {\n height: 2px;\n background: var(--color-error, #ef4444);\n width: 100%;\n }\n `]\n})\nexport class CalendarWeekComponent implements OnInit, OnDestroy {\n private layoutService = inject(CalendarEventLayoutService);\n private cdr = inject(ChangeDetectorRef);\n\n /** The date around which the week is centred. */\n @Input() focusDay!: Date;\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Observable that emits when the focus day changes. */\n @Input() focusDayChanged!: Observable<Date>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Optional custom event renderer component. */\n @Input() calendarEventComponent?: Type<CalendarEventData>;\n /** Emits when a calendar event is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n columns: ColumnDay[] = [];\n hourRows: DisplayHourRow[] = [];\n displayEvents: CalendarEvent[] = [];\n totalRows = 0;\n currentTimeRow = 0;\n currentTimeCol = '';\n gridTemplateColumns = 'repeat(7, 1fr)';\n\n private dayColumnMap: { subColumns: number; startCol: number }[] = [];\n private events: CalendarEvent[] = [];\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n private resolvedConfig!: CalendarConfig;\n private currentTimeInterval?: ReturnType<typeof setInterval>;\n\n constructor() {\n this.formatter = new DefaultCalendarDateFormatter();\n }\n\n ngOnInit() {\n this.resolvedConfig = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.buildColumns();\n this.updateCurrentTime();\n this.currentTimeInterval = setInterval(() => this.updateCurrentTime(), 60000);\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.events = events;\n this.refreshEvents();\n this.cdr.markForCheck();\n });\n }\n\n if (this.focusDayChanged) {\n this.focusDayChanged.pipe(takeUntil(this.destroy$)).subscribe(date => {\n this.focusDay = date;\n this.buildColumns();\n this.refreshEvents();\n this.updateCurrentTime();\n this.cdr.markForCheck();\n });\n }\n\n // Build hour rows asynchronously (formatTimeI returns a Promise).\n this.buildHourRows().then(() => this.cdr.markForCheck());\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.currentTimeInterval) clearInterval(this.currentTimeInterval);\n }\n\n /** Returns the CSS `grid-row` value for an event based on its start/end times. */\n getEventRow(event: CalendarEvent): string {\n const startRow = CalendarUtility.getCorrectRow(\n event.startTime.getHours(), event.startTime.getMinutes(), this.resolvedConfig.startHour\n );\n const endRow = CalendarUtility.getCorrectRow(\n event.endTime.getHours(), event.endTime.getMinutes(), this.resolvedConfig.startHour\n );\n return `${startRow} / ${Math.max(endRow, startRow + 1)}`;\n }\n\n /** Returns the CSS `grid-column` span for a day header, accounting for sub-columns. */\n getHeaderColumn(dayIndex: number): string {\n if (!this.dayColumnMap.length) return `${dayIndex + 2} / span 1`;\n const dayInfo = this.dayColumnMap[dayIndex];\n return `${dayInfo.startCol + 1} / span ${dayInfo.subColumns}`;\n }\n\n /** Returns the CSS `grid-column` value for an event within its day's sub-columns. */\n getEventColumn(event: CalendarEvent): string {\n const dayIdx = this.columns.findIndex(c => this.formatter.isSameDay(c.date, event.startTime));\n if (dayIdx < 0) return '1 / span 1';\n const dayInfo = this.dayColumnMap[dayIdx];\n const subCol = (event.column ?? 0) + dayInfo.startCol;\n const width = event.width ?? 1;\n return `${subCol} / span ${width}`;\n }\n\n /** Forwards event click to parent. */\n onEventClick(event: CalendarEvent) {\n this.eventClicked.emit(event);\n }\n\n /** trackBy for hour rows. */\n trackByHour(_index: number, row: DisplayHourRow): number {\n return row.hour;\n }\n\n /** trackBy for day columns. */\n trackByColumn(_index: number, col: ColumnDay): number {\n return col.date.getTime();\n }\n\n /** trackBy for events. */\n trackByEvent(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n\n private async buildHourRows() {\n const hours = this.resolvedConfig.endHour - this.resolvedConfig.startHour;\n this.totalRows = hours * 2;\n\n const rows: DisplayHourRow[] = [];\n for (let i = 0; i < hours; i++) {\n const hour = this.resolvedConfig.startHour + i;\n const label = await this.formatter.formatTimeI(hour, 0);\n rows.push({\n hour,\n topRow: i * 2 + 1,\n bottomRow: i * 2 + 3,\n hourLabel: label\n });\n }\n this.hourRows = rows;\n }\n\n /** Builds the 7 day columns for the current week (Monday–Sunday). */\n private buildColumns() {\n if (!this.focusDay) return;\n\n const shortNames = this.resolvedConfig.shortDayNames;\n const today = new Date();\n\n const day = this.focusDay.getDay();\n const mondayOffset = day === 0 ? -6 : 1 - day;\n const monday = new Date(this.focusDay);\n monday.setDate(this.focusDay.getDate() + mondayOffset);\n\n this.columns = [];\n for (let i = 0; i < 7; i++) {\n const date = new Date(monday);\n date.setDate(monday.getDate() + i);\n this.columns.push({\n date,\n dayName: shortNames[i],\n dayNumber: date.getDate(),\n isToday: this.formatter.isSameDay(date, today)\n });\n }\n }\n\n /** Filters, splits, and lays out events for the current week. */\n private refreshEvents() {\n if (!this.columns.length) return;\n\n const rangeStart = this.columns[0].date;\n const rangeEnd = new Date(this.columns[6].date);\n rangeEnd.setHours(23, 59, 59, 999);\n\n const filtered = this.events.filter(e =>\n this.layoutService.eventsOverlap(e.startTime, e.endTime, rangeStart, rangeEnd)\n );\n\n this.displayEvents = this.layoutService.calculateMultiDayEvents(\n filtered, this.resolvedConfig.startHour, this.resolvedConfig.endHour, rangeStart, rangeEnd\n );\n\n // Assign columns per day so overlapping events within a day get sub-columns\n for (let i = 0; i < 7; i++) {\n const dayStart = new Date(this.columns[i].date);\n dayStart.setHours(0, 0, 0, 0);\n const dayEnd = new Date(this.columns[i].date);\n dayEnd.setHours(23, 59, 59, 999);\n\n const dayEvents = this.displayEvents.filter(e =>\n this.formatter.isSameDay(e.startTime, this.columns[i].date)\n );\n\n this.layoutService.assignColumnsToEvents(dayEvents);\n this.layoutService.assignWidthsToEvents(dayEvents, dayStart, dayEnd);\n }\n\n this.buildGridColumns();\n this.updateCurrentTime();\n }\n\n /** Computes the CSS grid-template-columns string based on per-day sub-column counts. */\n private buildGridColumns() {\n this.dayColumnMap = [];\n let currentCol = 1;\n\n for (let i = 0; i < 7; i++) {\n const dayEvents = this.displayEvents.filter(e =>\n this.formatter.isSameDay(e.startTime, this.columns[i].date)\n );\n\n let maxSubCols = 1;\n for (const e of dayEvents) {\n maxSubCols = Math.max(maxSubCols, (e.column ?? 0) + (e.width ?? 1));\n }\n\n this.dayColumnMap.push({ subColumns: maxSubCols, startCol: currentCol });\n currentCol += maxSubCols;\n }\n\n const parts: string[] = [];\n for (const day of this.dayColumnMap) {\n for (let j = 0; j < day.subColumns; j++) {\n parts.push(`${1 / day.subColumns}fr`);\n }\n }\n this.gridTemplateColumns = parts.join(' ');\n }\n\n /** Updates the current-time red line position. */\n private updateCurrentTime() {\n const now = new Date();\n const dayIdx = this.columns.findIndex(c => this.formatter.isSameDay(c.date, now));\n if (dayIdx >= 0 && this.dayColumnMap.length > 0) {\n const dayInfo = this.dayColumnMap[dayIdx];\n this.currentTimeCol = `${dayInfo.startCol} / span ${dayInfo.subColumns}`;\n this.currentTimeRow = CalendarUtility.getCorrectRow(now.getHours(), now.getMinutes(), this.resolvedConfig.startHour);\n } else {\n this.currentTimeCol = '';\n this.currentTimeRow = 0;\n }\n }\n}\n","<div class=\"calendar-week\" role=\"grid\" aria-label=\"Week view\">\n <div class=\"week-header\" [style.grid-template-columns]=\"'60px ' + gridTemplateColumns\">\n <div class=\"time-gutter-header\"></div>\n @for (col of columns; track col.dayName; let i = $index) {\n <div class=\"day-column-header\"\n [class.today]=\"col.isToday\"\n [style.grid-column]=\"getHeaderColumn(i)\"\n role=\"columnheader\">\n <span class=\"day-name\">{{ col.dayName }}</span>\n <span class=\"day-number\">{{ col.dayNumber }}</span>\n </div>\n }\n </div>\n <div class=\"week-body\">\n <div class=\"time-gutter\" [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-label\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\">\n {{ row.hourLabel }}\n </div>\n }\n </div>\n <div class=\"week-grid\"\n [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\"\n [style.grid-template-columns]=\"gridTemplateColumns\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-line\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\"\n [style.grid-column]=\"'1 / -1'\">\n </div>\n }\n @if (currentTimeRow > 0 && currentTimeCol) {\n <div class=\"current-time-line\"\n [style.grid-row]=\"currentTimeRow\"\n [style.grid-column]=\"currentTimeCol\">\n <div class=\"current-time-dot\"></div>\n <div class=\"current-time-rule\"></div>\n </div>\n }\n @for (event of displayEvents; track $index) {\n <div class=\"week-event\"\n [style.grid-row]=\"getEventRow(event)\"\n [style.grid-column]=\"getEventColumn(event)\"\n (click)=\"onEventClick(event)\"\n (keyup.enter)=\"onEventClick(event)\"\n tabindex=\"0\">\n <mn-calendar-event [customComponent]=\"calendarEventComponent\" [event]=\"event\"></mn-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Output,\n EventEmitter,\n Type,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, Subject, takeUntil } from 'rxjs';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarConfig, DEFAULT_CALENDAR_CONFIG, HourRow, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\nimport { CalendarEventLayoutService } from '../../services/calendar-event-layout.service';\nimport { CalendarUtility } from '../../utils/calendar-utils';\nimport { CalendarEventComponent } from '../calendar-event/calendar-event.component';\n\n/** Extended hour row with a pre-resolved display label. */\ntype DisplayHourRow = {\n hourLabel: string;\n} & HourRow\n\n/**\n * Day grid view showing a single day with half-hour time slots.\n *\n * Shares the same layout algorithm as the week view via\n * {@link CalendarEventLayoutService}.\n */\n@Component({\n selector: 'mn-calendar-day',\n standalone: true,\n imports: [CommonModule, CalendarEventComponent],\n templateUrl: './calendar-day.component.html',\n providers: [CalendarEventLayoutService],\n styles: [`\n .calendar-day { width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden; }\n .day-header {\n display: grid;\n grid-template-columns: 60px 1fr;\n border-bottom: 1px solid var(--color-base-300);\n }\n .time-gutter-header { min-width: 60px; }\n .day-column-header {\n text-align: center;\n padding: 8px 4px;\n font-size: 13px;\n }\n .day-column-header.today { color: var(--color-primary); font-weight: 700; }\n .day-name { display: block; font-size: 11px; text-transform: uppercase; color: var(--color-base-content, #6b7280); opacity: 0.7; }\n .day-number { font-size: 18px; font-weight: 600; }\n .day-body { display: grid; grid-template-columns: 60px 1fr; flex: 1; min-height: 0; overflow: hidden; align-items: stretch; }\n .time-gutter { display: grid; height: 100%; min-height: 0; }\n .hour-label {\n font-size: 11px;\n color: var(--color-base-content, #6b7280); opacity: 0.7;\n text-align: right;\n padding-right: 8px;\n display: flex;\n align-items: start;\n min-height: 0;\n overflow: hidden;\n }\n .day-grid {\n display: grid;\n position: relative;\n grid-auto-rows: 1fr;\n height: 100%;\n min-height: 0;\n }\n .hour-line { border-top: 1px solid var(--color-base-200); pointer-events: none; min-height: 0; }\n .day-event { z-index: 1; padding: 1px 2px; overflow: hidden; min-height: 0; }\n .current-time-line { position: relative; z-index: 2; pointer-events: none; }\n .current-time-dot {\n width: 8px; height: 8px; background: var(--color-error, #ef4444); border-radius: 50%;\n position: absolute; left: -4px; top: -4px;\n }\n .current-time-rule { height: 2px; background: var(--color-error, #ef4444); width: 100%; }\n `]\n})\nexport class CalendarDayComponent implements OnInit, OnDestroy {\n private layoutService = inject(CalendarEventLayoutService);\n private cdr = inject(ChangeDetectorRef);\n\n /** The date to display. */\n @Input() focusDay!: Date;\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Observable that emits when the focus day changes. */\n @Input() focusDayChanged!: Observable<Date>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Optional custom event renderer component. */\n @Input() calendarEventComponent?: Type<CalendarEventData>;\n /** Emits when a calendar event is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n hourRows: DisplayHourRow[] = [];\n displayEvents: CalendarEvent[] = [];\n totalRows = 0;\n totalColumns = 1;\n currentTimeRow = 0;\n isToday = false;\n dayName = '';\n\n private events: CalendarEvent[] = [];\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n private resolvedConfig!: CalendarConfig;\n private currentTimeInterval?: ReturnType<typeof setInterval>;\n\n constructor() {\n this.formatter = new DefaultCalendarDateFormatter();\n }\n\n ngOnInit() {\n this.resolvedConfig = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.updateDayInfo();\n this.updateCurrentTime();\n this.currentTimeInterval = setInterval(() => this.updateCurrentTime(), 60000);\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.events = events;\n this.refreshEvents();\n this.cdr.markForCheck();\n });\n }\n\n if (this.focusDayChanged) {\n this.focusDayChanged.pipe(takeUntil(this.destroy$)).subscribe(date => {\n this.focusDay = date;\n this.updateDayInfo();\n this.refreshEvents();\n this.updateCurrentTime();\n this.cdr.markForCheck();\n });\n }\n\n // Build hour rows asynchronously (formatTimeI returns a Promise).\n this.buildHourRows().then(() => this.cdr.markForCheck());\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.currentTimeInterval) clearInterval(this.currentTimeInterval);\n }\n\n /** Returns the CSS `grid-row` value for an event. */\n getEventRow(event: CalendarEvent): string {\n const startRow = CalendarUtility.getCorrectRow(\n event.startTime.getHours(), event.startTime.getMinutes(), this.resolvedConfig.startHour\n );\n const endRow = CalendarUtility.getCorrectRow(\n event.endTime.getHours(), event.endTime.getMinutes(), this.resolvedConfig.startHour\n );\n return `${startRow} / ${Math.max(endRow, startRow + 1)}`;\n }\n\n /** Returns the CSS `grid-column` value for an event within its sub-columns. */\n getEventColumn(event: CalendarEvent): string {\n const col = (event.column ?? 0) + 1;\n const width = event.width ?? 1;\n return `${col} / span ${width}`;\n }\n\n /** Forwards event click to parent. */\n onEventClick(event: CalendarEvent) {\n this.eventClicked.emit(event);\n }\n\n /** trackBy for hour rows. */\n trackByHour(_index: number, row: DisplayHourRow): number {\n return row.hour;\n }\n\n /** trackBy for events. */\n trackByEvent(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n\n private async buildHourRows() {\n const hours = this.resolvedConfig.endHour - this.resolvedConfig.startHour;\n this.totalRows = hours * 2;\n\n const rows: DisplayHourRow[] = [];\n for (let i = 0; i < hours; i++) {\n const hour = this.resolvedConfig.startHour + i;\n const label = await this.formatter.formatTimeI(hour, 0);\n rows.push({\n hour,\n topRow: i * 2 + 1,\n bottomRow: i * 2 + 3,\n hourLabel: label\n });\n }\n this.hourRows = rows;\n }\n\n /** Updates the day name and isToday flag. */\n private updateDayInfo() {\n if (!this.focusDay) return;\n const today = new Date();\n this.isToday = this.formatter.isSameDay(this.focusDay, today);\n const longNames = this.resolvedConfig.longDayNames;\n const dayIdx = this.focusDay.getDay();\n const mondayIdx = dayIdx === 0 ? 6 : dayIdx - 1;\n this.dayName = longNames[mondayIdx];\n }\n\n /** Filters, splits, and lays out events for the focus day. */\n private refreshEvents() {\n if (!this.focusDay) return;\n\n const rangeStart = new Date(this.focusDay);\n rangeStart.setHours(0, 0, 0, 0);\n const rangeEnd = new Date(this.focusDay);\n rangeEnd.setHours(23, 59, 59, 999);\n\n const filtered = this.events.filter(e =>\n this.layoutService.eventsOverlap(e.startTime, e.endTime, rangeStart, rangeEnd)\n );\n\n this.displayEvents = this.layoutService.calculateMultiDayEvents(\n filtered, this.resolvedConfig.startHour, this.resolvedConfig.endHour, rangeStart, rangeEnd\n );\n\n this.layoutService.assignColumnsToEvents(this.displayEvents);\n this.layoutService.assignWidthsToEvents(this.displayEvents, rangeStart, rangeEnd);\n\n const maxCol = this.displayEvents.reduce((max, e) => Math.max(max, (e.column ?? 0) + (e.width ?? 1)), 1);\n this.totalColumns = maxCol;\n }\n\n /** Updates the current-time red line position. */\n private updateCurrentTime() {\n const now = new Date();\n if (this.focusDay && this.formatter.isSameDay(this.focusDay, now)) {\n this.currentTimeRow = CalendarUtility.getCorrectRow(now.getHours(), now.getMinutes(), this.resolvedConfig.startHour);\n this.isToday = true;\n } else {\n this.currentTimeRow = 0;\n this.isToday = false;\n }\n }\n}\n","<div class=\"calendar-day\" role=\"grid\" aria-label=\"Day view\">\n <div class=\"day-header\">\n <div class=\"time-gutter-header\"></div>\n <div class=\"day-column-header\" [class.today]=\"isToday\" role=\"columnheader\">\n <span class=\"day-name\">{{ dayName }}</span>\n <span class=\"day-number\">{{ focusDay.getDate() }}</span>\n </div>\n </div>\n <div class=\"day-body\">\n <div class=\"time-gutter\" [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-label\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\">\n {{ row.hourLabel }}\n </div>\n }\n </div>\n <div class=\"day-grid\"\n [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\"\n [style.grid-template-columns]=\"'repeat(' + totalColumns + ', 1fr)'\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-line\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\"\n [style.grid-column]=\"'1 / -1'\">\n </div>\n }\n @if (currentTimeRow > 0 && isToday) {\n <div class=\"current-time-line\"\n [style.grid-row]=\"currentTimeRow\"\n [style.grid-column]=\"'1 / -1'\">\n <div class=\"current-time-dot\"></div>\n <div class=\"current-time-rule\"></div>\n </div>\n }\n @for (event of displayEvents; track $index) {\n <div class=\"day-event\"\n [style.grid-row]=\"getEventRow(event)\"\n [style.grid-column]=\"getEventColumn(event)\"\n (click)=\"onEventClick(event)\"\n (keyup.enter)=\"onEventClick(event)\"\n tabindex=\"0\">\n <mn-calendar-event [customComponent]=\"calendarEventComponent\" [event]=\"event\"></mn-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import {Component, Input, OnInit, Output, EventEmitter, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CALENDAR_DATE_FORMATTER, CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\n\n/**\n * Renders a single row in the upcoming-events sidebar.\n * Shows the event title, formatted date/time, and optional description.\n */\n@Component({\n selector: 'mn-upcoming-event-row',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './upcoming-event-row.component.html',\n styles: [`\n .upcoming-event-row {\n padding: 8px 12px;\n border-left: 3px solid var(--color-primary, #3b82f6);\n margin-bottom: 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s;\n }\n .upcoming-event-row:hover { background: var(--color-base-200); }\n .event-title { font-weight: 600; font-size: 13px; }\n .event-time { font-size: 12px; color: var(--color-base-content, #6b7280); opacity: 0.7; }\n .event-description { font-size: 12px; color: var(--color-base-content, #9ca3af); opacity: 0.5; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n `]\n})\nexport class UpcomingEventRowComponent implements OnInit {\n /** The event to display. */\n @Input() event!: CalendarEvent;\n /** Emits the event when this row is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n formattedDate = '';\n\n private formatter: CalendarDateFormatter;\n\n constructor() {\n const formatter = inject<CalendarDateFormatter | null>(CALENDAR_DATE_FORMATTER, {optional: true});\n\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\n }\n\n async ngOnInit() {\n if (this.event) {\n const start = await this.formatter.formatTime(this.event.startTime);\n const end = await this.formatter.formatTime(this.event.endTime);\n this.formattedDate = `${start} - ${end}`;\n }\n }\n}\n","<div (click)=\"eventClicked.emit(event)\" (keyup.enter)=\"eventClicked.emit(event)\" [style.border-left-color]=\"event.color.primaryColor\" class=\"upcoming-event-row\"\n tabindex=\"0\">\n <div class=\"event-title\">{{ event.title }}</div>\n <div class=\"event-time\">{{ formattedDate }}</div>\n @if (event.description) {\n <div class=\"event-description\">{{ event.description }}</div>\n }\n</div>\n","import {Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {Observable, Subject, takeUntil} from 'rxjs';\nimport {CalendarEvent} from '../../models/calendar-event.model';\nimport {CalendarConfig, DEFAULT_CALENDAR_CONFIG, resolveCalendarConfig} from '../../models/calendar-config.model';\nimport {UpcomingEventRowComponent} from '../upcoming-event-row/upcoming-event-row.component';\n\n/**\n * Sidebar component that lists the next 10 upcoming events\n * (events whose end time is in the future), sorted by start time.\n */\n@Component({\n selector: 'mn-upcoming-events',\n standalone: true,\n imports: [CommonModule, UpcomingEventRowComponent],\n templateUrl: './upcoming-events.component.html',\n styles: [`\n .upcoming-events {\n padding: 16px;\n }\n .upcoming-title {\n font-size: 16px;\n font-weight: 600;\n margin-bottom: 12px;\n }\n .no-events {\n color: var(--color-base-content, #9ca3af); opacity: 0.5;\n font-size: 14px;\n }\n `]\n})\nexport class UpcomingEventsComponent implements OnInit, OnChanges, OnDestroy {\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Emits when an upcoming event row is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n upcomingEvents: CalendarEvent[] = [];\n title: string;\n noEventsMessage: string;\n\n private destroy$ = new Subject<void>();\n\n constructor() {\n this.title = DEFAULT_CALENDAR_CONFIG.upcomingEventsTitle;\n this.noEventsMessage = DEFAULT_CALENDAR_CONFIG.noUpcomingEvents;\n }\n\n /** Re-read labels when the config input changes (e.g. after a locale switch). */\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.config) {\n const resolved = resolveCalendarConfig(this.config);\n this.title = resolved.upcomingEventsTitle;\n this.noEventsMessage = resolved.noUpcomingEvents;\n }\n }\n\n ngOnInit() {\n const resolved = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.title = resolved.upcomingEventsTitle;\n this.noEventsMessage = resolved.noUpcomingEvents;\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n const now = new Date();\n this.upcomingEvents = events\n .filter(e => e.endTime > now)\n .sort((a, b) => a.startTime.getTime() - b.startTime.getTime())\n .slice(0, 10);\n });\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** trackBy for upcoming event rows. */\n trackByEvent(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n}\n","<div class=\"upcoming-events\" role=\"complementary\" aria-label=\"Upcoming events\">\n <div class=\"upcoming-title\">{{ title }}</div>\n @for (event of upcomingEvents; track $index) {\n <mn-upcoming-event-row\n [event]=\"event\"\n (eventClicked)=\"eventClicked.emit($event)\">\n </mn-upcoming-event-row>\n }\n @if (upcomingEvents.length === 0) {\n <div class=\"no-events\">{{ noEventsMessage }}</div>\n }\n</div>\n","import {\n Component,\n DestroyRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Type\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {BehaviorSubject, skip, Subject, takeUntil} from 'rxjs';\nimport {CalendarButton, CalendarEvent} from '../../models/calendar-event.model';\nimport {CalendarEventData} from '../../models/calendar-event-data.model';\nimport {\n CALENDAR_CONFIG,\n CalendarConfig,\n CalendarView,\n DEFAULT_CALENDAR_CONFIG,\n MN_CALENDAR_CONFIG,\n provideMnCalendarConfig,\n resolveCalendarConfig\n} from '../../models/calendar-config.model';\nimport {MnLanguageService} from '../../../../language';\nimport {CALENDAR_DATE_FORMATTER, CalendarDateFormatter} from '../../services/calendar-date-formatter';\nimport {DefaultCalendarDateFormatter} from '../../services/default-calendar-date-formatter';\nimport {CalendarMonthComponent} from '../calendar-month/calendar-month.component';\nimport {CalendarWeekComponent} from '../calendar-week/calendar-week.component';\nimport {CalendarDayComponent} from '../calendar-day/calendar-day.component';\nimport {UpcomingEventsComponent} from '../upcoming-events/upcoming-events.component';\nimport {MnButton} from '../../../mn-button';\nimport {MnDatetime} from '../../../mn-datetime';\nimport {FormsModule} from '@angular/forms';\n\n/**\n * Main calendar orchestrator component.\n *\n * Provides a toolbar with view switching (month / week / day), date navigation,\n * and an optional action button. The active view and an upcoming-events sidebar\n * are rendered inside a responsive grid layout.\n *\n * All configuration (visible hours, locale, labels, mobile breakpoint) is read\n * from the `mn-config.json5` system via {@link MN_CALENDAR_CONFIG}, falling back\n * to the legacy {@link CALENDAR_CONFIG} injection token, then to built-in defaults.\n * Date formatting is delegated to the {@link CALENDAR_DATE_FORMATTER} token.\n *\n * @example\n * ```html\n * <mn-calendar-view\n * [showButton]=\"true\"\n * [buttonTitle]=\"'New Event'\"\n * [NewCalendarItemsEvent]=\"eventsEmitter\"\n * (RequestNewCalendarItemsEvent)=\"loadEvents($event)\"\n * (CalendarItemClickedEvent)=\"onEventClick($event)\"\n * (ButtonClickedEvent)=\"openModal()\">\n * </mn-calendar-view>\n * ```\n */\n@Component({\n selector: 'mn-calendar-view',\n standalone: true,\n imports: [\n CommonModule,\n CalendarMonthComponent,\n CalendarWeekComponent,\n CalendarDayComponent,\n UpcomingEventsComponent,\n MnButton,\n MnDatetime,\n FormsModule\n ],\n templateUrl: './calendar-view.component.html',\n providers: [\n provideMnCalendarConfig(DEFAULT_CALENDAR_CONFIG),\n ],\n styles: [`:host { display: flex; flex-direction: column; width: 100%; height: 100%; }`]\n})\nexport class CalendarViewComponent implements OnInit, OnDestroy {\n /** Whether to show the action button in the toolbar. */\n @Input() showButton = false;\n /** Label text for the action button. */\n @Input() buttonTitle = '';\n /** Array of buttons to display in the toolbar's top-right area. */\n @Input() buttons: CalendarButton[] = [];\n /** Custom event renderer component type. */\n @Input() CalendarEventComponent?: Type<CalendarEventData>;\n /** Observable or EventEmitter that pushes new event arrays into the calendar. */\n @Input() NewCalendarItemsEvent?: EventEmitter<CalendarEvent[]>;\n\n /** Emits when the calendar needs fresh event data (e.g. after navigation). */\n @Output() RequestNewCalendarItemsEvent = new EventEmitter<Date>();\n /** Emits when a calendar event is clicked. */\n @Output() CalendarItemClickedEvent = new EventEmitter<CalendarEvent>();\n /** Emits when the action button is clicked. */\n @Output() ButtonClickedEvent = new EventEmitter<void>();\n\n readonly CalendarView = CalendarView;\n currentView = CalendarView.WEEK;\n focusDay = new Date();\n dateInputValue = '';\n viewOptions: { value: CalendarView; label: string }[] = [];\n isMobileView = false;\n isTabletView = false;\n\n /** BehaviorSubject so late-subscribing child views receive the last emitted events. */\n internalEventsChanged = new BehaviorSubject<CalendarEvent[]>([]);\n /** Subject for broadcasting focus-day changes to child views. */\n internalFocusDayChanged = new Subject<Date>();\n\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n protected config: CalendarConfig;\n /** Reference to the injected mn-config object (mutated in-place on locale change). */\n private readonly mnConfigRef: CalendarConfig | null;\n private readonly destroyRef = inject(DestroyRef);\n private readonly lang = inject(MnLanguageService);\n\n constructor() {\n const formatter = inject<CalendarDateFormatter | null>(CALENDAR_DATE_FORMATTER, {optional: true});\n const mnConfig = inject<CalendarConfig | null>(MN_CALENDAR_CONFIG, {optional: true});\n const legacyConfig = inject<CalendarConfig | null>(CALENDAR_CONFIG, {optional: true});\n\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\n // Keep a reference to the injected config so we can re-read it after locale changes.\n this.mnConfigRef = mnConfig;\n // Priority: mn-config system > legacy CALENDAR_CONFIG > built-in defaults\n const raw = mnConfig ?? legacyConfig ?? undefined;\n this.config = resolveCalendarConfig(raw as Partial<CalendarConfig> | undefined);\n }\n\n @HostListener('window:resize')\n onResize() {\n this.checkMobileView();\n }\n\n ngOnInit() {\n this.rebuildFromConfig();\n\n // Re-resolve config when locale changes (supports $translate in mn-config).\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.rebuildFromConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n\n this.checkMobileView();\n this.updateDateInput();\n this.RequestNewCalendarItemsEvent.emit(this.focusDay);\n\n if (this.NewCalendarItemsEvent) {\n this.NewCalendarItemsEvent.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.internalEventsChanged.next(events);\n });\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Switches the active view. On mobile, forces day view. */\n switchView(view: CalendarView) {\n if (this.isMobileView) {\n this.currentView = CalendarView.DAY;\n return;\n }\n this.currentView = view;\n }\n\n /** Navigates to the previous period (month / week / day). */\n navigatePrevious() {\n const d = new Date(this.focusDay);\n switch (this.currentView) {\n case CalendarView.MONTH: d.setMonth(d.getMonth() - 1); break;\n case CalendarView.WEEK: d.setDate(d.getDate() - 7); break;\n case CalendarView.DAY: d.setDate(d.getDate() - 1); break;\n }\n this.setFocusDay(d);\n }\n\n /** Navigates to the next period (month / week / day). */\n navigateNext() {\n const d = new Date(this.focusDay);\n switch (this.currentView) {\n case CalendarView.MONTH: d.setMonth(d.getMonth() + 1); break;\n case CalendarView.WEEK: d.setDate(d.getDate() + 7); break;\n case CalendarView.DAY: d.setDate(d.getDate() + 1); break;\n }\n this.setFocusDay(d);\n }\n\n /** Navigates to today. */\n goToToday() {\n this.setFocusDay(new Date());\n }\n\n /** Handles the date-picker input change. */\n onDateInputChange(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n if (value) {\n this.setFocusDay(new Date(value));\n }\n }\n\n /** Handles the mn-lib-datetime ngModel change. */\n onDateStringChange(value: string) {\n if (value) {\n this.setFocusDay(new Date(value));\n }\n }\n\n /** Handles a day click from the month view — switches to day view. */\n onMonthDayClick(date: Date) {\n this.currentView = CalendarView.DAY;\n this.setFocusDay(date);\n }\n\n /** Forwards a child event click to the parent output. */\n onEventClick(event: CalendarEvent) {\n this.CalendarItemClickedEvent.emit(event);\n }\n\n /** trackBy for view option buttons. */\n trackByView(_index: number, item: { value: CalendarView }): string {\n return item.value;\n }\n\n /** Rebuilds view options and labels from the current config. */\n private rebuildFromConfig() {\n // Re-resolve from the injected config reference which is mutated in-place by the provider on locale change.\n if (this.mnConfigRef) {\n this.config = resolveCalendarConfig(this.mnConfigRef as Partial<CalendarConfig>);\n }\n this.viewOptions = [\n { value: CalendarView.MONTH, label: this.config.viewLabels['MONTH'] ?? 'Month' },\n { value: CalendarView.WEEK, label: this.config.viewLabels['WEEK'] ?? 'Week' },\n { value: CalendarView.DAY, label: this.config.viewLabels['DAY'] ?? 'Day' }\n ];\n }\n\n private checkMobileView() {\n const wasMobile = this.isMobileView;\n const width = window.innerWidth;\n this.isMobileView = width < 475;\n this.isTabletView = width >= 475 && width < 1024;\n if (this.isMobileView && !wasMobile) {\n this.currentView = CalendarView.DAY;\n }\n }\n\n private setFocusDay(date: Date) {\n this.focusDay = date;\n this.updateDateInput();\n this.internalFocusDayChanged.next(date);\n this.RequestNewCalendarItemsEvent.emit(date);\n }\n\n private updateDateInput() {\n this.dateInputValue = this.formatter.formatDateForFormControl(this.focusDay);\n }\n}\n","<div class=\"w-full h-full flex flex-col\" role=\"application\" aria-label=\"Calendar\">\n\n @if (isMobileView) {\n <!-- Mobile (<475px): action button as a full-width CTA on top; Today folds into the date-nav row below. -->\n <div class=\"flex flex-col gap-2 py-3\">\n @if (buttons.length || showButton) {\n <div class=\"flex items-center gap-2\">\n @for (btn of buttons; track btn.label) {\n <button class=\"flex-1\" mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">{{ btn.label }}</button>\n }\n @if (showButton) {\n <button class=\"flex-1\" mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">{{ buttonTitle }}</button>\n }\n </div>\n }\n <div class=\"flex items-center gap-1\">\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'primary' }\" (click)=\"goToToday()\">\n {{ config.todayLabel }}\n </button>\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <div class=\"min-w-0 flex-1\">\n <mn-lib-datetime [props]=\"{ id: 'calendar-date-picker', mode: 'date', size: 'md' }\" [ngModel]=\"dateInputValue\" (ngModelChange)=\"onDateStringChange($event)\"></mn-lib-datetime>\n </div>\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n </div>\n </div>\n } @else if (isTabletView) {\n <!-- Tablet (375px–1023px): single row — Today / date-nav / action buttons -->\n <div class=\"flex items-center gap-3 py-3\">\n <div class=\"flex items-center gap-3 min-w-0 flex-1\">\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'fill', color: 'primary' }\" (click)=\"goToToday()\">\n {{ config.todayLabel }}\n </button>\n <div class=\"flex items-center gap-1 min-w-0\">\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <div class=\"min-w-0 flex-1\">\n <mn-lib-datetime [props]=\"{ id: 'calendar-date-picker', mode: 'date', size: 'md' }\" [ngModel]=\"dateInputValue\" (ngModelChange)=\"onDateStringChange($event)\"></mn-lib-datetime>\n </div>\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n </div>\n </div>\n <div class=\"flex items-center gap-2 shrink-0\">\n @for (btn of buttons; track btn.label) {\n <button mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">{{ btn.label }}</button>\n }\n @if (showButton) {\n <button mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">{{ buttonTitle }}</button>\n }\n </div>\n </div>\n } @else {\n <!-- Desktop (≥1024px): full row — Today / date-nav / view-switcher / action buttons -->\n <div class=\"flex items-center justify-between gap-3 py-3\">\n <div class=\"flex items-center gap-3\">\n <button mnButton [data]=\"{ size: 'md', variant: 'fill', color: 'primary' }\" (click)=\"goToToday()\">\n {{ config.todayLabel }}\n </button>\n <div class=\"flex items-center gap-1\">\n <button mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <mn-lib-datetime [props]=\"{ id: 'calendar-date-picker', mode: 'date', size: 'md' }\" [ngModel]=\"dateInputValue\" (ngModelChange)=\"onDateStringChange($event)\"></mn-lib-datetime>\n <button mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n </div>\n <div class=\"flex border border-base-300 rounded-md overflow-hidden\" role=\"tablist\" aria-label=\"Calendar view\">\n @for (view of viewOptions; track view.value) {\n <button\n mnButton\n [data]=\"{ size: 'md', variant: currentView === view.value ? 'fill' : 'text', color: 'primary' }\"\n role=\"tab\"\n [attr.aria-selected]=\"currentView === view.value\"\n (click)=\"switchView(view.value)\">\n {{ view.label }}\n </button>\n }\n </div>\n </div>\n <div class=\"flex items-center gap-2\">\n @for (btn of buttons; track btn.label) {\n <button mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">{{ btn.label }}</button>\n }\n @if (showButton) {\n <button mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">{{ buttonTitle }}</button>\n }\n </div>\n </div>\n }\n\n <div class=\"grid grid-cols-1 lg:grid-cols-[1fr_220px] gap-3 flex-1 min-h-0\">\n <div class=\"min-w-0 min-h-0 overflow-hidden overflow-y-auto\">\n @if (currentView === CalendarView.MONTH) {\n <mn-calendar-month\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n (dayClicked)=\"onMonthDayClick($event)\">\n </mn-calendar-month>\n }\n @if (currentView === CalendarView.WEEK) {\n <mn-calendar-week\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </mn-calendar-week>\n }\n @if (currentView === CalendarView.DAY) {\n <mn-calendar-day\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </mn-calendar-day>\n }\n </div>\n <div class=\"hidden lg:block border-l border-base-300 overflow-auto\">\n <mn-upcoming-events\n [eventsChanged]=\"internalEventsChanged\"\n [config]=\"config\"\n (eventClicked)=\"onEventClick($event)\">\n </mn-upcoming-events>\n </div>\n </div>\n\n</div>\n","// Main component\nexport { CalendarViewComponent } from './components/calendar-view/calendar-view.component';\n\n// Sub-components\nexport { CalendarWeekComponent } from './components/calendar-week/calendar-week.component';\nexport { CalendarDayComponent } from './components/calendar-day/calendar-day.component';\nexport { CalendarMonthComponent } from './components/calendar-month/calendar-month.component';\nexport { CalendarEventComponent } from './components/calendar-event/calendar-event.component';\nexport { CalendarEventDefaultComponent } from './components/calendar-event-default/calendar-event-default.component';\nexport { UpcomingEventsComponent } from './components/upcoming-events/upcoming-events.component';\nexport { UpcomingEventRowComponent } from './components/upcoming-event-row/upcoming-event-row.component';\n\n// Models\nexport type { CalendarEvent, CurrentTimeCalendarEvent, CalendarButton } from './models/calendar-event.model';\nexport type { CalendarEventData } from './models/calendar-event-data.model';\nexport { CalendarView, CALENDAR_CONFIG, DEFAULT_CALENDAR_CONFIG, MN_CALENDAR_CONFIG, MN_CALENDAR_COMPONENT_NAME, provideMnCalendarConfig, resolveCalendarConfig } from './models/calendar-config.model';\nexport type { CalendarConfig, HourRow, ColumnDay, MonthItem } from './models/calendar-config.model';\nexport type { ColorPreset } from './models/color-preset.model';\n\n// Services / Tokens\nexport { CALENDAR_DATE_FORMATTER } from './services/calendar-date-formatter';\nexport type { CalendarDateFormatter } from './services/calendar-date-formatter';\nexport { DefaultCalendarDateFormatter } from './services/default-calendar-date-formatter';\nexport { CalendarEventLayoutService } from './services/calendar-event-layout.service';\n\n// Utility\nexport { CalendarUtility } from './utils/calendar-utils';\n","import {Component, DoCheck, EventEmitter, Input, isSignal, Output} from '@angular/core';\nimport {MnTranslatePipe} from '../../language';\nimport {MnCollectionState} from '../mn-collection';\nimport {MnTabDataSource, MnTabItem} from './mn-tab.types';\nimport {CommonModule} from '@angular/common';\nimport {MnBadge} from '../mn-badge';\nimport {MnSkeleton} from '../mn-skeleton';\n\n/** Fallback number of skeleton tabs when no items are known and no count is given. */\nconst DEFAULT_SKELETON_TAB_COUNT = 3;\n\n/**\n * Tab component that renders a horizontal tab bar.\n * Supports translation keys for labels via MnTranslatePipe.\n */\n@Component({\n selector: 'mn-tab',\n standalone: true,\n imports: [MnTranslatePipe, CommonModule, MnBadge, MnSkeleton],\n templateUrl: './mn-tab.component.html',\n})\nexport class MnTabComponent implements DoCheck {\n /** Data source containing tab items and default active index. */\n @Input() dataSource!: MnTabDataSource;\n\n /**\n * Whether to enable horizontal scrolling when items overflow.\n * If true, tabs will scroll horizontally instead of shrinking too much.\n */\n @Input() scrollable = false;\n\n /**\n * Whether tabs should stretch to fill the available width.\n * Defaults to false, so tabs only take as much space as their content.\n */\n @Input() justified = false;\n\n /** Emits the newly activated tab item whenever the active tab changes. */\n @Output() activeChange = new EventEmitter<MnTabItem>();\n\n /** The currently active tab item. */\n currentActive?: MnTabItem;\n\n /**\n * Whether the tab bar is loading and should render skeleton tabs, from\n * {@link MnTabDataSource.state}.\n */\n get isLoadingState(): boolean {\n return this.dataSource.state === MnCollectionState.LOADING;\n }\n\n /**\n * Index array sizing the loading skeleton: `skeletonCount` when provided,\n * otherwise the number of known items, falling back to a default when none.\n */\n get skeletonTabs(): number[] {\n const count =\n this.dataSource.skeletonCount ??\n (this.dataSource.items.length || DEFAULT_SKELETON_TAB_COUNT);\n return Array.from({length: count}, (_, index) => index);\n }\n\n /**\n * Re-resolves the active tab on every change-detection pass.\n *\n * The data source is often populated or rebuilt asynchronously (tabs that\n * depend on fetched data or permissions). Resolving the active tab only once\n * at init would leave {@link currentActive} pointing at a stale item — the\n * tab bar would then highlight nothing and swallow the first click — so the\n * selection is kept in sync with whatever the data source currently holds.\n */\n ngDoCheck(): void {\n this.syncActiveTab();\n }\n\n /**\n * Sets the given tab item as active, invoking deactivate/activate callbacks.\n * @param item - The tab item to activate.\n */\n setActive(item: MnTabItem): void {\n if (this.currentActive === item) {\n return;\n }\n this.currentActive?.onDeactivate?.();\n item.onClick?.();\n this.currentActive = item;\n this.activeChange.emit(item);\n }\n\n /**\n * Returns the resolved badge value for a tab item, supporting both plain numbers and Signal<number>.\n * @param item - The tab item whose badge to resolve.\n */\n getBadge(item: MnTabItem): number | undefined {\n if (isSignal(item.badge)) return item.badge();\n return item.badge;\n }\n\n /**\n * Ensures {@link currentActive} references a tab that still exists in the data\n * source, falling back to the configured default tab when the current\n * selection is missing or stale (e.g. after the items array is replaced).\n */\n private syncActiveTab(): void {\n const items = this.dataSource?.items;\n if (!items || items.length === 0) {\n this.currentActive = undefined;\n return;\n }\n if (this.currentActive && items.includes(this.currentActive)) {\n return;\n }\n const defaultIndex = this.dataSource.defaultActive;\n const index =\n defaultIndex >= 0 && defaultIndex < items.length ? defaultIndex : 0;\n this.currentActive = items[index];\n }\n}\n","<div class=\"mb-10\">\n <div\n class=\"flex justify-start scrollbar-hide\"\n [class.overflow-x-auto]=\"scrollable\"\n [class.overflow-y-hidden]=\"scrollable\"\n >\n <div\n role=\"tablist\"\n class=\"tabs flex flex-nowrap -mb-[1px] border-b border-base-300\"\n [class.w-full]=\"justified\"\n >\n @if (isLoadingState) {\n @for (i of skeletonTabs; track i) {\n <div\n [class.flex-1]=\"justified\"\n class=\"tab px-4 py-2 border-b-2 border-transparent flex items-center justify-center\"\n >\n <mn-skeleton [data]=\"{ shape: 'rectangle', width: '4.5rem', height: '1rem' }\"></mn-skeleton>\n </div>\n }\n } @else {\n @for (item of dataSource.items; track item.label) {\n <div\n (click)=\"setActive(item)\"\n (keyup.enter)=\"setActive(item)\"\n (keyup.space)=\"setActive(item)\"\n [attr.aria-selected]=\"currentActive === item\"\n [class.border-primary]=\"currentActive === item\"\n [class.border-transparent]=\"currentActive !== item\"\n [class.flex-1]=\"justified\"\n [class.font-bold]=\"currentActive === item\"\n [class.text-base-content]=\"currentActive !== item\"\n [class.text-primary]=\"currentActive === item\"\n class=\"tab px-4 py-2 border-b-2 cursor-pointer select-none transition-colors whitespace-nowrap text-center flex items-center gap-2\"\n role=\"tab\"\n tabindex=\"0\"\n >\n {{ item.label | mnTranslate }}\n @let badge = getBadge(item);\n @if (badge && badge > 0) {\n <span [data]=\"{ size: 'sm', color: 'accent', variant: 'fill' }\" mnBadge>{{ badge }}</span>\n }\n </div>\n }\n }\n </div>\n </div>\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnIconVariants = tv({\n base: 'inline-flex shrink-0',\n variants: {\n color: {\n current: 'text-current',\n primary: 'text-primary',\n secondary: 'text-neutral',\n danger: 'text-error',\n warning: 'text-warning',\n success: 'text-success',\n accent: 'text-accent',\n },\n },\n\n defaultVariants: {\n color: 'current',\n },\n});\n\nexport type MnIconVariants = VariantProps<typeof mnIconVariants>;\n","// Custom SVGs that are NOT available in lucide (https://lucide.dev).\n// For any lucide icon, use the @lucide/angular directive directly instead —\n// e.g. `<svg lucideX [size]=\"18\"></svg>` — rather than adding it here.\n// Sourced from the .svg files in the ./icons/ directory.\nconst pistolSvg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8.72 14.56 9 10h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v4c2.5 0 1 4 1 4-4 6-1 6-1 6h3.38a1 1 0 0 0 .89-.55za1 1 0 0 1 .9-.56H13a2 2 0 0 0 2-2v-1a1 1 0 0 1 1-1\" /></svg>`;\nconst pendingSvg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 7v5l4 2\" /><path d=\"M14 20.775A9 9 0 0112 21\" /><path d=\"M19 17.656a9 9 0 01-1.5 1.456\" /><path d=\"M21 12a9 9 0 01-.228 2\" /><path d=\"M21 8h-5\" /><path d=\"M7.5 19.794c-6-3.464-6-12.124 0-15.588A9 9 0 0112 3a9.75 9.75 0 016.74 2.74L21 8V3\" /></svg>`;\n\nexport const MN_ICON_MAP: Record<string, string> = {\n pistol: pistolSvg,\n pending: pendingSvg,\n};\n","import { Component, HostBinding, Input, OnChanges, OnInit, inject, ElementRef } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { MnIconTypes } from './mn-iconTypes';\nimport { mnIconVariants } from './mn-iconVariants';\nimport { MN_ICON_MAP } from './mn-icon-map';\n\n@Component({\n selector: 'mn-icon',\n standalone: true,\n templateUrl: './mn-icon.html',\n})\nexport class MnIcon implements OnChanges, OnInit {\n @Input() data: Partial<MnIconTypes> = {};\n\n private sanitizer = inject(DomSanitizer);\n private el = inject(ElementRef);\n\n svgContent: SafeHtml = '';\n\n get iconSize(): number {\n return this.data.size ?? 24;\n }\n\n @HostBinding('class')\n get hostClasses(): string {\n return mnIconVariants({\n color: this.data.color,\n });\n }\n\n private resolvedName: string | null = null;\n\n ngOnInit(): void {\n const attrs = this.el.nativeElement.attributes;\n for (const item of Array.from<Attr>(attrs)) {\n const attr = item.name.toLowerCase();\n if (attr.startsWith('mnicon')) {\n const iconKey = attr.slice('mnicon'.length);\n for (const key of Object.keys(MN_ICON_MAP)) {\n if (key.toLowerCase() === iconKey) {\n this.resolvedName = key;\n break;\n }\n }\n if (this.resolvedName) break;\n }\n }\n this.updateContent();\n }\n\n ngOnChanges(): void {\n this.updateContent();\n }\n\n private updateContent(): void {\n const name = this.data.name ?? this.resolvedName;\n if (name) {\n const raw = MN_ICON_MAP[name];\n if (raw) {\n const size = this.iconSize;\n const isFullSvg = raw.trim().startsWith('<svg');\n if (isFullSvg) {\n const sized = raw.replace(/<svg([^>]*)>/, (_match: string, attrs: string) => {\n let updated = attrs.replace(/width=\"[^\"]*\"/, `width=\"${size}\"`);\n updated = updated.replace(/height=\"[^\"]*\"/, `height=\"${size}\"`);\n if (!attrs.includes('width=')) updated += ` width=\"${size}\"`;\n if (!attrs.includes('height=')) updated += ` height=\"${size}\"`;\n return `<svg${updated}>`;\n });\n this.svgContent = this.sanitizer.bypassSecurityTrustHtml(sized);\n } else {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${raw}</svg>`;\n this.svgContent = this.sanitizer.bypassSecurityTrustHtml(svg);\n }\n } else {\n this.svgContent = '';\n }\n } else {\n this.svgContent = '';\n }\n }\n}\n","<span\n [style.width.px]=\"iconSize\"\n [style.height.px]=\"iconSize\"\n style=\"display: inline-flex; align-items: center; justify-content: center;\"\n [innerHTML]=\"svgContent\"\n></span>\n","import { Directive } from '@angular/core';\n\n// AUTO-GENERATED — do not edit manually.\n// Run `npm run generate:icons` to regenerate after modifying MN_ICON_MAP.\n@Directive({\n selector: 'mn-icon[mnIconPistol], mn-icon[mnIconPending]',\n standalone: true,\n})\nexport class MnIconAttributes {}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Injection token for the base URL used by all CRUD service requests.\n *\n * Provide this token at the application or module level to configure\n * the root API URL that `CrudService` prepends to every endpoint.\n */\nexport const API_BASE_URL = new InjectionToken<string>('API_BASE_URL');\n","import {inject} from '@angular/core';\nimport {ApiError, FailureResult, QueryParams, Result, ResultMeta, SuccessResult} from './crud.model';\nimport {catchError, map, Observable, of} from 'rxjs';\nimport {HttpClient, HttpErrorResponse, HttpParams, HttpResponse, HttpStatusCode} from '@angular/common/http';\nimport {API_BASE_URL} from './crud.tokens';\n\n/**\n * Configuration for a CRUD service endpoint.\n *\n * Passed to the `CrudService` constructor to define which API\n * resource the service operates on.\n */\nexport type CrudConfig = {\n endpoint: string;\n}\n\n/**\n * Abstract base class for CRUD services.\n * Provides standard HTTP operations with typed `Result<T>` responses.\n *\n * @template TEntity The entity type returned by single-item operations.\n * @template TListResponse The response type for list operations (defaults to `TEntity[]`).\n * @template TCreatePayload The payload type for create operations (defaults to `Partial<TEntity>`).\n * @template TUpdatePayload The payload type for update operations (defaults to `Partial<TEntity>`).\n * @template TId The type of the entity identifier (defaults to `number`).\n * @template TGetByIdResponse The response type for getById (defaults to `TEntity`).\n * @template TCreateResponse The response type for create (defaults to `TEntity`).\n * @template TUpdateResponse The response type for update and patch (defaults to `TEntity`).\n * @template TDeleteResponse The response type for delete (defaults to `void`).\n */\nexport abstract class CrudService<\n TEntity,\n TListResponse = TEntity[],\n TCreatePayload = Partial<TEntity>,\n TUpdatePayload = Partial<TEntity>,\n TId extends string | number = number,\n TGetByIdResponse = TEntity,\n TCreateResponse = TEntity,\n TUpdateResponse = TEntity,\n TDeleteResponse = void\n> {\n protected readonly http = inject(HttpClient);\n protected readonly baseUrl = inject(API_BASE_URL);\n protected readonly endpoint: string;\n\n protected constructor(config: CrudConfig) {\n this.endpoint = `${this.baseUrl}${config.endpoint}`;\n }\n\n /**\n * Retrieves all entities from the configured endpoint.\n *\n * Sends a GET request to the base endpoint. Query values are\n * converted to `HttpParams` before the request is sent.\n *\n * @param query Optional query parameters appended to the request URL.\n * @returns An observable emitting a `Result` with the list response or a structured failure.\n */\n getAll(query?: QueryParams): Observable<Result<TListResponse>> {\n return this.http\n .get<TListResponse>(this.endpoint, {\n params: this.toHttpParams(query)\n })\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Retrieves a single entity by its identifier.\n *\n * Sends a GET request to `{endpoint}/{id}`.\n *\n * @param id The unique identifier of the entity to retrieve.\n * @returns An observable emitting a `Result` with the entity or a structured failure.\n */\n getById(id: TId): Observable<Result<TGetByIdResponse>> {\n return this.http\n .get<TGetByIdResponse>(this.itemUrl(id))\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Creates a new entity at the configured endpoint.\n *\n * Sends a POST request with the provided payload as the request body.\n *\n * @param payload The data used to create the entity.\n * @returns An observable emitting a `Result` with the created entity or a structured failure.\n */\n create(payload: TCreatePayload): Observable<Result<TCreateResponse>> {\n return this.http\n .post<TCreateResponse>(this.endpoint, payload)\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Fully replaces an existing entity.\n *\n * Sends a PUT request to `{endpoint}/{id}` with the provided payload,\n * replacing the entire entity.\n *\n * @param id The unique identifier of the entity to update.\n * @param payload The complete data to replace the existing entity with.\n * @returns An observable emitting a `Result` with the updated entity or a structured failure.\n */\n update(id: TId, payload: TUpdatePayload): Observable<Result<TUpdateResponse>> {\n return this.http\n .put<TUpdateResponse>(this.itemUrl(id), payload)\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Partially updates an existing entity.\n *\n * Sends a PATCH request to `{endpoint}/{id}` with the provided payload,\n * merging changes into the existing entity.\n *\n * @param id The unique identifier of the entity to patch.\n * @param payload A partial set of fields to update on the existing entity.\n * @returns An observable emitting a `Result` with the updated entity or a structured failure.\n */\n patch(id: TId, payload: Partial<TUpdatePayload>): Observable<Result<TUpdateResponse>> {\n return this.http\n .patch<TUpdateResponse>(this.itemUrl(id), payload)\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Deletes an entity by its identifier.\n *\n * Sends a DELETE request to `{endpoint}/{id}`.\n *\n * @param id The unique identifier of the entity to delete.\n * @returns An observable emitting a `Result` with the delete response or a structured failure.\n */\n delete(id: TId): Observable<Result<TDeleteResponse>> {\n return this.http\n .delete<TDeleteResponse>(this.itemUrl(id))\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Retrieves all entities with the full `HttpResponse` wrapper.\n *\n * Behaves like {@link getAll} but observes the complete HTTP response,\n * giving access to headers, status code, and URL alongside the body.\n *\n * @param query Optional query parameters appended to the request URL.\n * @returns An observable emitting a `Result` with the full HTTP response or a structured failure.\n */\n getAllResponse(query?: QueryParams): Observable<Result<HttpResponse<TListResponse>>> {\n return this.http\n .get<TListResponse>(this.endpoint, {\n params: this.toHttpParams(query),\n observe: 'response',\n })\n .pipe(\n map((response) =>\n this.success(response, {\n statusCode: response.status,\n headers: response.headers,\n url: response.url ?? undefined,\n })\n ),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Builds the URL for a single entity by appending the identifier to the endpoint.\n *\n * @param id The unique identifier to append.\n * @returns The full URL targeting the specific entity.\n */\n protected itemUrl(id: TId): string {\n return `${this.endpoint}/${id}`;\n }\n\n /**\n * Wraps a value in a `SuccessResult`.\n *\n * @template T The type of the response data.\n * @param data The response data to wrap.\n * @param meta Optional metadata (status code, headers, URL) to attach.\n * @returns A `SuccessResult` containing the provided data.\n */\n protected success<T>(data: T, meta?: ResultMeta): SuccessResult<T> {\n return {ok: true, data, meta};\n }\n\n /**\n * Wraps an error in a `FailureResult`.\n *\n * When no explicit metadata is provided, metadata is derived from\n * the `ApiError` itself (status code, headers, URL).\n *\n * @param error The structured API error.\n * @param meta Optional metadata to override the error-derived values.\n * @returns A `FailureResult` containing the error and metadata.\n */\n protected failure(error: ApiError, meta?: ResultMeta): FailureResult {\n return {\n ok: false,\n error,\n meta: meta ?? {\n statusCode: error.status ?? undefined,\n headers: error.headers,\n url: error.url ?? undefined,\n },\n };\n }\n\n /**\n * Maps an unknown error into a structured `ApiError`.\n *\n * Handles both `HttpErrorResponse` instances and unexpected error types.\n * Extracts backend messages, validation errors, and retry information\n * so callers receive a consistent error shape.\n *\n * @param error The raw error caught from the HTTP pipeline.\n * @returns A fully populated `ApiError` object.\n */\n protected mapHttpError(error: unknown): ApiError {\n const timestamp = new Date().toISOString();\n\n if (!(error instanceof HttpErrorResponse)) {\n return {\n status: null,\n message: 'Unknown error',\n original: error instanceof Error ? error : new Error(String(error)),\n retryable: false,\n timestamp,\n };\n }\n\n const status = this.normalizeStatus(error.status);\n const details = error.error;\n const backendMessage = this.extractBackendMessage(details);\n const validationErrors = this.extractValidationErrors(details);\n\n return {\n status,\n message: backendMessage ?? this.defaultMessage(status),\n details,\n backendMessage,\n validationErrors,\n url: error.url,\n headers: error.headers,\n original: error,\n retryable: this.isRetryable(status),\n timestamp,\n };\n }\n\n /**\n * Extracts a human-readable message from the error response body.\n *\n * Checks common keys (`message`, `title`, `detail`, `error`) on the\n * body object and returns the first non-empty string found.\n *\n * @param body The parsed error response body.\n * @returns The extracted message, or `undefined` if none was found.\n */\n protected extractBackendMessage(body: unknown): string | undefined {\n if (typeof body === 'string' && body.trim()) {\n return body;\n }\n\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const obj = body as Record<string, unknown>;\n\n for (const key of ['message', 'title', 'detail', 'error']) {\n const value = obj[key];\n if (typeof value === 'string' && value.trim()) {\n return value;\n }\n }\n return undefined;\n }\n\n /**\n * Extracts field-level validation errors from the error response body.\n *\n * Expects an `errors` property on the body containing a record of\n * field names to error messages (string or string array).\n *\n * @param body The parsed error response body.\n * @returns A record mapping field names to their error messages, or `undefined` if none were found.\n */\n protected extractValidationErrors(body: unknown): Record<string, string[]> | undefined {\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const obj = body as Record<string, unknown>;\n const errors = obj['errors'];\n\n if (!errors || typeof errors !== 'object') {\n return undefined;\n }\n\n const result: Record<string, string[]> = {};\n\n for (const [key, value] of Object.entries(errors as Record<string, unknown>)) {\n if (Array.isArray(value)) {\n result[key] = value.map(String);\n } else if (typeof value === 'string') {\n result[key] = [value];\n }\n }\n return Object.keys(result).length ? result : undefined;\n }\n\n /**\n * Returns a default user-facing message for the given HTTP status code.\n *\n * Provides human-readable messages for common HTTP status codes.\n * Override this method to customise messages.\n *\n * @param status The HTTP status code, or `null` when unknown.\n * @returns A descriptive error message.\n */\n protected defaultMessage(status: HttpStatusCode | null): string {\n switch (status) {\n case HttpStatusCode.BadRequest:\n return 'Bad request';\n case HttpStatusCode.Unauthorized:\n return 'Unauthorized';\n case HttpStatusCode.Forbidden:\n return 'Forbidden';\n case HttpStatusCode.NotFound:\n return 'Not found';\n case HttpStatusCode.Conflict:\n return 'Conflict';\n case HttpStatusCode.UnprocessableEntity:\n return 'Unprocessable entity';\n case HttpStatusCode.InternalServerError:\n return 'Internal server error';\n case null:\n return 'Unknown error';\n default:\n return `Request failed with status ${status}`;\n }\n }\n\n /**\n * Determines whether a request with the given status can be retried.\n *\n * Timeouts, rate-limiting responses, and server errors\n * (5xx) are considered retryable by default.\n *\n * @param status The HTTP status code, or `null` when unknown.\n * @returns `true` if the request is safe to retry.\n */\n protected isRetryable(status: HttpStatusCode | null): boolean {\n if (status === HttpStatusCode.RequestTimeout) return true;\n if (status === HttpStatusCode.TooManyRequests) return true;\n if (typeof status === 'number' && status >= 500) return true;\n return false;\n }\n\n /**\n * Normalises a raw HTTP status into an `HttpStatusCode | null` value.\n *\n * Converts `undefined`, `NaN`, and `0` (network error) to `null`\n * so downstream code only needs to handle `HttpStatusCode | null`.\n *\n * @param status The raw status value from the HTTP response.\n * @returns The normalised status code, or `null` when indeterminate.\n */\n protected normalizeStatus(status: number | null | undefined): HttpStatusCode | null {\n if (status === null || status === undefined || status === 0 || Number.isNaN(status)) return null;\n return status as HttpStatusCode;\n }\n\n /**\n * Converts query parameters into Angular `HttpParams`.\n *\n * `null` and `undefined` values are silently skipped.\n * Array values are appended as multiple entries for the same key.\n *\n * @param query The query parameter record to convert.\n * @returns An `HttpParams` instance, or `undefined` when no parameters are provided.\n */\n protected toHttpParams(query?: QueryParams): HttpParams | undefined {\n if (!query) return undefined;\n\n let params = new HttpParams();\n\n for (const [key, rawValue] of Object.entries(query)) {\n if (rawValue === null || rawValue === undefined) continue;\n\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n\n for (const value of values) {\n if (value === null || value === undefined) continue;\n params = params.append(key, String(value));\n }\n }\n return params;\n }\n}\n","import {inject} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\nimport {API_BASE_URL} from '../crud';\n\n/** A single query parameter value. */\ntype MnQueryValue = string | number | boolean | null | undefined;\n\n/** A record of query parameter key-value pairs. Arrays are appended as multiple entries. */\nexport type MnQueryParams = Record<string, MnQueryValue | MnQueryValue[]>;\n\n/**\n * Lightweight abstract HTTP base class that removes common boilerplate\n * from API services.\n *\n * Provides typed `get`, `post`, `patch`, `put`, and `delete` methods\n * that return Promises, automatic query-param building, and base-URL\n * injection via the `API_BASE_URL` token.\n *\n * Subclass this directly for services with static or mixed endpoints.\n * No CRUD structure is imposed — every method accepts a free-form path.\n */\nexport abstract class MnHttpService {\n /** Angular HTTP client injected automatically. */\n protected readonly http = inject(HttpClient);\n\n /** Base API URL provided via the `API_BASE_URL` injection token. */\n protected readonly baseUrl = inject(API_BASE_URL);\n\n /**\n * Sends a typed GET request.\n * @param path The path appended to the base URL.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected get<T>(path: string, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.get<T>(`${this.baseUrl}${path}`, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed POST request.\n * @param path The path appended to the base URL.\n * @param body Optional request body.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected post<T>(path: string, body?: unknown, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.post<T>(`${this.baseUrl}${path}`, body ?? {}, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed PATCH request.\n * @param path The path appended to the base URL.\n * @param body Optional request body.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected patch<T>(path: string, body?: unknown, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.patch<T>(`${this.baseUrl}${path}`, body ?? {}, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed PUT request.\n * @param path The path appended to the base URL.\n * @param body Optional request body.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected put<T>(path: string, body?: unknown, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.put<T>(`${this.baseUrl}${path}`, body ?? {}, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed DELETE request.\n * @param path The path appended to the base URL.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected delete<T = void>(path: string, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.delete<T>(`${this.baseUrl}${path}`, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Converts a query-params record to Angular `HttpParams`.\n * Null and undefined values are silently skipped.\n * Array values are appended as multiple entries for the same key.\n * @param query The query parameter record to convert.\n * @returns An `HttpParams` instance, or `undefined` when no parameters are provided.\n */\n protected toHttpParams(query?: MnQueryParams): HttpParams | undefined {\n if (!query) return undefined;\n\n let params = new HttpParams();\n\n for (const [key, rawValue] of Object.entries(query)) {\n if (rawValue === null || rawValue === undefined) continue;\n\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n\n for (const value of values) {\n if (value === null || value === undefined) continue;\n params = params.append(key, String(value));\n }\n }\n\n return params;\n }\n}\n","import { MnConfigService } from '../config/mn-config.service';\nimport { MnLanguageService } from '../language/mn-language.service';\n\nexport type MnPreviewMessage = {\n type: 'mn-config-update' | 'mn-translations-update';\n config?: Record<string, unknown>;\n translations?: Record<string, Record<string, string>>;\n}\n\n/**\n * Enable live preview mode. Listens for postMessage events from\n * Mn Web Manager and hot-swaps config/translations at runtime.\n *\n * Call this once in your app's bootstrap (e.g., APP_INITIALIZER or root component).\n *\n * @param configService - The MnConfigService instance\n * @param langService - The MnLanguageService instance\n * @param allowedOrigins - Optional whitelist of allowed origins (security)\n */\nexport function enableMnPreviewMode(\n configService: MnConfigService,\n langService: MnLanguageService,\n allowedOrigins?: string[]\n): void {\n window.addEventListener('message', async (event: MessageEvent<MnPreviewMessage>) => {\n if (allowedOrigins?.length && !allowedOrigins.includes(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data?.type) return;\n\n switch (data.type) {\n case 'mn-config-update':\n if (data.config) {\n await configService.loadFromObject(data.config);\n }\n break;\n\n case 'mn-translations-update':\n if (data.translations) {\n for (const [locale, translations] of Object.entries(data.translations)) {\n langService.registerTranslations(locale, translations);\n }\n await langService.setLocale(langService.locale);\n }\n break;\n }\n });\n}\n","/*\n * Public API Surface of mn-lib\n */\nexport * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":";;;;;;;;;;;;;;AAAA;MAca,eAAe,GAAG,IAAI,cAAc,CAAgB,iBAAiB;AAE3E,MAAM,uBAAuB,GAA4B;IAC9D,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;AACnF,IAAA,UAAU,EAAE;AACV,QAAA,OAAO,EAAE,kBAAkB;AAC3B,QAAA,IAAI,EAAE,eAAe;AACrB,QAAA,OAAO,EAAE,kBAAkB;AAC3B,QAAA,KAAK,EAAE,gBAAgB;AACvB,QAAA,OAAO,EAAE;AACV,KAAA;AACD,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,gBAAgB,EAAE,IAAI;AACtB,IAAA,QAAQ,EAAE,CAAC,CAAC,KAAK;;;ACvBb,SAAU,eAAe,CAAC,MAAA,GAAwB,EAAE,EAAA;AACxD,IAAA,MAAM,MAAM,GAAkB;AAC5B,QAAA,GAAG,uBAAuB;AAC1B,QAAA,GAAG,MAAM;AACT,QAAA,SAAS,EAAE,EAAE,GAAG,uBAAuB,CAAC,SAAS,EAAE,IAAI,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE;AAChF,QAAA,UAAU,EAAE,EAAE,GAAG,uBAAuB,CAAC,UAAU,EAAE,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;AACnF,QAAA,KAAK,EAAE,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;KACnE;IACD,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE;AACvD;;ACRA,IAAI,OAAO,GAAG,CAAC;AACf,MAAM,GAAG,GAAG,MAAM,CAAA,GAAA,EAAM,EAAE,OAAO,CAAA,CAAE;MAGtB,YAAY,CAAA;AACN,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAY,EAAE,CAAC;AACrD,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;AAE/C,IAAA,IAAI,CAAC,OAA4B,EAAA;;QAE/B,MAAM,gBAAgB,GAAI,OAExB,CAAC,QAAQ,IAAK,uBAAuB,CAAC,SAAoC,CAAE,OAE5E,CAAC,IAAI,IAAI,EAAE,CAAC,IAAI,uBAAuB,CAAC,gBAAgB;AAC1D,QAAA,MAAM,CAAC,GAAY,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAa;AACnF,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAE/C,QAAA,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE;AACpD,YAAA,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;QAClD;QACA,OAAO,CAAC,CAAC,EAAE;IACb;AAEA,IAAA,OAAO,CAAC,EAAa,EAAA;AACnB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK;AAChC,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;YAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACnD;IACF;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACxB;uGA7BW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cADC,MAAM,EAAA,CAAA;;2FACnB,YAAY,EAAA,UAAA,EAAA,CAAA;kBADxB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACRlC;MAmBa,cAAc,CAAA;AACR,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AAE5B,IAAA,GAAG;AACH,IAAA,aAAa;AACb,IAAA,gBAAgB;AAEjC,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,GAAG,GAAG,MAAM,CAAuB,eAAe,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AAE3E,QAAA,IAAI,CAAC,aAAa,GAAG,GAAG,EAAE,SAAS;QACnC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,EAAE,SAAS;QACxC,IAAI,CAAC,GAAG,GAAG;AACT,YAAA,GAAG,uBAAuB;AAC1B,YAAA,IAAI,GAAG,IAAI,EAAE,CAAC;;YAEd,SAAS,EAAE,uBAAuB,CAAC,SAAS;AAC5C,YAAA,UAAU,EAAE,EAAE,GAAG,uBAAuB,CAAC,UAAU,EAAE,IAAI,GAAG,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE;AACjF,YAAA,KAAK,EAAE,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC;SACjE;IACH;AAEA,IAAA,IAAI,CAAC,KAAkB,EAAA;;AAErB,QAAA,IAAI,QAAQ,GAAG,KAAK,CAAC,QAAQ;AAC7B,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;;AAEpB,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB;AAC7C,YAAA,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE;gBACnC,QAAQ,GAAG,WAAW;YACxB;iBAAO;gBACL,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,IAAsD,CAAW;YACtH;QACF;AAEA,QAAA,MAAM,CAAC,GAAwB;YAC7B,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,QAAQ;YACR,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC;SAChB;AACD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAY,CAAC,CAAC;IACzD;AAEA,IAAA,OAAO,CAAC,KAAa,EAAE,QAAiB,EAAE,KAA4B,EAAA;AACpE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;IACrD;AACA,IAAA,IAAI,CAAC,KAAa,EAAE,QAAiB,EAAE,KAA4B,EAAA;AACjE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;IAClD;AACA,IAAA,OAAO,CAAC,KAAa,EAAE,QAAiB,EAAE,KAA4B,EAAA;AACpE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;IACrD;AACA,IAAA,KAAK,CAAC,KAAa,EAAE,QAAiB,EAAE,KAA4B,EAAA;AAClE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;IACnD;AAEA,IAAA,OAAO,CAAC,EAAa,EAAA,EAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,KAAK,GAAA,EAAK,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAEtB,IAAA,IAAI,CAAC,IAAiB,EAAE,KAAa,EAAE,QAAiB,EAAE,KAA4B,EAAA;AAC5F,QAAA,IAAI,QAAQ,GAA8B,KAAK,EAAE,QAAQ;AAEzD,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;AACpB,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACzB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;AAC1C,gBAAA,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;oBAC/B,QAAQ,GAAG,OAAO;gBACpB;qBAAO;;oBAEL,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,KAAK,QAAQ,EAAE;AACjD,wBAAA,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB;oBACtC;yBAAO;wBACL,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAuC,CAAC;oBACxE;gBACF;YACF;iBAAO;;gBAEL,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAuC,CAAC;YACxE;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;AAC7D,QAAA,MAAM,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAY;AAC7D,QAAA,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO;AAE9B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAC,CAAC;IAC7H;uGA3FW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cADD,MAAM,EAAA,CAAA;;2FACnB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;AChB3B,MAAM,eAAe,GAAG,EAAE,CAAC;AAChC,IAAA,IAAI,EAAE,4FAA4F;AAClG,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,OAAO,EAAE,8CAA8C;AACvD,YAAA,IAAI,EAAE,qCAAqC;AAC3C,YAAA,OAAO,EAAE,8CAA8C;AACvD,YAAA,KAAK,EAAE,wCAAwC;AAC/C,YAAA,OAAO,EAAE,+CAA+C;AACxD,YAAA,MAAM,EAAE,2CAA2C;AACpD,SAAA;AACD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,OAAO,EAAE,sBAAsB;AAC/B,YAAA,IAAI,EAAE,yBAAyB;AAChC;AACF,KAAA;AACD,IAAA,gBAAgB,EAAE;AAChB,QAAA;AACE,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,KAAK,EAAE;AACR,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;AACZ,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,KAAK,EAAE;AACR,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,KAAK,EAAE;AACR,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,KAAK,EAAE;AACR,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,OAAO,EAAE,MAAM;AACf,YAAA,KAAK,EAAE;AACR,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,OAAO,EAAE;AACV;AACF,CAAA;;AChDM,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACjC,IAAA,IAAI,EAAE,sGAAsG;AAC5G,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,mBAAmB;AACvB,YAAA,EAAE,EAAE,uBAAuB;AAC3B,YAAA,EAAE,EAAE,mBAAmB;AACxB,SAAA;AAED,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,EAAE;AACR,YAAA,OAAO,EAAE,uBAAuB;AAChC,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,aAAa,EAAE,6CAA6C;AAC7D,SAAA;;AAGD,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;AACT,SAAA;AAED,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,gCAAgC;AACvC,SAAA;;;AAGD,QAAA,OAAO,EAAE;AACP,YAAA,IAAI,EAAE,4CAA4C;AACnD,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,IAAI,EAAE,mBAAmB;AACzB,YAAA,KAAK,EAAE,mBAAmB;AAC3B,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,EAAE;AACT,SAAA;AACF,KAAA;AAED,IAAA,gBAAgB,EAAE;;QAEhB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,uDAAuD,EAAE;QACvG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,uDAAuD,EAAE;QACvG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,iDAAiD,EAAE;QACjG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,uDAAuD,EAAE;QACvG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,uDAAuD,EAAE;QACvG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,oDAAoD,EAAE;QACpG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,uEAAuE,EAAE;;AAEvH,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE;;QAEvF,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,6BAA6B,EAAE;QAChF,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,6BAA6B,EAAE;QAChF,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,yBAAyB,EAAE;QAC5E,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,6BAA6B,EAAE;QAChF,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,6BAA6B,EAAE;QAChF,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,2BAA2B,EAAE;QAC9E,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,6CAA6C,EAAE;;AAEhG,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AACrF,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AACrF,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE;AACnF,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AACrF,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AACrF,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE;AACpF,QAAA,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE;;QAE1F,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,cAAc,EAAE;QAC9D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE;QAC9D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,YAAY,EAAE;QAC5D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,cAAc,EAAE;QAC9D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,cAAc,EAAE;QAC9D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,aAAa,EAAE;QAC7D,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,sBAAsB,EAAE;;AAEtE,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE;AAChF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAClF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE;AACjF,QAAA,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE;;QAEvF,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,2CAA2C,EAAE;QACpG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,2CAA2C,EAAE;QACpG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,yCAAyC,EAAE;QAClG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,2CAA2C,EAAE;QACpG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,2CAA2C,EAAE;QACpG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,0CAA0C,EAAE;QACnG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,mDAAmD,EAAE;;AAE5G,QAAA,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAC3F,QAAA,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAC3F,QAAA,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE;AACzF,QAAA,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAC3F,QAAA,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,EAAE;AAC3F,QAAA,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE;AAC1F,QAAA,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,0BAA0B,EAAE;AACjG,KAAA;AAED,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,MAAM;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,YAAY,EAAE,IAAI;AAClB,QAAA,QAAQ,EAAE,KAAK;AACf,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA;AACF,CAAA;;MC7HY,QAAQ,CAAA;IACV,IAAI,GAA2B,EAAE;;;AAI1C,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,gBAAgB,CAAC;AACtB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;AACpB,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;AAC1B,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACtB,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;AACpC,YAAA,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;AAC5B,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;AAC1B,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACvB,SAAA,CAAC;IACJ;;AAGA,IAAA,IACI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI;IAC1C;;AAEA,IAAA,IACI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,MAAM,GAAG,IAAI;IAC3C;;AAGA,IAAA,IACI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,IAAI;IACnC;;AAGA,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI;IACrC;;AAGA,IAAA,IAAY,SAAS,GAAA;AACnB,QAAA,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IACpD;uGA7CW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,gUCTrB,8NAOA,EAAA,CAAA;;2FDEa,QAAQ,EAAA,UAAA,EAAA,CAAA;kBALpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,+BAA+B,cAC7B,IAAI,EAAA,QAAA,EAAA,8NAAA,EAAA;;sBAIf;;sBAIA,WAAW;uBAAC,OAAO;;sBAenB,WAAW;uBAAC,gBAAgB;;sBAK5B,WAAW;uBAAC,oBAAoB;;sBAMhC,WAAW;uBAAC,eAAe;;sBAM3B,WAAW;uBAAC,eAAe;;;MEvBjB,sBAAsB,CAAA;AACxB,IAAA,QAAQ;AAET,IAAA,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC;AACpC,IAAA,OAAO,GAA0B,IAAI,CAAC,KAAK,CAAC,OAAO;AAEnD,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,YAAY,CAAC,EAAU,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IACxB;IAEA,SAAS,GAAG,CAAC,CAAS,EAAE,CAAU,KAAK,CAAC,CAAC,EAAE;AAE3C,IAAA,eAAe,CAAC,CAAU,EAAA;AACxB,QAAA,OAAO,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9D;AAEA,IAAA,UAAU,CAAC,CAAU,EAAA;QACnB,OAAO;AACL,YAAA,SAAS,EAAE,CAAC;AACZ,YAAA,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE;SAC7B;IACZ;uGAxBW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvBnC,inCA8BA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDZY,YAAY,sMAAE,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKrB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBARlC,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAA,eAAA,EAGhB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,inCAAA,EAAA;;sBAG9C;;;AEtBI,MAAM,eAAe,GAAG,EAAE,CAAC;AAChC,IAAA,IAAI,EAAE,0DAA0D;AAChE,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,uBAAuB;AAC3B,YAAA,EAAE,EAAE,qBAAqB;AACzB,YAAA,EAAE,EAAE,uBAAuB;AAC3B,YAAA,EAAE,EAAE,qBAAqB;AAC1B,SAAA;AAED,QAAA,OAAO,EAAE;AACP,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,IAAI,EAAE,EAAE;AACT,SAAA;AAED,QAAA,IAAI,EAAE;AACJ,YAAA,IAAI,EAAE,mBAAmB;AACzB,YAAA,KAAK,EAAE,mBAAmB;AAC3B,SAAA;AAED,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,SAAS,EAAE,EAAE;AACb,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,SAAS,EAAE,EAAE;AACd,SAAA;AACF,KAAA;AAED,IAAA,gBAAgB,EAAE;;QAEhB,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,2CAA2C,EAAE;QAC9F,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,2CAA2C,EAAE;QAC9F,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,qCAAqC,EAAE;QACxF,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,2CAA2C,EAAE;QAC9F,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,2CAA2C,EAAE;QAC9F,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,wCAAwC,EAAE;QAC3F,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,gEAAgE,EAAE;;QAEnH,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,gDAAgD,EAAE;QAChG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,gDAAgD,EAAE;QAChG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,0CAA0C,EAAE;QAC1F,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,gDAAgD,EAAE;QAChG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAI,KAAK,EAAE,gDAAgD,EAAE;QAChG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAK,KAAK,EAAE,6CAA6C,EAAE;QAC7F,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,yDAAyD,EAAE;AAC1G,KAAA;AAED,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,IAAI,EAAE,KAAK;AACZ,KAAA;AACF,CAAA;;MCjDY,OAAO,CAAA;IACT,IAAI,GAA0B,EAAE;AAEzC,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,eAAe,CAAC;AACrB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;AACpB,YAAA,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;AAC1B,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACtB,YAAA,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;AACrB,SAAA,CAAC;IACJ;uGAXW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,0JCTpB,6BACA,EAAA,CAAA;;2FDQa,OAAO,EAAA,UAAA,EAAA,CAAA;kBALnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,cACb,IAAI,EAAA,QAAA,EAAA,6BAAA,EAAA;;sBAIf;;sBAEA,WAAW;uBAAC,OAAO;;;AEZtB;;;;;;;;;;;;;;;;AAgBG;AA0GH;;;;;;;;;;;AAWG;AACH,MAAM,WAAW,GAAG,CAAC,GAAW,MAAqB,GAAG,KAAK,EAAE,GAAG,IAAI,GAAG,GAAG,CAAC;AAE7E;;;;;;;;;;AAUG;AACI,MAAM,kBAAkB,GAAkC;IAC/D,KAAK,EAAE,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC;IAChC,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACjD,IAAA,KAAK,EAAE,OAAO,EAAE,CAAC;AACjB,IAAA,QAAQ,EAAE,MAAM,IAAI;AACpB,IAAA,SAAS,EAAE,CAAC,KAAa,EAAE,IAAY,KAAY;AACjD,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,KAAK;QAEjC,IAAI,MAAM,GAAG,EAAE;QACf,IAAI,SAAS,GAAG,CAAC;QACjB,IAAI,SAAS,GAAG,CAAC;;;;AAKjB,QAAA,OAAO,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE;AAC1D,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;AAChC,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;AAEjC,YAAA,IAAI,QAAQ,KAAK,GAAG,EAAE;AACpB,gBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;oBACvB,MAAM,IAAI,QAAQ;AAClB,oBAAA,SAAS,EAAE;AACX,oBAAA,SAAS,EAAE;gBACb;qBAAO;oBACL,SAAS,EAAE,CAAC;gBACd;YACF;AAAO,iBAAA,IAAI,QAAQ,KAAK,GAAG,EAAE;AAC3B,gBAAA,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;oBAC7B,MAAM,IAAI,QAAQ;AAClB,oBAAA,SAAS,EAAE;AACX,oBAAA,SAAS,EAAE;gBACb;qBAAO;oBACL,SAAS,EAAE,CAAC;gBACd;YACF;AAAO,iBAAA,IAAI,QAAQ,KAAK,GAAG,EAAE;gBAC3B,MAAM,IAAI,QAAQ;AAClB,gBAAA,SAAS,EAAE;AACX,gBAAA,SAAS,EAAE;YACb;iBAAO;gBACL,MAAM,IAAI,QAAQ;AAClB,gBAAA,IAAI,QAAQ,KAAK,QAAQ,EAAE;AACzB,oBAAA,SAAS,EAAE;gBACb;AACA,gBAAA,SAAS,EAAE;YACb;QACF;;AAGA,QAAA,OAAO,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE;AAChE,YAAA,MAAM,IAAI,IAAI,CAAC,SAAS,CAAC;AACzB,YAAA,SAAS,EAAE;QACb;AAEA,QAAA,OAAO,MAAM;IACf;;AAGF;;;;;;;;;;;;AAYG;AACI,MAAM,eAAe,GAAkC;IAC5D,KAAK,EAAE,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,CAAC;IAChC,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACjD,IAAA,KAAK,EAAE,CAAC,KAAK,MAAM;AACjB,QAAA,GAAG,EAAG,KAA8B,CAAC,SAAS,IAAI,IAAI;AACtD,QAAA,GAAG,EAAG,KAA8B,CAAC,OAAO,IAAI,IAAI;KACrD,CAAC;IACF,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,KAAI;QACxC,MAAM,KAAK,GAAG,UAAU;AACxB,QAAA,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;AAExB,QAAA,MAAM,GAAG,GAAI,KAA8B,CAAC,SAA+B;AAC3E,QAAA,MAAM,GAAG,GAAI,KAA8B,CAAC,OAA6B;;AAGzE,QAAA,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE;YACtB,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC1C;;AAGA,QAAA,IAAI,GAAG,IAAI,KAAK,GAAG,GAAG,EAAE;YACtB,OAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;QAC1C;AAEA,QAAA,OAAO,IAAI;IACb,CAAC;;AAGH;;;;;;;;;;;;;AAaG;AACI,MAAM,aAAa,GAAkC;AAC1D,IAAA,KAAK,EAAE,CAAC,GAAG,KAAI;QACb,IAAI,GAAG,KAAK,EAAE;AAAE,YAAA,OAAO,IAAI;AAC3B,QAAA,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;AACvB,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,IAAI;IAC1C,CAAC;IACD,MAAM,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AACjD,IAAA,KAAK,EAAE,OAAO;AACZ,QAAA,SAAS,EAAE,SAAS;KACrB,CAAC;AACF,IAAA,QAAQ,EAAE,MAAM,IAAI;;AAGtB;;;;;;;;;;;;;AAaG;AACG,SAAU,WAAW,CAAC,IAAiB,EAAA;;AAE3C,IAAA,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,gBAAgB,EAAE;AACnE,QAAA,OAAO,eAAe;IACxB;;AAGA,IAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,QAAA,OAAO,aAAa;IACtB;;AAGA,IAAA,OAAO,kBAAkB;AAC3B;;AC1SO,MAAM,oBAAoB,GAAG,EAAE,CAAC;AACrC,IAAA,IAAI,EAAE,yIAAyI;AAC/I,IAAA,QAAQ,EAAE;AAER,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,WAAW;AAClB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACV,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,mFAAmF;AAC1F,SAAA;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,+BAA+B;AACtC,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,YAAY,EAAE,IAAI;AAClB,QAAA,KAAK,EAAE,IAAI;AACZ;AACF,CAAA;;MCjCY,cAAc,CAAA;AACE,IAAA,YAAY;AACZ,IAAA,EAAE;uGAFlB,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,gICP3B,kGAGA,EAAA,CAAA;;2FDIa,cAAc,EAAA,UAAA,EAAA,CAAA;kBAL1B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,kBAAkB,WACnB,EAAE,EAAA,QAAA,EAAA,kGAAA,EAAA;;sBAIV,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBACxB,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;AET3B;;AAEG;;AC8CH;;AAEG;AACG,SAAU,cAAc,CAAC,KAAc,EAAA;AAC3C,IAAA,QACE,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,KAAK,KAAK,IAAI;AACd,QAAA,OAAQ,KAAiC,CAAC,YAAY,CAAC,KAAK,QAAQ;AAExE;;MCnDa,iBAAiB,CAAA;AACX,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;IAExC,aAAa,GAAmB,EAAE;AAClC,IAAA,QAAQ,GAAG,IAAI,eAAe,CAAS,IAAI,CAAC;IAC5C,WAAW,GAAkB,IAAI;IACjC,MAAM,GAAG,KAAK;;AAGb,IAAA,OAAO,GAAuB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;;AAGnE,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK;IAC5B;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,OAAgB,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO;QACrB,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,+BAAA,CAAiC,CAAC;QAChD;IACF;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,UAAkB,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,OAAO,CAAC,GAAG,CAAC,uCAAuC,UAAU,CAAA,CAAE,CAAC;QAClE;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,UAAU;IAC/B;AAEA;;;AAGG;IACH,MAAM,UAAU,CAAC,MAAc,EAAA;AAC7B,QAAA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;YAAE;AAEhC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,YAAA,OAAO,CAAC,IAAI,CAAC,CAAA,oFAAA,CAAsF,CAAC;YACpG;QACF;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC;AACxD,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,CAAC,GAAG,CAAC,CAAA,6BAAA,EAAgC,MAAM,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAC;QACpE;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,cAAc,CAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAmB,GAAG,CAAC,CACrC;YACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE;AACtC,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,OAAO,CAAC,GAAG,CAAC,CAAA,4BAAA,EAA+B,MAAM,CAAA,CAAA,CAAG,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACnF;QACF;QAAE,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,CAAA,8CAAA,EAAiD,GAAG,CAAA,CAAE,EAAE,GAAG,CAAC;AACzE,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE;QACjC;IACF;AAEA;;AAEG;IACH,MAAM,SAAS,CAAC,MAAc,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAA,CAAA,CAAG,CAAC;QAC3D;AACA,QAAA,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IACpB;AAEA;;AAEG;IACH,oBAAoB,CAAC,MAAc,EAAE,YAA8B,EAAA;AACjE,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG;YAC3B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACrC,YAAA,GAAG,YAAY;SAChB;IACH;AAEA;;;;;AAKG;IACH,SAAS,CAAC,GAAW,EAAE,MAAwC,EAAA;AAC7D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QACjD,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC;AAE1C,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,CAAA,2CAAA,EAA8C,GAAG,CAAA,cAAA,EAAiB,IAAI,CAAC,MAAM,CAAA,CAAA,CAAG,CAAC;YAChG;AACA,YAAA,OAAO,GAAG;QACZ;QAEA,IAAI,MAAM,EAAE;AACV,YAAA,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBAC3D,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,MAAA,EAAS,QAAQ,QAAQ,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACvF;QACF;AAEA,QAAA,OAAO,KAAK;IACd;AAEA;;AAEG;IACK,eAAe,CAAC,GAAqB,EAAE,GAAW,EAAA;AACxD,QAAA,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;AAAE,YAAA,OAAO,GAAG,CAAC,GAAG,CAAC;QAE3C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5B,IAAI,OAAO,GAA0C,GAAG;AAExD,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,gBAAA,OAAO,SAAS;AACrE,YAAA,OAAO,GAAI,OAA4B,CAAC,IAAI,CAAC;QAC/C;AAEA,QAAA,OAAO,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,SAAS;IAC1D;AAEA;;AAEG;IACH,CAAC,CAAC,GAAW,EAAE,MAAwC,EAAA;QACrD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IACpC;AAEA;;;;AAIG;IACH,sBAAsB,CAAC,eAAmD,EAAE,QAAgB,EAAA;AAC1F,QAAA,IAAI,CAAC,eAAe,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,QAAQ;AACtE,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ;AACzC,QAAA,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAI,QAAQ;IAC9C;uGAtJW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cADJ,MAAM,EAAA,CAAA;;2FACnB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAD7B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACDlC;;;;;;;;;;AAUG;AACG,SAAU,iBAAiB,CAAC,MAAwB,EAAA;IACxD,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,CAAC,GAAsB,KAAK,YAAW;AACjD,gBAAA,IAAI,MAAM,CAAC,KAAK,EAAE;AAChB,oBAAA,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACpB;AACA,gBAAA,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC;AAEhC,gBAAA,MAAM,eAAe,GAAG,GAAG,CAAC,sBAAsB,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC;gBAChG,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,eAAe,CAAC;gBACzD,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5D,gBAAA,MAAM,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC;YACtC,CAAC;YACD,IAAI,EAAE,CAAC,iBAAiB,CAAC;AAC1B,SAAA;KACF;AACH;;AC/BA;;;;;;;;AAQG;MAMU,eAAe,CAAA;AACT,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAGjD,SAAS,CAAC,GAAW,EAAE,MAAwC,EAAA;QAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IACzC;uGANW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAf,eAAe,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,aAAA,EAAA,IAAA,EAAA,KAAA,EAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAL3B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,aAAa;AACnB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,KAAK;AACZ,iBAAA;;;ACTD,SAAS,aAAa,CAAC,KAAc,EAAA;AACnC,IAAA,QACE,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,KAAK,KAAK,IAAI;AACd,QAAA,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB;AAE/D;MAGa,eAAe,CAAA;AACT,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;IAElC,OAAO,GAAwB,IAAI;IACnC,SAAS,GAAqB,EAAE;IAChC,UAAU,GAAG,KAAK;;AAGlB,IAAA,cAAc,GAAG,MAAM,CAAC,CAAC,0DAAC;AACzB,IAAA,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;AAExC,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAGjD,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA;;;AAGG;AACH,IAAA,MAAM,IAAI,CAAC,GAAW,EAAE,SAAS,GAAG,KAAK,EAAA;AACvC,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,IAAY;AAEhB,QAAA,IAAI;AACF,YAAA,IAAI,GAAG,MAAM,cAAc,CACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,CAC7C;QACH;QAAE,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,CAAA,sCAAA,EAAyC,GAAG,CAAA,CAAE,EAAE,GAAG,CAAC;AACjE,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;YAC9C;QACF;AAEA,QAAA,IAAI,IAAa;AAEjB,QAAA,IAAI;AACF,YAAA,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1B;QAAE,OAAO,GAAG,EAAE;YACZ,OAAO,CAAC,IAAI,CAAC,CAAA,sCAAA,EAAyC,GAAG,CAAA,CAAE,EAAE,GAAG,EAAE,IAAI,CAAC;YACvE,IAAI,GAAG,EAAE;QACX;AAEA,QAAA,MAAM,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,EAAE,CAA4B;QACxE,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE;QACtE,MAAM,SAAS,GAA4B,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE;QAElG,MAAM,QAAQ,GAAqB,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAqB,GAAG,EAAE;QAE5G,IAAI,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE;AAChD,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;;;;AAKzB,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,QAAQ,EAAE;YACvE,MAAM,EAAE,GAAG,OAA2B;AACtC,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,gBAAA,OAAO,CAAC,GAAG,CAAC,+CAA+C,EAAE,EAAE,CAAC;YAClE;YACA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC;AAClC,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,aAAa,CAAC;YAC9F,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;YACnF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;QAC5C;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC;AAEA;;;;AAIG;AACH,IAAA,MAAM,cAAc,CAAC,MAA+B,EAAE,iBAAiB,GAAG,KAAK,EAAA;QAC7E,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;QAC5E,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE;QAC/E,MAAM,QAAQ,GAAqB,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAqB,GAAG,EAAE;QAElH,IAAI,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE;AAChD,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;QAEzB,IAAI,iBAAiB,EAAE;AACrB,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;AAClC,YAAA,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,YAAY,CAAC,KAAK,QAAQ,EAAE;gBACvE,MAAM,EAAE,GAAG,OAA2B;AACtC,gBAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,oBAAA,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,EAAE,CAAC;gBACpE;gBACA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC;AAClC,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,eAAe,EAAE,EAAE,CAAC,aAAa,CAAC;gBAC9F,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC;gBACnF,MAAM,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClE,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;YAC5C;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC;AAGA;;;AAGG;AACH,IAAA,OAAO,CACL,aAAqB,EACrB,WAAA,GAAwB,EAAE,EAC1B,UAAmB,EAAA;QAEnB,MAAM,UAAU,GAA4B,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ;AAC9E,eAAG,aAAa,CAAE,IAAI,CAAC,OAAwB,CAAC,QAAQ,CAAC,aAAa,CAAC;kBACjE,EAAE,GAAI,IAAI,CAAC,OAAwB,CAAC,QAAQ,CAAC,aAAa,CAA4B;kBACtF,EAAE;cACN,EAAE;AAEN,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,EAAE,WAAW,CAAC;QAE3E,IAAI,QAAQ,GAA4B,UAAU;QAElD,IAAI,IAAI,IAAI,aAAa,CAAE,IAAgC,CAAC,aAAa,CAAC,CAAC,EAAE;AAC3E,YAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAG,IAAgC,CAAC,aAAa,CAA4B,CAAC;QAClH;QAEA,IAAI,UAAU,EAAE;AACd,YAAA,MAAM,OAAO,GAAG,CAAA,CAAA,EAAI,UAAU,EAAE;YAChC,IAAI,IAAI,IAAI,aAAa,CAAE,IAAgC,CAAC,OAAO,CAAC,CAAC,EAAE;AACrE,gBAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAG,IAAgC,CAAC,OAAO,CAA4B,CAAC;YAC5G;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,yBAAA,EAA4B,aAAa,EAAE,EAAE;gBACzD,WAAW;gBACX,UAAU;gBACV,QAAQ;AACT,aAAA,CAAC;QACJ;AAEA,QAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAM;IACjD;AAEA;;;AAGG;IACH,aAAa,CAAC,aAAsB,EAAE,WAAqB,EAAA;QACzD,IAAI,IAAI,GAAY,aAAa;AACjC,QAAA,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE;AACjC,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,SAAS;AAC1C,YAAA,IAAI,GAAI,IAAgC,CAAC,OAAO,CAAC;YACjD,IAAI,IAAI,KAAK,SAAS;AAAE,gBAAA,OAAO,SAAS;QAC1C;AACA,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;AACK,IAAA,oBAAoB,CAAC,GAA4B,EAAA;QACvD,MAAM,GAAG,GAA4B,EAAE;AACvC,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AAC9C,YAAA,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE;AACzB,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YAChE;AAAO,iBAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,IAAG;AAC1B,oBAAA,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE;AACxB,wBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;oBAC1D;AAAO,yBAAA,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AAC9B,wBAAA,OAAO,IAAI,CAAC,oBAAoB,CAAC,IAA+B,CAAC;oBACnE;AACA,oBAAA,OAAO,IAAI;AACb,gBAAA,CAAC,CAAC;YACJ;AAAO,iBAAA,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE;gBAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAgC,CAAC;YACxE;iBAAO;AACL,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;YAClB;QACF;AACA,QAAA,OAAO,GAAG;IACZ;AAEA;;;AAGG;IACH,SAAS,CAAuE,IAAO,EAAE,KAAQ,EAAA;AAC/F,QAAA,MAAM,GAAG,GAA4B,EAAC,GAAG,IAAI,EAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACpC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;AACtB,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC;YAEvB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AAC9C,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC;YACvC;iBAAO;;AAEL,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;YACjB;QACF;AACA,QAAA,OAAO,GAAY;IACrB;uGA9MW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACZlC;;;;AAIG;SACa,eAAe,CAAC,GAAW,EAAE,SAAS,GAAG,KAAK,EAAA;IAC5D,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,UAAU,EAAE,CAAC,GAAoB,KAAK,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;YACpE,IAAI,EAAE,CAAC,eAAe,CAAC;AACxB,SAAA;KACF;AACH;;ACfA;;AAEG;MACU,eAAe,GAAG,IAAI,cAAc,CAC/C,iBAAiB,EACjB;AACE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,EAAE;AAClB,CAAA;AAGH;;AAEG;MACU,cAAc,GAAG,IAAI,cAAc,CAC9C,gBAAgB,EAChB;AACE,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM,IAAI;AACpB,CAAA;;AChBH;;;;;;;;;;;;AAYG;SACa,wBAAwB,CACtC,KAAwB,EACxB,aAAqB,EACrB,OAAoB,EAAA;IAEpB,OAAO;AACL,QAAA,OAAO,EAAE,KAAK;AACd,QAAA,IAAI,EAAE;YACJ,eAAe;YACf,iBAAiB;YACjB,UAAU;AACV,YAAA,CAAC,IAAI,QAAQ,EAAE,EAAE,eAAe,CAAC;AACjC,YAAA,CAAC,IAAI,QAAQ,EAAE,EAAE,cAAc,CAAC;AACjC,SAAA;AACD,QAAA,UAAU,EAAE,CACV,GAAoB,EACpB,IAAuB,EACvB,UAAsB,EACtB,WAA4B,EAC5B,UAAyB,KACpB;YACL,MAAM,aAAa,GAAG,MAAQ;AAC5B,gBAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAI,aAAa,EAAE,WAAW,IAAI,EAAE,EAAE,UAAU,IAAI,SAAS,CAAC;AAC1F,gBAAA,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,IAAI,EAAE,EAAE,QAAQ,CAAC;AACnD,YAAA,CAAC;;AAGD,YAAA,MAAM,GAAG,GAAG,aAAa,EAAE;;;YAI3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAK;AACtC,gBAAA,MAAM,OAAO,GAAG,aAAa,EAAE;;gBAE/B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBACrC,GAA+B,CAAC,GAAG,CAAC,GAAI,OAAmC,CAAC,GAAG,CAAC;gBACnF;AACF,YAAA,CAAC,CAAC;YAEF,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;AAE7C,YAAA,OAAO,GAAG;QACZ,CAAC;KACF;AACH;;MCzCa,kBAAkB,CAAA;;AAER,IAAA,SAAS;uGAFnB,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,CAAA,YAAA,EAAA,WAAA,CAAA,EAAA,EAAA,SAAA,EAdlB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,eAAe;;;AAGxB,gBAAA,IAAI,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,IAAI,QAAQ,EAAE,EAAE,eAAe,CAAC,EAAE,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;AACtF,gBAAA,UAAU,EAAE,CAAC,UAA2B,EAAE,IAAmB,KAAI;AAC/D,oBAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,EAAE;oBAC1D,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;AAChC,oBAAA,OAAO,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;gBAC/C,CAAC;AACF,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAlB9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAET,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,eAAe;;;AAGxB,4BAAA,IAAI,EAAE,CAAC,CAAC,IAAI,QAAQ,EAAE,EAAE,IAAI,QAAQ,EAAE,EAAE,eAAe,CAAC,EAAE,IAAI,SAAS,CAAC,YAAY,CAAC,CAAC;AACtF,4BAAA,UAAU,EAAE,CAAC,UAA2B,EAAE,IAAmB,KAAI;AAC/D,gCAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,EAAE;gCAC1D,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE;AAChC,gCAAA,OAAO,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;4BAC/C,CAAC;AACF,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBAGE,KAAK;uBAAC,YAAY;;;MCPR,mBAAmB,CAAA;;AAER,IAAA,UAAU;uGAFrB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,CAAA,aAAA,EAAA,YAAA,CAAA,EAAA,EAAA,SAAA,EATnB;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,cAAc;;AAEvB,gBAAA,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;AACpC,gBAAA,UAAU,EAAE,CAAC,IAAmB,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI;AACjE,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAb/B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAET,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,cAAc;;AAEvB,4BAAA,IAAI,EAAE,CAAC,IAAI,SAAS,CAAC,aAAa,CAAC,CAAC;AACpC,4BAAA,UAAU,EAAE,CAAC,IAAmB,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI;AACjE,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBAGE,KAAK;uBAAC,aAAa;;;MCNT,qBAAqB,GAAG,IAAI,cAAc,CAAuB,uBAAuB;AAErG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;MAiBU,YAAY,CAAA;AACvB,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;;IAGjD,QAAQ,GAAyB,EAAE;AAE5B,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGb,IAAA,KAAK;AAEf,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;IAC/D,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;IAGhD,KAAK,GAAkB,IAAI;;IAG3B,UAAU,GAAG,KAAK;;IAGV,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;;AAGO,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAExC;;;;AAIG;AACc,IAAA,oBAAoB,GAAuC;AAC1E,QAAA,QAAQ,EAAE,wBAAwB;AAClC,QAAA,KAAK,EAAE,oCAAoC;QAC3C,SAAS,EAAE,CAAC,IAAI,KAAK,CAAA,QAAA,EAAW,IAAI,CAAC,cAAc,CAAA,oBAAA,CAAsB;QACzE,SAAS,EAAE,CAAC,IAAI,KAAK,CAAA,QAAA,EAAW,IAAI,CAAC,cAAc,CAAA,mBAAA,CAAqB;QACxE,KAAK,EAAE,CAAC,IAAI,KAAK,CAAA,uBAAA,EAA0B,IAAI,CAAC,GAAG,CAAA,QAAA,CAAU;QAC7D,KAAK,EAAE,CAAC,IAAI,KAAK,CAAA,wBAAA,EAA2B,IAAI,CAAC,GAAG,CAAA,CAAE;KACvD;AAED;;;;AAIG;AACH,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;AAElD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACxB,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC;IACF;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;AAC1D,QAAA,IAAI,KAAK;YAAE,KAAK,CAAC,KAAK,EAAE;IAC1B;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAA,SAAA,EAAY,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AACzE,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CACxC,gBAAgB,EAChB,IAAI,CAAC,WAAW,EAChB,UAAU,CACX;;AAGD,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AAChB,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAC3D,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;QAC3E;IACF;AAEA;;;AAGG;AACH,IAAA,IAAY,OAAO,GAAA;QACjB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACrC;;AAIA;;;;;AAKG;AACH,IAAA,UAAU,CAAC,GAAY,EAAA;QACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;IACvC;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;;AAIA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,GAAW,EAAA;QACrB,IAAI,UAAU,GAAG,GAAG;;AAGpB,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE;AACnE,YAAA,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;;AAIzD,YAAA,IAAI,UAAU,KAAK,GAAG,EAAE;AACtB,gBAAA,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;AAC1D,gBAAA,IAAI,KAAK;AAAE,oBAAA,KAAK,CAAC,KAAK,GAAG,UAAU;YACrC;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,GAAG,UAAU;AACvB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/C;AAEA;;;AAGG;IACH,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;;AAIA;;;;;;AAMG;AACH,IAAA,QAAQ,CAAC,OAAwB,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;IAC/D;;AAIA;;;AAGG;AACH,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;IACvC;;AAGA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI;IAClC;;AAGA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI;IAClC;;AAGA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI;IACnC;;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,IAAI,IAAI;IACxC;;AAIA;;;AAGG;AACH,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;IACxC;AAEA;;;AAGG;AACH,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;AACtB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACnD;AAEA;;;;;;AAMG;AACK,IAAA,YAAY,CAAC,MAAwB,EAAA;;AAE3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1C,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC7B,oBAAA,OAAO,GAAG;gBACZ;YACF;QACF;;QAEA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvD;AAEA;;;;;;;AAOG;IACK,yBAAyB,CAAC,QAAgB,EAAE,MAAwB,EAAA;AAC1E,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;;QAGlC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,KAAK;AAC/D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,SAAS;AAC/E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB;QAElD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe;;AAGrF,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAClC;;AAEA,QAAA,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AAC9C,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAS,EAAE,GAAW,KAC3D,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,CAAI,CACrE;QACH;AACA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;AAKG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QAEtB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AACrC,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1E;AAEA;;;;;AAKG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC1C,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACzD;;;AAKA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtB;;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI;IACjC;AAEA;;;AAGG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,oBAAoB,CAAC;AAC1B,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,YAAA,KAAK,EAAE,IAAI,CAAC,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;YACjD,QAAQ,EAAE,IAAI,CAAC,UAAU;AAC1B,SAAA,CAAC;IACJ;uGAxVW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAY,6OC7DzB,+kDAgDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDAY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAW,cAAc,4FAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,8MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAajD,YAAY,EAAA,UAAA,EAAA,CAAA;kBAhBxB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,UAAA,EAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,WAAW,CAAC,EAAA,IAAA,EAEvD;;;;;;;AAOJ,wBAAA,iBAAiB,EAAE,mCAAmC;AACtD,wBAAA,eAAe,EAAE,kCAAkC;AACpD,qBAAA,EAAA,QAAA,EAAA,+kDAAA,EAAA;;sBAWA,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;ME5Dd,4BAA4B,GAAG,IAAI,cAAc,CAA8B,8BAA8B;MAiB7G,qBAAqB,CAAA;AACb,IAAA,eAAe,GAAG,MAAM,CAAC,4BAA4B,CAAC;uGAD9D,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EARrB;AACT,YAAA,wBAAwB,CAA8B,4BAA4B,EAAE,0BAA0B,CAAC;SAChH,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrBH,wgBAmBA,4CDFI,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAUP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAdjC,SAAS;+BACE,8BAA8B,EAAA,UAAA,EAC5B,IAAI,EAAA,OAAA,EACP;wBACP;qBACD,EAAA,SAAA,EACU;AACT,wBAAA,wBAAwB,CAA8B,4BAA4B,EAAE,0BAA0B,CAAC;qBAChH,EAAA,IAAA,EAEK;AACJ,wBAAA,KAAK,EAAE;AACR,qBAAA,EAAA,QAAA,EAAA,wgBAAA,EAAA;;;AEvBI,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAC1C,IAAA,IAAI,EAAE,EAAE;AACR,IAAA,QAAQ,EAAE;AACR,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,wCAAwC;AAC/C,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,WAAW;AAClB,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,KAAK,EAAE,YAAY;AACpB,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;AACF,KAAA;AACF,CAAA;;MCfY,iBAAiB,CAAA;AACD,IAAA,IAAI;AAE/B,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,yBAAyB,CAAC;AAC/B,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;AACpC,YAAA,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;AACxB,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY;AACpC,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC;AACzB,SAAA,CAAC;IACJ;uGAVW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECb9B,+NAKA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDII,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIE,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAR7B,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP;wBACP;AACD,qBAAA,EAAA,QAAA,EAAA,+NAAA,EAAA;;sBAIA,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;AEZpB,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACnC,IAAA,IAAI,EAAE,yIAAyI;AAC/I,IAAA,QAAQ,EAAE;AAER,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,WAAW;AAClB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACV,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,IAAI,EAAE,QAAQ;AACf;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,YAAY,EAAE,IAAI;AAClB,QAAA,MAAM,EAAE,UAAU;AACnB;AACF,CAAA;;MC7BY,kBAAkB,GAAG,IAAI,cAAc,CAAqB,oBAAoB;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BG;MAOU,UAAU,CAAA;AACrB,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;;IAGjD,QAAQ,GAAuB,EAAE;AAE1B,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGb,IAAA,KAAK;AAEf,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;IAC/D,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;IAGhD,KAAK,GAAkB,IAAI;;IAG3B,UAAU,GAAG,KAAK;;IAGV,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;;AAGO,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAExC;;;;AAIG;AACc,IAAA,oBAAoB,GAA+C;AAClF,QAAA,QAAQ,EAAE,wBAAwB;QAClC,SAAS,EAAE,CAAC,IAAI,KAAK,CAAA,QAAA,EAAW,IAAI,CAAC,cAAc,CAAA,oBAAA,CAAsB;QACzE,SAAS,EAAE,CAAC,IAAI,KAAK,CAAA,QAAA,EAAW,IAAI,CAAC,cAAc,CAAA,mBAAA,CAAqB;KACzE;AAED;;;;AAIG;AACH,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;AAElD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACxB,UAAU,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC;IACF;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,UAAU,CAAC;AAChE,QAAA,IAAI,QAAQ;YAAE,QAAQ,CAAC,KAAK,EAAE;IAChC;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAA,YAAA,EAAe,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC5E,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CACxC,aAAa,EACb,IAAI,CAAC,WAAW,EAChB,UAAU,CACX;;AAGD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAC/D;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;QAC3E;IACF;;AAIA;;;;AAIG;AACH,IAAA,UAAU,CAAC,GAAY,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG,IAAI,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;IAC/C;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA;;;;AAIG;AACH,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;;AAIA;;;;;AAKG;AACH,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IACpB;AAEA;;;AAGG;IACH,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;;AAIA;;;AAGG;AACH,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;IACxC;AAEA;;;AAGG;AACH,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;AACtB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACnD;AAEA;;;;;;AAMG;AACK,IAAA,YAAY,CAAC,MAAwB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1C,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC7B,oBAAA,OAAO,GAAG;gBACZ;YACF;QACF;QACA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvD;AAEA;;;;;;AAMG;IACK,yBAAyB,CAAC,QAAgB,EAAE,MAAwB,EAAA;AAC1E,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAElC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,KAAK;AAC/D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,SAAS;AAC/E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB;QAElD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe;AAErF,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAClC;;AAEA,QAAA,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACxE;AACA,QAAA,OAAO,MAAM;IACf;AAEA;;;;AAIG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QAEtB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AACrC,QAAA,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1E;AAEA;;;;AAIG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAExB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC1C,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACzD;;;AAKA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtB;;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI;IACjC;AAEA;;;AAGG;AACH,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,kBAAkB,CAAC;AACxB,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;AAC1B,SAAA,CAAC;IACJ;uGA3QW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClDvB,wjDA4CA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDGY,OAAO,oFAAE,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAGtB,UAAU,EAAA,UAAA,EAAA,CAAA;kBANtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,wjDAAA,EAAA;;sBAYjC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;AEzD3B;;;;;;;AAOG;AACI,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACpC,IAAA,IAAI,EAAE,wHAAwH;AAC9H,IAAA,QAAQ,EAAE;;AAER,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACV,SAAA;;AAED,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;;AAED,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,WAAW;AAClB,SAAA;;AAED,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;;AAED,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,4HAA4H;AACnI,SAAA;;AAED,QAAA,QAAQ,EAAE;AACR,YAAA,IAAI,EAAE,mDAAmD;AAC1D,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA;AACF,CAAA;;AClBD;;;;;;;;;;;;;;;;;;;;AAoBG;MAOU,WAAW,CAAA;AACtB,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;;AAElC,IAAA,KAAK;;AAEpB,IAAA,WAAW,GAAG,IAAI,YAAY,EAAwB;;AAEtD,IAAA,OAAO,GAAG,IAAI,YAAY,EAAQ;;IAElC,QAAQ,GAAwB,EAAE;;AAEzB,IAAA,KAAK,GAAG,MAAM,CAAS,EAAE,iDAAC;;AAE1B,IAAA,aAAa,GAAG,MAAM,CAAgB,IAAI,yDAAC;AAC7C,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,IAAI,EAAE;IAC7D,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AAC7D,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAE/B,IAAA,WAAW,GAAG,MAAM,CAAoB,EAAE,uDAAC;;AAE3C,IAAA,cAAc,GAAG,MAAM,CAAC,KAAK,0DAAC;;AAE9B,IAAA,eAAe,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,2DAAC;;AAExD,IAAA,YAAY,GAAG,QAAQ,CAAsB,MAAK;QACzD,MAAM,KAAK,GAAwB,EAAE;AAErC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE;AACzC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;YACtC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,KAAI;AACtB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,oBAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC5D,YAAA,CAAC,CAAC;QACJ;aAAO,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE;AACvF,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACzD;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;YAC/B,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAC3B,gBAAA,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI;gBAC/B,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AACxC,gBAAA,KAAK,EAAE,CAAC;AACR,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,wDAAC;;IAEM,YAAY,GAAG,KAAK;AAC5B;;;AAGG;AACc,IAAA,oBAAoB,GAAgD;AACnF,QAAA,QAAQ,EAAE,wBAAwB;AAClC,QAAA,MAAM,EAAE,+BAA+B;QACvC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAA,uBAAA,EAA0B,IAAI,CAAC,GAAG,CAAA,CAAA,CAAG;QACxD,QAAQ,EAAE,CAAC,IAAI,KAAK,CAAA,oBAAA,EAAuB,IAAI,CAAC,GAAG,CAAA,CAAA,CAAG;KACvD;;AAGD,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;;AAGA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,UAAU;IAC7C;;AAGA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ;IACnD;;AAGA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI;IAClC;;;AAKA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtB;;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI;IAChC;;AAGA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,mBAAmB,CAAC;AACzB,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;AACnE,YAAA,QAAQ,EAAE,IAAI,CAAC,WAAW,KAAK,UAAU;YACzC,QAAQ,EAAE,IAAI,CAAC,UAAU;AAC1B,SAAA,CAAC;IACJ;;AAGA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;IACxC;;;AAKA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;AACtB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACnD;;AAGA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAChF;;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACpE;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;QAEpB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;AACjF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;IACnD;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,GAAY,EAAA;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAgB,CAAC,YAAY,IAAI;cAC5E,GAAG,YAAY,IAAI,GAAG,CAAC,GAAG;kBACxB,EAAE;AACR,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IACrB;AAEA;;;AAGG;AACH,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA;;;AAGG;AACH,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;;AAIA;;;AAGG;AACH,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,YAAY,GAAG,UAAU;IAChC;AAEA;;;;AAIG;AACH,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;AAC9C,QAAA,KAAK,CAAC,KAAK,GAAG,EAAE;AAChB,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IACzB;AAEA;;;AAGG;AACH,IAAA,UAAU,CAAC,KAAa,EAAA;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE;IACb;AAEA;;;AAGG;AACH,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACvB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;AAC3C,YAAA,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;AACd,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;QAC/B;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B;AACA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;QACnB,IAAI,CAAC,SAAS,EAAE;IAClB;;IAGU,UAAU,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK;IACjE;;AAGU,IAAA,OAAO,CAAC,IAAuB,EAAA;AACvC,QAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,EAAE;IACrD;;AAGU,IAAA,OAAO,CAAC,IAAU,EAAA;AAC1B,QAAA,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC;IAC/C;;IAGQ,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;;;IAKO,SAAS,GAAe,MAAK;AACrC,IAAA,CAAC;;IAGO,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAA,cAAA,EAAiB,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC9E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CACzC,eAAe,EACf,IAAI,CAAC,WAAW,EAChB,UAAU,CACX;AAED,QAAA,MAAM,OAAO,GAAwB;AACnC,YAAA,YAAY,EAAE,kCAAkC;AAChD,YAAA,YAAY,EAAE,SAAS;AACvB,YAAA,WAAW,EAAE,QAAQ;SACtB;QAED,IAAI,CAAC,QAAQ,GAAG,EAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAC;AACzC,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAC;AACjF,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY;AAAE,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAC;AACtG,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY;AAAE,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,EAAC;AACtG,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW;AAAE,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAC;IACrG;AAEA;;;AAGG;AACK,IAAA,QAAQ,CAAC,QAAgB,EAAA;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;QAC5B,IAAI,QAAQ,GAAkB,IAAI;QAClC,IAAI,SAAS,GAA0B,EAAE;AAEzC,QAAA,IAAI,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;AAC5D,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM;YAAE,QAAQ,GAAG,QAAQ;QAE1D,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,EAAE;AAC9B,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO;AAC9B,YAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;YACxD,IAAI,UAAU,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE;gBACvC,QAAQ,GAAG,SAAS;gBACpB,SAAS,GAAG,EAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAC;YAC5C;YACA,QAAQ,GAAG,UAAU;QACvB;AAEA,QAAA,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEpF,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;AAC3F,YAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;YACzC,QAAQ,GAAG,UAAU;YACrB,SAAS,GAAG,EAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAC;QACxC;AAEA,QAAA,IAAI,QAAQ;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AAE9E,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE;IACb;;AAGQ,IAAA,QAAQ,CAAC,IAAY,EAAA;QAC3B,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1F;;IAGQ,IAAI,GAAA;AACV,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC5E,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,SAAS,EAAE;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IAC9B;;IAGQ,SAAS,GAAA;QACf,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;AACpC,YAAA,IAAI,GAAG;AAAE,gBAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;QACnC;IACF;;IAGQ,YAAY,CAAC,GAAW,EAAE,KAAa,EAAA;QAC7C,OAAO;AACL,YAAA,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAC/B,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,SAAS,EAAE,IAAI;YACf,KAAK;AACL,YAAA,QAAQ,EAAE,IAAI;SACf;IACH;;AAGQ,IAAA,YAAY,CAAC,MAAwB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1C,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;AAAE,oBAAA,OAAO,GAAG;YAC3C;QACF;QACA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B;;;IAKQ,mBAAmB,CAAC,GAAW,EAAE,MAAwB,EAAA;QAC/D,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAA0B,CAAC;IACvE;AAEA;;;AAGG;IACK,cAAc,CAAC,GAAW,EAAE,IAAuC,EAAA;QACzE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,GAAG,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,KAAK;AAC/D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,SAAS;AAC1E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB;QAElD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe;AAErF,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;YAChC,OAAO,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,EAAE,CAAC;QAC/B;AACA,QAAA,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YACpC,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAc,EAAE,KAAa,KAAI;AACtE,gBAAA,MAAM,KAAK,GAAI,IAAgC,CAAC,KAAK,CAAC;AACtD,gBAAA,OAAO,KAAK,KAAK,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAA,EAAA,EAAK,KAAK,IAAI;AAC7D,YAAA,CAAC,CAAC;QACJ;AACA,QAAA,OAAO,MAAM;IACf;;AAGQ,IAAA,aAAa,CAAC,IAAU,EAAA;AAC9B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;AAChC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;AACnF,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACpC,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE,WAAW,EAAE;AAC5C,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAI;AAC3B,YAAA,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtD,YAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpE,OAAO,IAAI,KAAK,KAAK;AACvB,QAAA,CAAC,CAAC;IACJ;;AAGQ,IAAA,aAAa,CAAC,KAAa,EAAA;QACjC,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI;AACrC,QAAA,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;AAAE,YAAA,OAAO,CAAA,EAAG,CAAC,KAAK,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,GAAA,CAAK;AACjE,QAAA,OAAO,GAAG,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK;IACnD;;AAGQ,IAAA,eAAe,CAAC,GAAW,EAAA;AACjC,QAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7C,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,OAAO,OAAO,IAAI,OAAO;IAC3B;uGAxZW,WAAW,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,WAAW,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7DxB,+pPAoLA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED1HY,YAAY,6HAAW,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,eAAe,EAAA,QAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,mBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,8DAAE,OAAO,EAAA,QAAA,EAAA,cAAA,EAAA,CAAA,EAAA,CAAA;;2FAGtG,WAAW,EAAA,UAAA,EAAA,CAAA;kBANvB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,cACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,EAAA,QAAA,EAAA,+pPAAA,EAAA;;sBAMjH,KAAK;uBAAC,EAAC,QAAQ,EAAE,IAAI,EAAC;;sBAEtB;;sBAEA;;;AElEI,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACnC,IAAA,IAAI,EAAE,aAAa;AACnB,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,cAAc;AAClB,YAAA,EAAE,EAAE,sBAAsB;AAC1B,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,sBAAsB;AAC1B,YAAA,EAAE,EAAE,cAAc;AACnB,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAI,uHAAuH;AAClI,YAAA,SAAS,EAAE,yHAAyH;AACpI,YAAA,MAAM,EAAK,sHAAsH;AACjI,YAAA,OAAO,EAAI,uHAAuH;AAClI,YAAA,IAAI,EAAO,oHAAoH;AAC/H,YAAA,OAAO,EAAI,uHAAuH;AAClI,YAAA,OAAO,EAAI,uHAAuH;AAClI,YAAA,KAAK,EAAM,qHAAqH;AACjI,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAI,YAAY;AAClB,YAAA,EAAE,EAAI,YAAY;AAClB,YAAA,EAAE,EAAI,YAAY;AAClB,YAAA,EAAE,EAAI,YAAY;AACnB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA;AACF,CAAA;AAEM,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAC1C,IAAA,IAAI,EAAE,mBAAmB;AACzB,IAAA,QAAQ,EAAE;AACR,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,oFAAoF;AAC3F,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,KAAK,EAAE,KAAK;AACb,KAAA;AACF,CAAA;;MCrCY,kBAAkB,GAAG,IAAI,cAAc,CAAqB,oBAAoB;MAShF,UAAU,CAAA;AACrB,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;IAEjD,QAAQ,GAAuB,EAAE;AAEhB,IAAA,KAAK;;AAGvB,IAAA,OAAO;;AAGN,IAAA,aAAa,GAAG,IAAI,YAAY,EAAW;AAEpC,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;IAC/D,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhD,KAAK,GAAG,KAAK;IACb,UAAU,GAAG,KAAK;IAEV,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;AACO,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAEvB,IAAA,oBAAoB,GAA+C;AAClF,QAAA,QAAQ,EAAE,wBAAwB;KACnC;AAED,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAA,YAAA,EAAe,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC5E,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CACxC,aAAa,EACb,IAAI,CAAC,WAAW,EAChB,UAAU,CACX;AAED,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAC/D;IACF;;AAIA,IAAA,UAAU,CAAC,GAAY,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG;IACpB;;IAGA,WAAW,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE;AAC9B,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO;QAC3B;IACF;AAEA,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;;AAIA,IAAA,YAAY,CAAC,OAAgB,EAAA;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,OAAO;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AACtB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;;AAIA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;IACxC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;AACtB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACnD;AAEQ,IAAA,YAAY,CAAC,MAAwB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1C,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC7B,oBAAA,OAAO,GAAG;gBACZ;YACF;QACF;QACA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvD;IAEQ,yBAAyB,CAAC,QAAgB,EAAE,MAAwB,EAAA;AAC1E,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,KAAK;AAC/D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,SAAS;AAC/E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB;QAClD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe;AAErF,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAClC;AACA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpF;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC1C,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACzD;;AAIA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtB;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI;IACjC;AAEA,IAAA,IAAI,eAAe,GAAA;AACjB,QAAA,OAAO,kBAAkB,CAAC;AACxB,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AACvB,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACtC,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,yBAAyB,CAAC;AAC/B,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AACxB,SAAA,CAAC;IACJ;uGA5KW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BvB,m+CAwCA,EAAA,MAAA,EAAA,CAAA,8oCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDdY,OAAO,oFAAE,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAItB,UAAU,EAAA,UAAA,EAAA,CAAA;kBAPtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,cACf,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,cAAc,CAAC,EAAA,QAAA,EAAA,m+CAAA,EAAA,MAAA,EAAA,CAAA,8oCAAA,CAAA,EAAA;;sBASjC,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAGxB;;sBAGA;;;AEvCI,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACnC,IAAA,IAAI,EAAE,2GAA2G;AACjH,IAAA,QAAQ,EAAE;AACR,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,WAAW;AAClB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,aAAa;AACjB,YAAA,EAAE,EAAE,WAAW;AACf,YAAA,EAAE,EAAE,WAAW;AAChB,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACD,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,mFAAmF;AAC1F,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,YAAY,EAAE,IAAI;AAClB,QAAA,KAAK,EAAE,IAAI;AACZ,KAAA;AACF,CAAA;;MCzBY,kBAAkB,GAAG,IAAI,cAAc,CAAqB,oBAAoB;MAmBhF,UAAU,CAAA;AACrB,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;IAEjD,QAAQ,GAAuB,EAAE;AAEhB,IAAA,KAAK;AAEf,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;IAC/D,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAEhD,KAAK,GAAkB,IAAI;IAC3B,UAAU,GAAG,KAAK;IAEV,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;AACO,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAEvB,IAAA,oBAAoB,GAA+C;AAClF,QAAA,QAAQ,EAAE,wBAAwB;QAClC,KAAK,EAAE,CAAC,IAAI,KAAK,CAAA,uBAAA,EAA0B,IAAI,CAAC,GAAG,CAAA,QAAA,CAAU;QAC7D,KAAK,EAAE,CAAC,IAAI,KAAK,CAAA,wBAAA,EAA2B,IAAI,CAAC,GAAG,CAAA,CAAE;KACvD;AAED,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAA,YAAA,EAAe,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC5E,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CACxC,aAAa,EACb,IAAI,CAAC,WAAW,EAChB,UAAU,CACX;AAED,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAC/D;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;QAC3E;IACF;;AAIA,IAAA,UAAU,CAAC,GAAY,EAAA;AACrB,QAAA,IAAI,GAAG,IAAI,IAAI,EAAE;AACf,YAAA,IAAI,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;;YAErB,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;AAC5E,gBAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;gBAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE;AAC1B,oBAAA,MAAM,GAAG,GAAG,CAAC,CAAS,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACxD,oBAAA,GAAG,GAAG,CAAA,EAAG,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE;gBACpI;YACF;AACA,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG;QAClB;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QACnB;IACF;AAEA,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;;AAIA,IAAA,WAAW,CAAC,GAAW,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG;AAChB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;IACpB;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;AAEA,IAAA,WAAW,CAAC,KAAuB,EAAA;AACjC,QAAA,IAAI;YACF,KAAK,CAAC,UAAU,EAAE;QACpB;AAAE,QAAA,MAAM;;QAER;IACF;;AAIA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;IACxC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;AACtB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACnD;AAEQ,IAAA,YAAY,CAAC,MAAwB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1C,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC7B,oBAAA,OAAO,GAAG;gBACZ;YACF;QACF;QACA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvD;IAEQ,yBAAyB,CAAC,QAAgB,EAAE,MAAwB,EAAA;AAC1E,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,KAAK;AAC/D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,SAAS;AAC/E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB;QAClD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe;AAErF,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAClC;AACA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpF;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC1C,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACzD;;AAIA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtB;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI;IACjC;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,gBAAgB;IAC5C;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,kBAAkB,CAAC;AACxB,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAC/B,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK;AACxB,SAAA,CAAC;IACJ;uGAtLW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,mCAAA,EAAA,aAAA,EAAA,kCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BvB,+iDA4CA,EAAA,MAAA,EAAA,CAAA,4DAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5BY,OAAO,oFAAE,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FActB,UAAU,EAAA,UAAA,EAAA,CAAA;kBAjBtB,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,cAAc,CAAC,EAAA,IAAA,EAG5B;;;;;;;AAOJ,wBAAA,iBAAiB,EAAE,mCAAmC;AACtD,wBAAA,eAAe,EAAE,kCAAkC;AACpD,qBAAA,EAAA,QAAA,EAAA,+iDAAA,EAAA,MAAA,EAAA,CAAA,4DAAA,CAAA,EAAA;;sBAOA,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;;AEjCpB,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACtC,IAAA,IAAI,EAAE,+EAA+E;AACrF,IAAA,QAAQ,EAAE;AACR,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,WAAW;AAClB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACV,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA;AACF,CAAA;;MCTY,sBAAsB,GAAG,IAAI,cAAc,CAAwB,wBAAwB;MAQ3F,aAAa,CAAA;AACxB,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;IAEjD,QAAQ,GAA0B,EAAE;AAEnB,IAAA,KAAK;AAEf,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE;IAC/D,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC/D,IAAA,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC;AAC1B,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGP,IAAA,UAAU;;IAGnD,cAAc,GAAc,EAAE;IAC9B,MAAM,GAAG,KAAK;IACd,UAAU,GAAG,KAAK;IAClB,UAAU,GAAG,EAAE;;AAGf,IAAA,aAAa,GAAiD,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE;IAE/F,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;AACO,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;AAEvB,IAAA,oBAAoB,GAAkD;AACrF,QAAA,QAAQ,EAAE,sCAAsC;KACjD;AAED,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAA,gBAAA,EAAmB,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAChF,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CACxC,iBAAiB,EACjB,IAAI,CAAC,WAAW,EAChB,UAAU,CACX;AAED,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;QAC/D;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;QAC3E;IACF;;AAIA,IAAA,UAAU,CAAC,GAAY,EAAA;AACrB,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,EAAE;IACrD;AAEA,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;;IAIA,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,UAAU;YAAE;AACrB,QAAA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM;AAC1B,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,sBAAsB,EAAE;QAC/B;aAAO;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACtB;IACF;;IAGQ,sBAAsB,GAAA;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,qBAAqB,EAAE;QAClE,IAAI,CAAC,aAAa,GAAG;AACnB,YAAA,GAAG,EAAE,CAAA,EAAG,IAAI,CAAC,MAAM,CAAA,EAAA,CAAI;AACvB,YAAA,IAAI,EAAE,CAAA,EAAG,IAAI,CAAC,IAAI,CAAA,EAAA,CAAI;AACtB,YAAA,KAAK,EAAE,CAAA,EAAG,IAAI,CAAC,KAAK,CAAA,EAAA,CAAI;SACzB;IACH;AAGA,IAAA,eAAe,CAAC,KAAY,EAAA;AAC1B,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AACpD,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,gBAAA,IAAI,CAAC,UAAU,GAAG,EAAE;YACtB;QACF;IACF;;IAKA,sBAAsB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,IAAI,CAAC,MAAM,GAAG,KAAK;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACtB;IACF;AAEA,IAAA,YAAY,CAAC,MAA2B,EAAA;QACtC,IAAI,MAAM,CAAC,QAAQ;YAAE;AAErB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AACvD,QAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;AACd,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;QAC3E;aAAO;AACL,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;gBACtF;YACF;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC;QAC9D;AACA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;IACpC;IAEA,YAAY,CAAC,MAA2B,EAAE,KAAY,EAAA;QACpD,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC;AACzE,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;IACpC;AAEA,IAAA,UAAU,CAAC,MAA2B,EAAA;QACpC,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;IACnD;AAEA,IAAA,YAAY,CAAC,MAA2B,EAAA;AACtC,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa;AAAE,YAAA,OAAO,KAAK;AAC3C,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;IAC3F;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAA;AACnB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE;QAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9E;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;;AAIA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;IACxC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;AACtB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACnD;AAEQ,IAAA,YAAY,CAAC,MAAwB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1C,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC7B,oBAAA,OAAO,GAAG;gBACZ;YACF;QACF;QACA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvD;IAEQ,yBAAyB,CAAC,QAAgB,EAAE,MAAwB,EAAA;AAC1E,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,KAAK;AAC/D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,SAAS;AAC/E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB;QAClD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe;AAErF,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAClC;;AAEA,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YAC5E,OAAO,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1E;AACA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpF;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC1C,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACzD;;AAIA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtB;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI;IACjC;AAEA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,qBAAqB,CAAC;AAC3B,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAChC,SAAA,CAAC;IACJ;uGAxPW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,gBAAA,EAAA,yBAAA,EAAA,eAAA,EAAA,0BAAA,EAAA,eAAA,EAAA,0BAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/B1B,opKA2HA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED/FY,OAAO,oFAAE,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,cAAA,EAAA,CAAA,EAAA,CAAA;;2FAGzC,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAA,QAAA,EAAA,opKAAA,EAAA;;sBAQpD,KAAK;uBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;sBAUxB,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;;sBAyFtC,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC;;sBAWzC,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE;;sBAChC,YAAY;AAAC,gBAAA,IAAA,EAAA,CAAA,eAAe,EAAE,EAAE;;;AEjJ5B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACjC,IAAA,IAAI,EAAE,gIAAgI;AACtI,IAAA,QAAQ,EAAE;AACR,QAAA,MAAM,EAAE;AACN,YAAA,IAAI,EAAE,WAAW;AAClB,SAAA;AACD,QAAA,IAAI,EAAE;AACJ,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACT,YAAA,EAAE,EAAE,KAAK;AACV,SAAA;AACD,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,EAAE,EAAE,YAAY;AAChB,YAAA,MAAM,EAAE,aAAa;AACrB,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,OAAO,EAAE,aAAa;AACvB,SAAA;AACD,QAAA,SAAS,EAAE;AACT,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA;AACF,CAAA;;MCrBY,gBAAgB,GAAG,IAAI,cAAc,CAAmB,kBAAkB;MAe1E,QAAQ,CAAA;AACnB,IAAA,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC,CAAC;AAElC,IAAA,KAAK;;IAE9B,aAAa,GAAY,IAAI;IAC7B,UAAU,GAAG,KAAK;IACR,QAAQ,GAAqB,EAAE;AACxB,IAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC,IAAI,EAAE;IAC7D,kBAAkB,GAAG,MAAM,CAAC,cAAc,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AAC7D,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAChC,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,oBAAoB,GAA6C;AAChF,QAAA,QAAQ,EAAE,yBAAyB;KACpC;AAED,IAAA,WAAA,GAAA;QACE,IAAI,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;IACzD;AAEA,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,aAAa,CAAC;IACrE;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;IACxC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO;AACtB,QAAA,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;IACnD;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;QACtB,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,CAAC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACpF;;AAIA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAC1C,OAAO,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC;IACzD;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE;IACtB;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,IAAI;IACjC;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,gBAAgB,CAAC;AACtB,YAAA,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;AACrB,YAAA,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;AACrC,YAAA,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;AACzB,YAAA,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;AAChC,SAAA,CAAC;IACJ;;IAIA,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,EAAE;AAEpB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,aAAa,EAAE;AACtB,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;IACpD;AAEA,IAAA,UAAU,CAAC,GAAY,EAAA;;QAErB,IAAI,CAAC,aAAa,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG;IAC/D;AAEA,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;IAC9B;;;AAKA,IAAA,WAAW,CAAC,MAAsB,EAAA;AAChC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD;;AAGA,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA2B;QAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;AACxC,QAAA,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;AACnE,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnB;QACF;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACxC,IAAI,MAAM,CAAC,QAAQ;YAAE;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;IACnC;AAEA,IAAA,UAAU,CAAC,MAAsB,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC,KAAK;IAC5C;IAEA,UAAU,GAAA;QACR,IAAI,CAAC,SAAS,EAAE;IAClB;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC;IACvD;IAEQ,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;IAEO,SAAS,GAAe,MAAK;AACrC,IAAA,CAAC;;IAIO,aAAa,GAAA;AACnB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,IAAI,CAAA,UAAA,EAAa,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;AAC1E,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CACxC,WAAW,EACX,IAAI,CAAC,WAAW,EAChB,UAAU,CACX;AAED,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAC;QAC7D;AACA,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;AAC1B,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAC;QACzE;IACF;AAEQ,IAAA,YAAY,CAAC,MAAwB,EAAA;AAC3C,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;YAC5B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE;AAC1C,gBAAA,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AAC7B,oBAAA,OAAO,GAAG;gBACZ;YACF;QACF;QACA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B;IAEQ,yBAAyB,CAAC,QAAgB,EAAE,MAAwB,EAAA;AAC1E,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,QAAQ,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,KAAK,KAAK;AAC/D,QAAA,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,GAAG,SAAS;AAC/E,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB;QAClD,MAAM,MAAM,GAAG,SAAS,IAAI,SAAS,IAAI,UAAU,IAAI,WAAW,IAAI,eAAe;AAErF,QAAA,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE;AAChC,YAAA,OAAO,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;QAClC;AACA,QAAA,IAAI,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACtE;AACA,QAAA,OAAO,MAAM;IACf;uGApLW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAR,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,eAAA,EAAA,mCAAA,EAAA,aAAA,EAAA,kCAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1BrB,orDAkDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlCY,OAAO,oFAAE,cAAc,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAUtB,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAbpB,SAAS;+BACE,eAAe,EAAA,UAAA,EACb,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,cAAc,CAAC,EAAA,IAAA,EAE5B;;;;AAIJ,wBAAA,iBAAiB,EAAE,mCAAmC;AACtD,wBAAA,eAAe,EAAE,kCAAkC;AACpD,qBAAA,EAAA,QAAA,EAAA,orDAAA,EAAA;;sBAKA,KAAK;uBAAC,EAAC,QAAQ,EAAE,IAAI,EAAC;;;AEtBzB;AACA;AACA;IAEY;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EALW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;IAOT;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,SAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,SAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,SAAA,CAAA,IAAA,CAAA,GAAA,IAAS;AACT,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EANW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;IAQT;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAJW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;IAMT;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAJW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;IAMZ;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,YAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAHW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;IAKZ;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,WAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,WAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,WAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,WAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EANW,WAAW,KAAX,WAAW,GAAA,EAAA,CAAA,CAAA;IAQX;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EAHW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;IAKd;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,eAAA,CAAA,GAAA,eAA+B;AAC/B,IAAA,cAAA,CAAA,YAAA,CAAA,GAAA,YAAyB;AACzB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAJW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;IAMd;AAAZ,CAAA,UAAY,UAAU,EAAA;AACpB,IAAA,UAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,UAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACzB,CAAC,EAHW,UAAU,KAAV,UAAU,GAAA,EAAA,CAAA,CAAA;IAKV;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;IAMhB;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,SAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,SAAA,CAAA,oBAAA,CAAA,GAAA,oBAAyC;AACzC,IAAA,SAAA,CAAA,qBAAA,CAAA,GAAA,qBAA2C;AAC3C,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,SAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,SAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAjBW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;IAmBT;AAAZ,CAAA,UAAY,eAAe,EAAA;AACzB,IAAA,eAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,eAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,eAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACjB,CAAC,EAJW,eAAe,KAAf,eAAe,GAAA,EAAA,CAAA,CAAA;IAMf;AAAZ,CAAA,UAAY,aAAa,EAAA;AACvB,IAAA,aAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,aAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAHW,aAAa,KAAb,aAAa,GAAA,EAAA,CAAA,CAAA;IAKb;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,WAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACvB,CAAC,EAHW,WAAW,KAAX,WAAW,GAAA,EAAA,CAAA,CAAA;IAKX;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,WAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,WAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,WAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACjB,CAAC,EALW,WAAW,KAAX,WAAW,GAAA,EAAA,CAAA,CAAA;IAOX;AAAZ,CAAA,UAAY,SAAS,EAAA;AACnB,IAAA,SAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,SAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,SAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EANW,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;IAQT;AAAZ,CAAA,UAAY,mBAAmB,EAAA;AAC7B,IAAA,mBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,mBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,mBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,GAAA,EAAA,CAAA,CAAA;IAMnB;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,gBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,gBAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,gBAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,gBAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACnC,CAAC,EARW,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;IAUhB;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,gBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EAJW,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;IAMhB;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,cAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,cAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,cAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACnB,IAAA,cAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACnB,CAAC,EANW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;;ACxH1B;;;;;AAKG;MACU,UAAU,GAAG,IAAI,cAAc,CAAmB,YAAY;;ACC3E;;;AAGG;MACU,iBAAiB,CAAA;AAKT,IAAA,MAAA;AACT,IAAA,MAAA;IALF,UAAU,GAA2B,EAAE;IACvC,iBAAiB,GAAG,CAAC;IAE7B,WAAA,CACmB,MAAmC,EAC5C,MAAe,EAAA;QADN,IAAA,CAAA,MAAM,GAAN,MAAM;QACf,IAAA,CAAA,MAAM,GAAN,MAAM;AAEd,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE;AAC7C,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;IAC3C;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,IAAoB,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI;QACvB,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,KAA8B,EAAA;QAClC,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;AACzC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AACpB,YAAA,OAAO,EAAE,CAAC;YACV,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC7B,SAAA,CAAC;QACF,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;;AAGG;IACH,GAAG,CAAC,OAAO,GAAG,CAAC,EAAA;QACb,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,iBAAiB,GAAG,OAAO;QAChC,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;;;AAIG;AACH,IAAA,QAAQ,CAAC,KAA8B,EAAE,IAAI,GAAG,CAAC,EAAA;AAC/C,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE;QAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;;;;;;AAOG;IACH,MAAM,CACJ,OAAe,EACf,OAAwF,EAAA;QAExF,IAAI,CAAC,eAAe,EAAE;QACtB,MAAM,SAAS,GAA2B,EAAE;AAC5C,QAAA,OAAO,CAAC;YACN,GAAG,EAAE,CAAC,KAA8B,EAAE,IAAI,GAAG,CAAC,KAAI;AAChD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE;gBAC7C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC9B,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YACjC,CAAC;AACF,SAAA,CAAC;AAEF,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;gBACpB,OAAO;AACP,gBAAA,MAAM,EAAE,SAAS;AAClB,aAAA,CAAC;QACJ;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;AAqBA,IAAA,UAAU,CACR,IAAqC,EACrC,IAAgE,EAChE,IAAqD,EAAA;QAErD,IAAI,CAAC,eAAe,EAAE;AAEtB,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,MAAM,KAAK,GAAG,IAAI;AAClB,YAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM;QACpB;QAEA,MAAM,KAAK,GAAG,IAAI;AAClB,QAAA,IAAI,WAA+B;AACnC,QAAA,IAAI,OAAuD;AAE3D,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,WAAW,GAAG,IAAI;YAClB,OAAO,GAAG,IAAK;QACjB;aAAO;YACL,OAAO,GAAG,IAAK;QACjB;AAEA,QAAA,MAAM,WAAW,GAAgC;AAC/C,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;SACT;QACD,MAAM,YAAY,GAAG,IAAI,iBAAiB,CACxC,WAAW,EACX,IAAgD,CACjD;AACA,QAAA,YAA8C,CAAC,MAAM,GAAG,YAA6C;QACtG,OAAO,CAAC,YAA6C,CAAC;QACtD,YAAY,CAAC,eAAe,EAAE;AAE9B,QAAA,MAAM,KAAK,GAA2B;YACpC,KAAK;YACL,WAAW;AACX,YAAA,MAAM,EAAE,WAAW,CAAC,MAAM,IAAI,EAAE;AAChC,YAAA,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE;SAC7B;AAED,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM;IACpB;AAEQ,IAAA,iBAAiB,CAAC,KAA6B,EAAA;AACrD,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC5B,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,EAAE;QAC9B;;AAGA,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AACjC,QAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;AAG3C,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;AAC1C,YAAA,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;AACpC,gBAAA,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAChC,aAAA,CAAC,CAAC;QACL;QAEA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;IACrC;AAEA;;AAEG;AACH,IAAA,cAAc,CAAC,UAAmC,EAAA;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU;QACvC,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;AAEG;AACH,IAAA,eAAe,CAAC,UAAyB,EAAA;AACvC,QAAA,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,UAAU;QACxC,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;AAEG;AACH,IAAA,YAAY,CAAC,KAAsB,EAAA;AACjC,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK;QAChC,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,GAAiB,EAAA;QACrB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,IAAG;AAC7B,YAAA,CAAmB,CAAC,SAAS,GAAG,KAAK;AACxC,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAG;AACnC,YAAA,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAG;AAClB,gBAAA,CAAmB,CAAC,SAAS,GAAG,KAAK;AACxC,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAK,CAAsC,CAAC,GAAG,KAAK,GAAG,CAAC;QAChG,IAAI,KAAK,EAAE;AACR,YAAA,KAAuB,CAAC,SAAS,GAAG,IAAI;QAC3C;QACA,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,KAA8B,EAAA;QAChD,MAAM,UAAU,GAAG,KAAuB;QAC1C,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,EAAE;AACnD,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACjB,OAAO,IAAI,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;IACtD;AAEA;;AAEG;IACH,eAAe,GAAA;QACb,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,MAAM,CAAC,IAAK,CAAC,IAAI,CAAC;gBACrB,OAAO,EAAE,IAAI,CAAC,iBAAiB;AAC/B,gBAAA,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;AAC7B,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,YAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC;QAC5B;IACF;AACD;AAED;;AAEG;MACU,qBAAqB,CAAA;AAEtB,IAAA,KAAA;AACA,IAAA,MAAA;IAFV,WAAA,CACU,KAA8B,EAC9B,MAAe,EAAA;QADf,IAAA,CAAA,KAAK,GAAL,KAAK;QACL,IAAA,CAAA,MAAM,GAAN,MAAM;AAEb,QAAA,IAAI,CAAC,KAAwB,CAAC,UAAU,GAAI,IAAI,CAAC,KAAwB,CAAC,UAAU,IAAI,EAAE;IAC7F;AAEA,IAAA,QAAQ,CAAC,QAAiB,EAAA;QACvB,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AACpE,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,MAAc,EAAA;AACrB,QAAA,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC7E,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,MAAc,EAAA;AACrB,QAAA,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAC7E,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,CAAC,OAAwB,EAAA;AAC7B,QAAA,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAC5E,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;QACF,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACjE,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,GAAG,CAAC,KAAa,EAAA;AACd,QAAA,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,GAAG,CAAC,KAAa,EAAA;AACd,QAAA,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACtE,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,SAAsB,EAAA;QAC1B,IAAI,CAAC,KAAwB,CAAC,UAAW,CAAC,IAAI,CAAC,SAAS,CAAC;AAC1D,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;IACH,IAAI,GAAA;QACF,OAAO,IAAI,CAAC,MAAM;IACpB;AACD;;MCvUY,WAAW,CAAA;AACd,IAAA,MAAM;AACN,IAAA,aAAa;IAErB,WAAA,CAAY,EAAU,EAAE,KAAa,EAAA;QACnC,IAAI,CAAC,MAAM,GAAG;YACZ,EAAE;YACF,KAAK;AACL,YAAA,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,SAAS,CAAC,OAAO;SACzB;AACD,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;IAC/D;AAEA,IAAA,IAAI,CAAC,IAAoB,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI;AACvB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,KAAK,CAAC,KAAgB,EAAA;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK;AACzB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,KAAK,CAAC,KAAgB,EAAA;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK;AACzB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,UAAU,CAAC,UAA2B,EAAA;AACpC,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,UAAU;AACnC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,KAAK,CAAC,KAA8B,EAAA;QAClC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;IACxC;IAEA,GAAG,CAAC,OAAO,GAAG,CAAC,EAAA;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;IACxC;AAEA,IAAA,QAAQ,CAAC,KAA8B,EAAE,IAAI,GAAG,CAAC,EAAA;QAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACjD;IAEA,MAAM,CACJ,OAAe,EACf,OAAwF,EAAA;QAExF,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;IACpD;AAKA,IAAA,UAAU,CACR,IAAqC,EACrC,IAAgE,EAChE,IAAqD,EAAA;AAErD,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;QAC5C;AACA,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAK,CAAC;QACzD;QACA,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAK,CAAC;IACnD;AAEA,IAAA,cAAc,CAAC,UAAmC,EAAA;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,UAAU,CAAC;IACtD;AAEA,IAAA,eAAe,CAAC,UAAyB,EAAA;QACvC,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC;IACvD;AAEA,IAAA,YAAY,CAAC,KAAsB,EAAA;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC;IAC/C;AAEA,IAAA,OAAO,CACL,SAAoF,EAAA;AAEpF,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS;AAC/B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK;AAC7B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;AACrB,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK;AAC7B,QAAA,OAAO,IAAI;IACb;IAEA,QAAQ,CAAC,IAAI,GAAG,IAAI,EAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI;AAC3B,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE;QACpC,OAAO,IAAI,CAAC,MAAM;IACpB;AACD;;MC/FqB,gBAAgB,CAAA;AAC1B,IAAA,MAAM;AACN,IAAA,aAAa;AAEvB,IAAA,WAAA,CAAsB,aAAsB,EAAA;AAC1C,QAAA,IAAI,CAAC,MAAM,GAAG,aAAa;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CACxC,IAAI,CAAC,MAAM,EACX,IAAI,CACL;IACH;AAEA,IAAA,KAAK,CAAC,KAAa,EAAA;AACjB,QAAA,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK;AACzB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QAAQ,CAAC,QAAgB,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC/B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,WAAW,CAAC,WAAmB,EAAA;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,WAAW;AACrC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,UAAU,CAAC,KAAuC,EAAA;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK;AAC9B,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,SAAS,CAAC,IAAe,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI;AAC5B,QAAA,OAAO,IAAI;IACb;;AAGA,IAAA,UAAU,CAAC,IAAe,EAAA;AACxB,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI;AAC7B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,IAAe,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI;AAC5B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QAAQ,CAAC,IAAkB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI;AAC3B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QAAQ,CAAC,IAAkB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI;AAC3B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,CAAC,MAAmB,EAAA;AACxB,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM;AAC3B,QAAA,OAAO,IAAI;IACb;IAEA,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC/B,QAAA,OAAO,IAAI;IACb;IAEA,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAAA;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC/B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,aAAa,CAAC,OAAqC,EAAA;AACjD,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,OAAO;AACnC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,CAAC,MAAmC,EAAA;AACzC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM;AAC5B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QAAQ,CAAC,OAAoC,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,OAAO;AAC9B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CAAC,MAAuB,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM;AACzB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,SAAwB,EAAA;AAChC,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS;AACjC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,QAAQ,CAAC,QAA8B,EAAA;AACrC,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,QAAQ;AAC/B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,CAAC,MAAqB,EAAA;AAC1B,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM;AAC3B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,SAAsD,EAAA;AAC9D,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS;AACjC,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;IACH,iBAAiB,CAAC,OAAO,GAAG,IAAI,EAAA;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,iBAAiB,GAAG,OAAO;AACvC,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,IAAI,CAAC,IAAoB,EAAA;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IACtC;AAEA;;AAEG;AACH,IAAA,KAAK,CAAC,KAA8B,EAAA;QAClC,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;IACxC;AAEA;;AAEG;AACH,IAAA,mBAAmB,CAAC,KAA8B,EAAA;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACtD;AAEA;;AAEG;IACH,GAAG,CAAC,OAAO,GAAG,CAAC,EAAA;QACb,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;IACxC;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAA8B,EAAE,IAAI,GAAG,CAAC,EAAA;QAC/C,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC;IACjD;AAEA;;AAEG;IACH,MAAM,CACJ,OAAe,EACf,OAAwF,EAAA;QAExF,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;IACpD;AAQA,IAAA,UAAU,CACR,IAAqC,EACrC,IAAgE,EAChE,IAAqD,EAAA;AAErD,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC;QAC5C;AACA,QAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAK,CAAC;QACzD;QACA,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,EAAE,IAAK,CAAC;IACnD;AAEA,IAAA,eAAe,CAAC,UAAyB,EAAA;QACvC,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC;IACvD;IAEA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,aAAa,CAAC,eAAe,EAAE;QACpC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1C;AACD;;ACjNK,MAAO,kBAA2C,SAAQ,gBAG/D,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC;YACJ,IAAI,EAAE,SAAS,CAAC,MAAM;AACtB,YAAA,KAAK,EAAE,EAAE;AAC+B,SAAA,CAAC;IAC7C;AAEA;;;AAGG;AACH,IAAA,YAAY,CAAC,KAAuB,EAAA;AAClC,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK;AAChC,QAAA,OAAO,IAAI;IACb;AAEA;;;AAGG;AACM,IAAA,WAAW,CAAC,YAAoB,EAAA;AACvC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CACF,IAAiF,EAAA;AAEjF,QAAA,IAAI,OAAO,IAAI,KAAK,UAAU,EAAE;YAC9B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAa,EAAE,EAAE,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC;AACb,YAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE;YACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAiD,CAAC;QAC3E;aAAO;YACL,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAA4C,CAAC;QACtE;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,CACL,KAAa,EACb,OAAmD,EACnD,EAAgB,EAAA;AAEhB,QAAA,MAAM,MAAM,GAAG,EAAE,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE;QACvD,MAAM,OAAO,GAAG,IAAI,WAAW,CAAa,MAAM,EAAE,KAAK,CAAC;QAC1D,OAAO,CAAC,OAAO,CAAC;AAChB,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAiD,CAAC;AACzE,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,CAAC,MAAmB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM;AAChC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CAAC,IAAoB,EAAA;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI;AACvB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,YAAY,CAAC,OAAgC,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,OAAO;AAClC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,UAAU,CAAC,OAAoC,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO;AAChC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,gBAAgB,CAAC,UAAoD,EAAA;AACnE,QAAA,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,UAAU;AACzC,QAAA,OAAO,IAAI;IACb;AACD;;AC/EK,MAAO,gBAAqD,SAAQ,gBAIzE,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC;YACJ,IAAI,EAAE,SAAS,CAAC,IAAI;AACpB,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;AACT,SAAA,CAAC;IACJ;AAQS,IAAA,KAAK,CACZ,KAAuH,EAAA;AAEvH,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,KAAgC,CAAC;IACtD;AAEA,IAAA,MAAM,CAAC,IAAoB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI;AACzB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,YAAY,CAAC,KAAsB,EAAA;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC;IAC/C;AAEA,IAAA,UAAU,CAAC,IAAgB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI;AAC7B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,UAAU,CAAC,OAAoC,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO;AAChC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,cAAc,CAAC,UAAmC,EAAA;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,UAAU,CAAC;IACtD;AAES,IAAA,eAAe,CAAC,UAAyB,EAAA;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC;IACvD;IAES,KAAK,GAAA;AACZ,QAAA,OAAO,KAAK,CAAC,KAAK,EAAE;IACtB;AACD;;AC1DK,MAAO,wBAA4C,SAAQ,gBAGhE,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC;YACJ,IAAI,EAAE,SAAS,CAAC,YAAY;AAC5B,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;AACT,SAAA,CAAC;IACJ;AAEA,IAAA,OAAO,CAAC,IAAY,EAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI;AAC1B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CAAC,IAAsB,EAAA;AACzB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI;AACvB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,aAAa,CAAC,MAAyC,EAAA;AACrD,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,MAAM;AAC5B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,YAAY,CAAC,MAAgC,EAAA;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,MAAM;AAC3B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,YAAY,CAAC,KAAuB,EAAA;QAClC,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC;IAC/C;AAEA,IAAA,cAAc,CAAC,UAAoC,EAAA;QACjD,OAAO,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,UAAU,CAAC;IACtD;AAES,IAAA,eAAe,CAAC,UAAyB,EAAA;QAChD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC;IACvD;IAES,KAAK,GAAA;AACZ,QAAA,OAAO,KAAK,CAAC,KAAK,EAAE;IACtB;AACD;;ACpDK,MAAO,kBAAsC,SAAQ,gBAG1D,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC;YACJ,IAAI,EAAE,SAAS,CAAC,MAAM;AACvB,SAAA,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,OAAoC,EAAA;AAC7C,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO;AAChC,QAAA,OAAO,IAAI;IACb;AACD;;MCfY,YAAY,CAAA;AACvB,IAAA,OAAO,MAAM,GAAA;QACX,OAAO,IAAI,kBAAkB,EAAW;IAC1C;AAEA,IAAA,OAAO,IAAI,GAAA;QACT,OAAO,IAAI,gBAAgB,EAAmB;IAChD;AAEA,IAAA,OAAO,YAAY,GAAA;QACjB,OAAO,IAAI,wBAAwB,EAAW;IAChD;AAEA,IAAA,OAAO,MAAM,GAAA;QACX,OAAO,IAAI,kBAAkB,EAAW;IAC1C;AACD;;MCbY,UAAU,CAAA;AAKX,IAAA,YAAA;AACA,IAAA,MAAA;AALO,IAAA,YAAY,GAAG,IAAI,OAAO,EAA4B;AACvD,IAAA,YAAY,GAAyC,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IAErG,WAAA,CACU,YAAmC,EACnC,MAAgC,EAAA;QADhC,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;AAEH,IAAA,KAAK,CAAC,MAAgB,EAAA;AACpB,QAAA,MAAM,KAAK,GAA6B;YACtC,MAAM,EAAE,gBAAgB,CAAC,SAAS;YAClC,MAAM;SACP;AACD,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;AAEA,IAAA,OAAO,CAAC,MAAwB,EAAA;AAC9B,QAAA,MAAM,KAAK,GAA6B;YACtC,MAAM;SACP;AACD,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/B;IAEQ,MAAM,iBAAiB,CAAC,KAA+B,EAAA;AAC7D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAkD;QAClF,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,UAAU,EAAE;AACrD,YAAA,MAAM,KAAK,CAAC,YAAY,EAAE;QAC5B;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;AAC7B,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC5B,IAAI,CAAC,OAAO,EAAE;IAChB;AAEA,IAAA,MAAM,CAAC,MAAyC,EAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;;AAElC,QAAA,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE;IACrD;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ;IACnC;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;IAC7B;AACD;;MC/BY,0BAA0B,CAAA;AAC7B,IAAA,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAE7B,IAAA,SAAS;AACT,IAAA,MAAM;AAEP,IAAA,YAAY;IACZ,QAAQ,GAA2B,MAAK;AAChD,IAAA,CAAC;AACO,IAAA,SAAS,GAAe,MAAK,EAAE,CAAC;IAExC,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;AAChB,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;;AAG5D,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,YAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;gBAClD,IAAI,CAAC,YAAa,CAAC,QAAoC,CAAC,GAAG,CAAC,GAAG,KAAK;AACvE,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAGlC;AACD,QAAA,IAAI,OAAO,QAAQ,CAAC,gBAAgB,KAAK,UAAU,EAAE;AACnD,YAAA,QAAQ,CAAC,gBAAgB,CAAC,CAAC,GAAY,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjE;AACA,QAAA,IAAI,OAAO,QAAQ,CAAC,iBAAiB,KAAK,UAAU,EAAE;YACpD,QAAQ,CAAC,iBAAiB,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACpD;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;IAC9B;AAEA,IAAA,UAAU,CAAC,GAAY,EAAA;AACrB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,QAAmD;QACvF,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,UAAU,EAAE;AACzD,YAAA,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;QAC1B;IACF;AAEA,IAAA,gBAAgB,CAAC,EAA0B,EAAA;AACzC,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,QAAgE;QACpG,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,gBAAgB,KAAK,UAAU,EAAE;AAC/D,YAAA,QAAQ,CAAC,gBAAgB,CAAC,UAAU,CAAC;QACvC;IACF;uGA7DW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EAR1B;AACT,YAAA;AACE,gBAAA,OAAO,EAAE,iBAAiB;AAC1B,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,0BAA0B,CAAC;AACzD,gBAAA,KAAK,EAAE,IAAI;AACZ,aAAA;AACF,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAEU,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAXtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,SAAS,EAAE;AACT,wBAAA;AACE,4BAAA,OAAO,EAAE,iBAAiB;AAC1B,4BAAA,WAAW,EAAE,UAAU,CAAC,gCAAgC,CAAC;AACzD,4BAAA,KAAK,EAAE,IAAI;AACZ,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBAIE;;sBACA;;;ACzBH;IACY;AAAZ,CAAA,UAAY,cAAc,EAAA;AACxB,IAAA,cAAA,CAAA,cAAA,CAAA,GAAA,cAA6B;AAC7B,IAAA,cAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,cAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EALW,cAAc,KAAd,cAAc,GAAA,EAAA,CAAA,CAAA;;ACHnB,MAAM,kBAAkB,GAAG,EAAE,CAAC;AACnC,IAAA,IAAI,EAAE,sCAAsC;AAC5C,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;;;;AAIL,YAAA,SAAS,EAAE,gBAAgB;AAC3B,YAAA,MAAM,EAAE,wBAAwB;AAChC,YAAA,IAAI,EAAE,aAAa;AACpB,SAAA;AACF,KAAA;AACD,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,WAAW;AACnB,KAAA;AACF,CAAA;;MCPY,UAAU,CAAA;IACZ,IAAI,GAA6B,EAAE;;;IAIF,UAAU,GAAG,MAAM;AAE7D,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,kBAAkB,CAAC,EAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAC,CAAC;IACrD;AAEA,IAAA,IACI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI;IAChC;AAEA,IAAA,IACI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI;IACjC;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK;IACrC;uGAxBW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAU,2PCVvB,4EAGA,EAAA,MAAA,EAAA,CAAA,4aAAA,CAAA,EAAA,CAAA;;2FDOa,UAAU,EAAA,UAAA,EAAA,CAAA;kBANtB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,cACX,IAAI,EAAA,QAAA,EAAA,4EAAA,EAAA,MAAA,EAAA,CAAA,4aAAA,CAAA,EAAA;;sBAKf;;sBAIA,WAAW;uBAAC,kBAAkB;;sBAE9B,WAAW;uBAAC,OAAO;;sBAKnB,WAAW;uBAAC,aAAa;;sBAKzB,WAAW;uBAAC,cAAc;;;AEzB7B;;;;;;;AAOG;MAKU,sBAAsB,CAAA;;AAExB,IAAA,aAAa;AAEL,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAErC,cAAc,GAAa,EAAE;;AAGpB,IAAA,QAAQ,GAA6B;AACpD,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC;AAC/B,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC;AAC/B,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC;KAChC;IAED,WAAW,GAAA;;AAET,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC;QACvD;AACA,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;AACjD,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC;YACpD;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,OAAO;QAC/B;IACF;uGA9BW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAGE;;;ACdH;;;;;AAKG;MAKU,oBAAoB,CAAA;;AAEtB,IAAA,WAAW;AAEH,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAErC,cAAc,GAAa,EAAE;;AAGpB,IAAA,QAAQ,GAA6B;AACpD,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;AAC3B,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;AAC3B,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC5B;IAED,WAAW,GAAA;AACT,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC;QACvD;AACA,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/C,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC;YACpD;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,OAAO;QAC/B;IACF;uGA7BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAGE;;;ACZH;;;;;AAKG;MAKU,oBAAoB,CAAA;;AAEtB,IAAA,WAAW;AAEH,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;AACvB,IAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;IAErC,cAAc,GAAa,EAAE;;AAGpB,IAAA,QAAQ,GAA6B;AACpD,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;AAC3B,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;AAC3B,QAAA,EAAE,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;KAC5B;IAED,WAAW,GAAA;AACT,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,EAAE;AACrC,YAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC;QACvD;AACA,QAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YACvD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC;AAC/C,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;AACzB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,CAAC;YACpD;AACA,YAAA,IAAI,CAAC,cAAc,GAAG,OAAO;QAC/B;IACF;uGA7BW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAApB,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAJhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;sBAGE;;;ACMH;AACA;;;;;;;;AAQG;IACS;AAAZ,CAAA,UAAY,iBAAiB,EAAA;;AAE3B,IAAA,iBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;;AAEnB,IAAA,iBAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;;AAEvB,IAAA,iBAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACjB,CAAC,EAPW,iBAAiB,KAAjB,iBAAiB,GAAA,EAAA,CAAA,CAAA;;ACb7B;;;;;;;;;;;;AAYG;MAEmB,gBAAgB,CAAA;AAE3B,IAAA,UAAU;IAEnB,aAAa,GAAQ,EAAE;IACvB,cAAc,GAAQ,EAAE;IACxB,WAAW,GAAG,EAAE;IAChB,eAAe,GAAG,KAAK;IAEvB,WAAW,GAAG,CAAC;IACf,QAAQ,GAAG,EAAE;AAEb;;;;;AAKG;IACH,eAAe,GAAG,CAAC;AAEnB;;;;;;;AAOG;IACH,cAAc,GAAG,CAAC;;IAGV,kBAAkB,GAAG,KAAK;AAEf,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;;IAEhC,aAAa,GAAW,cAAc;AACjD,IAAA,gBAAgB;AAChB,IAAA,aAAa,GAAG,IAAI,OAAO,EAAU;AACrC,IAAA,kBAAkB;AAClB,IAAA,gBAAgB;;AAEhB,IAAA,uBAAuB;AAE/B,IAAA,WAAA,GAAA;;;;;QAKE,gBAAgB,CAAC,MAAK;YACpB,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,cAAc;gBAAE;YACzE,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ;gBAAE;AAClD,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa;AAC7C,YAAA,IAAI,CAAC,EAAE;gBAAE;AACT,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,YAAY;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC;IACJ;;AAIA;;;;AAIG;AACH,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,iBAAiB,CAAC,SAAS;IAC7D;;AAGA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,eAAe,KAAK,iBAAiB,CAAC,OAAO;IAC3D;;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,eAAe,KAAK,iBAAiB,CAAC,KAAK;IACzD;;;AAKA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc;IACzC;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;AAC3C,QAAA,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,wBAAwB;IAClE;;AAGA,IAAA,IAAI,iBAAiB,GAAA;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,WAAW;AAC1D,QAAA,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,WAAW;IACrD;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,IAAI,WAAW;;AAE1D,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC;YAClD,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,UAAU;QACvE;AACA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,kBAAkB;AACnD,QAAA,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB;AACtF,QAAA,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO;IACxC;;AAIA;;;AAGG;AACH,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7E,OAAO,IAAI,CAAC,cAAc;QAC5B;AACA,QAAA,OAAO,CAAC;IACV;AAEA;;;AAGG;AACH,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,IAAI;IACxE;;;AAKA,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,IAAI,EAAE;AAChE,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU;QACnC;AACA,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM;IAClC;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpE;AAEA,IAAA,IAAI,uBAAuB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAC3D;;;AAKA,IAAA,IAAI,qBAAqB,GAAA;QACvB,OAAO,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,KAAK,EAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC,CAAC;IACpF;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW;QAChC,MAAM,UAAU,GAAG,CAAC;AACpB,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AAC7D,QAAA,IAAI,GAAG,GAAG,KAAK,GAAG,UAAU,GAAG,CAAC;AAChC,QAAA,IAAI,GAAG,GAAG,KAAK,EAAE;YACf,GAAG,GAAG,KAAK;AACX,YAAA,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,UAAU,GAAG,CAAC,CAAC;QAC3C;QACA,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE;AACjC,YAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACf;AACA,QAAA,OAAO,KAAK;IACd;AAaA,IAAA,IAAI,YAAY,GAAA;;;AAGd,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,gBAAgB,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,KAAK,EAAC,CAAC;IACpC;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,sBAAsB,EAAE;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE;QAC9C,IAAI,CAAC,mBAAmB,EAAE;AAE1B,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;;QAGvB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;AAC5E,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;AAC5B,aAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;aACtB,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AACtB,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC;;QAGJ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACrE,IAAI,CAAC,sBAAsB,EAAE;AAC7B,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC;IACJ;IAEA,SAAS,GAAA;;;QAGP,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AAChD,YAAA,IAAI,CAAC,eAAe,GAAG,CAAC;QAC1B;AACA,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,sBAAsB;AACnD,QAAA,IAAI,eAAe,KAAK,IAAI,CAAC,uBAAuB,EAAE;AACpD,YAAA,IAAI,CAAC,uBAAuB,GAAG,eAAe;AAC9C,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE;AACpC,QAAA,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE;AACtC,QAAA,IAAI,CAAC,gBAAgB,EAAE,WAAW,EAAE;IACtC;AAEA,IAAA,QAAQ,CAAC,YAAoB,EAAA;AAC3B,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,QAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,IAAI,CAAC,cAAc,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,GAAG,YAAY;YAC/B,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,YAAY,CAAC;AAC9C,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;aAAO;AACL,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;QACvC;IACF;AAEA,IAAA,QAAQ,CAAC,IAAY,EAAA;QACnB,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,CAAC,UAAU;YAAE;AACxC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,wBAAwB,EAAE;YAC/D,IAAI,CAAC,eAAe,EAAE;QACxB;aAAO;YACL,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;QACtC;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;AAEA,IAAA,gBAAgB,CAAC,OAAe,EAAA;QAC9B,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO;AACvB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;QACpB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,wBAAwB,EAAE;YAC/D,IAAI,CAAC,eAAe,EAAE;QACxB;aAAO;YACL,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,OAAO,CAAC;QAC7C;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;IAEA,YAAY,GAAA;;AAEV,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAC9B,YAAA,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;YAC5B;QACF;QAEA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,IAAI,IAAI,CAAC,eAAe;YAAE;AAEjE,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;QAC3B,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,wBAAwB;cACxG,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW;AAC3D,cAAE,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE;QAExC;aACG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;aACzC,KAAK,CAAC,MAAM,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC9C;AAEA,IAAA,aAAa,CAAC,KAAc,EAAA;QAC1B,OAAO,KAAK,YAAY,WAAW;IACrC;AAEA,IAAA,SAAS,GAAG,CAAC,MAAc,EAAE,IAAO,KAAY;QAC9C,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;AACpC,IAAA,CAAC;;;IAUS,mBAAmB,GAAA;;IAE7B;AAEA;;;AAGG;IACO,sBAAsB,GAAA;AAC9B,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAC7E;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAC7E;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;QACvF;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;YAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,EAAE;gBACtC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC;YACnF;YACA,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE;gBACzC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,cAAc,CAAC;YACzF;QACF;IACF;;AAIA;;;;;AAKG;IACO,cAAc,GAAA;AACtB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa;QAC7C,IAAI,EAAE,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,YAAY;QACxC;IACF;AAEA;;;AAGG;IACO,oBAAoB,GAAA;AAC5B,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC;AACvB,QAAA,IAAI,CAAC,kBAAkB,GAAG,KAAK;IACjC;IAEU,eAAe,GAAA;QACvB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,wBAAwB,EAAE;AAC/D,YAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ;AACpD,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9E;aAAO;;AAEL,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,aAAa;QAC1C;IACF;;AAGU,IAAA,iBAAiB,CAAC,KAAU,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACxI,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;AAC3C,YAAA,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,UAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpE;AACA,QAAA,OAAO,KAAK;IACd;AAEU,IAAA,iBAAiB,CAAC,IAAS,EAAA;QACnC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CACxB,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CAC9F,CAAC,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACrC,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAC5B,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACzB;IAEU,kBAAkB,GAAA;AAC1B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc;AAC3C,QAAA,IAAI,IAAI,KAAK,WAAW,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE;gBACjC,MAAM,IAAI,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,CAAA,uHAAA,CAAyH,CAAC;YAClK;YACA,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,IAAI,EAAE;gBACtC,MAAM,IAAI,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,CAAA,0GAAA,CAA4G,CAAC;YACrJ;QACF;QACA,IAAI,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,iBAAiB,EAAE;YACtD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE;gBAC7G,MAAM,IAAI,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,aAAa,CAAA,qBAAA,EAAwB,IAAI,CAAA,8GAAA,CAAgH,CAAC;YACrL;QACF;;AAEA,QAAA,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE;AAC3B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;YAClE,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE;YAC3C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;AAC3B,gBAAA,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAA,YAAA,EAAe,IAAI,CAAA,6CAAA,EAAgD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,2CAAA,CAA6C,CAAC;YAC3K;QACF;IACF;uGA/ZoB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBADrC;;sBAGE;;;AC7BH;;;AAGG;AAEG,MAAgB,0BAGpB,SAAQ,gBAAuB,CAAA;AACrB,IAAA,eAAe,GAAG,IAAI,YAAY,EAAO;AAEnD,IAAA,WAAW,GAAG,IAAI,GAAG,EAAU;AAE/B,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM;IAC7F;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM,MAAM,MAAM;IAC7D;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,KAAK,OAAO;IAClD;AAEA,IAAA,UAAU,CAAC,IAAO,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D;AAEA,IAAA,MAAM,CAAC,IAAO,EAAA;QACZ,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,IAAI,MAAM;AAEpD,QAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B;AAAO,aAAA,IAAI,IAAI,KAAK,OAAO,EAAE;YAC3B,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AAC5B,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B;iBAAO;AACL,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B;QACF;QAEA,IAAI,CAAC,aAAa,EAAE;IACtB;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AACvD,YAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QAC1B;aAAO;YACL,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACvF;QACA,IAAI,CAAC,aAAa,EAAE;IACtB;;IAGmB,mBAAmB,GAAA;QACpC,KAAK,CAAC,mBAAmB,EAAE;QAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,EAAE;YAC9C,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,EAAE;AACnD,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B;YACA,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;IAEU,aAAa,GAAA;AACrB,QAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/G,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC;AACxC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;uGAlEoB,0BAA0B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAD/C;;sBAKE;;;ACPH;;;;;;AAMG;MAQU,sBAAsB,CAAA;;IAExB,QAAQ,GAAG,eAAe;IAE1B,WAAW,GAAG,KAAK;IACnB,iBAAiB,GAAG,KAAK;IACzB,YAAY,GAAG,KAAK;IACpB,eAAe,GAAG,KAAK;IAEvB,WAAW,GAAG,CAAC;IACf,QAAQ,GAAG,EAAE;IACb,UAAU,GAAG,CAAC;IACd,cAAc,GAAG,CAAC;IAClB,YAAY,GAAa,EAAE;IAC3B,qBAAqB,GAA6B,EAAE;AACpD,IAAA,MAAM;AAEL,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAQ;AACnC,IAAA,UAAU,GAAG,IAAI,YAAY,EAAU;AACvC,IAAA,cAAc,GAAG,IAAI,YAAY,EAAU;AAErD,IAAA,IAAI,cAAc,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,iBAAiB,CAAC;IAC5E;uGAvBW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,yiBCpBnC,6gIAkGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDlFY,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,4EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAI9B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAPlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,0BAA0B,EAAA,UAAA,EACxB,IAAI,EAAA,OAAA,EACP,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAA,eAAA,EAEzB,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6gIAAA,EAAA;;sBAI9C;;sBAEA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA;;sBACA;;sBACA;;;AELG,MAAO,OACX,SAAQ,0BAAiD,CAAA;AAC/C,IAAA,UAAU,GAAG,IAAI,YAAY,EAAoB;AACjD,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAK;IAE1C,WAAW,GAAqB,IAAI;;IAGpC,aAAa,GAAsB,EAAE;;AAG7B,IAAA,OAAgB,qBAAqB,GAAG,GAAG;AAEnD;;;;AAIG;IACO,gBAAgB,GAAG,KAAK;;IAGxB,gBAAgB,GAAG,KAAK;IAEN,aAAa,GAAG,SAAS;AAErD,IAAA,IAAc,sBAAsB,GAAA;AAClC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,mBAAmB;IAC7C;AAEuC,IAAA,cAAc;;IAGrD,cAAc,CAAC,SAAiB,EAAE,KAAa,EAAA;AAC7C,QAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,KAAK;AACrC,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;;AAGA,IAAA,sBAAsB,CAAC,MAA2B,EAAA;AAChD,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,IAAI,KAAK;QACrD,OAAO;AACL,YAAA,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAC;AAC/B,YAAA,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,EAAC,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC;SAC3F;IACH;;;AAKA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;IACxD;;AAGA,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7F;;AAGA,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,IAAI,SAAS;IAClD;;AAGA,IAAA,IAAI,uBAAuB,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,iBAAiB,IAAI,WAAW;IACzD;;IAGA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB;IAChD;;IAGA,eAAe,GAAA;QACb,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACzC,IAAI,GAAG,CAAC,UAAU;gBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;QACtD;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACzB;;IAGQ,gBAAgB,GAAA;AACtB,QAAA,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,qBAAqB;IAC3F;AAEA;;;;AAIG;AACK,IAAA,kBAAkB,CAAC,MAAe,EAAA;AACxC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACzC,QAAA,IAAI,SAAS,KAAK,IAAI,CAAC,gBAAgB;YAAE;AACzC,QAAA,IAAI,CAAC,gBAAgB,GAAG,SAAS;AACjC,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAC7C,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACrC;AAEA,IAAA,IAAI,CAAC,MAA2B,EAAA;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,IAAI;YAAE;QAEjE,IAAI,IAAI,CAAC,WAAW,EAAE,SAAS,KAAK,MAAM,CAAC,GAAG,EAAE;YAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,KAAK;kBAC9C,EAAC,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM;kBACzC,IAAI;QACV;aAAO;AACL,YAAA,IAAI,CAAC,WAAW,GAAG,EAAC,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAC;QAC9D;QAEA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AACtC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACzB;AAEA,IAAA,UAAU,CAAC,GAAM,EAAA;AACf,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;QAClB;QACA,IAAI,CAAC,UAAU,CAAC,UAAU,GAAG,GAAG,CAAC;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IACzB;;AAIA;;;;AAIG;AACH,IAAA,qBAAqB,CAAC,MAA2B,EAAA;AAC/C,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ;AAChC,QAAA,MAAM,SAAS,GAAG,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,EAAE;AAC3E,QAAA,OAAO,EAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,EAAC;IACpD;AAEA,IAAA,WAAW,CAAC,MAA2B,EAAA;AACrC,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,KAAK,MAAM,CAAC,GAAG;AAAE,YAAA,OAAO,EAAE;AAC7E,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG;IACzD;AAEA,IAAA,UAAU,CAAC,MAA2B,EAAA;AACpC,QAAA,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,IAAI;IACrE;;;AAKQ,IAAA,OAAgB,gBAAgB,GAAG,EAAE;;IAGrC,eAAe,GAAG,EAAE;;IAGpB,gBAAgB,GAAA;QACtB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,GAAG,GAAG;IACjE;AAEA;;;;;AAKG;AACK,IAAA,uBAAuB,CAAC,MAAe,EAAA;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,eAAe;AACxF,QAAA,IAAI,MAAM,KAAK,IAAI,CAAC,QAAQ;YAAE;QAC9B,IAAI,CAAC,oBAAoB,EAAE;AAC3B,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAM;AACtB,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;QAEpB,IAAI,IAAI,CAAC,UAAU,CAAC,cAAc,KAAK,wBAAwB,EAAE;YAC/D,IAAI,CAAC,eAAe,EAAE;QACxB;AAAO,aAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;;YAEjC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAC5C;AAEA,QAAA,IAAI,MAAM;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;IACrC;;IAIU,cAAc,GAAA;AACtB,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAClC,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;IAC/B;;AAGS,IAAA,gBAAgB,CAAC,OAAe,EAAA;AACvC,QAAA,IAAI,CAAC,eAAe,GAAG,OAAO;AAC9B,QAAA,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;IACjC;;IAGmB,mBAAmB,GAAA;QACpC,KAAK,CAAC,mBAAmB,EAAE;;QAG3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE;AACrD,QAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;;AAGnC,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAE9B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,IAAI;QACtD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzC,YAAA,IAAI,GAAG,CAAC,UAAU,EAAE;gBAClB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE;YAClC;QACF;IACF;;IAIA,YAAY,CAAC,MAA2B,EAAE,GAAM,EAAA;AAC9C,QAAA,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;AAAE,YAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9D,QAAA,OAAO,EAAE;IACX;;IAGA,cAAc,CAAC,MAA2B,EAAE,GAAM,EAAA;QAChD,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7F,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,UAAU,GAAG,CAAC,MAAc,EAAE,MAA2B,KAAY;QACnE,OAAO,MAAM,CAAC,GAAG;AACnB,IAAA,CAAC;;IAIQ,YAAY,GAAG,0CAA0C;AAElE,IAAA,IAAI,gBAAgB,GAAA;QAClB,IAAI,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM;QAC1C,IAAI,IAAI,CAAC,YAAY;AAAE,YAAA,KAAK,EAAE;AAC9B,QAAA,OAAO,KAAK;IACd;;AAIA;;;AAGG;IACgB,sBAAsB,GAAA;QACvC,KAAK,CAAC,sBAAsB,EAAE;QAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzC,YAAA,IAAI,GAAG,CAAC,SAAS,EAAE;AACjB,gBAAA,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;YACzC;AACA,YAAA,IAAI,GAAG,CAAC,oBAAoB,EAAE;AAC5B,gBAAA,GAAG,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,oBAAoB,CAAC;YAC/D;QACF;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC;QAC7E;AACA,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE;AACxC,YAAA,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC;QACvF;IACF;;AAIU,IAAA,WAAW,CAAC,cAAuB,EAAA;AAC3C,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;;QAGxE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;YACzC,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;AAC/C,YAAA,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,WAAW;gBAAE;AAErC,YAAA,IAAI,GAAG,CAAC,QAAQ,EAAE;AAChB,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,QAAS,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;YAC9D;iBAAO;AACL,gBAAA,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE;AACtC,gBAAA,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,IAAG;oBACzB,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;AACrE,oBAAA,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;AACvD,gBAAA,CAAC,CAAC;YACJ;QACF;AAEA,QAAA,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC1B,IAAI,CAAC,eAAe,EAAE;QAEtB,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;AAEQ,IAAA,YAAY,CAAC,KAAU,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,KAAK;QAEnC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAY,CAAC,SAAS,CAAC;AACvF,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,cAAc,CAAC,IAAI;AAAE,YAAA,OAAO,KAAK;QAExF,MAAM,QAAQ,GAAG,MAAM,CAAC,iBAAiB,KAAK,CAAC,GAAM,KAAI;AACvD,YAAA,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU;AAAE,gBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AAC9D,YAAA,OAAO,EAAE;AACX,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,KAAK,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;AAEzD,QAAA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC9B,YAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AACtB,YAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;AAEtB,YAAA,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI;AAAE,gBAAA,OAAO,CAAC;YACtC,IAAI,EAAE,IAAI,IAAI;AAAE,gBAAA,OAAO,CAAC;YACxB,IAAI,EAAE,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAC;AAEzB,YAAA,QAAQ,MAAM,CAAC,QAAQ;gBACrB,KAAK,cAAc,CAAC,YAAY;AAC9B,oBAAA,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG;gBACnD,KAAK,cAAc,CAAC,SAAS;AAC3B,oBAAA,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG;gBACxC,KAAK,cAAc,CAAC,IAAI;oBACtB,OAAO,CAAC,IAAI,IAAI,CAAC,EAAqB,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,EAAqB,CAAC,CAAC,OAAO,EAAE,IAAI,GAAG;AACtG,gBAAA;AACE,oBAAA,OAAO,CAAC;;AAEd,QAAA,CAAC,CAAC;IACJ;uGAzUW,OAAO,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClCpB,sgeA0WA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED5UY,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,oBAAoB,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,iFAAE,OAAO,EAAA,QAAA,EAAA,cAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAIlN,OAAO,EAAA,UAAA,EAAA,CAAA;kBAPnB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,UAAU,cACR,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,CAAC,EAAA,eAAA,EAE3N,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,sgeAAA,EAAA;;sBAI9C;;sBACA;;sBA0BA,SAAS;uBAAC,gBAAgB;;sBA4J1B,YAAY;uBAAC,eAAe;;;MEvMlB,yBAAyB,CAAA;AAC3B,IAAA,MAAM;AACN,IAAA,QAAQ;AAEmC,IAAA,SAAS;AAErD,IAAA,YAAY;IAEpB,QAAQ,GAAA;QACN,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACzC;IAEQ,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;AAEtB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAC7C;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C;IACF;AAEA,IAAA,eAAe,CAAC,SAAwB,EAAA;QACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC;;AAG7D,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AACtB,YAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;gBACzD,IAAI,CAAC,YAAa,CAAC,QAAoC,CAAC,GAAG,CAAC,GAAG,KAAK;AACvE,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,QAAmC;AACtE,QAAA,IAAI,QAAQ,IAAI,UAAU,IAAI,QAAQ,EAAE;AACtC,YAAA,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ;QACtC;IACF;AAEA,IAAA,cAAc,CAAC,QAA8B,EAAA;AAC3C,QAAA,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,QAAQ,EAAE;YAC1C,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA,CAAC;IACJ;uGA9CW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAIJ,gBAAgB,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EANtC,0CAA0C,2DAD1C,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAGX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBANrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,UAAU,EAAE,IAAI;oBAChB,OAAO,EAAE,CAAC,YAAY,CAAC;AACvB,oBAAA,QAAQ,EAAE,0CAA0C;AACrD,iBAAA;;sBAEE;;sBACA;;sBAEA,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,WAAW,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;;;MC+FvC,mBAAmB,CAAA;AACtB,IAAA,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;AAEvB,IAAA,MAAM;AACN,IAAA,QAAQ;IACR,UAAU,GAAG,KAAK;IAClB,cAAc,GAAG,KAAK;AACrB,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAU;AAE3B,IAAA,WAAW;AACb,IAAA,SAAS;AAEnC,IAAA,IAAI;IACJ,IAAI,GAAsB,EAAE;IAC5B,WAAW,GAA6B,EAAE;IAC1C,YAAY,GAAG,KAAK;IACX,SAAS,GAAG,SAAS;IACrB,gBAAgB,GAAG,gBAAgB;;IAG5C,UAAU,GAA2B,EAAE;;IAGvC,eAAe,GAA4B,EAAE;;IAG7C,0BAA0B,GAA4B,EAAE;;IAGxD,YAAY,GAA4B,EAAE;;IAG1C,YAAY,GAAmC,EAAE;AAEzC,IAAA,wBAAwB;AAEhC,IAAA,OAAO,CAAC,KAA8B,EAAA;AACpC,QAAA,OAAO,KAA8B;IACvC;AAEA,IAAA,KAAK,CAAC,GAA0B,EAAA;AAC9B,QAAA,OAAO,GAAa;IACtB;;;;;;AAOA,IAAA,KAAK,CAAC,GAAY,EAAA;AAChB,QAAA,OAAO,GAAG;IACZ;AAEA,IAAA,oBAAoB,CAAC,KAA8B,EAAA;QACjD,MAAM,IAAI,GAAG,KAA8B;;AAE3C,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,MAAM,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAoB;AAC7D,YAAA,IAAI,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC;AAAE,gBAAA,OAAO,IAAI;QACxD;AACA,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU;AAClC,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;;AAE7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;AAC7B,QAAA,OAAO,MAAM,IAAI,IAAI,IAAI,UAAU,IAAI,MAAM;IAC/C;;IAGA,gBAAgB,GAA6C,EAAE;AAEvD,IAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE3C,OAAgB,cAAc,GAA2B;AAC/D,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,MAAM,EAAE,QAAQ;AAChB,QAAA,UAAU,EAAE,eAAe;AAC3B,QAAA,iBAAiB,EAAE,WAAW;AAC9B,QAAA,OAAO,EAAE,YAAY;AACrB,QAAA,gBAAgB,EAAE,0BAA0B;AAC5C,QAAA,aAAa,EAAE,wBAAwB;AACvC,QAAA,cAAc,EAAE,oBAAoB;AACpC,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,OAAO,EAAE,WAAW;KACrB;IAEO,YAAY,CAAC,SAA6B,EAAE,GAAW,EAAA;AAC7D,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,SAAS;AAC/B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAC;AAClE,QAAA,OAAO,UAAU,KAAK,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,GAAG,mBAAmB,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,UAAU;IAC9F;;AAGA,IAAA,IAAI,MAAM,GAAA;;;;QAIR,MAAM,IAAI,GAER,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;QACxB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;YAChD,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC;YAChD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC;YAC5D,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;YACjF,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;YACnD,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;YAC9E,aAAa,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC;YACrE,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC;YACxE,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;YACtD,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC;SACpD;IACH;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,EAAE;QACrB,IAAI,CAAC,SAAS,EAAE;QAChB,IAAI,CAAC,oBAAoB,EAAE;QAC3B,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,uBAAuB,EAAE;AAE9B,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;AAChD,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;QACrB;;QAGA,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9C,QAAA,CAAC,CAAC;IACJ;IAEA,eAAe,GAAA;;QAEb,UAAU,CAAC,MAAK;YACd,IAAI,CAAC,cAAc,EAAE;QACvB,CAAC,EAAE,GAAG,CAAC;IACT;IAEO,cAAc,GAAA;AACnB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAK,CAA2B,CAAC,SAAS,CAAC;AAC3F,QAAA,IAAI,CAAC,cAAc;YAAE;AAErB,QAAA,MAAM,GAAG,GAAG,cAAc,CAAC,GAAa;;QAGxC,UAAU,CAAC,MAAK;;YAEd,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,CAAC;YAClE,IAAI,UAAU,EAAE;gBACd,UAAU,CAAC,KAAK,EAAE;gBAClB;YACF;;YAGA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,KAAK,GAAG,CAAC;YAC/D,IAAI,QAAQ,EAAE;gBACZ,QAAQ,CAAC,KAAK,EAAE;gBAChB;YACF;;YAGA,MAAM,EAAE,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC;AACvC,YAAA,IAAI,EAAE;gBAAE,EAAE,CAAC,KAAK,EAAE;QACpB,CAAC,EAAE,EAAE,CAAC;IACR;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,wBAAwB,EAAE,WAAW,EAAE;IAC9C;IAEQ,cAAc,GAAA;QACpB,MAAM,YAAY,GAAsD,EAAE;QAE1E,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;YACjC,MAAM,WAAW,GAAG,KAA8B;AAClD,YAAA,IAAI,YAAY,GAAY,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,GAAmB,CAAC,IAAI,IAAI;;AAGzF,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,QAAQ,IAAI,YAAY,KAAK,IAAI,EAAE;AAC9D,gBAAA,YAAY,GAAG,WAAW,CAAC,YAAY,IAAI,KAAK;YAClD;AAEF,YAAA,MAAM,UAAU,GAAG,WAAW,CAAC,UAAU,IAAI,EAAE;AAC/C,YAAA,MAAM,eAAe,GAAG,WAAW,CAAC,eAAe,IAAI,EAAE;AACzD,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,IAAI,QAAQ;AAEjD,YAAA,YAAY,CAAC,KAAK,CAAC,GAAa,CAAC,GAAG;gBAClC,YAAY;AACZ,gBAAA;oBACE,UAAU;oBACV,eAAe;oBACf;AACD;aACF;AACH,QAAA,CAAC,CAAC;QAEA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC;;AAGvC,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;YACzE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;AACpD,YAAA,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE;QACpC;;QAGA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;YACjC,MAAM,SAAS,GAAG,KAA8B;AAChD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;AAClD,YAAA,IAAI,OAAO,KAAK,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;gBACzD,OAAO,CAAC,OAAO,EAAE;YACnB;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,eAAe,CAAC,KAA8B,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAK,KAA+B,CAAC,QAAQ,KAAK,IAAI;IAC5F;AAEA,IAAA,eAAe,CAAC,KAA8B,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,IAAK,KAA+B,CAAC,QAAQ,KAAK,IAAI;IAC5F;;IAGA,eAAe,GAA4B,EAAE;IAErC,SAAS,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;QAC9B;aAAO;;AAEL,YAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU;AACxC,YAAA,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,IAAG;AAC1C,gBAAA,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAa,CAAC,CAAC,CAAC;;AAE7F,gBAAA,IAAI,CAAC,CAAC,MAAM,EAAE;AACZ,oBAAA,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAa,CAAC,CAAC;gBAC5D;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU;AACtC,YAAA,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAa,CAAC,CAAC,CAAC;AAErG,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAa,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAa,CAAC,CAAC;AAEnI,YAAA,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC/B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,KAAK,KAAK;AACzC,oBAAA,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC7B,iBAAA,CAAC,CAAC;YACL;QACF;;QAEA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE;;QAEhD,IAAI,CAAC,yBAAyB,EAAE;IAClC;IAEQ,yBAAyB,GAAA;QAC/B,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE;YAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI;AACvE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS;;YAErC,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AAC3B,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;oBAClD,IAAI,OAAO,EAAE;wBACX,OAAO,CAAC,eAAe,EAAE;wBACzB,OAAO,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBACtD;AACF,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;QACjC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,KAAI;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAC5C,YAAA,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;AACjE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS;AAErC,YAAA,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE;;AAE5B,gBAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AAC3B,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;oBAClD,IAAI,OAAO,EAAE;wBACX,OAAO,CAAC,eAAe,EAAE;wBACzB,OAAO,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBACtD;AACF,gBAAA,CAAC,CAAC;YACJ;AAAO,iBAAA,IAAI,SAAS,IAAI,CAAC,UAAU,EAAE;;AAEnC,gBAAA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;oBAC3B,MAAM,SAAS,GAAG,KAA8B;AAChD,oBAAA,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,EAAE;AAC7C,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;oBAClD,IAAI,OAAO,EAAE;AACX,wBAAA,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC;wBACjC,OAAO,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBACtD;AACF,gBAAA,CAAC,CAAC;YACJ;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,KAA6B,EAAA;AAC1C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,IAAI,CAAA,MAAA,EAAS,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACrE,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IAClC;;;;IAMQ,oBAAoB,GAAA;AAC1B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAwB;QACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AACjC,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAa;YAC/B,MAAM,SAAS,GAAG,KAA8B;AAChD,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;AACzE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS;;YAGrC,IAAI,CAAC,SAAS,EAAE;gBACd,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAClC,IAAI,OAAO,EAAE;oBACX,OAAO,CAAC,eAAe,EAAE;oBACzB,OAAO,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACtD;YACF;AAAO,iBAAA,IAAI,SAAS,CAAC,qBAAqB,EAAE;;gBAE1C,MAAM,UAAU,GAAG,SAAS,CAAC,qBAAqB,CAAC,SAAS,CAAC;AAC7D,gBAAA,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,GAAG,UAAU;gBACjD,IAAI,UAAU,EAAE;oBACd,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;oBAClC,IAAI,OAAO,EAAE;wBACX,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC;AAC7D,wBAAA,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC;wBACjC,OAAO,CAAC,sBAAsB,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC;oBACpD;gBACF;YACF;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,gBAAgB,GAAA;AACtB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAwB;QACpD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AACjC,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAa;YAC/B,MAAM,SAAS,GAAG,KAA8B;YAChD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAC5C,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;AACzE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,SAAS;;YAGrC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAClC,IAAI,OAAO,EAAE;AACX,gBAAA,IAAI,CAAC,SAAS,IAAI,UAAU,EAAE;oBAC5B,OAAO,CAAC,eAAe,EAAE;oBACzB,OAAO,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACtD;AAAO,qBAAA,IAAI,SAAS,IAAI,CAAC,UAAU,EAAE;;oBAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC;AAC7D,oBAAA,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC;oBACjC,OAAO,CAAC,sBAAsB,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC;gBACpD;qBAAO,IAAI,SAAS,EAAE;;AAEpB,oBAAA,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,SAAS,CAAC;gBACxD;YACF;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;;;;AAKG;IACK,eAAe,CAAC,KAA4B,EAAE,SAA0B,EAAA;AAC9E,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE;QACpE,IAAI,KAAK,CAAC,qBAAqB,IAAI,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC,EAAE;YACzE,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;AACjD,gBAAA,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;YAC1C;QACF;AACA,QAAA,OAAO,cAAc;IACvB;AAEA;;;;AAIG;IACK,2BAA2B,CAAC,KAA4B,EAAE,SAA0B,EAAA;QAC1F,IAAI,CAAC,KAAK,CAAC,qBAAqB;YAAE;AAClC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAa;QAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,KAAK;QACjE,MAAM,UAAU,GAAG,KAAK,CAAC,qBAAqB,CAAC,SAAS,CAAC;AACzD,QAAA,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,GAAG,UAAU;AAEjD,QAAA,IAAI,UAAU,KAAK,WAAW,EAAE;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAClC,IAAI,OAAO,EAAE;gBACX,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC;AACzD,gBAAA,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC;gBACjC,OAAO,CAAC,sBAAsB,CAAC,EAAC,SAAS,EAAE,KAAK,EAAC,CAAC;YACpD;QACF;IACF;AAEA,IAAA,cAAc,CAAC,KAA8B,EAAA;QAC3C,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAa,CAAC;IAClD;;;;IAMQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc;YAAE;AAEjC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK;QACjC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;AAClD,YAAA,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC;YACnC,IAAI,MAAM,EAAE;gBACV,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;YACxC;QACF;IACF;AAEA,IAAA,aAAa,CAAC,GAAW,EAAA;QACvB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI;IACrC;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC;IAChD;;;;IAMQ,qBAAqB,GAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;YACjC,MAAM,SAAS,GAAG,KAA8B;AAChD,YAAA,IAAI,SAAS,CAAC,UAAU,EAAE;AACxB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAa,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,KAAwB,CAAC;YACtG;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,cAAc,CAAC,GAAW,EAAA;AACxB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;IAC/B;;AAGA,IAAA,eAAe,CAAC,KAA8B,EAAA;AAC5C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,GAAa;QAC/B,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;AACxC,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QAC/B;AACA,QAAA,OAAQ,KAA+B,CAAC,OAAO,IAAI,EAAE;IACvD;;AAGA,IAAA,gBAAgB,CAAC,KAA8B,EAAA;AAC7C,QAAA,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK;YAC3C,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,CAAC,CAAC,KAAK;AACd,YAAA,QAAQ,EAAE,CAAC,CAAC,KAAK,KAAK,UAAU;AACjC,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,cAAc,CAAC,KAA8B,EAAA;QAC3C,OAAO;YACL,EAAE,EAAE,KAAK,CAAC,GAAa;YACvB,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK;YAChC,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAa,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB;AAC3G,YAAA,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AACrC,YAAA,SAAS,EAAE,IAAI;SAChB;IACH;AAEQ,IAAA,MAAM,gBAAgB,CAAC,GAAW,EAAE,UAA2B,EAAE,SAA0B,EAAA;AACjG,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI;AAC7B,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;QAC3D;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,CAAA,kCAAA,EAAqC,GAAG,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;AAClE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE;QAC7B;gBAAU;AACR,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK;QAChC;IACF;;;;IAMQ,qBAAqB,GAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,kBAAkB,EAAE;gBAC/C,MAAM,UAAU,GAAG,KAA4C;AAC/D,gBAAA,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe;;AAErC,gBAAA,EAAE,CAAC,aAAa,GAAG,OAAO;;AAG1B,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;AAClD,gBAAA,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACvE,oBAAA,EAAE,CAAC,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC;gBACtE;qBAAO,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,EAAE;oBAC5C,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC5C;gBAEA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAa,CAAC,GAAG,EAAE;YACjD;iBAAO,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,mBAAmB,EAAE;gBACvD,MAAM,UAAU,GAAG,KAA6C;AAChE,gBAAA,MAAM,EAAE,GAAG,UAAU,CAAC,eAAe;;AAErC,gBAAA,EAAE,CAAC,aAAa,GAAG,QAAQ;;AAG3B,gBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;gBAClD,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI,EAAE;oBACpC,EAAE,CAAC,kBAAkB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACjD;gBAEA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAa,CAAC,GAAG,EAAE;YACjD;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,sBAAsB,CAAC,KAA8B,EAAE,YAAuB,EAAA;QAC5E,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CAAC,mBAAmB,EAAE;YAChD,MAAM,UAAU,GAAG,KAA6C;YAChE,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,eAAe,CAAC,KAAK;YACzE,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;AACtE,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;YAClD,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO,CAAC,aAAa,EAAE;YACzB;QACF;aAAO;YACL,MAAM,UAAU,GAAG,KAA4C;YAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,eAAe,CAAC,KAAK;AACzE,YAAA,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;AACnD,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;YAClD,IAAI,OAAO,EAAE;AACX,gBAAA,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACxB,OAAO,CAAC,aAAa,EAAE;YACzB;QACF;IACF;;;;AAMA,IAAA,cAAc,CAAC,KAA8B,EAAA;AAC3C,QAAA,MAAM,GAAG,GAAI,KAAmC,CAAC,GAAG,IAAI,CAAC;QACzD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD;IAEA,SAAS,CAAC,KAA8B,EAAE,KAAa,EAAA;AACrD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;QAClD,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAO,CAAC,aAAa,EAAE;QACzB;IACF;AAEA,IAAA,cAAc,CAAC,KAA8B,EAAA;AAC3C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC,EAAE,KAAK,IAAI,CAAC;IACvD;;;;IAMA,cAAc,CAAC,KAA8B,EAAE,KAAY,EAAA;AACzD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;QAClD,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAO,CAAC,aAAa,EAAE;QACzB;IACF;AAEA,IAAA,cAAc,CAAC,KAA8B,EAAA;QAC3C,MAAM,CAAC,GAAG,KAAkC;AAC5C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IAChE;;;;IAMA,aAAa,CAAC,KAA8B,EAAE,KAAY,EAAA;AACxD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;QAClD,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;YAC7B,OAAO,CAAC,aAAa,EAAE;QACzB;IACF;IAEA,kBAAkB,CAAC,KAA8B,EAAE,KAAa,EAAA;AAC9D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC;QAClD,IAAI,OAAO,EAAE;AACX,YAAA,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAO,CAAC,aAAa,EAAE;QACzB;IACF;AAEA,IAAA,aAAa,CAAC,KAA8B,EAAA;AAC1C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAa,CAAC,EAAE,KAAK,IAAI,SAAS;IAC/D;;;;IAMQ,uBAAuB,GAAA;;QAE7B,IAAI,CAAC,iBAAiB,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;AAE/C,QAAA,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,IAAG;;YAE3E,IAAI,CAAC,gBAAgB,EAAE;;YAGvB,IAAI,CAAC,qBAAqB,EAAE;;YAG5B,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,YAAA,IAAI,CAAC,0BAA0B,CAAC,SAAS,CAAC;;YAG1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;AAC9C,QAAA,CAAC,CAAC;IACJ;IAEQ,iBAAiB,GAAoB,EAAE;AAEvC,IAAA,0BAA0B,CAAC,SAA0B,EAAA;QAC3D,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;YACjC,MAAM,SAAS,GAAG,KAA8B;AAChD,YAAA,MAAM,UAAU,GAAgC,SAAS,CAAC,UAAU;YACpE,IAAI,CAAC,UAAU,EAAE,SAAS;gBAAE;;YAG5B,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAG;gBACjD,OAAO,SAAS,CAAC,MAAsB,CAAC,KAAK,IAAI,CAAC,iBAAiB,CAAC,MAAsB,CAAC;AAC7F,YAAA,CAAC,CAAC;YAEF,IAAI,OAAO,EAAE;gBACX,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAa,EAAE,UAAU,EAAE,SAAS,CAAC;YACnE;AACF,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,iBAAiB,GAAG,EAAE,GAAG,SAAS,EAAE;IAC3C;;;;AAMA;;;;;AAKG;AACH,IAAA,aAAa,CAAC,KAA8B,EAAA;AACzC,QAAA,KAAiC,CAAC,OAAO,IAAI;IAChD;AAEA,IAAA,MAAM,MAAM,GAAA;;QAEV,IAAI,CAAC,iBAAiB,EAAE;AAExB,QAAA,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE;AAChE,YAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAC5B;QACF;QAEA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,IAAI,EAAE;AAC9C,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;AAEA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAgB;AAE5C,QAAA,IAAI;AACF,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC;YAChD;AACA,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;QAChC;QAAE,OAAO,KAAK,EAAE;;AAEd,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;QAChD;IACF;uGAtsBW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,aAAA,EAAA,SAAA,EAShB,YAAY,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,WAAA,EAAA,SAAA,EACZ,UAAU,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjI1B,q/kBAkcA,EAAA,MAAA,EAAA,CAAA,0fAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/UY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,8CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,sGAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,4FAAE,YAAY,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,WAAW,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,0BAA0B,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,0FAAE,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAIlM,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAP/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,cAAc,EAAA,UAAA,EACZ,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,0BAA0B,EAAE,OAAO,EAAE,yBAAyB,CAAC,EAAA,QAAA,EAAA,q/kBAAA,EAAA,MAAA,EAAA,CAAA,0fAAA,CAAA,EAAA;;sBAO7M;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEA,YAAY;uBAAC,YAAY;;sBACzB,YAAY;uBAAC,UAAU;;;ME5Fb,wBAAwB,CAAA;IAC1B,OAAO,GAAiC,EAAE;AACzC,IAAA,WAAW,GAAG,IAAI,YAAY,EAA8B;AAEtE,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;IACxD;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;IACxD;AAEA,IAAA,aAAa,CAAC,MAAkC,EAAA;AAC9C,QAAA,QAAQ,MAAM,CAAC,KAAK;YAClB,KAAK,WAAW,CAAC,OAAO;AACtB,gBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;YACzE,KAAK,WAAW,CAAC,MAAM;AACrB,gBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;YACxE,KAAK,WAAW,CAAC,KAAK;AACpB,gBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC3E,KAAK,WAAW,CAAC,SAAS;AAC1B,YAAA;AACE,gBAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE;;IAElF;uGAxBW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1BzB;;;;;;;;;;;;;;;;;;;;;;;;GAwBT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA1BS,YAAY,+BAAE,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FA4BrB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA/BpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,QAAQ,CAAC;AACjC,oBAAA,IAAI,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE;AAC3B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA;AACF,iBAAA;;sBAEE;;sBACA;;;MCKU,qBAAqB,CAAA;AACxB,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE9B,IAAA,MAAM;AACN,IAAA,QAAQ;AAEkB,IAAA,UAAU;AAChB,IAAA,YAAY;AAEzC,IAAA,aAAa;IACb,cAAc,GAAkB,EAAE;IAClC,kBAAkB,GAAG,IAAI;IACzB,YAAY,GAAG,KAAK;IACpB,YAAY,GAA2B,EAAE;AAEzC;;;AAGG;IACH,iBAAiB,GAAG,CAAC;AAEb,IAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE3C,OAAgB,cAAc,GAA2B;AAC/D,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,QAAQ,EAAE,UAAU;AACpB,QAAA,UAAU,EAAE,eAAe;KAC5B;IAEO,YAAY,CAAC,SAA6B,EAAE,GAAW,EAAA;AAC7D,QAAA,IAAI,SAAS;AAAE,YAAA,OAAO,SAAS;AAC/B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAC;AAClE,QAAA,OAAO,UAAU,KAAK,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,GAAG,qBAAqB,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,UAAU;IAChG;;AAGA,IAAA,IAAI,MAAM,GAAA;QACR,MAAM,IAAI,GAAI,IAAI,CAAC,MAA4C,CAAC,IAAI,IAAI,EAAE;QAC1E,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;YAC7C,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YAChD,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;YACzD,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;SAChE;IACH;;IAGA,eAAe,GAA2D,EAAE;AAEpE,IAAA,kBAAkB;AAClB,IAAA,sBAAsB;IAE9B,QAAQ,GAAA;;QAEN,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AACpC,YAAA,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;;AAEzC,gBAAA,MAAM,kBAAkB,GAAG;oBACzB,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,CAAC;AACnC,oBAAA,IAAI,IAAI,CAAC,YAAY,IAAI,EAAE;iBAC5B;AAED,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG;oBAC9B,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;oBACnC,eAAe,EAAE,IAAI,CAAC,eAAe;AACrC,oBAAA,YAAY,EAAE,kBAAkB;AAChC,oBAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;AAC9B,oBAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC;iBACc;YACxC;QACF;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;AACxE,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QAC9C;IACF;IAEA,eAAe,GAAA;;AAEb,QAAA,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,MAAK;YACnE,IAAI,CAAC,wBAAwB,EAAE;;YAE/B,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,kBAAkB,EAAE,EAAE,cAAc,EAAE;YAC7C,CAAC,EAAE,GAAG,CAAC;;YAEP,IAAI,CAAC,kBAAkB,EAAE;AAC3B,QAAA,CAAC,CAAC;;QAEF,IAAI,CAAC,wBAAwB,EAAE;;;;QAK/B,UAAU,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;;QAE9C,UAAU,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,EAAE,GAAG,CAAC;IAClD;AAEA,IAAA,UAAU,CAAC,IAAsB,EAAA;AAC/B,QAAA,OAAO,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;IACtC;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE;AACtC,QAAA,IAAI,CAAC,sBAAsB,EAAE,WAAW,EAAE;IAC5C;AAEA;;;;;AAKG;IACK,kBAAkB,GAAA;AACxB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI;YAAE;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE;AACjF,QAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE;;;AAI3B,QAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;QAC5D,IAAI,OAAO,GAAG,CAAC;AACf,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACxC,gBAAA,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,MAAM;YACxD;AACA,YAAA,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;QACvD;QACA,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpE,QAAA,IAAI,OAAO,GAAG,IAAI,CAAC,iBAAiB,EAAE;AACpC,YAAA,IAAI,CAAC,iBAAiB,GAAG,OAAO;AAChC,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;QAC1B;IACF;;AAGA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAC7D;AAEA,IAAA,aAAa,CAAC,IAAsB,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC/C;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC;IACjE;AAEA,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC;IACtE;AAEA,IAAA,IAAI,gBAAgB,GAAA;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC;IACtE;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,mBAAmB,GAAG,CAAC;IACrC;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IAChE;AAEA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;IAClE;;AAGA,IAAA,IAAI,oBAAoB,GAAA;QACtB,OAAO,IAAI,CAAC,mBAAmB;IACjC;AAEA,IAAA,IAAI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,IAAI;IACjD;AAEA,IAAA,iBAAiB,CAAC,IAAsB,EAAA;QACtC,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAClC,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;IACjC;IAEA,MAAM,QAAQ,CAAC,IAAsB,EAAA;AACnC,QAAA,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;YAAE;AACnC,QAAA,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa;YAAE;;AAGpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChC;QACF;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa;AACzC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE;AAE5B,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YACrD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QAC9C;QAEA,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,mBAAmB,CAAC,MAAM,CAAC;QACvE,IAAI,CAAC,wBAAwB,EAAE;IACjC;;IAGQ,kBAAkB,GAAA;QACxB,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,SAAS;;;AAGtC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;AAC7B,aAAA,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC;QACzD,IAAI,SAAS,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,SAAS;QACtC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC;IAC7C;IAEQ,wBAAwB,GAAA;;AAE9B,QAAA,IAAI,CAAC,kBAAkB,EAAE,WAAW,EAAE;AACtC,QAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;AAEnC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC1C,QAAA,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE;YAC7B,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK;AAC7C,YAAA,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,MAAK;gBACnE,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK;AAC7C,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAC1B,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;QAChC;AACA,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,MAAM,IAAI,GAAA;QACR,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;;AAGpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChC;QACF;AAEA,QAAA,IAAI,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE;YAC/B,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE;AACjD,YAAA,IAAI,CAAC,OAAO;gBAAE;QAChB;AAEA,QAAA,IAAI,WAAW,EAAE,UAAU,EAAE;AAC3B,YAAA,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE;AAC9C,gBAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;AACzC,gBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE;YACnC;QACF;;AAGA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,IAAI,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE;YAC5B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE;AAChD,YAAA,IAAI,CAAC,QAAQ;gBAAE;QACjB;AAEA,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa;AACzC,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,EAAE;AAEhC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YACrD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;QAC9C;QAEA,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,mBAAmB,CAAC,OAAO,CAAC;QACxE,IAAI,CAAC,wBAAwB,EAAE;IACjC;AAEA,IAAA,MAAM,IAAI,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;;AAEnB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;gBACxB,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,SAAS,CAAC;YACxD;YACA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC;YACjD;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC;AAChE,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa;;AAGzC,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC;AAEjF,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC,EAAE;QAEhC,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,mBAAmB,CAAC,QAAQ,CAAC;QACzE,IAAI,CAAC,wBAAwB,EAAE;IACjC;AAEA,IAAA,MAAM,QAAQ,GAAA;QACZ,IAAI,IAAI,CAAC,YAAY;YAAE;AAEvB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW;;AAGpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE;AACrC,YAAA,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE;YAChC;QACF;AAEA,QAAA,IAAI,WAAW,EAAE,UAAU,EAAE;AAC3B,YAAA,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE;AAC9C,gBAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE;AACzC,gBAAA,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;oBAAE;YACnC;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,QAAA,IAAI;AACF,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,EAAE;;AAG/C,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;gBAChC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE;AACpD,oBAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC;oBAC9C,IAAI,MAAM,EAAE;AACV,wBAAA,IAAI,CAAC,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,MAAM,EAAE;oBACzD;gBACF;AACA,gBAAA,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,oBAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,oBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;oBACxB;gBACF;YACF;AAEA,YAAA,MAAM,MAAM,GAAiB;gBAC3B,MAAM,EAAE,gBAAgB,CAAC,SAAS;gBAClC,cAAc,EAAE,IAAI,CAAC,cAAc;AACnC,gBAAA,OAAO,EAAE,cAAc;aACxB;AAED,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC1B,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7C;AAEA,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AACxB,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;QAClD;IACF;;IAGQ,iBAAiB,GAAA;QACvB,MAAM,UAAU,GAAiD,EAAE;QACnE,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,UAAU;AAEvC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;AAC7B,aAAA,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAEjB,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,KAAI;YAC9C,IAAI,EAAE,CAAC,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAA,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE;YACvD;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,UAAU;IACnB;AAEA;;;AAGG;AACH,IAAA,yBAAyB,CAAC,MAAkC,EAAA;AAC1D,QAAA,QAAQ,MAAM,CAAC,KAAK;YAClB,KAAK,WAAW,CAAC,MAAM;gBACrB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE;YAChD,KAAK,WAAW,CAAC,OAAO;gBACtB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE;YAC9C,KAAK,WAAW,CAAC,SAAS;gBACxB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;YACnD,KAAK,WAAW,CAAC,KAAK;gBACpB,OAAO,EAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAC;AAC9C,YAAA;gBACE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;;IAEvD;AAEA;;;AAGG;IACH,MAAM,kBAAkB,CAAC,MAAkC,EAAA;AACzD,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAwC,CAAC;QACrE;AACA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACtB,YAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,IAAI,gBAAgB,CAAC,YAAY,EAA6B;QACvG;IACF;AAEQ,IAAA,MAAM,gBAAgB,CAAC,cAA2B,EAAE,SAA8B,EAAA;AACxF,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAC5B,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;gBACpC,cAAc;gBACd,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,SAAS;AACV,aAAA,CAAC;QACJ;IACF;uGA7aW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,YAAA,EAAA,SAAA,EAMlB,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,CAAA,aAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClDnC,u8KAkJA,yDD1GY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,gGAAE,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA;;2FAIpH,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAPjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,wBAAwB,CAAC,EAAA,QAAA,EAAA,u8KAAA,EAAA;;sBAO/H;;sBACA;;sBAEA,YAAY;uBAAC,mBAAmB;;sBAChC,YAAY;uBAAC,aAAa;;;ME7BhB,2BAA2B,CAAA;AAC9B,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE9B,IAAA,MAAM;AACN,IAAA,QAAQ;AAEe,IAAA,QAAQ;IAExC,mBAAmB,GAAG,OAAO;IAC7B,aAAa,GAAG,KAAK;AAEb,IAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAEnD,QAAQ,GAAA;QACN,IAAI,CAAC,aAAa,GAAG,CAAC,EACpB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;AACpD,aAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;AAC/D,aAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAClD;IACH;AAEA,IAAA,kBAAkB,CAAC,MAAc,EAAA;AAC/B,QAAA,IAAI,CAAC,mBAAmB,GAAG,MAAM;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;IAC1B;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE;AACrD,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACrC;QACF;QAEA,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAY;QAEjF,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE;AAChC,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;QAClD;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7B;IAEA,MAAM,GAAA;AACJ,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,gBAAgB,CAAC,SAAS;AACvE,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B;AAEQ,IAAA,YAAY,CAAC,KAAyB,EAAE,GAAW,EAAE,QAAgB,EAAA;AAC3E,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,KAAK;AACvB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,CAAC;AAClE,QAAA,OAAO,UAAU,KAAK,CAAA,OAAA,EAAU,GAAG,CAAA,CAAE,GAAG,QAAQ,GAAG,UAAU;IAC/D;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;IAC5E;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;IACzE;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,IAAI,WAAW,CAAC,OAAO;IAC1D;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,WAAW,CAAC,SAAS;IAC3D;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,KAAK,gBAAgB,CAAC,OAAO;AAC3B,gBAAA,OAAO,cAAc;YACvB,KAAK,gBAAgB,CAAC,MAAM;AAC1B,gBAAA,OAAO,aAAa;AACtB,YAAA;AACE,gBAAA,OAAO,cAAc;;IAE3B;AAEA,IAAA,cAAc,CAAC,KAAkB,EAAA;QAC/B,QAAQ,KAAK;YACX,KAAK,WAAW,CAAC,OAAO;AACtB,gBAAA,OAAO,SAAS;YAClB,KAAK,WAAW,CAAC,MAAM;AACrB,gBAAA,OAAO,QAAQ;YACjB,KAAK,WAAW,CAAC,KAAK;AACpB,gBAAA,OAAO,WAAW;AACpB,YAAA;AACE,gBAAA,OAAO,WAAW;;IAExB;AAEA,IAAA,gBAAgB,CAAC,KAAkB,EAAA;QACjC,QAAQ,KAAK;YACX,KAAK,WAAW,CAAC,OAAO;YACxB,KAAK,WAAW,CAAC,MAAM;AACrB,gBAAA,OAAO,MAAM;YACf,KAAK,WAAW,CAAC,KAAK;AACpB,gBAAA,OAAO,MAAM;AACf,YAAA;AACE,gBAAA,OAAO,SAAS;;IAEtB;AACA,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,OAAO,IAAI,CAAC,mBAAmB,KAAK,OAAO;QAC7C;AACA,QAAA,OAAO,KAAK;IACd;uGA7GW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAM3B,mBAAmB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5BhC,4gGAmGA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjFY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,yBAAyB,+FAAE,mBAAmB,EAAA,CAAA,EAAA,CAAA;;2FAI1F,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAPvC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,mBAAmB,CAAC,EAAA,QAAA,EAAA,4gGAAA,EAAA;;sBAOrG;;sBACA;;sBAEA,SAAS;uBAAC,mBAAmB;;;ME2BnB,qBAAqB,CAAA;AACxB,IAAA,EAAE,GAAG,MAAM,CAA0B,UAAU,CAAC;AAChD,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AACvC;AAC2F;AACnF,IAAA,OAAgB,cAAc,GAAG,GAAG;AAEnC,IAAA,MAAM;AACN,IAAA,QAAQ;IAEjB,SAAS,GAAG,KAAK;AACjB;;;;;;AAMG;AACM,IAAA,SAAS,GAAG,MAAM,CAAC,KAAK,qDAAC;IACzB,SAAS,GAAG,SAAS;IACtB,wBAAwB,GAAuB,IAAI;IACnD,iBAAiB,GAAwC,IAAI;IAC7D,YAAY,GAA0C,IAAI;IAC1D,YAAY,GAAG,CAAC;IAExB,QAAQ,GAAA;QACN,IAAI,CAAC,wBAAwB,EAAE;IACjC;AACA;AAC4F;AACpF,IAAA,OAAgB,kBAAkB,GAAG,EAAE;IAE/C,WAAW,GAAA;QACT,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,WAAW,EAAE;;AAElB,QAAA,IAAI,IAAI,CAAC,wBAAwB,IAAI,OAAO,IAAI,CAAC,wBAAwB,CAAC,KAAK,KAAK,UAAU,EAAE;AAC9F,YAAA,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE;QACvC;IACF;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAgB,KAAI;AAC5C,YAAA,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;gBAAE;AACrB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,gBAAgB,CACtD,0IAA0I,CAC3I;AACD,YAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE;AAC5B,YAAA,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,YAAA,IAAI,CAAC,CAAC,QAAQ,EAAE;AACd,gBAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,KAAK,EAAE;oBACpC,CAAC,CAAC,cAAc,EAAE;oBAClB,IAAI,CAAC,KAAK,EAAE;gBACd;YACF;iBAAO;AACL,gBAAA,IAAI,QAAQ,CAAC,aAAa,KAAK,IAAI,EAAE;oBACnC,CAAC,CAAC,cAAc,EAAE;oBAClB,KAAK,CAAC,KAAK,EAAE;gBACf;YACF;AACF,QAAA,CAAC;AACD,QAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC;IAC3E;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AAC1B,YAAA,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC;AAC5E,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC/B;IACF;AAEA,IAAA,QAAQ,CAAC,MAA4B,EAAA;AACnC,QAAA,OAAO,MAAsC;IAC/C;AAEA,IAAA,MAAM,CAAC,MAA4B,EAAA;AACjC,QAAA,OAAO,MAAoC;IAC7C;AAEA,IAAA,cAAc,CAAC,MAA4B,EAAA;AACzC,QAAA,OAAO,MAA4C;IACrD;AAEA,IAAA,QAAQ,CAAC,MAA4B,EAAA;AACnC,QAAA,OAAO,MAAsC;IAC/C;AAEQ,IAAA,OAAgB,uBAAuB,GAAG,GAAG;;IAE7C,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACtD;AACwF;IAChF,UAAU,GAAoC,IAAI;AAE1D;;AAEmF;AAC3E,IAAA,OAAgB,iBAAiB,GAAG,GAAG;;AAG/C,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,KAAK,KAAK;IAChD;AAEA;;;;;;;;;AASG;IACH,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,OAAO,CAAC,OAAO,IAAG;YAC3B,UAAU,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;;;;;;gBAMrB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC9C,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;AAExB,gBAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,oBAAA,OAAO,EAAE;oBACT;gBACF;AAEA,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,kBAAkB,CAAuB;gBAC/F,IAAI,CAAC,SAAS,EAAE;AACd,oBAAA,OAAO,EAAE;oBACT;gBACF;gBAEA,IAAI,OAAO,GAAG,KAAK;AACnB,gBAAA,MAAM,IAAI,GAAG,CAAC,KAAa,KAAU;;AAEnC,oBAAA,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;wBAAE;AACzC,oBAAA,IAAI,OAAO;wBAAE;oBACb,OAAO,GAAG,IAAI;AACd,oBAAA,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC;AACnD,oBAAA,SAAS,CAAC,mBAAmB,CAAC,eAAe,EAAE,IAAI,CAAC;oBACpD,YAAY,CAAC,QAAQ,CAAC;AACtB,oBAAA,OAAO,EAAE;AACX,gBAAA,CAAC;;;AAID,gBAAA,SAAS,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC;AAChD,gBAAA,SAAS,CAAC,gBAAgB,CAAC,eAAe,EAAE,IAAI,CAAC;;gBAEjD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,EAAE,qBAAqB,CAAC,iBAAiB,CAAC;AAC5E,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEQ,oBAAoB,GAAA;QAC1B,OAAO,OAAO,MAAM,KAAK;AACpB,eAAA,OAAO,MAAM,CAAC,UAAU,KAAK;AAC7B,eAAA,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO;IACpE;AAGA,IAAA,WAAW,CAAC,KAAY,EAAA;QACtB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,OAAO,EAAE;AACjD,YAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACzC,YAAA,IAAI,KAAK,IAAI,KAAK,CAAC,cAAc,EAAE;gBACjC,KAAK,CAAC,cAAc,EAAE;YACxB;QACF;IACF;IAEA,eAAe,GAAA;QACb,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC;AACrD,gBAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,MAAM,CAAC;QACzE,IAAI,WAAW,EAAE;AACf,YAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAC7C;IACF;IAEA,kBAAkB,GAAA;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC;IAC9C;AACA;AAC+E;IAC/E,eAAe,GAAG,KAAK;;;;;IAMvB,UAAU,GAAG,CAAC;;IAEd,eAAe,GAAG,KAAK;IACf,UAAU,GAAoC,IAAI;AAE1D,IAAA,IAA0B,WAAW,GAAA;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE;;;;;;;;QAQlD,MAAM,QAAQ,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK;AAChD,cAAE,IAAI,CAAC,MAAM,CAAC;cACZ,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,OAAO;AAC1C,QAAA,MAAM,SAAS,GAAG,CAAA,MAAA,EAAS,QAAQ,EAAE;AACrC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,aAAa,GAAG,EAAE;AACrD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,eAAe,GAAG,EAAE;AAC7D,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,GAAG,mBAAmB,GAAG,EAAE;QAC/D,OAAO,CAAA,kBAAA,EAAqB,IAAI,CAAA,EAAG,SAAS,CAAA,EAAG,OAAO,CAAA,EAAG,WAAW,CAAA,EAAG,OAAO,CAAA,CAAE;IAClF;IACQ,UAAU,GAAG,CAAC;;AAGtB,IAAA,IAAY,QAAQ,GAAA;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ;IACrD;;AAGQ,IAAA,OAAgB,eAAe,GAAG,MAAM;IAEhD,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC,aAA4B;QACrE,IAAI,CAAC,cAAc,EAAE;;AAErB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,kBAAkB,CAAgB;QACxF,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,KAAK,EAAE;QACnB;IACF;AAEA,IAAA,kBAAkB,CAAC,KAAmB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;;AAE3C,QAAA,IAAI,MAAM,CAAC,UAAU,GAAG,qBAAqB,CAAC,eAAe;YAAE;;AAE/D,QAAA,IAAK,KAAK,CAAC,MAAsB,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE;AACrD,QAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,OAAO;;;AAG/B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAC,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,EAAC;AACxD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAChC,KAAK,CAAC,MAAsB,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;IAClE;AAEA,IAAA,kBAAkB,CAAC,KAAmB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;;AAE3B,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;;AAE9D,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;AACjC,QAAA,IAAI,CAAC,UAAU,GAAG,EAAC,CAAC,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,EAAC;IAC1D;AAEA,IAAA,MAAM,gBAAgB,GAAA;QACpB,IAAI,CAAC,IAAI,CAAC,eAAe;YAAE;AAC3B,QAAA,IAAI,CAAC,eAAe,GAAG,KAAK;AAE5B,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC;YACjE,IAAI,MAAM,EAAE;;AAEV,gBAAA,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC;;;AAG9B,gBAAA,IAAI,CAAC,eAAe,GAAG,IAAI;AAC3B,gBAAA,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,WAAW;AACpC,gBAAA,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE;YAC1B;iBAAO;AACL,gBAAA,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB;QACF;aAAO;AACL,YAAA,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB;AAEA,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;IACxB;;IAGQ,kBAAkB,GAAA;QACxB,IAAI,IAAI,CAAC,UAAU,GAAG,qBAAqB,CAAC,uBAAuB,EAAE;AACnE,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,IAAI,CAAC,eAAe,EAAE,GAAG,qBAAqB,CAAC;AACjD,eAAA,IAAI,CAAC,UAAU,GAAG,qBAAqB,CAAC,kBAAkB;IACjE;AAEA;AACoE;IAC5D,eAAe,GAAA;QACrB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,CAAC;AAClD,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,EAAE,IAAI,CAAC;AAAE,YAAA,OAAO,CAAC;AACrB,QAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE;IACrD;;IAGQ,QAAQ,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,GAAG,CAAC;IACrB;AAEA;AAC2E;IACnE,MAAM,WAAW,CAAC,MAAwB,EAAA;QAChD,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ,EAAE;AAChD,YAAA,OAAO,KAAK;QACd;QAEA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,OAAO,EAAE;AAC/C,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;gBAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAC9C,gBAAA,IAAI,CAAC,OAAO;AAAE,oBAAA,OAAO,KAAK;YAC5B;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;AAC7B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,IAAI;IACnD;AAEA,IAAA,IAAI,kBAAkB,GAAA;QACpB,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,SAAS,CAAC,EAAE;AAC3C,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,MAAM;AAChC,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,WAAW;AACrC,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,WAAW;AACrC,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,WAAW;AACrC,YAAA,KAAK,SAAS,CAAC,IAAI,EAAE,OAAO,UAAU;AACtC,YAAA,SAAS,OAAO,WAAW;;IAE/B;AAEA,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AACvE,YAAA,OAAO,MAAM;QACf;AACA,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;AAAE,YAAA,OAAO,IAAI;AACxC,QAAA,QAAQ,IAAI,CAAC,MAAM,CAAC,UAAU;AAC5B,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,MAAM;AAChC,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,MAAM;AAChC,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,MAAM;AAChC,YAAA,KAAK,SAAS,CAAC,EAAE,EAAE,OAAO,MAAM;AAChC,YAAA,KAAK,SAAS,CAAC,IAAI,EAAE,OAAO,MAAM;AAClC,YAAA,SAAS,OAAO,IAAI;;IAExB;AAEA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,QAAQ;IACrD;;;;AAMA,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;IAC5E;AAEA,IAAA,IAAI,iBAAiB,GAAA;QACnB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;IAC7E;AAEA,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;IAC7E;IAEA,MAAM,cAAc,CAAC,MAAkC,EAAA;QACrD,IAAI,MAAM,CAAC,QAAQ;YAAE;AACrB,QAAA,IAAI,MAAM,CAAC,OAAO,EAAE;YAClB,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC;AACA,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;YACtB,IAAI,MAAM,CAAC,WAAW,KAAK,gBAAgB,CAAC,SAAS,EAAE;AACrD,gBAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACvB;iBAAO;AACL,gBAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,gBAAgB,CAAC,SAAS,CAAC;YACzE;QACF;IACF;AAEA,IAAA,oBAAoB,CAAC,KAAmB,EAAA;QACtC,QAAQ,KAAK;AACX,YAAA,KAAK,WAAW,CAAC,OAAO,EAAE,OAAO,SAAS;AAC1C,YAAA,KAAK,WAAW,CAAC,MAAM,EAAE,OAAO,QAAQ;AACxC,YAAA,KAAK,WAAW,CAAC,KAAK,EAAE,OAAO,WAAW;AAC1C,YAAA,SAAS,OAAO,WAAW;;IAE/B;AAEA,IAAA,sBAAsB,CAAC,KAAmB,EAAA;QACxC,QAAQ,KAAK;YACX,KAAK,WAAW,CAAC,OAAO;AACxB,YAAA,KAAK,WAAW,CAAC,MAAM,EAAE,OAAO,MAAM;AACtC,YAAA,KAAK,WAAW,CAAC,KAAK,EAAE,OAAO,MAAM;AACrC,YAAA,SAAS,OAAO,SAAS;;IAE7B;;;;IAMQ,wBAAwB,GAAA;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;AACd,QAAA,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK;YAAE;QACjC,IAAI,CAAC,YAAY,EAAE;IACrB;IAEQ,YAAY,GAAA;AAClB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;AACnC,QAAA,IAAI,CAAC,OAAO;YAAE;AAEd,QAAA,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,YAAW;YACzC,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI;gBACF,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtD,gBAAA,IAAI,UAAU,KAAK,IAAI,EAAE;oBACvB,IAAI,CAAC,WAAW,EAAE;gBACpB;YACF;YAAE,OAAO,CAAC,EAAE;AACV,gBAAA,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACpC;AACA,YAAA,IAAI,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE;gBACnE,IAAI,CAAC,WAAW,EAAE;YACpB;AACF,QAAA,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;IACtB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC;AAChC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI;QAC1B;IACF;uGA9bW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,sPCvDlC,6yJAwHA,EAAA,MAAA,EAAA,CAAA,0qFAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED7EI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,mBAAmB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACnB,2BAA2B,iGAC3B,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,wBAAwB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,QAAQ,4FACR,OAAO,EAAA,QAAA,EAAA,cAAA,EAAA,CAAA,EAAA,CAAA;;2FAKE,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAhBjC,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,qBAAqB;wBACrB,mBAAmB;wBACnB,2BAA2B;wBAC3B,yBAAyB;wBACzB,wBAAwB;wBACxB,QAAQ;wBACR,OAAO;AACR,qBAAA,EAAA,QAAA,EAAA,6yJAAA,EAAA,MAAA,EAAA,CAAA,0qFAAA,CAAA,EAAA;;sBAWA;;sBACA;;sBA8JA,YAAY;uBAAC,yBAAyB,EAAE,CAAC,QAAQ,CAAC;;sBAkClD,WAAW;uBAAC,OAAO;;;MEvPT,cAAc,CAAA;AACR,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACtC,UAAU,GAA0B,EAAE;AAEvD,IAAA,IAAI,CAAsC,MAAoC,EAAA;;AAE5E,QAAA,MAAM,YAAY,GAAG,eAAe,CAAC,qBAAqB,EAAE;YAC1D,mBAAmB,EAAE,IAAI,CAAC,QAAQ;AACnC,SAAA,CAA4D;;AAG7D,QAAA,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,MAA8B;;QAG7D,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAU,YAAY,EAAE,MAA8B,CAAC;AACtF,QAAA,YAAY,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ;;QAGzC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;YAC5D,SAAS,CAAC,SAA4C,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QAC7E;AACA,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAA0C,CAAC;;QAGhE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;AAC7C,QAAA,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,aAAa;AACnD,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;;AAGlC,QAAA,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,MAAK;YACnC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC7C,OAAO,CAAC,MAAM,EAAE;;YAGhB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,QAA0C,CAAC;AACjF,YAAA,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;gBACd,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBAChC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9B,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;oBAC3D,QAAQ,CAAC,SAA4C,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC7E;YACF;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,QAAQ;IACjB;uGA/CW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cAFb,MAAM,EAAA,CAAA;;2FAEP,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACPD;;ACeA;AACA,MAAM,2BAA2B,GAA+B;AAC9D,IAAA,EAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAC;IAC7B,EAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAC;CACjD;AAUK,MAAO,MACX,SAAQ,0BAAgD,CAAA;AAC9C,IAAA,SAAS,GAAG,IAAI,YAAY,EAAK;IAEf,aAAa,GAAG,QAAQ;;AAGpD,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;QACzC,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;YAC7C,OAAO,QAAQ,CAAC,KAAK;QACvB;AACA,QAAA,OAAO,2BAA2B;IACpC;;AAIA,IAAA,WAAW,CAAC,IAAO,EAAA;QACjB,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;;AAIA,IAAA,IAAc,sBAAsB,GAAA;AAClC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,eAAe;IACzC;AAEuC,IAAA,cAAc;;AAI3C,IAAA,WAAW,CAAC,cAAuB,EAAA;AAC3C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC3E,IAAI,CAAC,eAAe,EAAE;QAEtB,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;uGAvCW,MAAM,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7BnB,6nLAmJA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED3HY,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKxE,MAAM,EAAA,UAAA,EAAA,CAAA;kBARlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,cACP,IAAI,EAAA,OAAA,EACP,CAAC,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAGnE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,6nLAAA,EAAA;;sBAI9C;;sBA0BA,SAAS;uBAAC,gBAAgB;;;AEzC7B;AACA,MAAM,2BAA2B,GAA+B;IAC9D,EAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC;AACnD,IAAA,EAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAC;IAC7B,EAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAC;CACjD;AAED;;;;;;AAMG;AASG,MAAO,MAAoB,SAAQ,gBAAsC,CAAA;AACnE,IAAA,SAAS,GAAG,IAAI,YAAY,EAAK;IAEf,aAAa,GAAG,QAAQ;;AAGpD,IAAA,IAAI,YAAY,GAAA;QACd,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY;IAC/C;;;AAKA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ;QACzC,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE;YAC7C,OAAO,QAAQ,CAAC,KAAK;QACvB;AACA,QAAA,OAAO,2BAA2B;IACpC;;AAIA,IAAA,IAAc,sBAAsB,GAAA;AAClC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,eAAe;IACzC;AAEuC,IAAA,cAAc;;AAIrD,IAAA,WAAW,CAAC,IAAO,EAAA;QACjB,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC;AACnC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;IAC3B;;AAIU,IAAA,WAAW,CAAC,cAAuB,EAAA;AAC3C,QAAA,IAAI,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;;QAGxE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ;AACjD,QAAA,IAAI,QAAQ,IAAI,IAAI,EAAE;YACpB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;QAClC;AAEA,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;QAC1B,IAAI,CAAC,eAAe,EAAE;QAEtB,IAAI,cAAc,EAAE;YAClB,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;uGArDW,MAAM,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAN,MAAM,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCnB,y8JAoIA,EAAA,MAAA,EAAA,CAAA,i5BAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnGY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,0BAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,uBAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAK9E,MAAM,EAAA,UAAA,EAAA,CAAA;kBARlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,cACP,IAAI,EAAA,OAAA,EACP,CAAC,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,sBAAsB,CAAC,EAAA,eAAA,EAGzE,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,y8JAAA,EAAA,MAAA,EAAA,CAAA,i5BAAA,CAAA,EAAA;;sBAG9C;;sBA0BA,SAAS;uBAAC,gBAAgB;;;AE7D7B;;AAEG;IACS;AAAZ,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,YAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,YAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACb,CAAC,EAJW,YAAY,KAAZ,YAAY,GAAA,EAAA,CAAA,CAAA;AAmCxB;;;AAGG;AACH,SAAS,aAAa,CAAC,MAAc,EAAA;AACnC,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE;IAC1B,MAAM,IAAI,GAAa,EAAE;AACzB,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAC7B,QAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9D,QAAA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D;AACA,IAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE;AACxB;AAEA;AACO,MAAM,uBAAuB,GAAmB,CAAC,MAAK;IAC3D,MAAM,MAAM,GAAG,OAAO;AACtB,IAAA,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;IACnC,OAAO;AACL,QAAA,SAAS,EAAE,CAAC;AACZ,QAAA,OAAO,EAAE,EAAE;QACX,MAAM;AACN,QAAA,UAAU,EAAE,OAAO;AACnB,QAAA,mBAAmB,EAAE,iBAAiB;AACtC,QAAA,gBAAgB,EAAE,oBAAoB;AACtC,QAAA,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE;QACxD,aAAa,EAAE,KAAK,CAAC,KAAK;QAC1B,YAAY,EAAE,KAAK,CAAC,IAAI;AACxB,QAAA,gBAAgB,EAAE,GAAG;KACtB;AACH,CAAC;AAED;;;;;;;;;;;;;AAaG;MACU,eAAe,GAAG,IAAI,cAAc,CAAiB,gBAAgB,EAAE;AAClF,IAAA,UAAU,EAAE,MAAM;AAClB,IAAA,OAAO,EAAE,MAAM;AAChB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MACU,kBAAkB,GAAG,IAAI,cAAc,CAAiB,oBAAoB;AAEzF;AACO,MAAM,0BAA0B,GAAG;AAE1C;;;;;;;;AAQG;AACG,SAAU,uBAAuB,CAAC,OAAiC,EAAA;IACvE,OAAO,wBAAwB,CAAiB,kBAAkB,EAAE,0BAA0B,EAAE,OAAO,CAAC;AAC1G;AAEA;;AAEG;AACG,SAAU,qBAAqB,CAAC,OAAiC,EAAA;AACrE,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,EAAE,GAAG,uBAAuB,EAAE;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,uBAAuB,CAAC,MAAM;AAC/D,IAAA,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;IACnC,OAAO;AACL,QAAA,GAAG,uBAAuB;AAC1B,QAAA,GAAG,OAAO;QACV,MAAM;AACN,QAAA,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC,KAAK;AACnD,QAAA,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,IAAI;KACjD;AACH;;AC1HA;;;;;;;;;AASG;MACU,uBAAuB,GAAG,IAAI,cAAc,CAAwB,uBAAuB;;ACnCxG;;;;;;;;;;AAUG;MAEU,4BAA4B,CAAA;AACtB,IAAA,MAAM;AAEvB,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,MAAM,GAAG,MAAM,CAAwB,eAAe,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;QAE/E,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,uBAAuB,CAAC,MAAM;IAChE;;IAGA,WAAW,CAAC,IAAY,EAAE,MAAc,EAAA;AACtC,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACjC,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAC7E;IACH;;AAGA,IAAA,UAAU,CAAC,IAAsB,EAAA;AAC/B,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAC7E;IACH;;AAGA,IAAA,cAAc,CAAC,IAAU,EAAA;QACvB,OAAO,EAAE,CACP,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE;YAC/B,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS;AAC/C,YAAA,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE;AAC1B,SAAA,CAAC,CACH;IACH;;AAGA,IAAA,UAAU,CAAC,IAAU,EAAA;QACnB,OAAO,EAAE,CACP,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE;YACnC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE;AACvC,SAAA,CAAC,CACH;IACH;;AAGA,IAAA,wBAAwB,CAAC,IAAU,EAAA;AACjC,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;AAC5B,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACtD,QAAA,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACjD,QAAA,OAAO,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE;IACzB;;IAGA,SAAS,CAAC,KAAW,EAAE,KAAW,EAAA;QAChC,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,WAAW;AAC3C,eAAA,KAAK,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,QAAQ;eACnC,KAAK,CAAC,OAAO,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE;IAC1C;;AAGA,IAAA,eAAe,CAAC,IAAU,EAAA;QACxB,OAAO,OAAO,CAAC,OAAO,CACpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CACrE;IACH;uGAjEW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAA5B,4BAA4B,EAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC;;;ACRD;;;;;AAKG;MAqDU,sBAAsB,CAAA;;AAExB,IAAA,QAAQ;;AAER,IAAA,aAAa;;AAEb,IAAA,eAAe;;AAEf,IAAA,MAAM;;AAEL,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;IAE/C,UAAU,GAAgB,EAAE;AAC5B,IAAA,YAAY;IAEJ,MAAM,GAAoB,EAAE;AAC5B,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,IAAA,SAAS;AAEjB,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,4BAA4B,EAAE;AACnD,QAAA,IAAI,CAAC,YAAY,GAAG,uBAAuB,CAAC,YAAY;IAC1D;IAEA,QAAQ,GAAA;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,uBAAuB,EAAE;AAClG,QAAA,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY;QACzC,IAAI,CAAC,UAAU,EAAE;AAEjB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AACnE,gBAAA,IAAI,CAAC,MAAM,GAAG,MAAM;gBACpB,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;AACnE,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;gBACpB,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;;AAGA,IAAA,UAAU,CAAC,IAAU,EAAA;AACnB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;;AAGA,IAAA,cAAc,CAAC,KAAa,EAAA;AAC1B,QAAA,OAAO,KAAK;IACd;;IAGA,gBAAgB,CAAC,MAAc,EAAE,IAAe,EAAA;AAC9C,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;IAC5B;;IAGA,eAAe,CAAC,MAAc,EAAE,KAAoB,EAAA;QAClD,OAAO,KAAK,CAAC,EAAE;IACjB;;IAGQ,UAAU,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;QACxC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACtC,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACzC,QAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;QAE5C,IAAI,WAAW,GAAG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;QACvC,IAAI,WAAW,GAAG,CAAC;YAAE,WAAW,GAAG,CAAC;AAEpC,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AAEpB,QAAA,KAAK,IAAI,CAAC,GAAG,WAAW,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AACzC,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACtC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAChE;AAEA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/D;QAEA,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;AAC7C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,EAAE,EAAE;AACnC,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAChE;IACF;AAEQ,IAAA,eAAe,CAAC,IAAU,EAAE,cAAuB,EAAE,KAAW,EAAA;AACtE,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC;QACrD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IACpC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC;AACzC,aAAC,CAAC,CAAC,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CACzC;QAED,OAAO;YACL,IAAI;AACJ,YAAA,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE;YACzB,cAAc;YACd,OAAO;AACP,YAAA,MAAM,EAAE;SACT;IACH;uGApHW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClEnC,usCAkCA,EAAA,MAAA,EAAA,CAAA,+gCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDjBY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAiDX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBApDlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,usCAAA,EAAA,MAAA,EAAA,CAAA,+gCAAA,CAAA,EAAA;;sBAmDtB;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;;AEzEH;;;;;;;;;;;AAWG;MAEU,0BAA0B,CAAA;AAErC;;AAEG;AACH,IAAA,aAAa,CAAC,MAAY,EAAE,IAAU,EAAE,MAAY,EAAE,IAAU,EAAA;AAC9D,QAAA,OAAO,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI;IACvC;AAEA;;AAEG;AACH,IAAA,0BAA0B,CAAC,MAAuB,EAAE,KAAW,EAAE,GAAS,EAAA;QACxE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,IACpB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CACvD;IACH;AAEA;;;;;;AAMG;IACH,uBAAuB,CACrB,MAAuB,EACvB,SAAiB,EACjB,OAAe,EACf,UAAgB,EAChB,QAAc,EAAA;QAEd,MAAM,MAAM,GAAoB,EAAE;AAElC,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAExC,IAAI,UAAU,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY,EAAE,EAAE;gBACzD,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC;gBACzB;YACF;AAEA,YAAA,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC;YACpC,IAAI,OAAO,GAAG,IAAI;YAElB,OAAO,OAAO,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,EAAE;AAC/C,gBAAA,IAAI,OAAO,IAAI,UAAU,EAAE;AACzB,oBAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;AAClC,oBAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;oBAEhC,IAAI,OAAO,EAAE;wBACX,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACnC;yBAAO;wBACL,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBACrC,IAAI,OAAO,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY,EAAE,EAAE;AACtD,4BAAA,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;wBACnE;6BAAO;4BACL,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBACnC;oBACF;oBAEA,MAAM,CAAC,IAAI,CAAC;AACV,wBAAA,GAAG,KAAK;wBACR,SAAS,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ;AAC1C,wBAAA,OAAO,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY,EAAE,GAAG,QAAQ,GAAG,MAAM;wBAC/E,SAAS,EAAE,CAAC,OAAO;wBACnB,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,QAAQ,CAAC,YAAY;AAC/D,qBAAA,CAAC;gBACJ;gBAEA,OAAO,GAAG,KAAK;gBACf,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACtC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9B;QACF;AAEA,QAAA,OAAO,MAAM;IACf;AAEA;;;;;;AAMG;AACH,IAAA,qBAAqB,CAAC,MAAuB,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACvC,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;YAC1D,IAAI,IAAI,KAAK,CAAC;AAAE,gBAAA,OAAO,IAAI;AAC3B,YAAA,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;AACtG,QAAA,CAAC,CAAC;AAEF,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,MAAM,CAAC;QAC/D;IACF;AAEA;;;AAGG;AACH,IAAA,oBAAoB,CAAC,MAAuB,EAAE,SAAe,EAAE,OAAa,EAAA;AAC1E,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;YAC3F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC/D,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC;YACxF,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC;AAE1C,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,EAAE;AAClD,gBAAA,KAAK,CAAC,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YAChD;AACA,YAAA,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC;AAAE,gBAAA,KAAK,CAAC,KAAK,GAAG,CAAC;QACtC;IACF;;IAGQ,0BAA0B,CAAC,KAAoB,EAAE,SAA0B,EAAA;AACjF,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,IACpC,CAAC,KAAK;eACH,CAAC,CAAC,MAAM,KAAK;eACb,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,CAC9E;QAED,IAAI,MAAM,GAAG,CAAC;AACd,QAAA,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE;AACjD,YAAA,MAAM,EAAE;QACV;AACA,QAAA,OAAO,MAAM;IACf;;AAGQ,IAAA,wBAAwB,CAC9B,KAAoB,EACpB,SAA0B,EAC1B,UAAgB,EAChB,QAAc,EAAA;AAEd,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC;QAC9F,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC/D,QAAA,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC;QAE/B,MAAM,YAAY,GAAG;aAClB,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;aAChE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AAE1B,QAAA,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,OAAO,YAAY,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAC3C;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;IACxD;uGAxJW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAA1B,0BAA0B,EAAA,CAAA;;2FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBADtC;;;ACfD;;AAEG;MACU,eAAe,CAAA;AAC1B;;;AAGG;IACH,OAAO,gBAAgB,CAAC,IAAU,EAAA;AAChC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;QACzB,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG;IAC5B;AAEA;;;;;;;;AAQG;AACH,IAAA,OAAO,aAAa,CAAC,IAAY,EAAE,MAAc,EAAE,SAAiB,EAAA;AAClE,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,SAAS;QACnC,MAAM,GAAG,GAAG,UAAU,GAAG,CAAC,IAAI,MAAM,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QACvD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC;IACzB;AACD;;ACpBD;;;;;AAKG;MAsCU,6BAA6B,CAAA;AAChC,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAGvC,IAAA,KAAK;IACL,aAAa,GAAG,EAAE;AAEV,IAAA,SAAS;AAEjB,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,SAAS,GAAG,MAAM,CAA+B,uBAAuB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;QAEjG,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,4BAA4B,EAAE;IAClE;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AACnE,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC/D,IAAI,CAAC,aAAa,GAAG,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,EAAE;AACxC,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;QACzB;IACF;uGAtBW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClD1C,+ZAOA,EAAA,MAAA,EAAA,CAAA,4bAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDSY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAkCX,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBArCzC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,+ZAAA,EAAA,MAAA,EAAA,CAAA,4bAAA,CAAA,EAAA;;;AEPzB;;;;;;;;AAQG;MAaU,sBAAsB,CAAA;;AAExB,IAAA,KAAK;;AAEL,IAAA,eAAe;;AAEd,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAEa,IAAA,cAAc;IAE7E,QAAQ,GAAG,KAAK;IAExB,eAAe,GAAA;QACb,IAAI,CAAC,eAAe,EAAE;IACxB;AAEA,IAAA,WAAW,CAAC,OAAsB,EAAA;AAChC,QAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE;YACrE,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;;IAGA,YAAY,GAAA;QACV,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;IACpC;;IAGQ,eAAe,GAAA;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAC1B,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC3B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,EAAE,SAAS,IAAI,6BAA6B;QAChG,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,SAAS,CAAC;QACzD,GAAG,CAAC,QAA8B,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;AACtD,QAAA,GAAG,CAAC,iBAAiB,CAAC,aAAa,EAAE;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;uGApCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAQI,gBAAgB,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtCvD,4KAGA,0GDkBY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FASX,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAZlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,EAAA,UAAA,EACjB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,4KAAA,EAAA,MAAA,EAAA,CAAA,mDAAA,CAAA,EAAA;;sBAWtB;;sBAEA;;sBAEA;;sBAEA,SAAS;uBAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,IAAI,EAAE;;;AEXvE;;;;;AAKG;MA6EU,qBAAqB,CAAA;AACxB,IAAA,aAAa,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAClD,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAG9B,IAAA,QAAQ;;AAER,IAAA,aAAa;;AAEb,IAAA,eAAe;;AAEf,IAAA,MAAM;;AAEN,IAAA,sBAAsB;;AAErB,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;IAE1D,OAAO,GAAgB,EAAE;IACzB,QAAQ,GAAqB,EAAE;IAC/B,aAAa,GAAoB,EAAE;IACnC,SAAS,GAAG,CAAC;IACb,cAAc,GAAG,CAAC;IAClB,cAAc,GAAG,EAAE;IACnB,mBAAmB,GAAG,gBAAgB;IAE9B,YAAY,GAA+C,EAAE;IAC7D,MAAM,GAAoB,EAAE;AAC5B,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,IAAA,SAAS;AACT,IAAA,cAAc;AACd,IAAA,mBAAmB;AAE3B,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,4BAA4B,EAAE;IACrD;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,uBAAuB,EAAE;QACvG,IAAI,CAAC,YAAY,EAAE;QACnB,IAAI,CAAC,iBAAiB,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAAC;AAE7E,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AACnE,gBAAA,IAAI,CAAC,MAAM,GAAG,MAAM;gBACpB,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;AACnE,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;gBACpB,IAAI,CAAC,YAAY,EAAE;gBACnB,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,iBAAiB,EAAE;AACxB,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1D;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxB,IAAI,IAAI,CAAC,mBAAmB;AAAE,YAAA,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACvE;;AAGA,IAAA,WAAW,CAAC,KAAoB,EAAA;QAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,CAC5C,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CACxF;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CACpF;AACD,QAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE;IAC1D;;AAGA,IAAA,eAAe,CAAC,QAAgB,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM;AAAE,YAAA,OAAO,CAAA,EAAG,QAAQ,GAAG,CAAC,WAAW;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;QAC3C,OAAO,CAAA,EAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA,QAAA,EAAW,OAAO,CAAC,UAAU,CAAA,CAAE;IAC/D;;AAGA,IAAA,cAAc,CAAC,KAAoB,EAAA;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7F,IAAI,MAAM,GAAG,CAAC;AAAE,YAAA,OAAO,YAAY;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACzC,QAAA,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ;AACrD,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC;AAC9B,QAAA,OAAO,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,KAAK,EAAE;IACpC;;AAGA,IAAA,YAAY,CAAC,KAAoB,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;;IAGA,WAAW,CAAC,MAAc,EAAE,GAAmB,EAAA;QAC7C,OAAO,GAAG,CAAC,IAAI;IACjB;;IAGA,aAAa,CAAC,MAAc,EAAE,GAAc,EAAA;AAC1C,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;IAC3B;;IAGA,YAAY,CAAC,MAAc,EAAE,KAAoB,EAAA;QAC/C,OAAO,KAAK,CAAC,EAAE;IACjB;AAEQ,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS;AACzE,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,GAAG,CAAC;QAE1B,MAAM,IAAI,GAAqB,EAAE;AACjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,CAAC;AAC9C,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI;AACJ,gBAAA,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACjB,gBAAA,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACpB,gBAAA,SAAS,EAAE;AACZ,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;;IAGQ,YAAY,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa;AACpD,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;QAExB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AAClC,QAAA,MAAM,YAAY,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG;QAC7C,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtC,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC;AAEtD,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE;AACjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;YAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAClC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBAChB,IAAI;AACJ,gBAAA,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AACtB,gBAAA,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE;gBACzB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK;AAC9C,aAAA,CAAC;QACJ;IACF;;IAGQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;AACvC,QAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAElC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IACnC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAC/E;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAC7D,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAC3F;;AAGD,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,YAAA,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC/C,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7B,YAAA,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAEhC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAC3C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC5D;AAED,YAAA,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,SAAS,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC;QACtE;QAEA,IAAI,CAAC,gBAAgB,EAAE;QACvB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;;IAGQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACtB,IAAI,UAAU,GAAG,CAAC;AAElB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1B,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAC3C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC5D;YAED,IAAI,UAAU,GAAG,CAAC;AAClB,YAAA,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE;gBACzB,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;YACrE;AAEA,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;YACxE,UAAU,IAAI,UAAU;QAC1B;QAEA,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE;AACnC,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE;gBACvC,KAAK,CAAC,IAAI,CAAC,CAAA,EAAG,CAAC,GAAG,GAAG,CAAC,UAAU,CAAA,EAAA,CAAI,CAAC;YACvC;QACF;QACA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;IAC5C;;IAGQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjF,QAAA,IAAI,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;AACzC,YAAA,IAAI,CAAC,cAAc,GAAG,CAAA,EAAG,OAAO,CAAC,QAAQ,CAAA,QAAA,EAAW,OAAO,CAAC,UAAU,CAAA,CAAE;YACxE,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;QACtH;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,EAAE;AACxB,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC;QACzB;IACF;uGA5OW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EAvErB,CAAC,0BAA0B,CAAC,0BCtCzC,mlEAoDA,EAAA,MAAA,EAAA,CAAA,u0CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhBY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAyEnC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA5EjC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,sBAAsB,CAAC,EAAA,SAAA,EAEpC,CAAC,0BAA0B,CAAC,EAAA,QAAA,EAAA,mlEAAA,EAAA,MAAA,EAAA,CAAA,u0CAAA,CAAA,EAAA;;sBA4EtC;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;;AEjGH;;;;;AAKG;MAoDU,oBAAoB,CAAA;AACvB,IAAA,aAAa,GAAG,MAAM,CAAC,0BAA0B,CAAC;AAClD,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;;AAG9B,IAAA,QAAQ;;AAER,IAAA,aAAa;;AAEb,IAAA,eAAe;;AAEf,IAAA,MAAM;;AAEN,IAAA,sBAAsB;;AAErB,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;IAE1D,QAAQ,GAAqB,EAAE;IAC/B,aAAa,GAAoB,EAAE;IACnC,SAAS,GAAG,CAAC;IACb,YAAY,GAAG,CAAC;IAChB,cAAc,GAAG,CAAC;IAClB,OAAO,GAAG,KAAK;IACf,OAAO,GAAG,EAAE;IAEJ,MAAM,GAAoB,EAAE;AAC5B,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,IAAA,SAAS;AACT,IAAA,cAAc;AACd,IAAA,mBAAmB;AAE3B,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,4BAA4B,EAAE;IACrD;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,uBAAuB,EAAE;QACvG,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,iBAAiB,EAAE;AACxB,QAAA,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,EAAE,KAAK,CAAC;AAE7E,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AACnE,gBAAA,IAAI,CAAC,MAAM,GAAG,MAAM;gBACpB,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC,CAAC;QACJ;AAEA,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,IAAG;AACnE,gBAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;gBACpB,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,aAAa,EAAE;gBACpB,IAAI,CAAC,iBAAiB,EAAE;AACxB,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,IAAI,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC1D;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;QACxB,IAAI,IAAI,CAAC,mBAAmB;AAAE,YAAA,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;IACvE;;AAGA,IAAA,WAAW,CAAC,KAAoB,EAAA;QAC9B,MAAM,QAAQ,GAAG,eAAe,CAAC,aAAa,CAC5C,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CACxF;QACD,MAAM,MAAM,GAAG,eAAe,CAAC,aAAa,CAC1C,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CACpF;AACD,QAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE;IAC1D;;AAGA,IAAA,cAAc,CAAC,KAAoB,EAAA;QACjC,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC;AACnC,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC;AAC9B,QAAA,OAAO,CAAA,EAAG,GAAG,CAAA,QAAA,EAAW,KAAK,EAAE;IACjC;;AAGA,IAAA,YAAY,CAAC,KAAoB,EAAA;AAC/B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAC/B;;IAGA,WAAW,CAAC,MAAc,EAAE,GAAmB,EAAA;QAC7C,OAAO,GAAG,CAAC,IAAI;IACjB;;IAGA,YAAY,CAAC,MAAc,EAAE,KAAoB,EAAA;QAC/C,OAAO,KAAK,CAAC,EAAE;IACjB;AAEQ,IAAA,MAAM,aAAa,GAAA;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS;AACzE,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,GAAG,CAAC;QAE1B,MAAM,IAAI,GAAqB,EAAE;AACjC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,CAAC;AAC9C,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC;gBACR,IAAI;AACJ,gBAAA,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACjB,gBAAA,SAAS,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;AACpB,gBAAA,SAAS,EAAE;AACZ,aAAA,CAAC;QACJ;AACA,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;;IAGQ,aAAa,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC;AAC7D,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACrC,QAAA,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC;AAC/C,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC;IACrC;;IAGQ,aAAa,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;QAEpB,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC1C,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;QACxC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;AAElC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IACnC,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAC/E;QAED,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,uBAAuB,CAC7D,QAAQ,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAC3F;QAED,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,aAAa,CAAC;AAC5D,QAAA,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,EAAE,UAAU,EAAE,QAAQ,CAAC;AAEjF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACxG,QAAA,IAAI,CAAC,YAAY,GAAG,MAAM;IAC5B;;IAGQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;AACtB,QAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE;YACjE,IAAI,CAAC,cAAc,GAAG,eAAe,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AACpH,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACrB;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC;AACvB,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QACtB;IACF;uGArKW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,SAAA,EA9CpB,CAAC,0BAA0B,CAAC,0BCtCzC,w3DA+CA,EAAA,MAAA,EAAA,CAAA,i2CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,sBAAsB,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,iBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAgDnC,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAnDhC,SAAS;+BACE,iBAAiB,EAAA,UAAA,EACf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,sBAAsB,CAAC,EAAA,SAAA,EAEpC,CAAC,0BAA0B,CAAC,EAAA,QAAA,EAAA,w3DAAA,EAAA,MAAA,EAAA,CAAA,i2CAAA,CAAA,EAAA;;sBAmDtC;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;;AE7FH;;;AAGG;MAqBU,yBAAyB,CAAA;;AAE3B,IAAA,KAAK;;AAEJ,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;IAE1D,aAAa,GAAG,EAAE;AAEV,IAAA,SAAS;AAEjB,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,SAAS,GAAG,MAAM,CAA+B,uBAAuB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;QAEjG,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,4BAA4B,EAAE;IAClE;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;AACnE,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YAC/D,IAAI,CAAC,aAAa,GAAG,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,GAAG,EAAE;QAC1C;IACF;uGAtBW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BtC,6ZAQA,EAAA,MAAA,EAAA,CAAA,ifAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDKY,YAAY,EAAA,CAAA,EAAA,CAAA;;2FAiBX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBApBrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,UAAA,EACrB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,6ZAAA,EAAA,MAAA,EAAA,CAAA,ifAAA,CAAA,EAAA;;sBAmBtB;;sBAEA;;;AE3BH;;;AAGG;MAqBU,uBAAuB,CAAA;;AAEzB,IAAA,aAAa;;AAEb,IAAA,MAAM;;AAEL,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;IAE1D,cAAc,GAAoB,EAAE;AACpC,IAAA,KAAK;AACL,IAAA,eAAe;AAEP,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEtC,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,KAAK,GAAG,uBAAuB,CAAC,mBAAmB;AACxD,QAAA,IAAI,CAAC,eAAe,GAAG,uBAAuB,CAAC,gBAAgB;IACjE;;AAGA,IAAA,WAAW,CAAC,OAAsB,EAAA;QAChC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YACpC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;AACnD,YAAA,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,mBAAmB;AACzC,YAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,gBAAgB;QAClD;IACF;IAEA,QAAQ,GAAA;QACN,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,uBAAuB,EAAE;AAClG,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,mBAAmB;AACzC,QAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,gBAAgB;AAEhD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AACnE,gBAAA,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,CAAC,cAAc,GAAG;qBACnB,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,GAAG;qBAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;AAC5D,qBAAA,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;AACjB,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;;IAGA,YAAY,CAAC,MAAc,EAAE,KAAoB,EAAA;QAC/C,OAAO,KAAK,CAAC,EAAE;IACjB;uGApDW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC/BpC,ybAYA,EAAA,MAAA,EAAA,CAAA,kLAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEY,YAAY,+BAAE,yBAAyB,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAiBtC,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBApBnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,cAClB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,yBAAyB,CAAC,EAAA,QAAA,EAAA,ybAAA,EAAA,MAAA,EAAA,CAAA,kLAAA,CAAA,EAAA;;sBAmBjD;;sBAEA;;sBAEA;;;AEDH;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MAoBU,qBAAqB,CAAA;;IAEvB,UAAU,GAAG,KAAK;;IAElB,WAAW,GAAG,EAAE;;IAEhB,OAAO,GAAqB,EAAE;;AAE9B,IAAA,sBAAsB;;AAEtB,IAAA,qBAAqB;;AAGpB,IAAA,4BAA4B,GAAG,IAAI,YAAY,EAAQ;;AAEvD,IAAA,wBAAwB,GAAG,IAAI,YAAY,EAAiB;;AAE5D,IAAA,kBAAkB,GAAG,IAAI,YAAY,EAAQ;IAE9C,YAAY,GAAG,YAAY;AACpC,IAAA,WAAW,GAAG,YAAY,CAAC,IAAI;AAC/B,IAAA,QAAQ,GAAG,IAAI,IAAI,EAAE;IACrB,cAAc,GAAG,EAAE;IACnB,WAAW,GAA6C,EAAE;IAC1D,YAAY,GAAG,KAAK;IACpB,YAAY,GAAG,KAAK;;AAGpB,IAAA,qBAAqB,GAAG,IAAI,eAAe,CAAkB,EAAE,CAAC;;AAEhE,IAAA,uBAAuB,GAAG,IAAI,OAAO,EAAQ;AAErC,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAC9B,IAAA,SAAS;AACP,IAAA,MAAM;;AAEC,IAAA,WAAW;AACX,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,IAAA,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEjD,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,SAAS,GAAG,MAAM,CAA+B,uBAAuB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACjG,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAwB,kBAAkB,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;AACpF,QAAA,MAAM,YAAY,GAAG,MAAM,CAAwB,eAAe,EAAE,EAAC,QAAQ,EAAE,IAAI,EAAC,CAAC;QAErF,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,4BAA4B,EAAE;;AAEhE,QAAA,IAAI,CAAC,WAAW,GAAG,QAAQ;;AAE3B,QAAA,MAAM,GAAG,GAAG,QAAQ,IAAI,YAAY,IAAI,SAAS;AACjD,QAAA,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,GAA0C,CAAC;IACjF;IAGA,QAAQ,GAAA;QACN,IAAI,CAAC,eAAe,EAAE;IACxB;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,iBAAiB,EAAE;;AAGxB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAK;YACzD,IAAI,CAAC,iBAAiB,EAAE;AAC1B,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC;QAElD,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AAErD,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAG;AAC3E,gBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC;AACzC,YAAA,CAAC,CAAC;QACJ;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IAC1B;;AAGA,IAAA,UAAU,CAAC,IAAkB,EAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG;YACnC;QACF;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;IACzB;;IAGA,gBAAgB,GAAA;QACd,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjC,QAAA,QAAQ,IAAI,CAAC,WAAW;YACtB,KAAK,YAAY,CAAC,KAAK;gBAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAAE;YACvD,KAAK,YAAY,CAAC,IAAI;gBAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAAE;YACpD,KAAK,YAAY,CAAC,GAAG;gBAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAAE;;AAErD,QAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrB;;IAGA,YAAY,GAAA;QACV,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjC,QAAA,QAAQ,IAAI,CAAC,WAAW;YACtB,KAAK,YAAY,CAAC,KAAK;gBAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;gBAAE;YACvD,KAAK,YAAY,CAAC,IAAI;gBAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAAE;YACpD,KAAK,YAAY,CAAC,GAAG;gBAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBAAE;;AAErD,QAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;IACrB;;IAGA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC;IAC9B;;AAGA,IAAA,iBAAiB,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK;QACtD,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC;IACF;;AAGA,IAAA,kBAAkB,CAAC,KAAa,EAAA;QAC9B,IAAI,KAAK,EAAE;YACT,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC;IACF;;AAGA,IAAA,eAAe,CAAC,IAAU,EAAA;AACxB,QAAA,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG;AACnC,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACxB;;AAGA,IAAA,YAAY,CAAC,KAAoB,EAAA;AAC/B,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3C;;IAGA,WAAW,CAAC,MAAc,EAAE,IAA6B,EAAA;QACvD,OAAO,IAAI,CAAC,KAAK;IACnB;;IAGQ,iBAAiB,GAAA;;AAEvB,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,IAAI,CAAC,WAAsC,CAAC;QAClF;QACA,IAAI,CAAC,WAAW,GAAG;AACjB,YAAA,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE;AAChF,YAAA,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE;AAC7E,YAAA,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK;SACzE;IACH;IAEQ,eAAe,GAAA;AACrB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY;AACnC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU;AAC/B,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK,GAAG,GAAG;QAC/B,IAAI,CAAC,YAAY,GAAG,KAAK,IAAI,GAAG,IAAI,KAAK,GAAG,IAAI;AAChD,QAAA,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,SAAS,EAAE;AACnC,YAAA,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,GAAG;QACrC;IACF;AAEQ,IAAA,WAAW,CAAC,IAAU,EAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,eAAe,EAAE;AACtB,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9C;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC9E;uGAtLW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,OAAA,EAAA,SAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,4BAAA,EAAA,8BAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,eAAA,EAAA,YAAA,EAAA,EAAA,EAAA,SAAA,EALrB;YACT,uBAAuB,CAAC,uBAAuB,CAAC;AACjD,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5EH,slNAgIA,EAAA,MAAA,EAAA,CAAA,oEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDhEI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,sBAAsB,2JACtB,qBAAqB,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,uBAAuB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,QAAQ,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACR,UAAU,8EACV,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAQF,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAnBjC,SAAS;+BACE,kBAAkB,EAAA,UAAA,EAChB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,sBAAsB;wBACtB,qBAAqB;wBACrB,oBAAoB;wBACpB,uBAAuB;wBACvB,QAAQ;wBACR,UAAU;wBACV;qBACD,EAAA,SAAA,EAEU;wBACT,uBAAuB,CAAC,uBAAuB,CAAC;AACjD,qBAAA,EAAA,QAAA,EAAA,slNAAA,EAAA,MAAA,EAAA,CAAA,oEAAA,CAAA,EAAA;;sBAKA;;sBAEA;;sBAEA;;sBAEA;;sBAEA;;sBAGA;;sBAEA;;sBAEA;;sBAoCA,YAAY;uBAAC,eAAe;;;AEpI/B;;ACQA;AACA,MAAM,0BAA0B,GAAG,CAAC;AAEpC;;;AAGG;MAOU,cAAc,CAAA;;AAEhB,IAAA,UAAU;AAEnB;;;AAGG;IACM,UAAU,GAAG,KAAK;AAE3B;;;AAGG;IACM,SAAS,GAAG,KAAK;;AAGhB,IAAA,YAAY,GAAG,IAAI,YAAY,EAAa;;AAGtD,IAAA,aAAa;AAEb;;;AAGG;AACH,IAAA,IAAI,cAAc,GAAA;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,iBAAiB,CAAC,OAAO;IAC5D;AAEA;;;AAGG;AACH,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,KAAK,GACT,IAAI,CAAC,UAAU,CAAC,aAAa;aAC5B,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,IAAI,0BAA0B,CAAC;AAC9D,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,KAAK,EAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,KAAK,CAAC;IACzD;AAEA;;;;;;;;AAQG;IACH,SAAS,GAAA;QACP,IAAI,CAAC,aAAa,EAAE;IACtB;AAEA;;;AAGG;AACH,IAAA,SAAS,CAAC,IAAe,EAAA;AACvB,QAAA,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE;YAC/B;QACF;AACA,QAAA,IAAI,CAAC,aAAa,EAAE,YAAY,IAAI;AACpC,QAAA,IAAI,CAAC,OAAO,IAAI;AAChB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;IAC9B;AAEA;;;AAGG;AACH,IAAA,QAAQ,CAAC,IAAe,EAAA;AACtB,QAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,KAAK,EAAE;QAC7C,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA;;;;AAIG;IACK,aAAa,GAAA;AACnB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK;QACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;YAC9B;QACF;AACA,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;YAC5D;QACF;AACA,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa;AAClD,QAAA,MAAM,KAAK,GACT,YAAY,IAAI,CAAC,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,YAAY,GAAG,CAAC;AACrE,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC;IACnC;uGA/FW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,OAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECrB3B,i2DAgDA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9B6B,YAAY,+BAAE,OAAO,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAlD,eAAe,EAAA,IAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA;;2FAGd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,SAAS;+BACE,QAAQ,EAAA,UAAA,EACN,IAAI,EAAA,OAAA,EACP,CAAC,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,EAAA,QAAA,EAAA,i2DAAA,EAAA;;sBAK5D;;sBAMA;;sBAMA;;sBAGA;;;AEpCI,MAAM,cAAc,GAAG,EAAE,CAAC;AAC/B,IAAA,IAAI,EAAE,sBAAsB;AAC5B,IAAA,QAAQ,EAAE;AACR,QAAA,KAAK,EAAE;AACL,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,SAAS,EAAE,cAAc;AACzB,YAAA,MAAM,EAAE,YAAY;AACpB,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,MAAM,EAAE,aAAa;AACtB,SAAA;AACF,KAAA;AAED,IAAA,eAAe,EAAE;AACf,QAAA,KAAK,EAAE,SAAS;AACjB,KAAA;AACF,CAAA;;ACnBD;AACA;AACA;AACA;AACA,MAAM,SAAS,GAAG,CAAA,gXAAA,CAAkX;AACpY,MAAM,UAAU,GAAG,CAAA,ybAAA,CAA2b;AAEvc,MAAM,WAAW,GAA2B;AACjD,IAAA,MAAM,EAAE,SAAS;AACjB,IAAA,OAAO,EAAE,UAAU;;;MCER,MAAM,CAAA;IACR,IAAI,GAAyB,EAAE;AAEhC,IAAA,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;AAChC,IAAA,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,UAAU,GAAa,EAAE;AAEzB,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE;IAC7B;AAEA,IAAA,IACI,WAAW,GAAA;AACb,QAAA,OAAO,cAAc,CAAC;AACpB,YAAA,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;AACvB,SAAA,CAAC;IACJ;IAEQ,YAAY,GAAkB,IAAI;IAE1C,QAAQ,GAAA;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU;QAC9C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAO,KAAK,CAAC,EAAE;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACpC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC1C,oBAAA,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,OAAO,EAAE;AACjC,wBAAA,IAAI,CAAC,YAAY,GAAG,GAAG;wBACvB;oBACF;gBACF;gBACA,IAAI,IAAI,CAAC,YAAY;oBAAE;YACzB;QACF;QACA,IAAI,CAAC,aAAa,EAAE;IACtB;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,aAAa,EAAE;IACtB;IAEQ,aAAa,GAAA;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY;QAChD,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC;YAC7B,IAAI,GAAG,EAAE;AACP,gBAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/C,IAAI,SAAS,EAAE;AACb,oBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAc,EAAE,KAAa,KAAI;AAC1E,wBAAA,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,IAAI,CAAA,CAAA,CAAG,CAAC;wBAC/D,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,CAAG,CAAC;AAC/D,wBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC;AAAE,4BAAA,OAAO,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA,CAAG;AAC5D,wBAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;AAAE,4BAAA,OAAO,IAAI,CAAA,SAAA,EAAY,IAAI,CAAA,CAAA,CAAG;wBAC9D,OAAO,CAAA,IAAA,EAAO,OAAO,CAAA,CAAA,CAAG;AAC1B,oBAAA,CAAC,CAAC;oBACF,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,KAAK,CAAC;gBACjE;qBAAO;oBACL,MAAM,GAAG,GAAG,CAAA,+CAAA,EAAkD,IAAI,aAAa,IAAI,CAAA,wHAAA,EAA2H,GAAG,CAAA,MAAA,CAAQ;oBACzN,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,GAAG,CAAC;gBAC/D;YACF;iBAAO;AACL,gBAAA,IAAI,CAAC,UAAU,GAAG,EAAE;YACtB;QACF;aAAO;AACL,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACtB;IACF;uGArEW,MAAM,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAM,yKCXnB,qMAMA,EAAA,CAAA;;2FDKa,MAAM,EAAA,UAAA,EAAA,CAAA;kBALlB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,SAAS,cACP,IAAI,EAAA,QAAA,EAAA,qMAAA,EAAA;;sBAIf;;sBAWA,WAAW;uBAAC,OAAO;;;AErBtB;AACA;MAKa,gBAAgB,CAAA;uGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,+CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,+CAA+C;AACzD,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACLD;;;;;AAKG;MACU,YAAY,GAAG,IAAI,cAAc,CAAS,cAAc;;ACQrE;;;;;;;;;;;;;AAaG;MACmB,WAAW,CAAA;AAWZ,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,IAAA,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC;AAC9B,IAAA,QAAQ;AAE3B,IAAA,WAAA,CAAsB,MAAkB,EAAA;AACtC,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,EAAG,MAAM,CAAC,QAAQ,CAAA,CAAE;IACrD;AAEA;;;;;;;;AAQG;AACH,IAAA,MAAM,CAAC,KAAmB,EAAA;QACxB,OAAO,IAAI,CAAC;AACT,aAAA,GAAG,CAAgB,IAAI,CAAC,QAAQ,EAAE;AACjC,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK;SAChC;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClE;IACL;AAEA;;;;;;;AAOG;AACH,IAAA,OAAO,CAAC,EAAO,EAAA;QACb,OAAO,IAAI,CAAC;AACT,aAAA,GAAG,CAAmB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AACtC,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClE;IACL;AAEA;;;;;;;AAOG;AACH,IAAA,MAAM,CAAC,OAAuB,EAAA;QAC5B,OAAO,IAAI,CAAC;AACT,aAAA,IAAI,CAAkB,IAAI,CAAC,QAAQ,EAAE,OAAO;AAC5C,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClE;IACL;AAEA;;;;;;;;;AASG;IACH,MAAM,CAAC,EAAO,EAAE,OAAuB,EAAA;QACrC,OAAO,IAAI,CAAC;aACT,GAAG,CAAkB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO;AAC9C,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClE;IACL;AAEA;;;;;;;;;AASG;IACH,KAAK,CAAC,EAAO,EAAE,OAAgC,EAAA;QAC7C,OAAO,IAAI,CAAC;aACT,KAAK,CAAkB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO;AAChD,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClE;IACL;AAEA;;;;;;;AAOG;AACH,IAAA,MAAM,CAAC,EAAO,EAAA;QACZ,OAAO,IAAI,CAAC;AACT,aAAA,MAAM,CAAkB,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;AACxC,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EACjC,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClE;IACL;AAEA;;;;;;;;AAQG;AACH,IAAA,cAAc,CAAC,KAAmB,EAAA;QAChC,OAAO,IAAI,CAAC;AACT,aAAA,GAAG,CAAgB,IAAI,CAAC,QAAQ,EAAE;AACjC,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AAChC,YAAA,OAAO,EAAE,UAAU;SACpB;AACA,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KACX,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YACrB,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;AACzB,YAAA,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,SAAS;SAC/B,CAAC,CACH,EACD,UAAU,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAClE;IACL;AAEA;;;;;AAKG;AACO,IAAA,OAAO,CAAC,EAAO,EAAA;AACvB,QAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAA,CAAA,EAAI,EAAE,EAAE;IACjC;AAEA;;;;;;;AAOG;IACO,OAAO,CAAI,IAAO,EAAE,IAAiB,EAAA;QAC7C,OAAO,EAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAC;IAC/B;AAEA;;;;;;;;;AASG;IACO,OAAO,CAAC,KAAe,EAAE,IAAiB,EAAA;QAClD,OAAO;AACL,YAAA,EAAE,EAAE,KAAK;YACT,KAAK;YACL,IAAI,EAAE,IAAI,IAAI;AACZ,gBAAA,UAAU,EAAE,KAAK,CAAC,MAAM,IAAI,SAAS;gBACrC,OAAO,EAAE,KAAK,CAAC,OAAO;AACtB,gBAAA,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,SAAS;AAC5B,aAAA;SACF;IACH;AAEA;;;;;;;;;AASG;AACO,IAAA,YAAY,CAAC,KAAc,EAAA;QACnC,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAE1C,QAAA,IAAI,EAAE,KAAK,YAAY,iBAAiB,CAAC,EAAE;YACzC,OAAO;AACL,gBAAA,MAAM,EAAE,IAAI;AACZ,gBAAA,OAAO,EAAE,eAAe;AACxB,gBAAA,QAAQ,EAAE,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,gBAAA,SAAS,EAAE,KAAK;gBAChB,SAAS;aACV;QACH;QAEA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC;AACjD,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAC1D,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC;QAE9D,OAAO;YACL,MAAM;YACN,OAAO,EAAE,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YACtD,OAAO;YACP,cAAc;YACd,gBAAgB;YAChB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;AACtB,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;YACnC,SAAS;SACV;IACH;AAEA;;;;;;;;AAQG;AACO,IAAA,qBAAqB,CAAC,IAAa,EAAA;QAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE;AAC3C,YAAA,OAAO,IAAI;QACb;QAEA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACrC,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,GAAG,GAAG,IAA+B;AAE3C,QAAA,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;AACzD,YAAA,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;YACtB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAC7C,gBAAA,OAAO,KAAK;YACd;QACF;AACA,QAAA,OAAO,SAAS;IAClB;AAEA;;;;;;;;AAQG;AACO,IAAA,uBAAuB,CAAC,IAAa,EAAA;QAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACrC,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,GAAG,GAAG,IAA+B;AAC3C,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE5B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACzC,YAAA,OAAO,SAAS;QAClB;QAEA,MAAM,MAAM,GAA6B,EAAE;AAE3C,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAiC,CAAC,EAAE;AAC5E,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACxB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;YACjC;AAAO,iBAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;YACvB;QACF;AACA,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS;IACxD;AAEA;;;;;;;;AAQG;AACO,IAAA,cAAc,CAAC,MAA6B,EAAA;QACpD,QAAQ,MAAM;YACZ,KAAK,cAAc,CAAC,UAAU;AAC5B,gBAAA,OAAO,aAAa;YACtB,KAAK,cAAc,CAAC,YAAY;AAC9B,gBAAA,OAAO,cAAc;YACvB,KAAK,cAAc,CAAC,SAAS;AAC3B,gBAAA,OAAO,WAAW;YACpB,KAAK,cAAc,CAAC,QAAQ;AAC1B,gBAAA,OAAO,WAAW;YACpB,KAAK,cAAc,CAAC,QAAQ;AAC1B,gBAAA,OAAO,UAAU;YACnB,KAAK,cAAc,CAAC,mBAAmB;AACrC,gBAAA,OAAO,sBAAsB;YAC/B,KAAK,cAAc,CAAC,mBAAmB;AACrC,gBAAA,OAAO,uBAAuB;AAChC,YAAA,KAAK,IAAI;AACP,gBAAA,OAAO,eAAe;AACxB,YAAA;gBACE,OAAO,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAE;;IAEnD;AAEA;;;;;;;;AAQG;AACO,IAAA,WAAW,CAAC,MAA6B,EAAA;AACjD,QAAA,IAAI,MAAM,KAAK,cAAc,CAAC,cAAc;AAAE,YAAA,OAAO,IAAI;AACzD,QAAA,IAAI,MAAM,KAAK,cAAc,CAAC,eAAe;AAAE,YAAA,OAAO,IAAI;AAC1D,QAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG;AAAE,YAAA,OAAO,IAAI;AAC5D,QAAA,OAAO,KAAK;IACd;AAEA;;;;;;;;AAQG;AACO,IAAA,eAAe,CAAC,MAAiC,EAAA;AACzD,QAAA,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI;AAChG,QAAA,OAAO,MAAwB;IACjC;AAEA;;;;;;;;AAQG;AACO,IAAA,YAAY,CAAC,KAAmB,EAAA;AACxC,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;AAE5B,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAE7B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACnD,YAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;gBAAE;AAEjD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAE9D,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,gBAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;oBAAE;AAC3C,gBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5C;QACF;AACA,QAAA,OAAO,MAAM;IACf;AACD;;AC1ZD;;;;;;;;;;AAUG;MACmB,aAAa,CAAA;;AAEd,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;;AAGzB,IAAA,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC;AAEjD;;;;;AAKG;IACO,GAAG,CAAI,IAAY,EAAE,KAAqB,EAAA;AAClD,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,EAAE,EAAE;AACzC,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACjC,SAAA,CAAC,CACH;IACH;AAEA;;;;;;AAMG;AACO,IAAA,IAAI,CAAI,IAAY,EAAE,IAAc,EAAE,KAAqB,EAAA;AACnE,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,CAAA,EAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA,CAAE,EAAE,IAAI,IAAI,EAAE,EAAE;AACtD,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACjC,SAAA,CAAC,CACH;IACH;AAEA;;;;;;AAMG;AACO,IAAA,KAAK,CAAI,IAAY,EAAE,IAAc,EAAE,KAAqB,EAAA;AACpE,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAI,CAAA,EAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA,CAAE,EAAE,IAAI,IAAI,EAAE,EAAE;AACvD,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACjC,SAAA,CAAC,CACH;IACH;AAEA;;;;;;AAMG;AACO,IAAA,GAAG,CAAI,IAAY,EAAE,IAAc,EAAE,KAAqB,EAAA;AAClE,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,CAAA,EAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA,CAAE,EAAE,IAAI,IAAI,EAAE,EAAE;AACrD,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACjC,SAAA,CAAC,CACH;IACH;AAEA;;;;;AAKG;IACO,MAAM,CAAW,IAAY,EAAE,KAAqB,EAAA;AAC5D,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAI,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,EAAG,IAAI,EAAE,EAAE;AAC5C,YAAA,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACjC,SAAA,CAAC,CACH;IACH;AAEA;;;;;;AAMG;AACO,IAAA,YAAY,CAAC,KAAqB,EAAA;AAC1C,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,SAAS;AAE5B,QAAA,IAAI,MAAM,GAAG,IAAI,UAAU,EAAE;AAE7B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACnD,YAAA,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS;gBAAE;AAEjD,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,CAAC,QAAQ,CAAC;AAE9D,YAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,gBAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;oBAAE;AAC3C,gBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5C;QACF;AAEA,QAAA,OAAO,MAAM;IACf;AACD;;ACtHD;;;;;;;;;AASG;SACa,mBAAmB,CACjC,aAA8B,EAC9B,WAA8B,EAC9B,cAAyB,EAAA;IAEzB,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,KAAqC,KAAI;AACjF,QAAA,IAAI,cAAc,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACpE;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;QACvB,IAAI,CAAC,IAAI,EAAE,IAAI;YAAE;AAEjB,QAAA,QAAQ,IAAI,CAAC,IAAI;AACf,YAAA,KAAK,kBAAkB;AACrB,gBAAA,IAAI,IAAI,CAAC,MAAM,EAAE;oBACf,MAAM,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;gBACjD;gBACA;AAEF,YAAA,KAAK,wBAAwB;AAC3B,gBAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,oBAAA,KAAK,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AACtE,wBAAA,WAAW,CAAC,oBAAoB,CAAC,MAAM,EAAE,YAAY,CAAC;oBACxD;oBACA,MAAM,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC;gBACjD;gBACA;;AAEN,IAAA,CAAC,CAAC;AACJ;;ACjDA;;AAEG;;ACFH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"mn-angular-lib.mjs","sources":["../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.tokens.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.providers.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.store.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert.service.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alertVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-button/mn-buttonVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-button/mn-button.ts","../../../projects/mn-angular-lib/src/lib/features/mn-button/mn-button.html","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert-outlet/mn-alert-outlet.ts","../../../projects/mn-angular-lib/src/lib/features/mn-alert/mn-alert-outlet/mn-alert-outlet.html","../../../projects/mn-angular-lib/src/lib/features/mn-badge/mn-badgeVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-badge/mn-badge.ts","../../../projects/mn-angular-lib/src/lib/features/mn-badge/mn-badge.html","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-field-adapters.ts","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-fieldVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-error-message/mn-error-message.ts","../../../projects/mn-angular-lib/src/lib/features/mn-error-message/mn-error-message.html","../../../projects/mn-angular-lib/src/lib/config/mn-config.types.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.types.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.service.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.providers.ts","../../../projects/mn-angular-lib/src/lib/language/mn-translate.pipe.ts","../../../projects/mn-angular-lib/src/lib/config/mn-config.service.ts","../../../projects/mn-angular-lib/src/lib/config/mn-config.providers.ts","../../../projects/mn-angular-lib/src/lib/context/mn-context.tokens.ts","../../../projects/mn-angular-lib/src/lib/config/mn-component-config.providers.ts","../../../projects/mn-angular-lib/src/lib/context/mn-section.directive.ts","../../../projects/mn-angular-lib/src/lib/context/mn-instance.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-field.ts","../../../projects/mn-angular-lib/src/lib/features/mn-input-field/mn-input-field.html","../../../projects/mn-angular-lib/src/lib/features/mn-dual-horizontal-image/mn-dual-horizontal-image.ts","../../../projects/mn-angular-lib/src/lib/features/mn-dual-horizontal-image/mn-dual-horizontal-image.html","../../../projects/mn-angular-lib/src/lib/features/mn-information-card/mn-information-cardVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-information-card/mn-information-card.ts","../../../projects/mn-angular-lib/src/lib/features/mn-information-card/mn-information-card.html","../../../projects/mn-angular-lib/src/lib/features/mn-textarea/mn-textareaVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-textarea/mn-textarea.ts","../../../projects/mn-angular-lib/src/lib/features/mn-textarea/mn-textarea.html","../../../projects/mn-angular-lib/src/lib/features/mn-file-input/mn-file-inputVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-file-input/mn-file-input.ts","../../../projects/mn-angular-lib/src/lib/features/mn-file-input/mn-file-input.html","../../../projects/mn-angular-lib/src/lib/features/mn-checkbox/mn-checkboxVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-checkbox/mn-checkbox.ts","../../../projects/mn-angular-lib/src/lib/features/mn-checkbox/mn-checkbox.html","../../../projects/mn-angular-lib/src/lib/features/mn-datetime/mn-datetimeVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-datetime/mn-datetime.ts","../../../projects/mn-angular-lib/src/lib/features/mn-datetime/mn-datetime.html","../../../projects/mn-angular-lib/src/lib/features/mn-multi-select/mn-multi-selectVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-multi-select/mn-multi-select.ts","../../../projects/mn-angular-lib/src/lib/features/mn-multi-select/mn-multi-select.html","../../../projects/mn-angular-lib/src/lib/features/mn-select/mn-selectVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-select/mn-select.ts","../../../projects/mn-angular-lib/src/lib/features/mn-select/mn-select.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal.types.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal-haptics.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/form-layout.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/step.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/base-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/wizard-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/form-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/confirmation-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/custom-modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/builder/modal.builder.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal-ref.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-form-body/mn-custom-field-host.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-table.types.ts","../../../projects/mn-angular-lib/src/lib/features/mn-skeleton/mn-skeletonVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-skeleton/mn-skeleton.ts","../../../projects/mn-angular-lib/src/lib/features/mn-skeleton/mn-skeleton.html","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-hidden-below.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-show-above.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-show-below.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection.types.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection-base.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-selectable-collection-base.directive.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection-pagination.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-collection/mn-collection-pagination.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-table.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-table/mn-table.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-custom-body-host/mn-custom-body-host.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-form-body/mn-form-body.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-form-body/mn-form-body.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-footer-actions/mn-footer-actions.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-wizard-body/mn-wizard-body.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-wizard-body/mn-wizard-body.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-confirmation-body/mn-confirmation-body.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-confirmation-body/mn-confirmation-body.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-modal-shell/mn-modal-shell.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/components/mn-modal-shell/mn-modal-shell.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-modal/mn-modal.service.ts","../../../projects/mn-angular-lib/src/lib/features/mn-modal/index.ts","../../../projects/mn-angular-lib/src/lib/features/mn-list/mn-list.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-list/mn-list.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-grid/mn-grid.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-grid/mn-grid.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/models/calendar-config.model.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/services/calendar-date-formatter.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/services/default-calendar-date-formatter.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-month/calendar-month.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-month/calendar-month.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/services/calendar-event-layout.service.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/utils/calendar-utils.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event-default/calendar-event-default.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event-default/calendar-event-default.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event/calendar-event.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-event/calendar-event.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-week/calendar-week.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-week/calendar-week.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-day/calendar-day.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-day/calendar-day.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-event-row/upcoming-event-row.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-event-row/upcoming-event-row.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-events/upcoming-events.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/upcoming-events/upcoming-events.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-view/calendar-view.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/components/calendar-view/calendar-view.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-calendar/index.ts","../../../projects/mn-angular-lib/src/lib/features/mn-tab/mn-tab.component.ts","../../../projects/mn-angular-lib/src/lib/features/mn-tab/mn-tab.component.html","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-iconVariants.ts","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon-map.ts","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon.ts","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon.html","../../../projects/mn-angular-lib/src/lib/features/mn-icon/mn-icon-attributes.directive.ts","../../../projects/mn-angular-lib/src/lib/shared/crud/crud.tokens.ts","../../../projects/mn-angular-lib/src/lib/shared/crud/crud.service.ts","../../../projects/mn-angular-lib/src/lib/shared/http/mn-http.service.ts","../../../projects/mn-angular-lib/src/lib/preview/mn-preview-listener.ts","../../../projects/mn-angular-lib/src/public-api.ts","../../../projects/mn-angular-lib/src/mn-angular-lib.ts"],"sourcesContent":["// projects/mn-angular-lib/src/lib/mn-mn-alert/mn-mn-alert.tokens.ts\nimport { InjectionToken } from '@angular/core';\nimport { MnAlert } from './mn-alert.types';\n\nexport type MnAlertKind = 'success' | 'info' | 'warning' | 'error' | 'default';\n\nexport type MnAlertConfig = {\n durations?: Partial<Record<MnAlertKind, number | null>>;\n cssClasses?: Partial<Record<MnAlertKind, string>>;\n icons?: Partial<Record<MnAlertKind, unknown>>;\n fallbackDuration?: number | null;\n finalize?: (a: MnAlert) => MnAlert;\n}\n\nexport const MN_ALERT_CONFIG = new InjectionToken<MnAlertConfig>('MN_ALERT_CONFIG');\n\nexport const DEFAULT_MN_ALERT_CONFIG: Required<MnAlertConfig> = {\n durations: { success: 3000, info: 4000, warning: 5000, error: 7000, default: 4000 },\n cssClasses: {\n success: 'mn-alert-success',\n info: 'mn-alert-info',\n warning: 'mn-alert-warning',\n error: 'mn-alert-error',\n default: 'alert'\n },\n icons: {},\n fallbackDuration: 4000,\n finalize: (a) => a\n};\n","// projects/mn-angular-lib/src/lib/mn-mn-alert/mn-mn-alert.providers.ts\nimport { Provider } from '@angular/core';\nimport { MN_ALERT_CONFIG, MnAlertConfig, DEFAULT_MN_ALERT_CONFIG } from './mn-alert.tokens';\n\nexport function provideMnAlerts(config: MnAlertConfig = {}): Provider {\n const merged: MnAlertConfig = {\n ...DEFAULT_MN_ALERT_CONFIG,\n ...config,\n durations: { ...DEFAULT_MN_ALERT_CONFIG.durations, ...(config.durations ?? {}) },\n cssClasses: { ...DEFAULT_MN_ALERT_CONFIG.cssClasses, ...(config.cssClasses ?? {}) },\n icons: { ...DEFAULT_MN_ALERT_CONFIG.icons, ...(config.icons ?? {}) }\n };\n return { provide: MN_ALERT_CONFIG, useValue: merged };\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { MnAlert, MnAlertId } from './mn-alert.types';\nimport { DEFAULT_MN_ALERT_CONFIG } from './mn-alert.tokens';\n\nlet COUNTER = 0;\nconst uid = () => `mn_${++COUNTER}`;\n\n@Injectable({ providedIn: 'root' })\nexport class MnAlertStore {\n private readonly _alerts$ = new BehaviorSubject<MnAlert[]>([]);\n readonly alerts$ = this._alerts$.asObservable();\n\n show(partial: Omit<MnAlert, 'id'>): MnAlertId {\n // Ensure every alert has a numeric duration: use provided or fall back to per-kind default\n const computedDuration = (partial as {\n duration?: number\n }).duration ?? (DEFAULT_MN_ALERT_CONFIG.durations as Record<string, number>)[(partial as {\n kind?: string\n }).kind ?? ''] ?? DEFAULT_MN_ALERT_CONFIG.fallbackDuration;\n const a: MnAlert = { id: uid(), ...partial, duration: computedDuration } as MnAlert;\n this._alerts$.next([...this._alerts$.value, a]);\n\n if (typeof a.duration === 'number' && a.duration > 0) {\n setTimeout(() => this.dismiss(a.id), a.duration);\n }\n return a.id;\n }\n\n dismiss(id: MnAlertId) {\n const list = this._alerts$.value;\n if (list.some(x => x.id === id)) {\n this._alerts$.next(list.filter(x => x.id !== id));\n }\n }\n\n clear() {\n this._alerts$.next([]);\n }\n}\n","// projects/mn-angular-lib/src/lib/mn-mn-alert/mn-mn-alert.service.ts\nimport {Injectable, inject} from '@angular/core';\nimport { MnAlertStore } from './mn-alert.store';\nimport { MnAlert, MnAlertId } from './mn-alert.types';\nimport { MN_ALERT_CONFIG, DEFAULT_MN_ALERT_CONFIG, MnAlertConfig, MnAlertKind } from './mn-alert.tokens';\nimport { MnAlertVariants } from './mn-alertVariants';\n\nexport type MnShowInput = {\n title: string;\n subTitle?: string;\n duration?: number;\n icon?: unknown;\n cssClass?: string;\n meta?: Record<string, unknown>;\n kind: MnAlertKind;\n variant?: MnAlertVariants['variant'];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MnAlertService {\n private readonly store = inject(MnAlertStore);\n\n private readonly cfg: Required<MnAlertConfig>;\n private readonly userDurations?: Partial<Record<MnAlertKind, number | null>>;\n private readonly hasUserDurations: boolean;\n\n constructor() {\n const cfg = inject<MnAlertConfig | null>(MN_ALERT_CONFIG, {optional: true});\n\n this.userDurations = cfg?.durations;\n this.hasUserDurations = !!cfg?.durations;\n this.cfg = {\n ...DEFAULT_MN_ALERT_CONFIG,\n ...(cfg ?? {}),\n // Do not pre-merge durations; keep defaults separate and use logic in kind()\n durations: DEFAULT_MN_ALERT_CONFIG.durations,\n cssClasses: { ...DEFAULT_MN_ALERT_CONFIG.cssClasses, ...(cfg?.cssClasses ?? {}) },\n icons: { ...DEFAULT_MN_ALERT_CONFIG.icons, ...(cfg?.icons ?? {}) }\n };\n }\n\n show(input: MnShowInput): MnAlertId {\n // Always ensure a numeric duration is set\n let duration = input.duration;\n if (duration == null) {\n // Prefer user defaultDuration if provided and not null, otherwise use library per-kind default\n const userDefault = this.cfg.fallbackDuration;\n if (typeof userDefault === 'number') {\n duration = userDefault;\n } else {\n duration = DEFAULT_MN_ALERT_CONFIG.durations[input.kind as keyof typeof DEFAULT_MN_ALERT_CONFIG.durations] as number;\n }\n }\n\n const a: Omit<MnAlert, 'id'> = {\n title: input.title,\n subTitle: input.subTitle,\n duration,\n icon: input.icon,\n cssClass: input.cssClass,\n meta: input.meta,\n kind: input.kind,\n variant: input.variant\n };\n return this.store.show(this.cfg.finalize(a as MnAlert));\n }\n\n success(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('success', title, subTitle, extra);\n }\n info(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('info', title, subTitle, extra);\n }\n warning(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('warning', title, subTitle, extra);\n }\n error(title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n return this.kind('error', title, subTitle, extra);\n }\n\n dismiss(id: MnAlertId) { this.store.dismiss(id); }\n clear() { this.store.clear(); }\n\n private kind(kind: MnAlertKind, title: string, subTitle?: string, extra?: Partial<MnShowInput>) {\n let duration: number | null | undefined = extra?.duration;\n\n if (duration == null) {\n if (this.hasUserDurations) {\n const userDur = this.userDurations?.[kind];\n if (typeof userDur === 'number') {\n duration = userDur;\n } else {\n // userDur is undefined or null -> fallback to user defaultDuration if numeric\n if (typeof this.cfg.fallbackDuration === 'number') {\n duration = this.cfg.fallbackDuration;\n } else {\n duration = this.cfg.durations[kind as keyof typeof this.cfg.durations];\n }\n }\n } else {\n // No user durations provided at all; use library defaults per kind\n duration = this.cfg.durations[kind as keyof typeof this.cfg.durations];\n }\n }\n\n const cssClass = extra?.cssClass ?? this.cfg.cssClasses[kind];\n const icon = (extra?.icon ?? this.cfg.icons[kind]) as unknown;\n const variant = extra?.variant;\n\n return this.show({ title, subTitle, duration: duration as number, cssClass, icon, meta: extra?.meta , kind: kind, variant});\n }\n}\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnAlertVariants = tv({\n base: 'flex items-start gap-3 p-4 border rounded-xl shadow-sm transition-all duration-300 w-full ',\n variants: {\n kind: {\n success: 'bg-success/10 border-success/30 text-success',\n info: 'bg-info/10 border-info/30 text-info',\n warning: 'bg-warning/10 border-warning/30 text-warning',\n error: 'bg-error/10 border-error/30 text-error',\n default: 'bg-base-100 border-base-300 text-base-content',\n accent: 'bg-accent/10 border-accent/30 text-accent',\n },\n variant: {\n fill: '',\n outline: 'bg-base-200 border-2',\n soft: 'border-none shadow-none',\n }\n },\n compoundVariants: [\n {\n kind: 'success',\n variant: 'fill',\n class: 'bg-success border-success text-success-content'\n },\n {\n kind: 'info',\n variant: 'fill',\n class: 'bg-info border-info text-info-content'\n },\n {\n kind: 'warning',\n variant: 'fill',\n class: 'bg-warning border-warning text-warning-content'\n },\n {\n kind: 'error',\n variant: 'fill',\n class: 'bg-error border-error text-error-content'\n },\n {\n kind: 'accent',\n variant: 'fill',\n class: 'bg-accent border-accent text-accent-content'\n },\n ],\n defaultVariants: {\n kind: 'info',\n variant: 'soft'\n }\n});\n\nexport type MnAlertVariants = VariantProps<typeof mnAlertVariants>;\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnButtonVariants = tv({\n base: 'inline-flex items-center justify-center hover:cursor-pointer transition-all duration-300 ease-in-out',\n variants: {\n size: {\n sm: 'px-2 py-1 text-sm',\n md: 'px-3 py-1.5 text-base',\n lg: 'px-4 py-2 text-lg',\n },\n\n variant: {\n fill: '',\n outline: 'bg-transparent border',\n text: 'bg-transparent',\n textUnderline: 'bg-transparent underline underline-offset-2',\n },\n\n // Intentionally empty; resolved via compoundVariants\n color: {\n primary: '',\n secondary: '',\n danger: '',\n warning: '',\n success: '',\n accent: '',\n gray: '',\n },\n\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n disabled: {\n true: 'opacity-50 pointer-events-none',\n },\n // Busy state: dim and block interaction like `disabled`, and hint the wait cursor.\n // The spinner itself is rendered in the template (see mn-button.html).\n loading: {\n true: 'opacity-50 pointer-events-none cursor-wait',\n },\n wrap: {\n true: 'whitespace-normal',\n false: 'whitespace-nowrap',\n },\n hover: {\n true: '',\n },\n },\n\n compoundVariants: [\n // Fill — base\n { variant: 'fill', color: 'primary', class: 'bg-primary text-primary-content border border-primary' },\n { variant: 'fill', color: 'secondary', class: 'bg-neutral text-neutral-content border border-neutral' },\n { variant: 'fill', color: 'danger', class: 'bg-error text-error-content border border-error' },\n { variant: 'fill', color: 'warning', class: 'bg-warning text-warning-content border border-warning' },\n { variant: 'fill', color: 'success', class: 'bg-success text-success-content border border-success' },\n { variant: 'fill', color: 'accent', class: 'bg-accent text-accent-content border border-accent' },\n { variant: 'fill', color: 'gray', class: 'bg-base-content/10 text-base-content/70 border border-base-content/10' },\n // Fill — hover\n { variant: 'fill', color: 'primary', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'secondary', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'danger', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'warning', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'success', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'accent', hover: true, class: 'hover:brightness-60' },\n { variant: 'fill', color: 'gray', hover: true, class: 'hover:bg-base-content/20' },\n // Outline — base\n { variant: 'outline', color: 'primary', class: 'border-primary text-primary' },\n { variant: 'outline', color: 'secondary', class: 'border-neutral text-neutral' },\n { variant: 'outline', color: 'danger', class: 'border-error text-error' },\n { variant: 'outline', color: 'warning', class: 'border-warning text-warning' },\n { variant: 'outline', color: 'success', class: 'border-success text-success' },\n { variant: 'outline', color: 'accent', class: 'border-accent text-accent' },\n { variant: 'outline', color: 'gray', class: 'border-base-content/70 text-base-content/70' },\n // Outline — hover\n { variant: 'outline', color: 'primary', hover: true, class: 'hover:bg-primary/10' },\n { variant: 'outline', color: 'secondary', hover: true, class: 'hover:bg-neutral/10' },\n { variant: 'outline', color: 'danger', hover: true, class: 'hover:bg-error/10' },\n { variant: 'outline', color: 'warning', hover: true, class: 'hover:bg-warning/10' },\n { variant: 'outline', color: 'success', hover: true, class: 'hover:bg-success/10' },\n { variant: 'outline', color: 'accent', hover: true, class: 'hover:bg-accent/10' },\n { variant: 'outline', color: 'gray', hover: true, class: 'hover:bg-base-content/10' },\n // Text — base\n { variant: 'text', color: 'primary', class: 'text-primary' },\n { variant: 'text', color: 'secondary', class: 'text-neutral' },\n { variant: 'text', color: 'danger', class: 'text-error' },\n { variant: 'text', color: 'warning', class: 'text-warning' },\n { variant: 'text', color: 'success', class: 'text-success' },\n { variant: 'text', color: 'accent', class: 'text-accent' },\n { variant: 'text', color: 'gray', class: 'text-base-content/70' },\n // Text — hover\n { variant: 'text', color: 'primary', hover: true, class: 'hover:bg-primary/10' },\n { variant: 'text', color: 'secondary', hover: true, class: 'hover:bg-neutral/10' },\n { variant: 'text', color: 'danger', hover: true, class: 'hover:bg-error/10' },\n { variant: 'text', color: 'warning', hover: true, class: 'hover:bg-warning/10' },\n { variant: 'text', color: 'success', hover: true, class: 'hover:bg-success/10' },\n { variant: 'text', color: 'accent', hover: true, class: 'hover:bg-accent/10' },\n { variant: 'text', color: 'gray', hover: true, class: 'hover:bg-base-content/10' },\n // Text Underline — base\n { variant: 'textUnderline', color: 'primary', class: 'text-primary underline underline-offset-2' },\n { variant: 'textUnderline', color: 'secondary', class: 'text-neutral underline underline-offset-2' },\n { variant: 'textUnderline', color: 'danger', class: 'text-error underline underline-offset-2' },\n { variant: 'textUnderline', color: 'warning', class: 'text-warning underline underline-offset-2' },\n { variant: 'textUnderline', color: 'success', class: 'text-success underline underline-offset-2' },\n { variant: 'textUnderline', color: 'accent', class: 'text-accent underline underline-offset-2' },\n { variant: 'textUnderline', color: 'gray', class: 'text-base-content/70 underline underline-offset-2' },\n // Text Underline — hover\n { variant: 'textUnderline', color: 'primary', hover: true, class: 'hover:bg-primary/10' },\n { variant: 'textUnderline', color: 'secondary', hover: true, class: 'hover:bg-neutral/10' },\n { variant: 'textUnderline', color: 'danger', hover: true, class: 'hover:bg-error/10' },\n { variant: 'textUnderline', color: 'warning', hover: true, class: 'hover:bg-warning/10' },\n { variant: 'textUnderline', color: 'success', hover: true, class: 'hover:bg-success/10' },\n { variant: 'textUnderline', color: 'accent', hover: true, class: 'hover:bg-accent/10' },\n { variant: 'textUnderline', color: 'gray', hover: true, class: 'hover:bg-base-content/10' },\n ],\n\n defaultVariants: {\n size: 'md',\n variant: 'fill',\n color: 'primary',\n borderRadius: 'lg',\n disabled: false,\n loading: false,\n wrap: false,\n hover: true,\n },\n});\n\nexport type MnButtonVariants = VariantProps<typeof mnButtonVariants>;\n","import {Component, HostBinding, Input} from '@angular/core';\nimport {MnButtonTypes} from './mn-buttonTypes';\nimport {mnButtonVariants} from './mn-buttonVariants';\n\n@Component({\n selector: 'button[mnButton], a[mnButton]',\n standalone: true,\n templateUrl: './mn-button.html',\n})\nexport class MnButton {\n @Input() data: Partial<MnButtonTypes> = {};\n\n // A loading button is treated as non-interactive: it blocks clicks and is unfocusable,\n // Bind the computed classes to the host element\n @HostBinding('class')\n get hostClasses(): string {\n return mnButtonVariants({\n size: this.data.size,\n variant: this.data.variant,\n color: this.data.color,\n borderRadius: this.data.borderRadius,\n disabled: this.data.disabled,\n loading: this.data.loading,\n wrap: this.data.wrap,\n hover: this.data.hover,\n });\n }\n\n // Signals assistive tech that the control is busy while a loading action runs.\n @HostBinding('attr.aria-busy')\n get ariaBusy() {\n return this.data.loading ? 'true' : null;\n }\n // For accessibility (works for both <button> and <a>)\n @HostBinding('attr.aria-disabled')\n get ariaDisabled() {\n return this.data.disabled ? 'true' : null;\n }\n\n // Only meaningful for <button>. For <a> it does nothing semantically.\n @HostBinding('attr.disabled')\n get disabledAttr() {\n return this.isBlocked ? '' : null;\n }\n\n // Make disabled/loading anchors unfocusable + prevent activation\n @HostBinding('attr.tabindex')\n get tabIndex() {\n return this.isBlocked ? '-1' : null;\n }\n\n // so an in-flight action cannot be triggered a second time.\n private get isBlocked(): boolean {\n return !!(this.data.disabled || this.data.loading);\n }\n\n}\n","@if (data.loading) {\n <span\n aria-hidden=\"true\"\n class=\"inline-block h-4 w-4 shrink-0 mr-2 animate-spin rounded-full border-2 border-current border-r-transparent\"\n ></span>\n}\n<ng-content></ng-content>\n","\nimport {Component, Input, TemplateRef, ChangeDetectionStrategy, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable } from 'rxjs';\nimport {MnAlertStore} from '../mn-alert.store';\nimport {MnAlert} from '../mn-alert.types';\nimport {mnAlertVariants} from '../mn-alertVariants';\nimport {MnButton} from '../../mn-button/mn-button';\n\nexport type MnAlertTemplateContext = {\n $implicit: MnAlert;\n alert: MnAlert;\n dismiss: () => void;\n}\n\n@Component({\n selector: 'mn-alert-outlet',\n standalone: true,\n imports: [CommonModule, MnButton],\n templateUrl: './mn-alert-outlet.html',\n styleUrl: './mn-alert-outlet.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnAlertOutletComponent {\n @Input() template?: TemplateRef<MnAlertTemplateContext>;\n\n private store = inject(MnAlertStore);\n alerts$: Observable<MnAlert[]> = this.store.alerts$;\n\n constructor() {}\n\n dismissAlert(id: string) {\n this.store.dismiss(id);\n }\n\n trackById = (_: number, a: MnAlert) => a.id;\n\n getAlertClasses(a: MnAlert) {\n return mnAlertVariants({ kind: a.kind, variant: a.variant });\n }\n\n contextFor(a: MnAlert) {\n return {\n $implicit: a,\n alert: a,\n dismiss: () => this.dismissAlert(a.id)\n } as const;\n }\n\n}\n","@if (alerts$ | async; as alerts) {\n <div class=\"fixed top-4 left-0 right-0 z-[9999] flex flex-col gap-3 w-full px-2 sm:px-0 sm:left-auto sm:right-4 sm:max-w-sm\">\n @for (a of alerts; track trackById($index, a)) {\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"contextFor(a)\">\n </ng-container>\n } @else {\n <div [class]=\"getAlertClasses(a)\" [class.extra]=\"a.cssClass\" class=\"relative\">\n <div class=\"flex-1 min-w-0 pr-8\">\n <h4 class=\"font-semibold text-sm\">{{ a.title }}</h4>\n @if (a.subTitle) {\n <p class=\"text-sm mt-1 opacity-90 leading-tight\">{{ a.subTitle }}</p>\n }\n </div>\n <button\n mnButton\n [data]=\"{ size: 'md', variant: 'text' }\"\n (click)=\"dismissAlert(a.id)\"\n class=\"absolute top-2 right-2 shrink-0 !text-current hover:!bg-current/10\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n }\n }\n </div>\n}\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnBadgeVariants = tv({\n base: 'inline-flex items-center rounded-md border font-semibold',\n variants: {\n size: {\n sm: 'px-1.5 py-0.5 text-xs',\n md: 'px-2 py-0.5 text-sm',\n lg: 'px-2.5 py-1 text-base',\n xl: 'px-3 py-1.5 text-lg',\n },\n\n variant: {\n default: '',\n fill: '',\n },\n\n wrap: {\n true: 'whitespace-normal',\n false: 'whitespace-nowrap',\n },\n\n color: {\n primary: '',\n secondary: '',\n danger: '',\n warning: '',\n success: '',\n accent: '',\n lightgray: '',\n },\n },\n\n compoundVariants: [\n // Default (light/transparent)\n { variant: 'default', color: 'primary', class: 'bg-primary/20 border-primary text-primary' },\n { variant: 'default', color: 'secondary', class: 'bg-neutral/20 border-neutral text-neutral' },\n { variant: 'default', color: 'danger', class: 'bg-error/20 border-error text-error' },\n { variant: 'default', color: 'warning', class: 'bg-warning/20 border-warning text-warning' },\n { variant: 'default', color: 'success', class: 'bg-success/20 border-success text-success' },\n { variant: 'default', color: 'accent', class: 'bg-accent/20 border-accent text-accent' },\n { variant: 'default', color: 'lightgray', class: 'bg-base-content/10 border-base-content/70 text-base-content/70' },\n // Fill (solid)\n { variant: 'fill', color: 'primary', class: 'bg-primary border-primary text-primary-content' },\n { variant: 'fill', color: 'secondary', class: 'bg-neutral border-neutral text-neutral-content' },\n { variant: 'fill', color: 'danger', class: 'bg-error border-error text-error-content' },\n { variant: 'fill', color: 'warning', class: 'bg-warning border-warning text-warning-content' },\n { variant: 'fill', color: 'success', class: 'bg-success border-success text-success-content' },\n { variant: 'fill', color: 'accent', class: 'bg-accent border-accent text-accent-content' },\n { variant: 'fill', color: 'lightgray', class: 'bg-base-content/70 border-base-content/70 text-base-100' },\n ],\n\n defaultVariants: {\n size: 'md',\n variant: 'default',\n color: 'primary',\n wrap: false,\n },\n});\n\nexport type MnBadgeVariants = VariantProps<typeof mnBadgeVariants>;\n","import { Component, HostBinding, Input } from '@angular/core';\nimport { MnBadgeTypes } from './mn-badgeTypes';\nimport { mnBadgeVariants } from './mn-badgeVariants';\n\n@Component({\n selector: 'span[mnBadge]',\n standalone: true,\n templateUrl: './mn-badge.html',\n})\nexport class MnBadge {\n @Input() data: Partial<MnBadgeTypes> = {};\n\n @HostBinding('class')\n get hostClasses(): string {\n return mnBadgeVariants({\n size: this.data.size,\n variant: this.data.variant,\n color: this.data.color,\n wrap: this.data.wrap,\n });\n }\n}\n","<ng-content></ng-content>\n","/**\n * MnInputField Adapters\n *\n * This module implements the Adapter Pattern to handle type-specific behavior\n * for different HTML input types in the MnInputField component.\n *\n * The adapter pattern allows the component to support multiple input types\n * (text, number, date, time, etc.) without coupling the component logic to\n * type-specific implementations. Each adapter handles:\n * - Parsing: converting raw string input to the appropriate data type\n * - Formatting: converting typed values back to string for display\n * - Attributes: providing type-specific DOM attributes (min, max, step, inputmode)\n * - Validation: implementing type-specific validation rules\n *\n * This approach keeps the component code clean and makes it easy to add\n * support for new input types by creating new adapters.\n */\n\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\nimport { MnInputDateTimeProps, MnInputProps, MnInputType } from './mn-input-fieldTypes';\n\n/**\n * DOM attributes that can be dynamically set on input elements.\n * These attributes are type-specific and provided by adapters.\n */\nexport type MnDomAttrs = {\n /** Minimum value for date/time/number inputs */\n min?: string | null;\n /** Maximum value for date/time/number inputs */\n max?: string | null;\n /** Step increment for number/date/time inputs */\n step?: string | null;\n /** Mobile keyboard hint (e.g., 'decimal' for number inputs) */\n inputmode?: string | null;\n};\n\n/**\n * Adapter interface for handling input type-specific behavior.\n *\n * Each adapter implementation defines how to handle a specific input type\n * (or group of related types) throughout the component lifecycle.\n *\n * @template TOut - The output type after parsing (e.g., string | null, number | null)\n */\nexport type MnInputAdapter<TOut = string | null> = {\n /**\n * Parses the raw string value from the input element into the typed value\n * that will be sent to the FormControl.\n *\n * @param raw - Raw string value from the input element\n * @returns Typed value to store in the FormControl\n *\n * @example\n * // Text adapter\n * parse('hello') // => 'hello'\n * parse('') // => null\n *\n * // Number adapter\n * parse('42') // => 42\n * parse('') // => null\n * parse('abc') // => null\n */\n parse(raw: string): TOut;\n\n /**\n * Formats the typed value from the FormControl into a string\n * that will be displayed in the input element.\n *\n * @param val - Typed value from the FormControl\n * @returns String representation for the input element's value attribute\n *\n * @example\n * // Text adapter\n * format('hello') // => 'hello'\n * format(null) // => ''\n *\n * // Number adapter\n * format(42) // => '42'\n * format(null) // => ''\n */\n format(val: unknown): string;\n\n /**\n * Returns type-specific DOM attributes for the input element.\n * These attributes are applied dynamically based on the input type and props.\n *\n * @param props - Input field properties\n * @returns Object containing DOM attributes (min, max, step, inputmode)\n *\n * @example\n * // Date adapter with date range\n * attrs({ startDate: '2024-01-01', endDate: '2024-12-31' })\n * // => { min: '2024-01-01', max: '2024-12-31' }\n *\n * // Number adapter\n * attrs({}) // => { inputmode: 'decimal' }\n */\n attrs(props: MnInputProps): MnDomAttrs;\n\n /**\n * Performs type-specific validation on the current input value.\n * This validation runs in addition to Angular's built-in validators.\n *\n * @param props - Input field properties (may contain validation constraints)\n * @param control - The AbstractControl being validated\n * @param currentRaw - Current raw string value from the input element\n * @returns ValidationErrors object if invalid, null if valid\n *\n * @example\n * // Date adapter validation\n * validate(props, control, '2024-06-15')\n * // Returns { mnMin: { min: '2024-07-01', actual: '2024-06-15' } }\n * // if startDate is '2024-07-01'\n */\n validate(props: MnInputProps, control: AbstractControl, currentRaw: string | null): ValidationErrors | null;\n\n /**\n * Applies a mask to the raw input value.\n */\n applyMask?(value: string, mask: string): string;\n}\n\n/**\n * Utility function to convert empty strings to null.\n * This is a common pattern for optional form fields where empty input\n * should be treated as \"no value\" rather than an empty string.\n *\n * @param raw - Raw input string\n * @returns The input string if non-empty, null if empty\n *\n * @example\n * emptyToNull('hello') // => 'hello'\n * emptyToNull('') // => null\n */\nconst emptyToNull = (raw: string): string | null => (raw === '' ? null : raw);\n\n/**\n * Default adapter for text-based input types.\n * Used for: text, email, password, search, tel, url\n *\n * Behavior:\n * - Empty strings are converted to null\n * - Values are stored as strings in the FormControl\n * - No special DOM attributes\n * - No additional validation (relies on Angular's built-in validators)\n * - Supports simple masking (0 for digit, A for alpha, * for any)\n */\nexport const defaultTextAdapter: MnInputAdapter<string | null> = {\n parse: (raw) => emptyToNull(raw),\n format: (val) => (val == null ? '' : String(val)),\n attrs: () => ({}),\n validate: () => null,\n applyMask: (value: string, mask: string): string => {\n if (!mask || !value) return value;\n\n let result = '';\n let maskIndex = 0;\n let dataIndex = 0;\n\n // Remove non-alphanumeric if we want to re-mask from clean data\n // But usually we just want to restrict input.\n // A simple implementation:\n while (maskIndex < mask.length && dataIndex < value.length) {\n const maskChar = mask[maskIndex];\n const dataChar = value[dataIndex];\n\n if (maskChar === '0') {\n if (/\\d/.test(dataChar)) {\n result += dataChar;\n dataIndex++;\n maskIndex++;\n } else {\n dataIndex++; // skip invalid\n }\n } else if (maskChar === 'A') {\n if (/[a-zA-Z]/.test(dataChar)) {\n result += dataChar;\n dataIndex++;\n maskIndex++;\n } else {\n dataIndex++; // skip invalid\n }\n } else if (maskChar === '*') {\n result += dataChar;\n dataIndex++;\n maskIndex++;\n } else {\n result += maskChar;\n if (dataChar === maskChar) {\n dataIndex++;\n }\n maskIndex++;\n }\n }\n\n // Auto-append static characters if next in mask\n while (maskIndex < mask.length && !/[0A*]/.test(mask[maskIndex])) {\n result += mask[maskIndex];\n maskIndex++;\n }\n\n return result;\n }\n};\n\n/**\n * Adapter for date and time input types.\n * Used for: date, time, datetime-local\n *\n * Behavior:\n * - Empty strings are converted to null\n * - Values are stored as ISO 8601 strings in the FormControl\n * - Provides min/max attributes from startDate/endDate props\n * - Validates date/time ranges using string comparison\n *\n * Note: String comparison works for ISO 8601 dates/times because they are\n * lexicographically ordered (e.g., '2024-01-15' < '2024-12-31').\n */\nexport const dateTimeAdapter: MnInputAdapter<string | null> = {\n parse: (raw) => emptyToNull(raw),\n format: (val) => (val == null ? '' : String(val)),\n attrs: (props) => ({\n min: (props as MnInputDateTimeProps).startDate ?? null,\n max: (props as MnInputDateTimeProps).endDate ?? null,\n }),\n validate: (props, _control, currentRaw) => {\n const value = currentRaw;\n if (!value) return null; // Don't validate empty values (use 'required' validator for that)\n\n const min = (props as MnInputDateTimeProps).startDate as string | undefined;\n const max = (props as MnInputDateTimeProps).endDate as string | undefined;\n\n // Validate minimum date/time constraint\n if (min && value < min) {\n return { mnMin: { min, actual: value } };\n }\n\n // Validate maximum date/time constraint\n if (max && value > max) {\n return { mnMax: { max, actual: value } };\n }\n\n return null;\n },\n};\n\n/**\n * Adapter for number input type.\n *\n * Behavior:\n * - Empty strings are converted to null\n * - Valid numbers are parsed to number type\n * - Invalid numbers (NaN, Infinity) are converted to null\n * - Values are stored as numbers (or null) in the FormControl\n * - Sets inputmode='decimal' for optimized mobile keyboards\n * - No additional validation (relies on Angular's built-in validators)\n *\n * Note: The browser's native number input validation handles\n * basic number format validation automatically.\n */\nexport const numberAdapter: MnInputAdapter<number | null> = {\n parse: (raw) => {\n if (raw === '') return null;\n const num = Number(raw);\n return Number.isFinite(num) ? num : null;\n },\n format: (val) => (val == null ? '' : String(val)),\n attrs: () => ({\n inputmode: 'decimal',\n }),\n validate: () => null,\n};\n\n/**\n * Selects the appropriate adapter based on the input type.\n * This is the main factory function used by the MnInputField component\n * to determine which adapter to use for a given input type.\n *\n * @param type - The input type (e.g., 'text', 'email', 'date', 'number')\n * @returns The appropriate adapter instance\n *\n * @example\n * pickAdapter('text') // => defaultTextAdapter\n * pickAdapter('email') // => defaultTextAdapter\n * pickAdapter('date') // => dateTimeAdapter\n * pickAdapter('number') // => numberAdapter\n */\nexport function pickAdapter(type: MnInputType): MnInputAdapter<string | null | number> {\n // Date/time inputs use the dateTimeAdapter for range validation\n if (type === 'date' || type === 'time' || type === 'datetime-local') {\n return dateTimeAdapter;\n }\n\n // Number inputs use the numberAdapter for type conversion\n if (type === 'number') {\n return numberAdapter;\n }\n\n // All other input types use the default text adapter\n return defaultTextAdapter;\n}\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnInputFieldVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 placeholder-base-content/50 text-base-content text-sm outline-none focus:ring-1 focus:ring-primary',\n variants: {\n\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n hover: {\n true: 'hover:cursor-pointer hover:bg-base-200 transition-colors duration-300 ease-in-out',\n },\n disabled: {\n true: 'opacity-50 cursor-not-allowed',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n hover: true,\n }\n});\n\nexport type MnInputVariants = VariantProps<typeof mnInputFieldVariants>;\n","import {Component, Input} from '@angular/core';\n\n@Component({\n selector: 'mn-error-message',\n imports: [],\n templateUrl: './mn-error-message.html',\n})\nexport class MnErrorMessage {\n @Input({ required: true }) errorMessage! :string;\n @Input({ required: true }) id!: string;\n}\n","<div [id]=\"id + '-error'\" class=\"text-red-500 mt-2 text-sm\">\n {{ errorMessage }}\n</div>\n","/**\n * Types for mn-lib configuration.\n */\n\nexport type MnConfigSettings = {\n /** Application or library version. */\n version?: string;\n /** Application or library name. */\n name?: string;\n}\n\nexport type MnConfigFile = {\n /**\n * General settings such as version and name.\n */\n settings?: MnConfigSettings;\n /**\n * Base defaults by component name. Each value is a plain object with inputs/options for that component.\n */\n defaults: Record<string, unknown>;\n /**\n * Nested object tree keyed by section names. Leaf nodes may contain\n * component-name keys (component override objects) and keys starting with '#'\n * representing instance-id overrides.\n */\n overrides: Record<string, unknown>;\n}\n","/**\n * A marker object used in config values to indicate that the value\n * should be resolved via the MnLanguageService.\n *\n * Example in mn-config.json5:\n * label: { $translate: \"form.email.label\" }\n */\nexport type MnTranslatable = {\n $translate: string;\n params?: Record<string, string | number>;\n}\n\n/**\n * A config value that is either a plain value or a translatable marker.\n */\nexport type MnConfigValue<T = string> = T | MnTranslatable;\n\n/**\n * A flat key-value map of translations for a single locale.\n * Supports nested keys via dot notation: \"form.email.label\"\n */\nexport type MnTranslationMap = Record<string, string>;\n\n/**\n * All loaded translations keyed by locale code (e.g. \"en\", \"nl\", \"de\").\n */\nexport type MnTranslations = Record<string, MnTranslationMap>;\n\n/**\n * Configuration for the language provider.\n */\nexport type MnLanguageConfig = {\n /** URL pattern for loading translation files. Use `{locale}` as placeholder. e.g. \"assets/i18n/{locale}.json\" */\n urlPattern: string;\n /** The default/fallback locale. */\n defaultLocale: string;\n /** Locales to preload at bootstrap. */\n preload?: string[];\n /**\n * Optional mapping of domain hostnames to locale codes.\n * When set, the service will use the current domain to determine the initial locale.\n * Example: { \"example.nl\": \"nl\", \"example.de\": \"de\", \"example.com\": \"en\" }\n */\n domainLocaleMap?: Record<string, string>;\n /** Whether to enable debug logging. */\n debug?: boolean;\n}\n\n/**\n * Type guard: checks whether a value is a translatable marker object.\n */\nexport function isTranslatable(value: unknown): value is MnTranslatable {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as Record<string, unknown>)['$translate'] === 'string'\n );\n}\n","import {Injectable, inject, ApplicationRef} from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, firstValueFrom, Observable } from 'rxjs';\nimport { MnTranslationMap, MnTranslations } from './mn-language.types';\n\n@Injectable({ providedIn: 'root' })\nexport class MnLanguageService {\n private readonly http = inject(HttpClient);\n private readonly appRef = inject(ApplicationRef);\n\n private _translations: MnTranslations = {};\n private _locale$ = new BehaviorSubject<string>('en');\n private _urlPattern: string | null = null;\n private _debug = false;\n\n /** Observable of the current active locale. */\n readonly locale$: Observable<string> = this._locale$.asObservable();\n\n /** Current active locale. */\n get locale(): string {\n return this._locale$.value;\n }\n\n /**\n * Enable or disable debug logging.\n */\n setDebug(enabled: boolean): void {\n this._debug = enabled;\n if (enabled) {\n console.log(`[MnLanguage] Debug mode enabled`);\n }\n }\n\n /**\n * Configure the URL pattern used to fetch translation files.\n * Use `{locale}` as placeholder, e.g. `\"assets/i18n/{locale}.json\"`.\n */\n configure(urlPattern: string): void {\n if (this._debug) {\n console.log(`[MnLanguage] Configured urlPattern: ${urlPattern}`);\n }\n this._urlPattern = urlPattern;\n }\n\n /**\n * Load translations for a locale from the configured URL pattern.\n * If translations are already loaded for this locale, this is a no-op.\n */\n async loadLocale(locale: string): Promise<void> {\n if (this._translations[locale]) return;\n\n if (!this._urlPattern) {\n console.warn(`[MnLanguage] No URL pattern configured. Call configure() or use provideMnLanguage().`);\n return;\n }\n\n const url = this._urlPattern.replace('{locale}', locale);\n if (this._debug) {\n console.log(`[MnLanguage] Loading locale \"${locale}\" from ${url}`);\n }\n\n try {\n const map = await firstValueFrom(\n this.http.get<MnTranslationMap>(url)\n );\n this._translations[locale] = map ?? {};\n if (this._debug) {\n console.log(`[MnLanguage] Loaded locale \"${locale}\"`, this._translations[locale]);\n }\n } catch (err) {\n console.warn(`[MnLanguage] Failed to load translations from ${url}`, err);\n this._translations[locale] = {};\n }\n }\n\n /**\n * Switch the active locale. Loads translations if not yet loaded.\n */\n async setLocale(locale: string): Promise<void> {\n if (this._debug) {\n console.log(`[MnLanguage] Setting locale to \"${locale}\"`);\n }\n await this.loadLocale(locale);\n this._locale$.next(locale);\n this.appRef.tick();\n }\n\n /**\n * Register translations for a locale directly from code (no HTTP needed).\n */\n registerTranslations(locale: string, translations: MnTranslationMap): void {\n this._translations[locale] = {\n ...(this._translations[locale] ?? {}),\n ...translations,\n };\n }\n\n /**\n * Translate a key using the current locale, with optional parameter interpolation.\n * Falls back to the key itself if no translation is found.\n *\n * Interpolation replaces `{{paramName}}` with the provided value.\n */\n translate(key: string, params?: Record<string, string | number>): string {\n const map = this._translations[this.locale] ?? {};\n let value = this.getValueFromMap(map, key);\n\n if (value === undefined) {\n if (this._debug) {\n console.warn(`[MnLanguage] Missing translation for key: \"${key}\" in locale: \"${this.locale}\"`);\n }\n return key;\n }\n\n if (params) {\n for (const [paramKey, paramValue] of Object.entries(params)) {\n value = value.replace(new RegExp(`\\\\{\\\\{${paramKey}\\\\}\\\\}`, 'g'), String(paramValue));\n }\n }\n\n return value;\n }\n\n /**\n * Helper to retrieve a value from a potentially nested translation map using a dot-notated key.\n */\n private getValueFromMap(map: MnTranslationMap, key: string): string | undefined {\n if (map[key] !== undefined) return map[key];\n\n const parts = key.split('.');\n let current: MnTranslationMap | string | undefined = map;\n\n for (const part of parts) {\n if (current === null || typeof current !== 'object') return undefined;\n current = (current as MnTranslationMap)[part];\n }\n\n return typeof current === 'string' ? current : undefined;\n }\n\n /**\n * Shorthand alias for `translate`.\n */\n t(key: string, params?: Record<string, string | number>): string {\n return this.translate(key, params);\n }\n\n /**\n * Resolve the effective default locale from a domain-to-locale map.\n * Matches `window.location.hostname` against the map keys.\n * Returns the mapped locale, or the provided fallback if no match is found.\n */\n resolveLocaleForDomain(domainLocaleMap: Record<string, string> | undefined, fallback: string): string {\n if (!domainLocaleMap || typeof window === 'undefined') return fallback;\n const hostname = window.location.hostname;\n return domainLocaleMap[hostname] ?? fallback;\n }\n}\n","import { APP_INITIALIZER, Provider } from '@angular/core';\nimport { MnLanguageService } from './mn-language.service';\nimport { MnLanguageConfig } from './mn-language.types';\n\n/**\n * Provides an APP_INITIALIZER that configures the MnLanguageService and\n * preloads the requested locales during application bootstrap.\n *\n * Usage in app.config.ts:\n * ...provideMnLanguage({\n * urlPattern: 'assets/i18n/{locale}.json',\n * defaultLocale: 'en',\n * preload: ['en', 'nl'],\n * })\n */\nexport function provideMnLanguage(config: MnLanguageConfig): Provider[] {\n return [\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (svc: MnLanguageService) => async () => {\n if (config.debug) {\n svc.setDebug(true);\n }\n svc.configure(config.urlPattern);\n\n const effectiveLocale = svc.resolveLocaleForDomain(config.domainLocaleMap, config.defaultLocale);\n const localesToLoad = config.preload ?? [effectiveLocale];\n await Promise.all(localesToLoad.map(l => svc.loadLocale(l)));\n await svc.setLocale(effectiveLocale);\n },\n deps: [MnLanguageService],\n },\n ];\n}\n","import {Pipe, PipeTransform, inject} from '@angular/core';\nimport { MnLanguageService } from './mn-language.service';\n\n/**\n * Pipe that translates a key via MnLanguageService.\n *\n * Usage in templates:\n * {{ 'form.email.label' | mnTranslate }}\n * {{ 'greeting' | mnTranslate:{ name: 'World' } }}\n *\n * Note: This pipe is impure so it re-evaluates when the locale changes.\n */\n@Pipe({\n name: 'mnTranslate',\n standalone: true,\n pure: false,\n})\nexport class MnTranslatePipe implements PipeTransform {\n private readonly lang = inject(MnLanguageService);\n\n\n transform(key: string, params?: Record<string, string | number>): string {\n return this.lang.translate(key, params);\n }\n}\n","import {inject, Injectable, signal} from '@angular/core';\nimport {HttpClient} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\nimport {MnConfigFile, MnConfigSettings} from './mn-config.types';\nimport {isTranslatable, MnLanguageConfig, MnLanguageService} from '../language';\nimport JSON5 from 'json5';\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n Object.prototype.toString.call(value) === '[object Object]'\n );\n}\n\n@Injectable({ providedIn: 'root' })\nexport class MnConfigService {\n private readonly http = inject(HttpClient);\n\n private _config: MnConfigFile | null = null;\n private _settings: MnConfigSettings = {};\n private _debugMode = false;\n\n /** Reactive version counter — incremented on every config load. */\n private _configVersion = signal(0);\n readonly configVersion = this._configVersion.asReadonly();\n\n private readonly lang = inject(MnLanguageService);\n\n /** General settings from the config file (version, name, etc.). */\n get settings(): Readonly<MnConfigSettings> {\n return this._settings;\n }\n\n /**\n * Load the configuration JSON from the provided URL and cache it in memory.\n * Consumers should typically call this via the APP_INITIALIZER helper.\n */\n async load(url: string, debugMode = false): Promise<void> {\n this._debugMode = debugMode;\n this.lang.setDebug(debugMode);\n let text: string;\n\n try {\n text = await firstValueFrom(\n this.http.get(url, { responseType: 'text' })\n );\n } catch (err) {\n console.warn(`[MnConfig] Failed to load config from ${url}`, err);\n this._config = { defaults: {}, overrides: {} };\n return;\n }\n\n let json: unknown;\n\n try {\n json = JSON5.parse(text);\n } catch (err) {\n console.warn(`[MnConfig] Failed to parse JSON5 from ${url}`, err, text);\n json = {};\n }\n\n const cfg = (isPlainObject(json) ? json : {}) as Record<string, unknown>;\n const defaults = isPlainObject(cfg['defaults']) ? cfg['defaults'] : {};\n const overrides: Record<string, unknown> = isPlainObject(cfg['overrides']) ? cfg['overrides'] : {};\n\n const settings: MnConfigSettings = isPlainObject(cfg['settings']) ? cfg['settings'] as MnConfigSettings : {};\n\n this._config = { settings, defaults, overrides };\n this._settings = settings;\n\n // Bootstrap language service from config if a \"language\" section is present.\n // This avoids circular dependency: config reads raw language settings and\n // pushes them into the language service (language service never imports config).\n const langCfg = cfg['language'];\n if (isPlainObject(langCfg) && typeof langCfg['urlPattern'] === 'string') {\n const lc = langCfg as MnLanguageConfig;\n if (this._debugMode) {\n console.log(`[MnConfig] Applying language config from file`, lc);\n }\n this.lang.configure(lc.urlPattern);\n const effectiveLocale = this.lang.resolveLocaleForDomain(lc.domainLocaleMap, lc.defaultLocale);\n const localesToLoad = Array.from(new Set([...(lc.preload ?? []), effectiveLocale]));\n await Promise.all(localesToLoad.map(l => this.lang.loadLocale(l)));\n await this.lang.setLocale(effectiveLocale);\n }\n\n this._configVersion.update(v => v + 1);\n }\n\n /**\n * Load configuration from a pre-parsed object (no HTTP fetch).\n * Used for live preview scenarios where config is pushed via postMessage.\n * Optionally re-bootstraps the language service if a `language` section is present.\n */\n async loadFromObject(config: Record<string, unknown>, bootstrapLanguage = false): Promise<void> {\n const defaults = isPlainObject(config['defaults']) ? config['defaults'] : {};\n const overrides = isPlainObject(config['overrides']) ? config['overrides'] : {};\n const settings: MnConfigSettings = isPlainObject(config['settings']) ? config['settings'] as MnConfigSettings : {};\n\n this._config = { settings, defaults, overrides };\n this._settings = settings;\n\n if (bootstrapLanguage) {\n const langCfg = config['language'];\n if (isPlainObject(langCfg) && typeof langCfg['urlPattern'] === 'string') {\n const lc = langCfg as MnLanguageConfig;\n if (this._debugMode) {\n console.log(`[MnConfig] Applying language config from object`, lc);\n }\n this.lang.configure(lc.urlPattern);\n const effectiveLocale = this.lang.resolveLocaleForDomain(lc.domainLocaleMap, lc.defaultLocale);\n const localesToLoad = Array.from(new Set([...(lc.preload ?? []), effectiveLocale]));\n await Promise.all(localesToLoad.map(l => this.lang.loadLocale(l)));\n await this.lang.setLocale(effectiveLocale);\n }\n }\n\n this._configVersion.update(v => v + 1);\n }\n\n\n /**\n * Resolve a configuration object for a component, optionally scoped to a section path\n * and optionally overridden by an instance id.\n */\n resolve<T extends object = Record<string, unknown>>(\n componentName: string,\n sectionPath: string[] = [],\n instanceId?: string,\n ): T {\n const baseConfig: Record<string, unknown> = isPlainObject(this._config?.defaults)\n ? (isPlainObject((this._config as MnConfigFile).defaults[componentName])\n ? { ...(this._config as MnConfigFile).defaults[componentName] as Record<string, unknown> }\n : {})\n : {};\n\n const leaf = this.walkOverrides(this._config?.overrides ?? {}, sectionPath);\n\n let resolved: Record<string, unknown> = baseConfig;\n\n if (leaf && isPlainObject((leaf as Record<string, unknown>)[componentName])) {\n resolved = this.deepMerge(resolved, (leaf as Record<string, unknown>)[componentName] as Record<string, unknown>);\n }\n\n if (instanceId) {\n const instKey = `#${instanceId}`;\n if (leaf && isPlainObject((leaf as Record<string, unknown>)[instKey])) {\n resolved = this.deepMerge(resolved, (leaf as Record<string, unknown>)[instKey] as Record<string, unknown>);\n }\n }\n\n if (this._debugMode) {\n console.debug(`[MnConfig] Resolving for ${componentName}`, {\n sectionPath,\n instanceId,\n resolved,\n });\n }\n\n return this.resolveTranslatables(resolved) as T;\n }\n\n /**\n * Walk the overrides nested object using the provided section path and return the leaf node.\n * If any segment is missing or the current node is not a plain object, returns undefined.\n */\n walkOverrides(overridesRoot: unknown, sectionPath: string[]): unknown | undefined {\n let node: unknown = overridesRoot;\n for (const segment of sectionPath) {\n if (!isPlainObject(node)) return undefined;\n node = (node as Record<string, unknown>)[segment];\n if (node === undefined) return undefined;\n }\n return node;\n }\n\n /**\n * Recursively walk a resolved config object and replace any `{ $translate: \"key\" }` markers\n * with their translated values from MnLanguageService.\n */\n private resolveTranslatables(obj: Record<string, unknown>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (isTranslatable(value)) {\n out[key] = this.lang.translate(value.$translate, value.params);\n } else if (Array.isArray(value)) {\n out[key] = value.map(item => {\n if (isTranslatable(item)) {\n return this.lang.translate(item.$translate, item.params);\n } else if (isPlainObject(item)) {\n return this.resolveTranslatables(item as Record<string, unknown>);\n }\n return item;\n });\n } else if (isPlainObject(value)) {\n out[key] = this.resolveTranslatables(value as Record<string, unknown>);\n } else {\n out[key] = value;\n }\n }\n return out;\n }\n\n /**\n * Deep merge two plain-object trees. Arrays and non-plain values are replaced by the patch.\n * Does not mutate inputs; returns a new object.\n */\n deepMerge<A extends Record<string, unknown>, B extends Record<string, unknown>>(base: A, patch: B): A & B {\n const out: Record<string, unknown> = {...base};\n for (const key of Object.keys(patch)) {\n const bVal = base[key];\n const pVal = patch[key];\n\n if (isPlainObject(bVal) && isPlainObject(pVal)) {\n out[key] = this.deepMerge(bVal, pVal);\n } else {\n // replace for arrays, primitives, null, undefined, and non-plain objects\n out[key] = pVal;\n }\n }\n return out as A & B;\n }\n}\n","import { APP_INITIALIZER, Provider } from '@angular/core';\nimport { MnConfigService } from './mn-config.service';\n\n/**\n * Provides an APP_INITIALIZER that loads the mn-lib configuration from the given URL\n * during application bootstrap. The consuming application is responsible for providing\n * HttpClient (e.g., via HttpClientModule or provideHttpClient()).\n */\nexport function provideMnConfig(url: string, debugMode = false): Provider[] {\n return [\n {\n provide: APP_INITIALIZER,\n multi: true,\n useFactory: (svc: MnConfigService) => () => svc.load(url, debugMode),\n deps: [MnConfigService],\n },\n ];\n}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Represents the current section path based on nested mn-section directives.\n */\nexport const MN_SECTION_PATH = new InjectionToken<string[]>(\n 'MN_SECTION_PATH',\n {\n providedIn: 'root',\n factory: () => [],\n },\n);\n\n/**\n * Represents the current component instance id provided by [mn-instance].\n */\nexport const MN_INSTANCE_ID = new InjectionToken<string | null>(\n 'MN_INSTANCE_ID',\n {\n providedIn: 'root',\n factory: () => null,\n },\n);\n","import { DestroyRef, InjectionToken, Optional, Provider } from '@angular/core';\nimport { MN_INSTANCE_ID, MN_SECTION_PATH } from '../context/mn-context.tokens';\nimport { MnConfigService } from './mn-config.service';\nimport { MnLanguageService } from '../language/mn-language.service';\n\n/**\n * Helper to provide a resolved, typed component config via DI.\n *\n * Usage in a component/module providers:\n * const MY_CFG = new InjectionToken<MyCfg>('MY_CFG');\n * providers: [ provideMnComponentConfig(MY_CFG, 'my-component') ]\n * Then in the component:\n * readonly cfg = inject(MY_CFG)\n *\n * The returned config object is **reactive**: when the active locale changes,\n * all translatable values are re-resolved in place so that templates using\n * `cfg.someLabel` automatically reflect the new language on the next change-detection cycle.\n */\nexport function provideMnComponentConfig<T extends object>(\n token: InjectionToken<T>,\n componentName: string,\n initial?: Partial<T>,\n): Provider {\n return {\n provide: token,\n deps: [\n MnConfigService,\n MnLanguageService,\n DestroyRef,\n [new Optional(), MN_SECTION_PATH],\n [new Optional(), MN_INSTANCE_ID],\n ],\n useFactory: (\n svc: MnConfigService,\n lang: MnLanguageService,\n destroyRef: DestroyRef,\n sectionPath: string[] | null,\n instanceId: string | null,\n ): T => {\n const resolveConfig = (): T => {\n const resolved = svc.resolve<T>(componentName, sectionPath ?? [], instanceId ?? undefined);\n return Object.assign({}, initial ?? {}, resolved);\n };\n\n // Create the initial config object that will be shared by reference.\n const cfg = resolveConfig();\n\n // Re-resolve translatable values whenever the locale changes.\n // skip(1) because the current locale was already used for the initial resolve.\n const sub = lang.locale$.subscribe(() => {\n const updated = resolveConfig();\n // Mutate the existing object in place so all template bindings pick up the new values.\n for (const key of Object.keys(updated)) {\n (cfg as Record<string, unknown>)[key] = (updated as Record<string, unknown>)[key];\n }\n });\n\n destroyRef.onDestroy(() => sub.unsubscribe());\n\n return cfg;\n },\n };\n}\n","import { Attribute, Directive, Input, Optional, SkipSelf } from '@angular/core';\nimport { MN_SECTION_PATH } from './mn-context.tokens';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- kebab-case is intentional: matches the Attribute() token and is stable public API\n selector: '[mn-section]',\n standalone: true,\n providers: [\n {\n provide: MN_SECTION_PATH,\n // Read parent MN_SECTION_PATH from ancestor injector (skipSelf to avoid self-reference),\n // and read the attribute value using Attribute so it's available at provider creation time.\n deps: [[new Optional(), new SkipSelf(), MN_SECTION_PATH], new Attribute('mn-section')],\n useFactory: (parentPath: string[] | null, attr: string | null) => {\n const parent = Array.isArray(parentPath) ? parentPath : [];\n const name = (attr ?? '').trim();\n return name ? [...parent, name] : [...parent];\n },\n },\n ],\n})\nexport class MnSectionDirective {\n /** Section name contributed by this DOM node to the section path */\n @Input('mn-section') mnSection: string | undefined;\n}\n","import { Attribute, Directive, Input } from '@angular/core';\nimport { MN_INSTANCE_ID } from './mn-context.tokens';\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector -- kebab-case is intentional: matches the Attribute() token and is stable public API\n selector: '[mn-instance]',\n standalone: true,\n providers: [\n {\n provide: MN_INSTANCE_ID,\n // Read the attribute at provider creation time using Attribute token; Inputs may not be set yet.\n deps: [new Attribute('mn-instance')],\n useFactory: (attr: string | null) => (attr ?? '').trim() || null,\n },\n ],\n})\nexport class MnInstanceDirective {\n /** Instance id for targeting per-component instance overrides */\n @Input('mn-instance') mnInstance: string | undefined;\n}\n","import {Component, DestroyRef, ElementRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {CommonModule, NgClass} from '@angular/common';\nimport {MnErrorMessageData, MnInputFieldUIConfig, MnInputProps} from './mn-input-fieldTypes';\nimport {AbstractControl, FormsModule, NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {pickAdapter} from './mn-input-field-adapters';\nimport {mnInputFieldVariants} from './mn-input-fieldVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_INPUT_FIELD_CONFIG = new InjectionToken<MnInputFieldUIConfig>('MN_INPUT_FIELD_CONFIG');\n\n/**\n * MnInputField Component\n *\n * A flexible, accessible input field component that implements Angular's ControlValueAccessor\n * and Validator interfaces. Supports multiple input types, custom validation messages,\n * and configurable error display (single or multiple errors).\n *\n * Features:\n * - Works with Angular Reactive Forms (FormControl, FormGroup)\n * - Supports standard and date/time input types\n * - Built-in error messages with internationalization support\n * - Custom error messages per field\n * - Priority-based error display or show all errors\n * - Full accessibility (ARIA attributes)\n * - Type-safe adapter pattern for different input types\n *\n * @example\n * ```typescript\n * <mn-input-field\n * formControlName=\"email\"\n * [props]=\"{\n * id: 'email',\n * type: 'email',\n * label: 'Email Address',\n * size: 'md',\n * borderRadius: 'md',\n * errorMessages: { required: 'Email is required' }\n * }\"\n * ></mn-input-field>\n * ```\n */\n@Component({\n selector: 'mn-lib-input-field',\n standalone: true,\n imports: [CommonModule, NgClass, MnErrorMessage, FormsModule],\n templateUrl: './mn-input-field.html',\n host: {\n // Native inputs (notably `type=\"date\"`) have a platform-specific intrinsic width.\n // Without an explicit host width the inline host collapses to that intrinsic size,\n // so the input's `w-full` (width:100%) resolves against a content-sized box and\n // fails to fill the parent on real mobile devices (desktop devtools hides this\n // because it still renders the control with the desktop engine). Give the host a\n // real width when fullWidth is requested so 100% has something to fill.\n '[style.display]': \"props?.fullWidth ? 'block' : null\",\n '[style.width]': \"props?.fullWidth ? '100%' : null\",\n },\n})\nexport class MnInputField implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n /** Resolved UI configuration for the input field */\n protected uiConfig: MnInputFieldUIConfig = {};\n\n private readonly el = inject(ElementRef);\n\n /** Configuration properties for the input field */\n @Input({ required: true }) props!: MnInputProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Current raw string value of the input element */\n value: string | null = null;\n\n /** Whether the input is disabled */\n isDisabled = false;\n\n /** Callback function to notify Angular forms of value changes */\n private onChange: (val: unknown) => void = () => {\n };\n\n /** Callback function to notify Angular forms when input is touched/blurred */\n private onTouched: () => void = () => {};\n\n /**\n * Built-in default error messages in English.\n * These are used when useBuiltInErrorMessages is true (default).\n * Can be overridden per-field using props.errorMessages.\n */\n private readonly builtInErrorMessages: Record<string, MnErrorMessageData> = {\n required: 'This field is required',\n email: 'Please enter a valid email address',\n minlength: (args) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args) => `Maximum ${args.requiredLength} characters allowed`,\n mnMin: (args) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args) => `Date/time must be up to ${args.max}`,\n };\n\n /**\n * Constructor - Registers this component as the ControlValueAccessor\n * for the injected NgControl (FormControl).\n *\n */\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n\n if (this.props.autoFocus) {\n setTimeout(() => this.focus(), 0);\n }\n }\n\n /**\n * Focuses the input element.\n */\n focus(): void {\n const input = this.el.nativeElement.querySelector('input');\n if (input) input.focus();\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-input-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnInputFieldUIConfig>(\n 'mn-input-field',\n this.sectionPath,\n instanceId\n );\n\n // Allow props to override uiConfig for label and placeholder\n if (this.props) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n /**\n * Gets the appropriate adapter based on the input type.\n * Adapters handle type-specific formatting, parsing, and validation.\n */\n private get adapter() {\n return pickAdapter(this.props.type);\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n /**\n * Writes a new value to the input element (called by Angular Forms).\n * Formats the value using the type-specific adapter.\n *\n * @param val - The value to write (type depends on input type)\n */\n writeValue(val: unknown): void {\n this.value = this.adapter.format(val);\n }\n\n /**\n * Registers a callback function to be called when the input value changes.\n *\n * @param fn - Callback function to notify Angular Forms of changes\n */\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers a callback function to be called when the input is touched/blurred.\n *\n * @param fn - Callback function to notify Angular Forms of touch events\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * Sets the disabled state of the input element.\n *\n * @param isDisabled - Whether the input should be disabled\n */\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n /**\n * Handles input events from the input element.\n * Parses the raw string value and notifies Angular Forms.\n *\n * @param raw - Raw string value from the input element\n */\n handleInput(raw: string): void {\n let finalValue = raw;\n\n // Apply mask if available\n if (this.props.mask && typeof this.adapter.applyMask === 'function') {\n finalValue = this.adapter.applyMask(raw, this.props.mask);\n\n // Force-update the DOM input when the mask stripped characters,\n // because Angular won't re-render if this.value hasn't changed.\n if (finalValue !== raw) {\n const input = this.el.nativeElement.querySelector('input');\n if (input) input.value = finalValue;\n }\n }\n\n this.value = finalValue;\n this.onChange(this.adapter.parse(finalValue));\n }\n\n /**\n * Handles blur events from the input element.\n * Notifies Angular Forms that the input has been touched.\n */\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Validator Implementation ==========\n\n /**\n * Validates the control using the type-specific adapter.\n * Called by Angular Forms during validation.\n *\n * @param control - The AbstractControl to validate\n * @returns ValidationErrors if invalid, null if valid\n */\n validate(control: AbstractControl): ValidationErrors | null {\n return this.adapter.validate(this.props, control, this.value);\n }\n\n // ========== Template Attribute Getters ==========\n\n /**\n * Gets all DOM attributes from the adapter.\n * These are input-type-specific attributes (min, max, step, inputmode).\n */\n get domAttrs() {\n return this.adapter.attrs(this.props);\n }\n\n /** Min attribute for date/time/number inputs */\n get minAttr() {\n return this.domAttrs.min ?? null;\n }\n\n /** Max attribute for date/time/number inputs */\n get maxAttr() {\n return this.domAttrs.max ?? null;\n }\n\n /** Step attribute for number/date/time inputs */\n get stepAttr() {\n return this.domAttrs.step ?? null;\n }\n\n /** Inputmode attribute for mobile keyboard optimization */\n get inputmodeAttr() {\n return this.domAttrs.inputmode ?? null;\n }\n\n // ========== Error Handling ==========\n\n /**\n * Gets the FormControl instance from Angular Forms.\n * Returns null if no control is attached.\n */\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n /**\n * Determines whether to show error messages.\n * Errors are shown when the control is invalid and has been touched or modified.\n */\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n /**\n * Picks the error key to display based on errorPriority.\n * Used when showAllErrors is false (default).\n *\n * @param errors - ValidationErrors object from the control\n * @returns The error key to display\n */\n private pickErrorKey(errors: ValidationErrors): string {\n // If priority is specified, use the first matching error from the priority list\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n // Otherwise, use the first error key\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n /**\n * Resolves a single error message for a specific error key.\n * Checks custom messages, built-in messages, and fallback in order.\n *\n * @param errorKey - The error key (e.g., 'required', 'email')\n * @param errors - All validation errors on the control\n * @returns The resolved error message string\n */\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n\n // Priority: custom (props) > config > built-in > fallback > default\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n // If the message is a function, call it with error arguments\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n // Interpolate {{placeholder}} tokens with error arguments (e.g. {{requiredLength}})\n if (errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)}}/g, (_: string, key: string) =>\n errorArgs[key] !== undefined ? String(errorArgs[key]) : `{{${key}}}`\n );\n }\n return msgDef;\n }\n\n /**\n * Gets all error messages for the current control state.\n * Returns an array of error messages (used when showAllErrors is true).\n *\n * @returns Array of error message strings\n */\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n\n const errorKeys = Object.keys(errors);\n return errorKeys.map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n /**\n * Gets a single error message for the current control state.\n * Uses errorPriority to determine which error to show (when showAllErrors is false).\n *\n * @returns Single error message string, or null if no errors\n */\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n /** Resolved ID for the input element */\n get resolvedId(): string {\n return this.props.id;\n }\n\n /** Resolved name attribute for the input element */\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n /**\n * Computes the CSS classes from tailwind-variants based on the props.\n * Returns the variant classes for styling the input element.\n */\n get inputClasses(): string {\n return mnInputFieldVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n hover: this.isDisabled ? false : this.props.hover,\n disabled: this.isDisabled,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n <!-- Label -->\n @if (uiConfig.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500 \">*</span>\n }\n </label>\n }\n\n <!-- Input Element -->\n <input\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [type]=\"props.type\"\n [attr.placeholder]=\"uiConfig.placeholder || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [attr.autocomplete]=\"props.autocomplete || null\"\n [attr.min]=\"minAttr\"\n [attr.max]=\"maxAttr\"\n [ngModel]=\"value\"\n [ngClass]=\"inputClasses\"\n (input)=\"handleInput(($any($event.target)).value)\"\n (search)=\"handleInput(($any($event.target)).value)\"\n (blur)=\"handleBlur()\"\n />\n\n <!-- Error Messages -->\n @if (showError) {\n <!-- Show all errors mode -->\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n\n }\n }\n }\n</div>\n","import {Component, inject, InjectionToken} from '@angular/core';\nimport {NgOptimizedImage} from '@angular/common';\nimport { MnDualHorizontalImageTypes } from './mn-dual-horizontal-imageTypes';\nimport {provideMnComponentConfig} from '../../config';\n\nexport type MnDualHorizontalImageConfig = {\n images?: MnDualHorizontalImageTypes[];\n noImagesFound?: string;\n}\n\nexport const MN_LIB_DUAL_HORIZONTAL_IMAGE = new InjectionToken<MnDualHorizontalImageConfig>('MN_LIB_DUAL_HORIZONTAL_IMAGE');\n\n\n@Component({\n selector: 'mn-lib-dual-horizontal-image',\n standalone: true,\n imports: [\n NgOptimizedImage\n ],\n providers: [\n provideMnComponentConfig<MnDualHorizontalImageConfig>(MN_LIB_DUAL_HORIZONTAL_IMAGE, 'mn-dual-horizontal-image'),\n ],\n templateUrl: './mn-dual-horizontal-image.html',\n host: {\n class: 'block'\n }\n})\nexport class MnDualHorizontalImage {\n protected readonly componentConfig = inject(MN_LIB_DUAL_HORIZONTAL_IMAGE);\n}\n","<div class=\"flex flex-col w-full -space-y-16 md:-space-y-24 lg:-space-y-24\">\n@for (image of componentConfig.images; track image.id) {\n <div\n class=\"relative aspect-3/2 w-[75%] md:w-[65%]\n overflow-hidden rounded-3xl shadow-md\n first:self-start last:self-end\"\n >\n <img\n [ngSrc]=\"image.url\"\n fill\n class=\"object-cover\"\n [alt]=\"image.alt\"\n />\n </div>\n } @empty {\n <p>{{ componentConfig.noImagesFound ?? 'No images found' }}</p>\n }\n</div>\n\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnInformationCardVariants = tv({\n base: '',\n variants: {\n bottomBorder: {\n true: 'border-b border-b-2 border-primary-500',\n },\n shadow: {\n true: 'shadow-xl',\n },\n textPosition: {\n left: 'text-left',\n center: 'text-center',\n right: 'text-right',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n },\n});\n\nexport type MnInformationCardVariants = VariantProps<typeof mnInformationCardVariants>;\n","import {Component, Input} from '@angular/core';\nimport {MnInformationCardData} from './mn-information-cardTypes';\nimport {mnInformationCardVariants} from './mn-information-cardVariants';\nimport {NgClass} from '@angular/common';\n\n@Component({\n selector: 'mn-lib-information-card',\n standalone: true,\n imports: [\n NgClass\n ],\n templateUrl: './mn-information-card.html',\n})\nexport class MnInformationCard<TExtra = unknown> {\n @Input({ required: true }) data!: MnInformationCardData<TExtra>;\n\n get hostClasses(): string {\n return mnInformationCardVariants({\n bottomBorder: this.data.bottomBorder,\n shadow: this.data.shadow,\n textPosition: this.data.textPosition,\n borderRadius: this.data.borderRadius\n });\n }\n}\n\n","<div class=\"flex flex-col items-center gap-y-4 p-4 size-full\" [ngClass]=\"hostClasses\">\n<ng-content select=\"[header]\"></ng-content>\n<ng-content></ng-content>\n<ng-content select=\"[footer]\"></ng-content>\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnTextareaVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 placeholder-base-content/50 text-base-content text-sm outline-none focus:ring-1 focus:ring-primary',\n variants: {\n\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n resize: {\n none: 'resize-none',\n vertical: 'resize-y',\n horizontal: 'resize-x',\n both: 'resize',\n }\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n resize: 'vertical',\n }\n});\n\nexport type MnTextareaVariants = VariantProps<typeof mnTextareaVariants>;\n","import {Component, DestroyRef, ElementRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnTextareaErrorMessageData, MnTextareaProps, MnTextareaUIConfig} from './mn-textareaTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnTextareaVariants} from './mn-textareaVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_TEXTAREA_CONFIG = new InjectionToken<MnTextareaUIConfig>('MN_TEXTAREA_CONFIG');\n\n/**\n * MnTextarea Component\n *\n * A flexible, accessible textarea component that implements Angular's ControlValueAccessor\n * and Validator interfaces. Works similarly to MnInputField but uses a textarea element,\n * allowing users to set the height (rows), width (cols), and resize behavior.\n *\n * Features:\n * - Works with Angular Reactive Forms (FormControl, FormGroup)\n * - Configurable rows, cols, and resize behavior\n * - Built-in error messages with internationalization support\n * - Custom error messages per field\n * - Priority-based error display or show all errors\n * - Full accessibility (ARIA attributes)\n *\n * @example\n * ```typescript\n * <mn-textarea\n * formControlName=\"description\"\n * [props]=\"{\n * id: 'description',\n * rows: 5,\n * label: 'Description',\n * size: 'md',\n * borderRadius: 'md',\n * resize: 'vertical',\n * errorMessages: { required: 'Description is required' }\n * }\"\n * ></mn-textarea>\n * ```\n */\n@Component({\n selector: 'mn-lib-textarea',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-textarea.html',\n})\nexport class MnTextarea implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n /** Resolved UI configuration for the textarea */\n protected uiConfig: MnTextareaUIConfig = {};\n\n private readonly el = inject(ElementRef);\n\n /** Configuration properties for the textarea */\n @Input({ required: true }) props!: MnTextareaProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Current raw string value of the textarea element */\n value: string | null = null;\n\n /** Whether the textarea is disabled */\n isDisabled = false;\n\n /** Callback function to notify Angular forms of value changes */\n private onChange: (val: unknown) => void = () => {\n };\n\n /** Callback function to notify Angular forms when textarea is touched/blurred */\n private onTouched: () => void = () => {};\n\n /**\n * Built-in default error messages in English.\n * These are used when useBuiltInErrorMessages is true (default).\n * Can be overridden per-field using props.errorMessages.\n */\n private readonly builtInErrorMessages: Record<string, MnTextareaErrorMessageData> = {\n required: 'This field is required',\n minlength: (args) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args) => `Maximum ${args.requiredLength} characters allowed`,\n };\n\n /**\n * Constructor - Registers this component as the ControlValueAccessor\n * for the injected NgControl (FormControl).\n *\n */\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n\n if (this.props.autoFocus) {\n setTimeout(() => this.focus(), 0);\n }\n }\n\n /**\n * Focuses the textarea element.\n */\n focus(): void {\n const textarea = this.el.nativeElement.querySelector('textarea');\n if (textarea) textarea.focus();\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-textarea-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnTextareaUIConfig>(\n 'mn-textarea',\n this.sectionPath,\n instanceId\n );\n\n // Allow props to override uiConfig for label and placeholder\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n if (this.props.placeholder) {\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n /**\n * Writes a new value to the textarea element (called by Angular Forms).\n *\n * @param val - The value to write\n */\n writeValue(val: unknown): void {\n this.value = val != null ? String(val) : null;\n }\n\n /**\n * Registers a callback function to be called when the textarea value changes.\n *\n * @param fn - Callback function to notify Angular Forms of changes\n */\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers a callback function to be called when the textarea is touched/blurred.\n *\n * @param fn - Callback function to notify Angular Forms of touch events\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n /**\n * Sets the disabled state of the textarea element.\n *\n * @param isDisabled - Whether the textarea should be disabled\n */\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n /**\n * Handles input events from the textarea element.\n * Notifies Angular Forms of the new value.\n *\n * @param raw - Raw string value from the textarea element\n */\n handleInput(raw: string): void {\n this.value = raw;\n this.onChange(raw);\n }\n\n /**\n * Handles blur events from the textarea element.\n * Notifies Angular Forms that the textarea has been touched.\n */\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Error Handling ==========\n\n /**\n * Gets the FormControl instance from Angular Forms.\n * Returns null if no control is attached.\n */\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n /**\n * Determines whether to show error messages.\n * Errors are shown when the control is invalid and has been touched or modified.\n */\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n /**\n * Picks the error key to display based on errorPriority.\n * Used when showAllErrors is false (default).\n *\n * @param errors - ValidationErrors object from the control\n * @returns The error key to display\n */\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n /**\n * Resolves a single error message for a specific error key.\n *\n * @param errorKey - The error key (e.g., 'required', 'minlength')\n * @param errors - All validation errors on the control\n * @returns The resolved error message string\n */\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n // Interpolate {{placeholder}} tokens with validation error args\n if (errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)}}/g, (_, key) => errorArgs[key] ?? _);\n }\n return msgDef;\n }\n\n /**\n * Gets all error messages for the current control state.\n *\n * @returns Array of error message strings\n */\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n\n const errorKeys = Object.keys(errors);\n return errorKeys.map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n /**\n * Gets a single error message for the current control state.\n *\n * @returns Single error message string, or null if no errors\n */\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n /** Resolved ID for the textarea element */\n get resolvedId(): string {\n return this.props.id;\n }\n\n /** Resolved name attribute for the textarea element */\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n /**\n * Computes the CSS classes from tailwind-variants based on the props.\n * Returns the variant classes for styling the textarea element.\n */\n get textareaClasses(): string {\n return mnTextareaVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n resize: this.props.resize,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n <!-- Label -->\n @if (uiConfig.label || props.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500 \">*</span>\n }\n </label>\n }\n\n <!-- Textarea Element -->\n <textarea\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [attr.placeholder]=\"uiConfig.placeholder || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [attr.autocomplete]=\"props.autocomplete || null\"\n [attr.rows]=\"props.rows ?? null\"\n [attr.cols]=\"props.cols ?? null\"\n [ngClass]=\"textareaClasses\"\n (input)=\"handleInput(($any($event.target)).value)\"\n (blur)=\"handleBlur()\"\n >{{ value ?? '' }}</textarea>\n\n <!-- Error Messages -->\n @if (showError) {\n <!-- Show all errors mode -->\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import {tv, type VariantProps} from 'tailwind-variants';\n\n/**\n * Tailwind-variants definition for the MnFileInput component.\n *\n * Mirrors the styling vocabulary of {@link mnInputFieldVariants} (size,\n * borderRadius, shadow, fullWidth, disabled) so a file input visually matches the\n * rest of the input family, and adds a `dropzone` toggle for the large dashed\n * drop area used by the default display mode.\n */\nexport const mnFileInputVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 text-base-content text-sm outline-none transition-colors duration-300 ease-in-out',\n variants: {\n /** Inner padding scale of the clickable control. */\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n /** Corner rounding of the control. */\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n /** Drop shadow toggle. */\n shadow: {\n true: 'shadow-lg',\n },\n /** Stretch the control to the full width of its container. */\n fullWidth: {\n true: 'w-full',\n },\n /** Renders the control as a large dashed dropzone with a hover accent. */\n dropzone: {\n true: 'flex flex-col items-center justify-center gap-2 p-6 border-2 border-dashed text-center cursor-pointer hover:border-primary',\n },\n /** Dimmed, non-interactive appearance. */\n disabled: {\n true: 'opacity-50 cursor-not-allowed pointer-events-none',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'lg',\n },\n});\n\n/** Variant prop types derived from {@link mnFileInputVariants}. */\nexport type MnFileInputVariants = VariantProps<typeof mnFileInputVariants>;\n","import {Component, computed, DestroyRef, EventEmitter, inject, Input, OnInit, Output, signal,} from '@angular/core';\nimport {CommonModule, NgClass} from '@angular/common';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {skip} from 'rxjs';\nimport {\n MnFileInputDisplayMode,\n MnFileInputErrorMessageData,\n MnFileInputProps,\n MnFileInputUIConfig,\n} from './mn-file-inputTypes';\nimport {mnFileInputVariants} from './mn-file-inputVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {LucideFile, LucideImagePlus, LucideTrash2, LucideUpload, LucideX} from '@lucide/angular';\nimport {MnConfigService} from '../../config';\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from '../../context';\nimport {MnLanguageService} from '../../language';\nimport {MnValidationErrorArgs} from '../../shared/types';\n\n/** A single renderable entry in the file input (a newly-selected file or an existing image). */\nexport type MnFileDisplayItem = {\n /** File name (new files) or a derived name (existing images). */\n name: string;\n /** Whether the entry should render as an image preview. */\n isImage: boolean;\n /** Object-URL (new image files) or saved URL (existing images), else null. */\n previewUrl: string | null;\n /** Human-readable size for new files, else null. */\n sizeLabel: string | null;\n /** Index used by the remove action. */\n index: number;\n /** True for an already-saved image passed via `currentUrl(s)`. */\n existing: boolean;\n};\n\n/**\n * MnFileInput Component\n *\n * A generic, accessible file input that implements Angular's ControlValueAccessor.\n * It styles selection to match the rest of the input family, shows image previews\n * (and a file icon + name for non-images), supports single or multiple selection,\n * several display layouts, and client-side `accept` / `maxSize` / `maxFiles` limits.\n *\n * The form control value is the plain selection: `File | null` (single) or\n * `File[]` (multiple). An optional `currentUrl`/`currentUrls` renders an\n * already-saved image; removing it leaves the value untouched and emits `cleared`.\n *\n * @example\n * ```html\n * <mn-lib-file-input\n * formControlName=\"image\"\n * [props]=\"{ id: 'image', label: 'Cover', accept: 'image/*', displayMode: 'dropzone' }\"\n * (cleared)=\"onRemoveExisting()\">\n * </mn-lib-file-input>\n * ```\n */\n@Component({\n selector: 'mn-lib-file-input',\n standalone: true,\n imports: [CommonModule, NgClass, MnErrorMessage, LucideFile, LucideImagePlus, LucideTrash2, LucideUpload, LucideX],\n templateUrl: './mn-file-input.html',\n})\nexport class MnFileInput implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n /** Configuration properties for the file input. */\n @Input({required: true}) props!: MnFileInputProps;\n /** Emits whenever the selected file(s) change (in addition to the form control). */\n @Output() filesChange = new EventEmitter<File | File[] | null>();\n /** Emits when the user removes an already-saved image (`currentUrl(s)`). */\n @Output() cleared = new EventEmitter<void>();\n /** Resolved UI configuration for the file input. */\n protected uiConfig: MnFileInputUIConfig = {};\n /** Currently selected files (always an array internally). */\n protected readonly files = signal<File[]>([]);\n /** Transient message for a rejected selection (accept/maxSize/maxFiles). */\n protected readonly internalError = signal<string | null>(null);\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, {optional: true}) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, {optional: true});\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n /** Object-URL previews aligned to {@link files}; null for non-image entries. */\n private readonly previewUrls = signal<(string | null)[]>([]);\n /** True once the user removed the single existing image. */\n private readonly currentCleared = signal(false);\n /** Indices of removed existing images (multiple mode). */\n private readonly removedExisting = signal<Set<number>>(new Set());\n /** Renderable entries: existing images (when nothing newer hides them) then new files. */\n readonly displayItems = computed<MnFileDisplayItem[]>(() => {\n const items: MnFileDisplayItem[] = [];\n\n if (this.props.multiple) {\n const urls = this.props.currentUrls ?? [];\n const removed = this.removedExisting();\n urls.forEach((url, i) => {\n if (!removed.has(i)) items.push(this.existingItem(url, i));\n });\n } else if (this.files().length === 0 && this.props.currentUrl && !this.currentCleared()) {\n items.push(this.existingItem(this.props.currentUrl, 0));\n }\n\n const previews = this.previewUrls();\n this.files().forEach((file, i) => {\n items.push({\n name: file.name,\n isImage: this.isImage(file),\n previewUrl: previews[i] ?? null,\n sizeLabel: this.humanFileSize(file.size),\n index: i,\n existing: false,\n });\n });\n\n return items;\n });\n /** Disabled state pushed by the forms API. */\n private formDisabled = false;\n /**\n * Built-in default error messages in English.\n * Used when `useBuiltInErrorMessages` is true (default); overridable per-field.\n */\n private readonly builtInErrorMessages: Record<string, MnFileInputErrorMessageData> = {\n required: 'This field is required',\n accept: 'This file type is not allowed',\n maxSize: (args) => `File is too large (max ${args.max})`,\n maxFiles: (args) => `Too many files (max ${args.max})`,\n };\n\n /** Registers this component as the ControlValueAccessor for the injected control. */\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n /** The effective display mode. */\n get displayMode(): MnFileInputDisplayMode {\n return this.props.displayMode ?? 'dropzone';\n }\n\n /** Whether the control is disabled (via props or the forms API). */\n get isDisabled(): boolean {\n return this.formDisabled || !!this.props.disabled;\n }\n\n /** Native `accept` attribute value, or null for no restriction when unset. */\n get acceptAttr(): string | null {\n return this.props.accept ?? null;\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n /** Resolved id for the file input element. */\n get resolvedId(): string {\n return this.props.id;\n }\n\n /** Resolved name attribute for the file input element. */\n get resolvedName(): string | null {\n return this.props.name ?? null;\n }\n\n /** Tailwind-variant classes for the clickable control. */\n get controlClasses(): string {\n return mnFileInputVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth ?? (this.displayMode !== 'compact'),\n dropzone: this.displayMode === 'dropzone',\n disabled: this.isDisabled,\n });\n }\n\n /** The attached form control, if any. */\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n // ========== Selection handling ==========\n\n /** Whether to show control validation errors. */\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n /** All control error messages (used when `showAllErrors` is true). */\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map((key) => this.resolveControlError(key, errors));\n }\n\n /** Single control error message (priority-aware). */\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n return this.resolveControlError(this.pickErrorKey(errors), errors);\n }\n\n ngOnInit(): void {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => this.resolveConfig());\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n this.destroyRef.onDestroy(() => this.revokeAll());\n }\n\n /**\n * Writes a value from the form into the control.\n * @param val A `File`, an array of `File`, or null/undefined.\n */\n writeValue(val: unknown): void {\n const next = Array.isArray(val) ? val.filter((f): f is File => f instanceof File)\n : val instanceof File ? [val]\n : [];\n this.setFiles(next);\n }\n\n /**\n * Registers the form's change callback.\n * @param fn Callback invoked with the new value.\n */\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n /**\n * Registers the form's touched callback.\n * @param fn Callback invoked when the control is touched.\n */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n // ========== Derived view state ==========\n\n /**\n * Sets the disabled state of the control.\n * @param isDisabled Whether the control should be disabled.\n */\n setDisabledState(isDisabled: boolean): void {\n this.formDisabled = isDisabled;\n }\n\n /**\n * Handles a file-picker change: validates the incoming files against the\n * configured limits and updates the selection.\n * @param event The native change event from the hidden file input.\n */\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n const incoming = Array.from(input.files ?? []);\n input.value = '';\n if (incoming.length === 0) return;\n this.addFiles(incoming);\n }\n\n /**\n * Removes a newly-selected file by index.\n * @param index Index into the current selection.\n */\n removeFile(index: number): void {\n const next = this.files().filter((_, i) => i !== index);\n this.internalError.set(null);\n this.setFiles(next);\n this.emit();\n }\n\n /**\n * Removes an already-saved image and notifies the consumer via `cleared`.\n * @param index Index of the existing image (0 in single mode).\n */\n removeExisting(index: number): void {\n if (this.props.multiple) {\n const set = new Set(this.removedExisting());\n set.add(index);\n this.removedExisting.set(set);\n } else {\n this.currentCleared.set(true);\n }\n this.cleared.emit();\n this.onTouched();\n }\n\n /** Whether the attached control carries a `required` validator. */\n protected isRequired(): boolean {\n return this.control?.hasValidator(Validators.required) ?? false;\n }\n\n /** Stable track key for a display item across renders. */\n protected itemKey(item: MnFileDisplayItem): string {\n return `${item.existing ? 'e' : 'f'}-${item.index}`;\n }\n\n /** Whether a file should render as an image. */\n protected isImage(file: File): boolean {\n return (file.type ?? '').startsWith('image/');\n }\n\n /** Callback to notify Angular forms of value changes. */\n private onChange: (val: unknown) => void = () => {\n };\n\n // ========== Error handling (control validators) ==========\n\n /** Callback to notify Angular forms when the control is touched. */\n private onTouched: () => void = () => {\n };\n\n /** Resolves UI strings from config, layering built-in defaults and prop overrides. */\n private resolveConfig(): void {\n const instanceId = this.explicitInstanceId || `mn-file-input-${this.props.id}`;\n const resolved = this.configService.resolve<MnFileInputUIConfig>(\n 'mn-file-input',\n this.sectionPath,\n instanceId,\n );\n\n const builtIn: MnFileInputUIConfig = {\n dropzoneHint: 'Click to upload or drag and drop',\n replaceLabel: 'Replace',\n removeLabel: 'Remove',\n };\n\n this.uiConfig = {...builtIn, ...resolved};\n if (this.props.label) this.uiConfig = {...this.uiConfig, label: this.props.label};\n if (this.props.dropzoneHint) this.uiConfig = {...this.uiConfig, dropzoneHint: this.props.dropzoneHint};\n if (this.props.replaceLabel) this.uiConfig = {...this.uiConfig, replaceLabel: this.props.replaceLabel};\n if (this.props.removeLabel) this.uiConfig = {...this.uiConfig, removeLabel: this.props.removeLabel};\n }\n\n /**\n * Validates and merges newly-picked files into the current selection.\n * @param incoming The files chosen by the user.\n */\n private addFiles(incoming: File[]): void {\n this.internalError.set(null);\n let errorKey: string | null = null;\n let errorArgs: MnValidationErrorArgs = {};\n\n let accepted = incoming.filter((f) => this.matchesAccept(f));\n if (accepted.length < incoming.length) errorKey = 'accept';\n\n if (this.props.maxSize != null) {\n const max = this.props.maxSize;\n const withinSize = accepted.filter((f) => f.size <= max);\n if (withinSize.length < accepted.length) {\n errorKey = 'maxSize';\n errorArgs = {max: this.humanFileSize(max)};\n }\n accepted = withinSize;\n }\n\n let next = this.props.multiple ? [...this.files(), ...accepted] : accepted.slice(-1);\n\n if (this.props.multiple && this.props.maxFiles != null && next.length > this.props.maxFiles) {\n next = next.slice(0, this.props.maxFiles);\n errorKey = 'maxFiles';\n errorArgs = {max: this.props.maxFiles};\n }\n\n if (errorKey) this.internalError.set(this.resolveMessage(errorKey, errorArgs));\n\n this.setFiles(next);\n this.emit();\n }\n\n /** Replaces the internal selection and rebuilds image previews. */\n private setFiles(next: File[]): void {\n this.revokeAll();\n this.files.set(next);\n this.previewUrls.set(next.map((f) => (this.isImage(f) ? URL.createObjectURL(f) : null)));\n }\n\n /** Emits the current value to the form and any listeners. */\n private emit(): void {\n const value = this.props.multiple ? this.files() : (this.files()[0] ?? null);\n this.onChange(value);\n this.onTouched();\n this.filesChange.emit(value);\n }\n\n /** Revokes any outstanding object-URL previews to avoid leaks. */\n private revokeAll(): void {\n for (const url of this.previewUrls()) {\n if (url) URL.revokeObjectURL(url);\n }\n }\n\n /** Builds a display item for an already-saved image. */\n private existingItem(url: string, index: number): MnFileDisplayItem {\n return {\n name: this.fileNameFromUrl(url),\n isImage: true,\n previewUrl: url,\n sizeLabel: null,\n index,\n existing: true,\n };\n }\n\n /** Picks which control error key to display. */\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) return key;\n }\n }\n return Object.keys(errors)[0];\n }\n\n // ========== Helpers ==========\n\n /** Resolves a control error key to a message, interpolating its args. */\n private resolveControlError(key: string, errors: ValidationErrors): string {\n return this.resolveMessage(key, errors[key] as MnValidationErrorArgs);\n }\n\n /**\n * Resolves a message for an error key using the same precedence as the other\n * inputs: custom props > config > built-in > fallback > default.\n */\n private resolveMessage(key: string, args: MnValidationErrorArgs | undefined): string {\n const customMsg = this.props.errorMessages?.[key];\n const configMsg = this.uiConfig.errorMessages?.[key];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[key] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(args ?? {}, {});\n }\n if (args && typeof args === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)}}/g, (_match: string, token: string) => {\n const value = (args as Record<string, unknown>)[token];\n return value !== undefined ? String(value) : `{{${token}}}`;\n });\n }\n return msgDef;\n }\n\n /** Checks a file against the configured `accept` filter (extensions and MIME globs). */\n private matchesAccept(file: File): boolean {\n const accept = this.props.accept;\n if (!accept) return true;\n const tokens = accept.split(',').map((t) => t.trim().toLowerCase()).filter(Boolean);\n if (tokens.length === 0) return true;\n const name = file.name.toLowerCase();\n const type = (file.type ?? '').toLowerCase();\n return tokens.some((token) => {\n if (token.startsWith('.')) return name.endsWith(token);\n if (token.endsWith('/*')) return type.startsWith(token.slice(0, -1));\n return type === token;\n });\n }\n\n /** Formats a byte count as a human-readable size. */\n private humanFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n\n /** Derives a display name from a URL (last path segment). */\n private fileNameFromUrl(url: string): string {\n const clean = url.split('?')[0].split('#')[0];\n const segment = clean.substring(clean.lastIndexOf('/') + 1);\n return segment || 'image';\n }\n}\n","<div [class.w-full]=\"props.fullWidth !== false && displayMode !== 'compact'\" class=\"flex flex-col\">\n <!-- Label -->\n @if (uiConfig.label) {\n <label [attr.for]=\"resolvedId\" class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\">\n <p>{{ uiConfig.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <!-- Hidden native file input shared by every trigger -->\n <input\n #fileInput\n (change)=\"onFileSelected($event)\"\n [accept]=\"acceptAttr\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || null\"\n [attr.multiple]=\"props.multiple || null\"\n [attr.name]=\"resolvedName\"\n [disabled]=\"isDisabled\"\n [id]=\"resolvedId\"\n class=\"hidden\"\n type=\"file\"\n />\n\n @switch (displayMode) {\n <!-- Compact: inline button + filename chips -->\n @case ('compact') {\n <div class=\"flex flex-wrap items-center gap-2\">\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n [ngClass]=\"controlClasses\"\n class=\"inline-flex items-center gap-2 cursor-pointer hover:bg-base-200\"\n type=\"button\">\n <svg lucideUpload [size]=\"18\"></svg>\n <span class=\"text-sm\">{{ uiConfig.replaceLabel }}</span>\n </button>\n @for (item of displayItems(); track itemKey(item)) {\n <span class=\"inline-flex items-center gap-1 text-sm text-base-content/70\">\n @if (item.isImage && item.previewUrl) {\n <img [src]=\"item.previewUrl\" alt=\"\" class=\"h-6 w-6 rounded object-cover\"/>\n } @else {\n <svg lucideFile [size]=\"16\" class=\"text-base-content/50\"></svg>\n }\n <span class=\"max-w-40 truncate\">{{ item.name }}</span>\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"text-base-content/50 hover:text-error cursor-pointer\"\n type=\"button\">\n <svg lucideX [size]=\"14\"></svg>\n </button>\n </span>\n }\n </div>\n }\n\n <!-- List: compact rows of file icon + name + size -->\n @case ('list') {\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n [ngClass]=\"controlClasses\"\n class=\"flex flex-row items-center justify-center gap-2 cursor-pointer hover:bg-base-200\"\n type=\"button\">\n <svg lucideUpload [size]=\"18\"></svg>\n <span class=\"text-sm\">{{ uiConfig.replaceLabel }}</span>\n </button>\n @if (displayItems().length > 0) {\n <div class=\"mt-2 flex flex-col gap-1\">\n @for (item of displayItems(); track itemKey(item)) {\n <div class=\"flex items-center gap-2 rounded-lg bg-base-200 px-3 py-1.5 text-sm\">\n <svg lucideFile [size]=\"16\" class=\"text-base-content/50\"></svg>\n <span class=\"flex-1 truncate text-base-content\">{{ item.name }}</span>\n @if (item.sizeLabel) {\n <span class=\"text-base-content/50\">{{ item.sizeLabel }}</span>\n }\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"text-base-content/50 hover:text-error cursor-pointer\"\n type=\"button\">\n <svg lucideX [size]=\"16\"></svg>\n </button>\n </div>\n }\n </div>\n }\n }\n\n <!-- Thumbnail: grid of tiles with overlay remove + add tile -->\n @case ('thumbnail') {\n <div class=\"flex flex-wrap gap-3\">\n @for (item of displayItems(); track itemKey(item)) {\n <div class=\"relative h-24 w-24 overflow-hidden rounded-xl border border-base-300 bg-base-100\">\n @if (item.isImage && item.previewUrl) {\n <img [src]=\"item.previewUrl\" alt=\"\" class=\"h-full w-full object-cover\"/>\n } @else {\n <div class=\"flex h-full w-full flex-col items-center justify-center gap-1 p-1 text-center\">\n <svg lucideFile [size]=\"22\" class=\"text-base-content/50\"></svg>\n <span class=\"w-full truncate text-xs text-base-content/60\">{{ item.name }}</span>\n </div>\n }\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"btn btn-circle btn-xs absolute top-1 right-1 border-none bg-black/60 text-white hover:bg-black/80\"\n type=\"button\">\n <svg lucideX [size]=\"14\"></svg>\n </button>\n </div>\n }\n @if (props.multiple || displayItems().length === 0) {\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n class=\"flex h-24 w-24 flex-col items-center justify-center gap-1 rounded-xl border-2 border-dashed border-base-300 text-base-content/50 hover:border-primary cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed\"\n type=\"button\">\n <svg lucideImagePlus [size]=\"22\"></svg>\n </button>\n }\n </div>\n }\n\n <!-- Dropzone (default): large dashed area + preview rows -->\n @default {\n <button\n (click)=\"fileInput.click()\"\n [disabled]=\"isDisabled\"\n [ngClass]=\"controlClasses\"\n type=\"button\">\n <svg lucideImagePlus [size]=\"28\" class=\"text-base-content/40\"></svg>\n <span class=\"text-sm text-base-content/60\">{{ uiConfig.dropzoneHint }}</span>\n </button>\n @if (displayItems().length > 0) {\n <div class=\"mt-2 flex flex-col gap-2\">\n @for (item of displayItems(); track itemKey(item)) {\n <div class=\"flex items-center gap-3 rounded-lg bg-base-200 p-2\">\n @if (item.isImage && item.previewUrl) {\n <img [src]=\"item.previewUrl\" alt=\"\" class=\"h-12 w-12 rounded-md object-cover\"/>\n } @else {\n <svg lucideFile [size]=\"24\" class=\"text-base-content/50\"></svg>\n }\n <span class=\"flex-1 truncate text-sm text-base-content\">{{ item.name }}</span>\n @if (item.sizeLabel) {\n <span class=\"text-sm text-base-content/50\">{{ item.sizeLabel }}</span>\n }\n <button\n (click)=\"item.existing ? removeExisting(item.index) : removeFile(item.index)\"\n [attr.aria-label]=\"uiConfig.removeLabel\"\n class=\"btn btn-circle btn-sm btn-ghost text-base-content/60 hover:text-error\"\n type=\"button\">\n <svg lucideTrash2 [size]=\"16\"></svg>\n </button>\n </div>\n }\n </div>\n }\n }\n }\n\n <!-- Selection-limit error (accept / maxSize / maxFiles) -->\n @if (internalError(); as msg) {\n <mn-error-message [errorMessage]=\"msg\" [id]=\"resolvedId + '-selection'\"></mn-error-message>\n }\n\n <!-- Control validation errors -->\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n</div>\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnCheckboxVariants = tv({\n base: 'mn-checkbox',\n variants: {\n size: {\n xs: 'size-4 p-0.5',\n sm: 'size-5 p-[0.1875rem]',\n md: 'size-6 p-1',\n lg: 'size-7 p-[0.3125rem]',\n xl: 'size-8 p-1.5',\n },\n color: {\n primary: 'border-primary checked:bg-primary indeterminate:bg-primary focus-visible:outline-primary text-primary-content',\n secondary: 'border-secondary checked:bg-secondary indeterminate:bg-secondary focus-visible:outline-secondary text-secondary-content',\n accent: 'border-accent checked:bg-accent indeterminate:bg-accent focus-visible:outline-accent text-accent-content',\n neutral: 'border-neutral checked:bg-neutral indeterminate:bg-neutral focus-visible:outline-neutral text-neutral-content',\n info: 'border-info checked:bg-info indeterminate:bg-info focus-visible:outline-info text-info-content',\n success: 'border-success checked:bg-success indeterminate:bg-success focus-visible:outline-success text-success-content',\n warning: 'border-warning checked:bg-warning indeterminate:bg-warning focus-visible:outline-warning text-warning-content',\n error: 'border-error checked:bg-error indeterminate:bg-error focus-visible:outline-error text-error-content',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n color: 'primary',\n borderRadius: 'sm',\n },\n});\n\nexport const mnCheckboxWrapperVariants = tv({\n base: 'text-base-content',\n variants: {\n size: {\n xs: 'text-sm',\n sm: 'text-sm',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n fullWidth: {\n true: 'w-full',\n },\n hover: {\n true: 'hover:bg-base-200 rounded-md transition-colors duration-200 ease-in-out px-2 -mx-2',\n },\n },\n defaultVariants: {\n size: 'md',\n hover: false,\n },\n});\n\nexport type MnCheckboxVariants = VariantProps<typeof mnCheckboxVariants>;\nexport type MnCheckboxWrapperVariants = VariantProps<typeof mnCheckboxWrapperVariants>;\n","import {\n Component,\n DestroyRef,\n EventEmitter,\n inject,\n InjectionToken,\n Input,\n OnChanges,\n OnInit,\n Output\n} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnCheckboxErrorMessageData, MnCheckboxProps, MnCheckboxUIConfig} from './mn-checkboxTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnCheckboxVariants, mnCheckboxWrapperVariants} from './mn-checkboxVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_CHECKBOX_CONFIG = new InjectionToken<MnCheckboxUIConfig>('MN_CHECKBOX_CONFIG');\n\n@Component({\n selector: 'mn-lib-checkbox',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-checkbox.html',\n styleUrl: './mn-checkbox.css',\n})\nexport class MnCheckbox implements OnInit, OnChanges {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n protected uiConfig: MnCheckboxUIConfig = {};\n\n @Input({ required: true }) props!: MnCheckboxProps;\n\n /** Direct checked binding for non-form usage */\n @Input() checked?: boolean;\n\n /** Emits when checked state changes (for non-form usage) */\n @Output() checkedChange = new EventEmitter<boolean>();\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n value = false;\n isDisabled = false;\n\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnCheckboxErrorMessageData> = {\n required: 'This field is required',\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-checkbox-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnCheckboxUIConfig>(\n 'mn-checkbox',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n writeValue(val: unknown): void {\n this.value = !!val;\n }\n\n /** Sync value from checked input when not using forms */\n ngOnChanges(): void {\n if (this.checked !== undefined) {\n this.value = this.checked;\n }\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n handleChange(checked: boolean): void {\n this.value = checked;\n this.onChange(checked);\n this.checkedChange.emit(checked);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Error Handling ==========\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n return msgDef;\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get checkboxClasses(): string {\n return mnCheckboxVariants({\n size: this.props.size,\n color: this.props.color,\n borderRadius: this.props.borderRadius,\n });\n }\n\n get wrapperClasses(): string {\n return mnCheckboxWrapperVariants({\n size: this.props.size,\n fullWidth: this.props.fullWidth,\n hover: this.props.hover,\n });\n }\n}\n","<div [class.is-fullwidth]=\"props.fullWidth\" class=\"flex flex-col items-start\">\n <label [attr.for]=\"resolvedId\" [ngClass]=\"wrapperClasses\"\n class=\"flex flex-row items-center gap-x-2 select-none cursor-pointer\">\n <input\n type=\"checkbox\"\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [checked]=\"value\"\n [ngClass]=\"checkboxClasses\"\n (change)=\"handleChange($any($event.target).checked)\"\n (blur)=\"handleBlur()\"\n />\n @if (uiConfig.label || props.label) {\n <span class=\"flex flex-row items-center gap-x-0.5\">\n <span>{{ uiConfig.label || props.label }}</span>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n }\n </label>\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1 mt-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnDatetimeVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 placeholder-base-content/50 cursor-pointer text-base-content text-sm',\n variants: {\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'px-2 py-1.5',\n md: 'px-3 py-2',\n lg: 'px-4 py-3',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n hover: {\n true: 'hover:cursor-pointer hover:bg-base-200 transition-colors duration-300 ease-in-out',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n hover: true,\n },\n});\n\nexport type MnDatetimeVariants = VariantProps<typeof mnDatetimeVariants>;\n","import {Component, DestroyRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnDatetimeErrorMessageData, MnDatetimeMode, MnDatetimeProps, MnDatetimeUIConfig} from './mn-datetimeTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnDatetimeVariants} from './mn-datetimeVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_DATETIME_CONFIG = new InjectionToken<MnDatetimeUIConfig>('MN_DATETIME_CONFIG');\n\n@Component({\n selector: 'mn-lib-datetime',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-datetime.html',\n styles: `input::-webkit-calendar-picker-indicator { cursor: pointer; }`,\n host: {\n // Native date/time inputs have a platform-specific intrinsic width. Without an\n // explicit host width the inline host collapses to that intrinsic size, so the\n // input's `w-full` (width:100%) resolves against a content-sized box and fails to\n // fill the parent on real mobile devices (desktop devtools hides this because it\n // still renders the control with the desktop engine). Give the host a real width\n // when fullWidth is requested so 100% has something to fill.\n '[style.display]': \"props?.fullWidth ? 'block' : null\",\n '[style.width]': \"props?.fullWidth ? '100%' : null\",\n },\n})\nexport class MnDatetime implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n protected uiConfig: MnDatetimeUIConfig = {};\n\n @Input({ required: true }) props!: MnDatetimeProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n value: string | null = null;\n isDisabled = false;\n\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnDatetimeErrorMessageData> = {\n required: 'This field is required',\n mnMin: (args) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args) => `Date/time must be up to ${args.max}`,\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-datetime-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnDatetimeUIConfig>(\n 'mn-datetime',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n if (this.props.placeholder) {\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n writeValue(val: unknown): void {\n if (val != null) {\n let str = String(val);\n // Convert ISO 8601 strings (e.g. \"2025-01-01T10:00:00.000Z\") to datetime-local format\n if (str.includes('T') && (str.endsWith('Z') || /[+-]\\d{2}:\\d{2}$/.test(str))) {\n const date = new Date(str);\n if (!isNaN(date.getTime())) {\n const pad = (n: number) => n.toString().padStart(2, '0');\n str = `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}T${pad(date.getHours())}:${pad(date.getMinutes())}`;\n }\n }\n this.value = str;\n } else {\n this.value = null;\n }\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Event Handlers ==========\n\n handleInput(raw: string): void {\n this.value = raw;\n this.onChange(raw);\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n handleClick(input: HTMLInputElement): void {\n try {\n input.showPicker();\n } catch {\n // picker already open (icon click) or browser restriction\n }\n }\n\n // ========== Error Handling ==========\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n return msgDef;\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get resolvedMode(): MnDatetimeMode {\n return this.props.mode ?? 'datetime-local';\n }\n\n get inputClasses(): string {\n return mnDatetimeVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n hover: this.props.hover,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n @if (uiConfig.label || props.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <input\n #dateInput\n [id]=\"resolvedId\"\n [attr.name]=\"resolvedName\"\n [type]=\"resolvedMode\"\n [attr.placeholder]=\"uiConfig.placeholder || props.placeholder || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [disabled]=\"isDisabled\"\n [attr.min]=\"props.min || null\"\n [attr.max]=\"props.max || null\"\n [attr.step]=\"props.step || null\"\n [value]=\"value ?? ''\"\n [ngClass]=\"inputClasses\"\n (click)=\"handleClick(dateInput)\"\n (input)=\"handleInput(($any($event.target)).value)\"\n (blur)=\"handleBlur()\"\n />\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnMultiSelectVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 text-base-content text-sm cursor-pointer',\n variants: {\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n },\n});\n\nexport type MnMultiSelectVariants = VariantProps<typeof mnMultiSelectVariants>;\n","import {\n Component,\n DestroyRef,\n ElementRef,\n HostListener,\n inject,\n InjectionToken,\n Input,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnMultiSelectProps, MnMultiSelectOption, MnMultiSelectErrorMessageData, MnMultiSelectUIConfig} from './mn-multi-selectTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnMultiSelectVariants} from './mn-multi-selectVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnButton} from '../mn-button';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\nimport {LucideX} from \"@lucide/angular\";\n\nexport const MN_MULTI_SELECT_CONFIG = new InjectionToken<MnMultiSelectUIConfig>('MN_MULTI_SELECT_CONFIG');\n\n@Component({\n selector: 'mn-lib-multi-select',\n standalone: true,\n imports: [NgClass, MnErrorMessage, MnButton, LucideX],\n templateUrl: './mn-multi-select.html',\n})\nexport class MnMultiSelect implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n protected uiConfig: MnMultiSelectUIConfig = {};\n\n @Input({ required: true }) props!: MnMultiSelectProps;\n\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, { optional: true }) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, { optional: true });\n private readonly elRef = inject(ElementRef);\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n\n /** Reference to the trigger element for positioning the dropdown */\n @ViewChild('trigger', { static: false }) triggerRef!: ElementRef<HTMLElement>;\n\n /** Currently selected values */\n selectedValues: unknown[] = [];\n isOpen = false;\n isDisabled = false;\n searchTerm = '';\n\n /** Dropdown position calculated from trigger bounding rect */\n dropdownStyle: { top: string; left: string; width: string } = { top: '0px', left: '0px', width: '0px' };\n\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnMultiSelectErrorMessageData> = {\n required: 'At least one option must be selected',\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-multi-select-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnMultiSelectUIConfig>(\n 'mn-multi-select',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = { ...this.uiConfig, label: this.props.label };\n }\n if (this.props.placeholder) {\n this.uiConfig = { ...this.uiConfig, placeholder: this.props.placeholder };\n }\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n writeValue(val: unknown): void {\n this.selectedValues = Array.isArray(val) ? val : [];\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Dropdown Logic ==========\n\n toggle(): void {\n if (this.isDisabled) return;\n this.isOpen = !this.isOpen;\n if (this.isOpen) {\n this.updateDropdownPosition();\n } else {\n this.searchTerm = '';\n }\n }\n\n /** Calculates the fixed position for the dropdown based on the trigger element */\n private updateDropdownPosition(): void {\n if (!this.triggerRef) return;\n const rect = this.triggerRef.nativeElement.getBoundingClientRect();\n this.dropdownStyle = {\n top: `${rect.bottom}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n }\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: Event): void {\n if (!this.elRef.nativeElement.contains(event.target)) {\n if (this.isOpen) {\n this.isOpen = false;\n this.searchTerm = '';\n }\n }\n }\n\n /** Closes the dropdown when the page or a scrollable parent is scrolled */\n @HostListener('window:scroll', [])\n @HostListener('window:resize', [])\n onWindowScrollOrResize(): void {\n if (this.isOpen) {\n this.isOpen = false;\n this.searchTerm = '';\n }\n }\n\n toggleOption(option: MnMultiSelectOption): void {\n if (option.disabled) return;\n\n const index = this.selectedValues.indexOf(option.value);\n if (index > -1) {\n this.selectedValues = this.selectedValues.filter(v => v !== option.value);\n } else {\n if (this.props.maxSelections && this.selectedValues.length >= this.props.maxSelections) {\n return;\n }\n this.selectedValues = [...this.selectedValues, option.value];\n }\n this.onChange(this.selectedValues);\n }\n\n removeOption(option: MnMultiSelectOption, event: Event): void {\n event.stopPropagation();\n this.selectedValues = this.selectedValues.filter(v => v !== option.value);\n this.onChange(this.selectedValues);\n }\n\n isSelected(option: MnMultiSelectOption): boolean {\n return this.selectedValues.includes(option.value);\n }\n\n isMaxReached(option: MnMultiSelectOption): boolean {\n if (!this.props.maxSelections) return false;\n return this.selectedValues.length >= this.props.maxSelections && !this.isSelected(option);\n }\n\n onSearch(term: string): void {\n this.searchTerm = term;\n }\n\n get filteredOptions(): MnMultiSelectOption[] {\n if (!this.searchTerm) return this.props.options;\n const lower = this.searchTerm.toLowerCase();\n return this.props.options.filter(o => o.label.toLowerCase().includes(lower));\n }\n\n get selectedOptions(): MnMultiSelectOption[] {\n return this.props.options.filter(o => this.selectedValues.includes(o.value));\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n // ========== Error Handling ==========\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n // Interpolate {{placeholder}} tokens with validation error args\n if (typeof msgDef === 'string' && errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/\\{\\{(\\w+)\\}\\}/g, (_, key) => errorArgs[key] ?? _);\n }\n return msgDef;\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n // ========== Resolved Properties ==========\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get triggerClasses(): string {\n return mnMultiSelectVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n });\n }\n}\n","<div class=\"flex flex-col h-full\" [class.is-fullwidth]=\"props.fullWidth\">\n @if (uiConfig.label || props.label) {\n <label class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\" [attr.for]=\"resolvedId\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <!-- Trigger -->\n <div\n #trigger\n [id]=\"resolvedId\"\n [ngClass]=\"triggerClasses\"\n class=\"relative\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-controls]=\"isOpen ? resolvedId + '-listbox' : null\"\n role=\"combobox\"\n tabindex=\"0\"\n (click)=\"toggle()\"\n (keydown.enter)=\"toggle()\"\n (keydown.space)=\"toggle(); $event.preventDefault()\"\n (blur)=\"handleBlur()\"\n >\n <div class=\"flex flex-row items-center gap-x-2 flex-wrap min-h-6\">\n @if (selectedOptions.length === 0) {\n <span class=\"text-base-content/50\">{{ uiConfig.placeholder || props.placeholder || 'Select...' }}</span>\n } @else {\n @for (opt of selectedOptions; track opt.value) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <span class=\"inline-flex items-center gap-x-1 bg-base-200 border border-accent text-base-content text-xs pl-2 py-0.5 rounded-md cursor-pointer\"\n (click)=\"removeOption(opt, $event)\">\n {{ opt.label }}\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary', hover: false }\"\n type=\"button\"\n class=\"text-base-content/50 cursor-pointer\"\n (click)=\"removeOption(opt, $event)\"\n [attr.aria-label]=\"'Remove ' + opt.label\"\n ><svg lucideX [size]=\"18\"></svg></button>\n </span>\n }\n }\n </div>\n <div class=\"absolute right-2 top-1/2 -translate-y-1/2 pointer-events-none\">\n <svg class=\"w-4 h-4 text-base-content/50\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12 12\">\n <path fill=\"currentColor\" d=\"M6 8L1 3h10z\"/>\n </svg>\n </div>\n </div>\n\n <!-- Dropdown -->\n @if (isOpen) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div\n [id]=\"resolvedId + '-listbox'\"\n aria-multiselectable=\"true\"\n role=\"listbox\"\n class=\"fixed z-9999 bg-base-100 border border-base-300 rounded-md shadow-lg max-h-60 overflow-auto\"\n [style.top]=\"dropdownStyle.top\"\n [style.left]=\"dropdownStyle.left\"\n [style.width]=\"dropdownStyle.width\"\n (click)=\"$event.stopPropagation()\"\n >\n @if (props.searchable) {\n <div class=\"p-2 border-b border-base-300\">\n <input\n type=\"text\"\n class=\"w-full p-1.5 text-sm border border-base-300 rounded-md outline-none focus:border-primary-500 bg-base-200 text-base-content placeholder-base-content/50\"\n [placeholder]=\"props.searchPlaceholder || 'Search...'\"\n [value]=\"searchTerm\"\n (input)=\"onSearch(($any($event.target)).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n }\n @for (opt of filteredOptions; track opt.value) {\n <div\n (keyup.enter)=\"toggleOption(opt)\"\n (keyup.space)=\"toggleOption(opt)\"\n [attr.aria-selected]=\"isSelected(opt)\"\n class=\"flex items-center gap-x-2 px-3 py-2 text-sm cursor-pointer text-base-content hover:bg-base-200\"\n [class.opacity-50]=\"opt.disabled || isMaxReached(opt)\"\n [class.pointer-events-none]=\"opt.disabled || isMaxReached(opt)\"\n (click)=\"toggleOption(opt); $event.stopPropagation()\"\n role=\"option\"\n tabindex=\"0\"\n >\n <input\n type=\"checkbox\"\n class=\"w-4 h-4 accent-primary pointer-events-none\"\n [checked]=\"isSelected(opt)\"\n [disabled]=\"opt.disabled || isMaxReached(opt)\"\n tabindex=\"-1\"\n />\n <span>{{ opt.label }}</span>\n </div>\n }\n @if (filteredOptions.length === 0) {\n <div class=\"px-3 py-2 text-sm text-base-content/50\">{{ uiConfig.noOptionsFound || 'No options found' }}</div>\n }\n </div>\n }\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1 mt-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnSelectVariants = tv({\n base: 'bg-base-100 border-1 border-base-300 text-base-content text-sm cursor-pointer hover:bg-base-200 transition-colors duration-300',\n variants: {\n shadow: {\n true: 'shadow-lg',\n },\n size: {\n sm: 'p-2',\n md: 'p-3',\n lg: 'p-4',\n },\n borderRadius: {\n none: 'rounded-none',\n xs: 'rounded-xs',\n sm: 'rounded-sm',\n md: 'rounded-md',\n lg: 'rounded-lg',\n xl: 'rounded-xl',\n two_xl: 'rounded-2xl',\n three_xl: 'rounded-3xl',\n four_xl: 'rounded-4xl',\n },\n fullWidth: {\n true: 'w-full',\n },\n },\n defaultVariants: {\n size: 'md',\n borderRadius: 'md',\n },\n});\n\nexport type MnSelectVariants = VariantProps<typeof mnSelectVariants>;\n","import {Component, DestroyRef, inject, InjectionToken, Input, OnInit} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnSelectErrorMessageData, MnSelectOption, MnSelectProps, MnSelectUIConfig} from './mn-selectTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnSelectVariants} from './mn-selectVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context\";\nimport {MnLanguageService} from \"../../language\";\nimport {skip} from \"rxjs\";\n\nexport const MN_SELECT_CONFIG = new InjectionToken<MnSelectUIConfig>('MN_SELECT_CONFIG');\n\n@Component({\n selector: 'mn-lib-select',\n standalone: true,\n imports: [NgClass, MnErrorMessage],\n templateUrl: './mn-select.html',\n host: {\n // Without an explicit host width the inline host collapses to its content size, so\n // the control's `w-full` (width:100%) resolves against a content-sized box and fails\n // to fill the parent. Give the host a real width when fullWidth is requested.\n '[style.display]': \"props?.fullWidth ? 'block' : null\",\n '[style.width]': \"props?.fullWidth ? '100%' : null\",\n },\n})\nexport class MnSelect implements OnInit {\n ngControl = inject(NgControl, {optional: true, self: true});\n\n @Input({required: true}) props!: MnSelectProps;\n /** Currently selected value */\n selectedValue: unknown = null;\n isDisabled = false;\n protected uiConfig: MnSelectUIConfig = {};\n private readonly configService = inject(MnConfigService);\n private readonly sectionPath = inject(MN_SECTION_PATH, {optional: true}) ?? [];\n private readonly explicitInstanceId = inject(MN_INSTANCE_ID, {optional: true});\n private readonly lang = inject(MnLanguageService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly builtInErrorMessages: Record<string, MnSelectErrorMessageData> = {\n required: 'Please select an option',\n };\n\n constructor() {\n if (this.ngControl) this.ngControl.valueAccessor = this;\n }\n\n get selectedOption(): MnSelectOption | undefined {\n return this.props.options.find(o => o.value === this.selectedValue);\n }\n\n get control() {\n return this.ngControl?.control ?? null;\n }\n\n get showError(): boolean {\n const c = this.control;\n return !!c && c.invalid && (c.touched || c.dirty);\n }\n\n get errorMessages(): string[] {\n const errors = this.control?.errors;\n if (!errors) return [];\n return Object.keys(errors).map(key => this.resolveErrorMessageForKey(key, errors));\n }\n\n // ========== ControlValueAccessor Implementation ==========\n\n get errorMessage(): string | null {\n const errors = this.control?.errors;\n if (!errors) return null;\n const errorKey = this.pickErrorKey(errors);\n return this.resolveErrorMessageForKey(errorKey, errors);\n }\n\n get resolvedId(): string {\n return this.props.id;\n }\n\n get resolvedName(): string | null {\n return this.props?.name ?? null;\n }\n\n get selectClasses(): string {\n return mnSelectVariants({\n size: this.props.size,\n borderRadius: this.props.borderRadius,\n shadow: this.props.shadow,\n fullWidth: this.props.fullWidth,\n });\n }\n\n // ========== Select Logic ==========\n\n ngOnInit() {\n this.resolveConfig();\n\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n\n writeValue(val: unknown): void {\n // Treat empty string as null so the placeholder is shown and the control stays properly invalid\n this.selectedValue = (val === '' || val == null) ? null : val;\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n // ========== Error Handling ==========\n\n /** Returns the index of an option, used as the <option> value attribute */\n optionIndex(option: MnSelectOption): string {\n return String(this.props.options.indexOf(option));\n }\n\n /** Handles native select change event */\n onSelectChange(event: Event): void {\n const target = event.target as HTMLSelectElement;\n const index = parseInt(target.value, 10);\n if (isNaN(index) || index < 0 || index >= this.props.options.length) {\n this.selectedValue = null;\n this.onChange(null);\n return;\n }\n const option = this.props.options[index];\n if (option.disabled) return;\n this.selectedValue = option.value;\n this.onChange(this.selectedValue);\n }\n\n isSelected(option: MnSelectOption): boolean {\n return this.selectedValue === option.value;\n }\n\n handleBlur(): void {\n this.onTouched();\n }\n\n protected isRequired(): boolean {\n if (!this.control) return false;\n return this.control.hasValidator(Validators.required);\n }\n\n private onChange: (val: unknown) => void = () => {\n };\n\n private onTouched: () => void = () => {\n };\n\n // ========== Resolved Properties ==========\n\n private resolveConfig() {\n const instanceId = this.explicitInstanceId || `mn-select-${this.props.id}`;\n this.uiConfig = this.configService.resolve<MnSelectUIConfig>(\n 'mn-select',\n this.sectionPath,\n instanceId\n );\n\n if (this.props.label) {\n this.uiConfig = {...this.uiConfig, label: this.props.label};\n }\n if (this.props.placeholder) {\n this.uiConfig = {...this.uiConfig, placeholder: this.props.placeholder};\n }\n }\n\n private pickErrorKey(errors: ValidationErrors): string {\n if (this.props.errorPriority) {\n for (const key of this.props.errorPriority) {\n if (errors[key] !== undefined) {\n return key;\n }\n }\n }\n return Object.keys(errors)[0];\n }\n\n private resolveErrorMessageForKey(errorKey: string, errors: ValidationErrors): string {\n const errorArgs = errors[errorKey];\n const customMsg = this.props.errorMessages?.[errorKey];\n const configMsg = this.uiConfig.errorMessages?.[errorKey];\n const useBuiltIn = this.props.useBuiltInErrorMessages !== false;\n const builtInMsg = useBuiltIn ? this.builtInErrorMessages[errorKey] : undefined;\n const fallbackMsg = this.props.defaultErrorMessage;\n const msgDef = customMsg ?? configMsg ?? builtInMsg ?? fallbackMsg ?? 'Invalid input';\n\n if (typeof msgDef === 'function') {\n return msgDef(errorArgs, errors);\n }\n if (errorArgs && typeof errorArgs === 'object') {\n return msgDef.replace(/{{(\\w+)}}/g, (_, key) => errorArgs[key] ?? _);\n }\n return msgDef;\n }\n}\n","<div [class.is-fullwidth]=\"props.fullWidth\" class=\"flex flex-col h-full\">\n @if (uiConfig.label || props.label) {\n <label [attr.for]=\"resolvedId\" class=\"pl-2 pb-1 flex flex-row gap-x-0.5! text-base!\">\n <p>{{ uiConfig.label || props.label }}</p>\n @if (isRequired()) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n }\n\n <select\n (blur)=\"handleBlur()\"\n (change)=\"onSelectChange($event)\"\n [attr.aria-describedby]=\"showError ? resolvedId + '-error' : null\"\n [attr.aria-invalid]=\"showError || null\"\n [attr.aria-label]=\"uiConfig.ariaLabel || uiConfig.label || props.label || null\"\n [disabled]=\"isDisabled\"\n [id]=\"resolvedId\"\n [name]=\"resolvedName\"\n [ngClass]=\"selectClasses\"\n >\n @if (props.placeholder || uiConfig.placeholder) {\n <option [selected]=\"selectedValue === null\" [value]=\"''\" disabled>\n {{ uiConfig.placeholder || props.placeholder }}\n </option>\n }\n @for (opt of props.options; track opt.value) {\n <option\n [disabled]=\"opt.disabled\"\n [selected]=\"isSelected(opt)\"\n [value]=\"optionIndex(opt)\"\n >{{ opt.label }}\n </option>\n }\n </select>\n\n @if (showError) {\n @if (props.showAllErrors) {\n <div class=\"flex flex-col gap-y-1 mt-1\">\n @for (error of errorMessages; track $index) {\n <mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage !== null) {\n <mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></mn-error-message>\n }\n }\n }\n</div>\n","import {TemplateRef, Type} from '@angular/core';\nimport {Observable} from 'rxjs';\nimport {AsyncValidatorFn, ValidatorFn} from '@angular/forms';\nimport {TableDataSource} from '../mn-table';\n\nexport { Type, TemplateRef };\n\n// =========================\n// Enums / Value Types\n// =========================\n\nexport enum ModalKind {\n WIZARD = 'wizard',\n FORM = 'form',\n CONFIRMATION = 'confirmation',\n CUSTOM = 'custom',\n}\n\nexport enum ModalSize {\n SM = 'sm',\n MD = 'md',\n LG = 'lg',\n XL = 'xl',\n FULL = 'full',\n}\n\nexport enum CloseMode {\n ALLOWED = 'allowed',\n GUARDED = 'guarded',\n DISABLED = 'disabled',\n}\n\nexport enum BackdropMode {\n HIDE = 'hide',\n STATIC = 'static',\n CLOSABLE = 'closable',\n}\n\nexport enum KeyboardMode {\n ENABLED = 'enabled',\n DISABLED = 'disabled',\n}\n\nexport enum ModalIntent {\n NEUTRAL = 'neutral',\n INFO = 'info',\n SUCCESS = 'success',\n WARNING = 'warning',\n DANGER = 'danger',\n}\n\nexport enum WizardFlowMode {\n LINEAR = 'linear',\n FREE = 'free',\n}\n\nexport enum FormLayoutMode {\n SINGLE_COLUMN = 'single-column',\n TWO_COLUMN = 'two-column',\n INLINE = 'inline',\n}\n\nexport enum SubmitMode {\n ONCE = 'once',\n RETRYABLE = 'retryable',\n}\n\nexport enum ConfirmationTone {\n DEFAULT = 'default',\n WARNING = 'warning',\n DANGER = 'danger',\n}\n\nexport enum FieldKind {\n TEXT = 'text',\n NUMBER = 'number',\n SELECT = 'select',\n CHECKBOX = 'checkbox',\n DATE = 'date',\n TEXTAREA = 'textarea',\n DATETIME = 'datetime',\n MULTI_SELECT = 'multi-select',\n MULTI_SELECT_TABLE = 'multi-select-table',\n SINGLE_SELECT_TABLE = 'single-select-table',\n PASSWORD = 'password',\n FILE = 'file',\n COLOR = 'color',\n RATING = 'rating',\n SLIDER = 'slider',\n CUSTOM = 'custom',\n}\n\nexport enum FieldAppearance {\n OUTLINE = 'outline',\n FILLED = 'filled',\n GHOST = 'ghost',\n}\n\nexport enum SelectionMode {\n SINGLE = 'single',\n MULTIPLE = 'multiple',\n}\n\nexport enum OptionState {\n ENABLED = 'enabled',\n DISABLED = 'disabled',\n}\n\nexport enum ActionStyle {\n PRIMARY = 'primary',\n SECONDARY = 'secondary',\n DANGER = 'danger',\n GHOST = 'ghost',\n}\n\nexport enum StepState {\n PENDING = 'pending',\n ACTIVE = 'active',\n COMPLETE = 'complete',\n DISABLED = 'disabled',\n HIDDEN = 'hidden',\n}\n\nexport enum NavigationDirection {\n FORWARD = 'forward',\n BACKWARD = 'backward',\n DIRECT = 'direct',\n}\n\nexport enum ModalCloseReason {\n COMPLETED = 'completed',\n CANCELLED = 'cancelled',\n DISMISSED = 'dismissed',\n BACKDROP = 'backdrop',\n ESCAPE = 'escape',\n PROGRAMMATIC = 'programmatic',\n GUARD_REJECTED = 'guard_rejected',\n}\n\nexport enum ValidationStatus {\n VALID = 'valid',\n INVALID = 'invalid',\n PENDING = 'pending',\n}\n\nexport enum ValidationCode {\n REQUIRED = 'required',\n MIN = 'min',\n MAX = 'max',\n PATTERN = 'pattern',\n CUSTOM = 'custom',\n}\n\n// =========================\n// Value Objects & Types\n// =========================\n\nexport type ModalStepId = string;\nexport type ModalInputMap = Record<string, unknown>;\n\n// =========================\n// Conditional Field Types\n// =========================\n\n/**\n * A condition function that receives the current form values and returns\n * whether the field should be visible.\n */\nexport type FieldVisibilityCondition<TModel = unknown> = (formValue: Partial<TModel>) => boolean;\n\n/**\n * A condition function that receives the current form values and returns\n * whether the field should be required.\n */\nexport type FieldRequiredCondition<TModel = unknown> = (formValue: Partial<TModel>) => boolean;\n\n// =========================\n// Cross-Field Validation\n// =========================\n\n/**\n * A form-level validator that receives the entire form value\n * and returns an error map or null.\n */\nexport type FormValidator<TModel = unknown> = (formValue: Partial<TModel>) => Record<string, string> | null;\n\n// =========================\n// Async DataSource Types\n// =========================\n\n/**\n * A data source that asynchronously loads options for select/multi-select fields.\n * Can optionally depend on other field values to reload.\n */\nexport type FieldDataSource<TValue = unknown, TModel = unknown> = {\n /** Load options, optionally based on current form values */\n load(formValue?: Partial<TModel>): Promise<SelectOption<TValue>[]> | SelectOption<TValue>[];\n /** Keys of other fields that trigger a reload when their value changes */\n dependsOn?: KeyOf<TModel>[];\n}\n\n// =========================\n// Validation Types\n// =========================\n\nexport type ValidationResult = {\n status: ValidationStatus;\n code?: ValidationCode;\n message?: string;\n}\n\nexport type StepValidator = {\n validate(): Promise<ValidationResult> | ValidationResult;\n}\n\nexport type FieldValidator = {\n validate(value: unknown): Promise<ValidationResult> | ValidationResult;\n}\n\nexport type StepGuard = {\n canEnter(): Promise<boolean> | boolean;\n canExit(): Promise<boolean> | boolean;\n}\n\n// =========================\n// Modal Result & Events\n// =========================\n\nexport type ModalCloseEvent<TResult = unknown> = {\n reason: ModalCloseReason;\n result?: TResult;\n}\n\nexport type ModalRef<TResult = unknown> = {\n afterClosed$: Observable<ModalCloseEvent<TResult>>;\n close(result?: TResult): void;\n dismiss(reason: ModalCloseReason): void;\n update(config: Partial<BaseModalConfig<TResult>>): void;\n}\n\n// =========================\n// Handlers\n// =========================\n\nexport type ModalResultHandler<TResult = unknown> = {\n handle(result: TResult): Promise<void> | void;\n}\n\nexport type WizardStepChangeEvent = {\n previousStepId?: ModalStepId;\n currentStepId: ModalStepId;\n direction: NavigationDirection;\n}\n\nexport type WizardStepChangeHandler = {\n handle(event: WizardStepChangeEvent): Promise<void> | void;\n}\n\n// =========================\n// Wizard Types\n// =========================\n\nexport type StepBodyConfig = Type<unknown> | TemplateRef<unknown> | string;\n\nexport type WizardStepConfig<TModel = unknown> = {\n id: ModalStepId;\n title: string;\n state?: StepState;\n body?: StepBodyConfig;\n fields?: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n fieldGroups?: FormFieldGroup<TModel>[];\n formValidators?: FormValidator<TModel>[];\n groupValidators?: ValidatorFn[];\n initialValue?: Partial<TModel>;\n guard?: StepGuard;\n validators?: StepValidator[];\n /** Custom label for the 'Next' button on this step */\n nextLabel?: string;\n /** Custom label for the 'Back' button on this step */\n backLabel?: string;\n /** Whether to hide the 'Back' button on this step */\n hideBack?: boolean;\n /** Condition to show/hide this entire step based on aggregated wizard data */\n visible?: (aggregatedData: Record<ModalStepId, Record<string, unknown>>) => boolean;\n}\n\nexport type WizardResult = {\n status: ModalCloseReason;\n visitedStepIds: ModalStepId[];\n payload?: Record<ModalStepId, Record<string, unknown>>;\n}\n\n// =========================\n// Form Types\n// =========================\n\ntype KeyOf<T> = unknown extends T ? string : keyof T & string;\n\nexport type SelectOption<TValue = unknown> = {\n label: string;\n value: TValue;\n state?: OptionState;\n}\n\nexport type TextFieldConfig<TModel = unknown> = {\n kind: FieldKind.TEXT;\n key: KeyOf<TModel>;\n label: string;\n appearance?: FieldAppearance;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n placeholder?: string;\n /** Whether this field is read-only (display only) */\n readOnly?: boolean;\n /** Whether this field is disabled */\n disabled?: boolean;\n /** Condition to show/hide this field based on other field values */\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n /** Input mask (e.g., '(000) 000-0000') */\n mask?: string;\n /** Autocomplete attribute */\n autocomplete?: string;\n /** Whether to focus this field when the modal opens */\n autoFocus?: boolean;\n /** When to update the form control value and run validation */\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type NumberFieldConfig<TModel = unknown> = {\n kind: FieldKind.NUMBER;\n key: KeyOf<TModel>;\n label: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n placeholder?: string;\n min?: number;\n max?: number;\n step?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type SelectFieldConfig<TModel = unknown, TValue = unknown> = {\n kind: FieldKind.SELECT;\n key: KeyOf<TModel>;\n label: string;\n options: SelectOption<TValue>[];\n selectionMode?: SelectionMode;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n /** Async data source for loading options dynamically */\n dataSource?: FieldDataSource<TValue, TModel>;\n}\n\nexport type CheckboxFieldConfig<TModel = unknown> = {\n kind: FieldKind.CHECKBOX;\n key: KeyOf<TModel>;\n label: string;\n defaultValue?: boolean;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type DateFieldConfig<TModel = unknown> = {\n kind: FieldKind.DATE;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n minDate?: string;\n maxDate?: string;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type TextareaFieldConfig<TModel = unknown> = {\n kind: FieldKind.TEXTAREA;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n rows?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type DatetimeFieldConfig<TModel = unknown> = {\n kind: FieldKind.DATETIME;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n mode?: 'date' | 'time' | 'datetime-local';\n min?: string;\n max?: string;\n step?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type MultiSelectFieldConfig<TModel = unknown, TValue = unknown> = {\n kind: FieldKind.MULTI_SELECT;\n key: KeyOf<TModel>;\n label: string;\n options: SelectOption<TValue>[];\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n searchable?: boolean;\n searchPlaceholder?: string;\n maxSelections?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n /** Async data source for loading options dynamically */\n dataSource?: FieldDataSource<TValue, TModel>;\n}\n\nexport type PasswordFieldConfig<TModel = unknown> = {\n kind: FieldKind.PASSWORD;\n key: KeyOf<TModel>;\n label: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type MultiSelectTableFieldConfig<TModel = unknown, TRow = unknown> = {\n kind: FieldKind.MULTI_SELECT_TABLE;\n key: KeyOf<TModel>;\n label: string;\n /** The TableDataSource that powers the mn-table. selectionMode will be forced to 'multi'. */\n tableDataSource: TableDataSource<TRow>;\n /** Function to extract the value stored in the form from a selected row (default: getID) */\n getRowValue?: (row: TRow) => unknown;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type SingleSelectTableFieldConfig<TModel = unknown, TRow = unknown> = {\n kind: FieldKind.SINGLE_SELECT_TABLE;\n key: KeyOf<TModel>;\n label: string;\n /** The TableDataSource that powers the mn-table. selectionMode will be forced to 'single'. */\n tableDataSource: TableDataSource<TRow>;\n /** Function to extract the value stored in the form from a selected row (default: getID) */\n getRowValue?: (row: TRow) => unknown;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type ColorFieldConfig<TModel = unknown> = {\n kind: FieldKind.COLOR;\n key: KeyOf<TModel>;\n label: string;\n /** Default color value (hex string, e.g., '#ff0000') */\n defaultValue?: string;\n /** Predefined color swatches to show */\n swatches?: string[];\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type RatingFieldConfig<TModel = unknown> = {\n kind: FieldKind.RATING;\n key: KeyOf<TModel>;\n label: string;\n /** Maximum rating value (default: 5) */\n max?: number;\n /** Icon to use for rating (default: 'star') */\n icon?: 'star' | 'heart' | 'circle';\n /** Allow half-star ratings (default: false) */\n allowHalf?: boolean;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type SliderFieldConfig<TModel = unknown> = {\n kind: FieldKind.SLIDER;\n key: KeyOf<TModel>;\n label: string;\n /** Minimum value (default: 0) */\n min?: number;\n /** Maximum value (default: 100) */\n max?: number;\n /** Step increment (default: 1) */\n step?: number;\n /** Whether to show the current value label (default: true) */\n showValue?: boolean;\n /** Unit label displayed after the value (e.g., '%', 'px') */\n unit?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type FileFieldConfig<TModel = unknown> = {\n kind: FieldKind.FILE;\n key: KeyOf<TModel>;\n label: string;\n /** Accepted file types (e.g., '.pdf,.jpg,image/*') */\n accept?: string;\n /** Allow multiple file selection */\n multiple?: boolean;\n /** Maximum file size in bytes */\n maxSize?: number;\n /** Maximum number of files (when multiple is true) */\n maxFiles?: number;\n /** How the selection is displayed (default: 'dropzone') */\n displayMode?: 'dropzone' | 'thumbnail' | 'list' | 'compact';\n /** Hint shown inside the empty dropzone */\n dropzoneHint?: string;\n /** Label for the \"choose/replace file\" affordance */\n replaceLabel?: string;\n /** Accessible label for the per-file remove button */\n removeLabel?: string;\n /** URL of an already-saved image to preview when no new file is selected (single mode) */\n currentUrl?: string | null;\n /** URLs of already-saved images to preview when nothing is selected (multiple mode) */\n currentUrls?: string[] | null;\n /**\n * Called when the user removes an already-saved image (`currentUrl`/`currentUrls`).\n * The form value stays null; use this to record the removal intent (e.g. to send\n * a \"clear image\" instruction to the API on submit).\n */\n onClear?: () => void;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type CustomFieldConfig<TModel = unknown> = {\n kind: FieldKind.CUSTOM;\n key: KeyOf<TModel>;\n component: Type<unknown>;\n inputs?: ModalInputMap;\n label?: string;\n validators?: ValidatorFn[];\n asyncValidators?: AsyncValidatorFn[];\n visible?: FieldVisibilityCondition<TModel>;\n /** Condition to dynamically mark this field as required based on other field values */\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport type FormFieldConfig<TModel = unknown> =\n | TextFieldConfig<TModel>\n | NumberFieldConfig<TModel>\n | SelectFieldConfig<TModel>\n | CheckboxFieldConfig<TModel>\n | DateFieldConfig<TModel>\n | TextareaFieldConfig<TModel>\n | DatetimeFieldConfig<TModel>\n | MultiSelectFieldConfig<TModel>\n | MultiSelectTableFieldConfig<TModel, unknown>\n | SingleSelectTableFieldConfig<TModel, unknown>\n | PasswordFieldConfig<TModel>\n | FileFieldConfig<TModel>\n | ColorFieldConfig<TModel>\n | RatingFieldConfig<TModel>\n | SliderFieldConfig<TModel>\n | CustomFieldConfig<TModel>;\n\nexport type AnimationOptions = {\n type: 'slide' | 'fade' | 'zoom';\n duration?: number; // ms\n}\n\n// =========================\n// Form Layout Types\n// =========================\n\nexport type FormRowField<TModel = unknown> = {\n field: FormFieldConfig<TModel>;\n span?: number; // Number of columns this field spans (default: 1)\n}\n\nexport type FormRow<TModel = unknown> = {\n columns?: number; // Number of columns in this row (default: 1 = full width)\n fields: FormRowField<TModel>[];\n}\n\n// =========================\n// Field Group / Section Types\n// =========================\n\nexport type FormFieldGroup<TModel = unknown> = {\n /** Section header title */\n title: string;\n /** Optional description below the section header */\n description?: string;\n /** Fields in this group */\n fields: FormFieldConfig<TModel>[];\n /** Optional rows layout for this group */\n rows?: FormRow<TModel>[];\n /** Condition to show/hide this entire group based on form values */\n visible?: FieldVisibilityCondition<TModel>;\n}\n\n// =========================\n// Action Types\n// =========================\n\nexport type ConfirmationActionConfig<TResult = unknown> = {\n label: string;\n style?: ActionStyle;\n handler?: ModalResultHandler<TResult>;\n}\n\nexport type CancellationActionConfig = {\n label: string;\n style?: ActionStyle;\n reason?: ModalCloseReason;\n}\n\n// =========================\n// Footer Action Types\n// =========================\n\nexport type ModalFooterAction<TResult = unknown> = {\n label: string;\n style?: ActionStyle;\n /** Position in the footer: 'left' or 'right' (default: 'right') */\n position?: 'left' | 'right';\n /** Whether this action closes the modal */\n closesModal?: boolean;\n /** Close reason when this action closes the modal */\n closeReason?: ModalCloseReason;\n /** Handler called when the action is clicked */\n handler?: (modalRef: ModalRef<TResult>) => Promise<void> | void;\n /** Whether the button is disabled */\n disabled?: boolean;\n}\n\n// =========================\n// Polling / Async Types\n// =========================\n\nexport type ModalPollingConfig<TResult = unknown> = {\n /** Polling interval in milliseconds */\n interval: number;\n /** Function called on each poll tick */\n onPoll: (modalRef: ModalRef<TResult>) => Promise<boolean | void> | boolean | void;\n /** Whether to start polling immediately (default: true) */\n autoStart?: boolean;\n /** Maximum number of poll attempts (undefined = unlimited) */\n maxAttempts?: number;\n}\n\n// =========================\n// Base Config\n// =========================\n\n// =========================\n// i18n / Localization\n// =========================\n\nexport type ModalI18nLabels = {\n /** Submit button label (default: 'Submit') */\n submit?: string;\n /** Cancel button label (default: 'Cancel') */\n cancel?: string;\n /** Next button label for wizard (default: 'Next') */\n next?: string;\n /** Back button label for wizard (default: 'Back') */\n back?: string;\n /** Close button label (default: 'Close') */\n close?: string;\n /** Complete button label for wizard (default: 'Complete') */\n complete?: string;\n /** Submitting state label (default: 'Submitting...') */\n submitting?: string;\n /** Completing state label (default: 'Completing...') */\n completing?: string;\n /** Loading label (default: 'Loading...') */\n loading?: string;\n /** Select placeholder (default: 'Select...') */\n selectPlaceholder?: string;\n /** File upload prompt (default: 'Click or drag files here') */\n fileUploadPrompt?: string;\n /** Confirm button label (default: 'Confirm') */\n confirm?: string;\n}\n\n// =========================\n// Cancel / Dismiss Handler\n// =========================\n\nexport type ModalCancelHandler<_TResult = unknown> = (reason: ModalCloseReason) => Promise<void> | void;\n\nexport type BaseModalConfig<TResult = unknown> = {\n kind: ModalKind;\n title?: string;\n subtitle?: string;\n description?: string;\n /** Width of the modal (uses ModalSize enum) */\n sizeWidth?: ModalSize;\n /** Height of the modal (uses ModalSize enum) */\n sizeHeight?: ModalSize;\n closeMode?: CloseMode;\n closeGuard?: () => Promise<boolean> | boolean;\n backdrop?: BackdropMode;\n keyboard?: KeyboardMode;\n intent?: ModalIntent;\n resultType?: TResult;\n /** Custom footer actions (overrides default footer) */\n footerActions?: ModalFooterAction<TResult>[];\n /** Polling configuration for periodic async operations */\n polling?: ModalPollingConfig<TResult>;\n /** Handler called when the modal is cancelled or dismissed */\n readOnly?: boolean;\n disabled?: boolean;\n onCancel?: ModalCancelHandler<TResult>;\n /** i18n labels for buttons and UI text */\n i18n?: ModalI18nLabels;\n /** Animation configuration */\n animation?: AnimationOptions | AnimationOptions['type'];\n /**\n * Whether the modal renders as a bottom sheet on small screens (< 640px).\n * Defaults to true. Set to false to keep it a centered dialog on mobile.\n */\n mobileBottomSheet?: boolean;\n\n /** Custom component to render in the modal body */\n component?: Type<unknown>;\n /** Custom template to render in the modal body */\n template?: TemplateRef<unknown>;\n /** Inputs for the custom component */\n inputs?: ModalInputMap;\n}\n\n// =========================\n// Specialized Configs\n// =========================\n\nexport type WizardBeforeCompleteValidator<TResult = unknown> = (\n payload: Record<ModalStepId, Record<string, unknown>>\n) => Promise<Partial<Record<keyof TResult & string, string>> | null> | Partial<Record<keyof TResult & string, string>> | null;\n\nexport type WizardModalConfig<TResult = WizardResult> = {\n kind: ModalKind.WIZARD;\n steps: WizardStepConfig[];\n startStepId?: ModalStepId;\n flow?: WizardFlowMode;\n onStepChange?: WizardStepChangeHandler;\n onComplete?: ModalResultHandler<TResult>;\n /** Cross-step validators run before wizard completion */\n onBeforeComplete?: WizardBeforeCompleteValidator<TResult>[];\n /** Global initial values for all steps */\n initialValue?: Partial<TResult>;\n} & BaseModalConfig<TResult>\n\nexport type FormModalConfig<TModel = unknown, TResult = TModel> = {\n kind: ModalKind.FORM;\n body?: StepBodyConfig;\n fields: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n layout?: FormLayoutMode;\n initialValue?: Partial<TModel>;\n submitMode?: SubmitMode;\n onComplete?: ModalResultHandler<TResult>;\n /** Form-level validators for cross-field validation */\n formValidators?: FormValidator<TModel>[];\n /** Angular FormGroup-level validators (e.g., Validators.required on the group) */\n groupValidators?: ValidatorFn[];\n /** Field groups with section headers */\n fieldGroups?: FormFieldGroup<TModel>[];\n} & BaseModalConfig<TResult>\n\nexport type ConfirmationModalConfig<TResult = boolean> = {\n kind: ModalKind.CONFIRMATION;\n message: string;\n tone?: ConfirmationTone;\n confirm?: ConfirmationActionConfig<TResult>;\n cancel?: CancellationActionConfig;\n\n // Form-like capabilities for hybrid confirmation modals\n body?: StepBodyConfig;\n fields?: FormFieldConfig<unknown>[];\n rows?: FormRow<unknown>[];\n fieldGroups?: FormFieldGroup<unknown>[];\n formValidators?: FormValidator<unknown>[];\n groupValidators?: ValidatorFn[];\n initialValue?: Partial<unknown>;\n} & BaseModalConfig<TResult>\n\nexport type CustomModalConfig<TResult = unknown> = {\n kind: ModalKind.CUSTOM;\n onComplete?: ModalResultHandler<TResult>;\n} & BaseModalConfig<TResult>\n\n// =========================\n// Union Root Config\n// =========================\n\nexport type ModalConfig<TResult = unknown, TModel = unknown> =\n | WizardModalConfig<TResult>\n | FormModalConfig<TModel, TResult>\n | ConfirmationModalConfig<TResult>\n | CustomModalConfig<TResult>;\n","import {InjectionToken} from '@angular/core';\n\n/**\n * Intensity of a haptic impact. Mirrors the three impact weights exposed by most\n * native haptic engines (e.g. Capacitor Haptics `ImpactStyle`) without binding the\n * library to any particular implementation.\n */\nexport type MnHapticStyle = 'light' | 'medium' | 'heavy';\n\n/**\n * Abstraction over a native haptic feedback engine.\n *\n * The modal feature deliberately does NOT depend on Capacitor (or any other native\n * bridge) so the library stays usable in plain web apps. Consumers that run inside a\n * native shell provide an implementation of this handler through {@link MN_HAPTICS};\n * when no handler is provided the modal simply skips haptic feedback.\n */\nexport type MnHapticsHandler = {\n /**\n * Triggers a transient impact-style haptic.\n * @param style Intensity of the impact.\n */\n impact(style: MnHapticStyle): void;\n}\n\n/**\n * Optional DI token used by the bottom sheet to emit haptic feedback on native\n * platforms (sheet open, swipe-dismiss, and snap-back). Provide a {@link MnHapticsHandler}\n * at the application root to enable it; leave unprovided on the web (the modal injects it\n * with `{ optional: true }` and no-ops when absent).\n */\nexport const MN_HAPTICS = new InjectionToken<MnHapticsHandler>('MN_HAPTICS');\n","import {Validators, ValidatorFn} from '@angular/forms';\nimport {\n FormFieldConfig,\n FormFieldGroup,\n FormRow,\n FormRowField,\n FormValidator,\n StepBodyConfig,\n} from '../mn-modal.types';\n\n/**\n * Shared interface for configurations that support form layouts.\n */\nexport type FormContainerConfig<TModel = unknown> = {\n fields?: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n fieldGroups?: FormFieldGroup<TModel>[];\n formValidators?: FormValidator<TModel>[];\n groupValidators?: ValidatorFn[];\n initialValue?: Partial<TModel>;\n body?: StepBodyConfig;\n}\n\ntype WithAutoFocus = { autoFocus?: boolean };\ntype WithValidators = { validators?: ValidatorFn[] };\n\n/**\n * A self-referential type so that field-group builder methods can be chained.\n * e.g. g.field(...).field(...).field(...)\n */\nexport type ChainableGroupBuilder<TModel> = FormLayoutBuilder<TModel, ChainableGroupBuilder<TModel>>;\n\n/**\n * A builder class that provides form layout capabilities (fields, rows, groups).\n * This can be used as a delegate to avoid code duplication between FormModalBuilder and StepBuilder.\n */\nexport class FormLayoutBuilder<TModel = unknown, TParent = unknown> {\n private currentRow: FormRowField<TModel>[] = [];\n private currentRowColumns = 1;\n\n constructor(\n private readonly config: FormContainerConfig<TModel>,\n private parent: TParent\n ) {\n this.config.fields = this.config.fields || [];\n this.config.rows = this.config.rows || [];\n }\n\n /**\n * Add a custom body/content to the form/step.\n */\n body(body: StepBodyConfig): TParent {\n this.config.body = body;\n return this.parent;\n }\n\n /**\n * Add a field as a full-width row (single column).\n */\n field(field: FormFieldConfig<TModel>): TParent {\n this.flushCurrentRow();\n this.config.fields = this.config.fields || [];\n this.config.fields.push(field);\n this.config.rows = this.config.rows || [];\n this.config.rows.push({\n columns: 1,\n fields: [{ field, span: 1 }],\n });\n return this.parent;\n }\n\n /**\n * Start a new row with the specified number of columns.\n * All subsequent `addToRow()` calls will add fields to this row.\n */\n row(columns = 2): TParent {\n this.flushCurrentRow();\n this.currentRowColumns = columns;\n return this.parent;\n }\n\n /**\n * Add a field to the current row started by `row()`.\n * @param field - The field configuration\n * @param span - How many columns this field should span (default: 1)\n */\n addToRow(field: FormFieldConfig<TModel>, span = 1): TParent {\n this.config.fields = this.config.fields || [];\n this.config.fields.push(field);\n this.currentRow.push({ field, span });\n return this.parent;\n }\n\n /**\n * Declarative way to add a row.\n * @example\n * .addRow(2, row => {\n * row.add({ kind: FieldKind.TEXT, key: 'first', ... });\n * row.add({ kind: FieldKind.TEXT, key: 'last', ... });\n * })\n */\n addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): TParent {\n this.flushCurrentRow();\n const rowFields: FormRowField<TModel>[] = [];\n buildFn({\n add: (field: FormFieldConfig<TModel>, span = 1) => {\n this.config.fields = this.config.fields || [];\n this.config.fields.push(field);\n rowFields.push({ field, span });\n },\n });\n\n if (rowFields.length > 0) {\n this.config.rows = this.config.rows || [];\n this.config.rows.push({\n columns,\n fields: rowFields,\n });\n }\n return this.parent;\n }\n\n /**\n * Add a field group with a section header.\n */\n fieldGroup(group: FormFieldGroup<TModel>): TParent;\n /**\n * Add a field group using a functional builder.\n */\n fieldGroup(\n title: string,\n buildFn: (group: ChainableGroupBuilder<TModel>) => void\n ): TParent;\n /**\n * Add a field group with title, description, and a functional builder.\n */\n fieldGroup(\n title: string,\n description: string,\n buildFn: (group: ChainableGroupBuilder<TModel>) => void\n ): TParent;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: ChainableGroupBuilder<TModel>) => void),\n arg3?: (group: ChainableGroupBuilder<TModel>) => void\n ): TParent {\n this.flushCurrentRow();\n\n if (typeof arg1 !== 'string') {\n const group = arg1;\n this.processFieldGroup(group);\n return this.parent;\n }\n\n const title = arg1;\n let description: string | undefined;\n let buildFn: (group: ChainableGroupBuilder<TModel>) => void;\n\n if (typeof arg2 === 'string') {\n description = arg2;\n buildFn = arg3!;\n } else {\n buildFn = arg2!;\n }\n\n const groupConfig: FormContainerConfig<TModel> = {\n fields: [],\n rows: [],\n };\n const groupBuilder = new FormLayoutBuilder<TModel, ChainableGroupBuilder<TModel>>(\n groupConfig,\n null as unknown as ChainableGroupBuilder<TModel>\n );\n (groupBuilder as ChainableGroupBuilder<TModel>).parent = groupBuilder as ChainableGroupBuilder<TModel>;\n buildFn(groupBuilder as ChainableGroupBuilder<TModel>);\n groupBuilder.flushCurrentRow();\n\n const group: FormFieldGroup<TModel> = {\n title,\n description,\n fields: groupConfig.fields || [],\n rows: groupConfig.rows || [],\n };\n\n this.processFieldGroup(group);\n return this.parent;\n }\n\n private processFieldGroup(group: FormFieldGroup<TModel>): void {\n if (!this.config.fieldGroups) {\n this.config.fieldGroups = [];\n }\n\n // Also add group fields to the flat fields array for form control creation\n this.config.fields = this.config.fields || [];\n const fields = this.config.fields;\n group.fields.forEach((f) => fields.push(f));\n\n // Build rows for the group if not provided\n if (!group.rows || group.rows.length === 0) {\n group.rows = group.fields.map((f) => ({\n columns: 1,\n fields: [{ field: f, span: 1 }],\n }));\n }\n\n this.config.fieldGroups.push(group);\n }\n\n /**\n * Add form-level validators for cross-field validation.\n */\n formValidators(validators: FormValidator<TModel>[]): TParent {\n this.config.formValidators = validators;\n return this.parent;\n }\n\n /**\n * Add Angular FormGroup-level validators.\n */\n groupValidators(validators: ValidatorFn[]): TParent {\n this.config.groupValidators = validators;\n return this.parent;\n }\n\n /**\n * Set initial value for fields.\n */\n initialValue(value: Partial<TModel>): TParent {\n this.config.initialValue = value;\n return this.parent;\n }\n\n /**\n * Set the field to be focused when the form initializes.\n */\n focus(key: keyof TModel): TParent {\n this.config.fields?.forEach(f => {\n (f as WithAutoFocus).autoFocus = false;\n });\n this.config.fieldGroups?.forEach(g => {\n g.fields.forEach(f => {\n (f as WithAutoFocus).autoFocus = false;\n });\n });\n\n const field = this.config.fields?.find(f => (f as unknown as { key: keyof TModel }).key === key);\n if (field) {\n (field as WithAutoFocus).autoFocus = true;\n }\n return this.parent;\n }\n\n /**\n * Wraps a field with a fluent API for validation.\n */\n fieldWithValidators(field: FormFieldConfig<TModel>): FieldValidatorBuilder<TModel, TParent> {\n const fieldWithV = field as WithValidators;\n fieldWithV.validators = fieldWithV.validators || [];\n this.field(field);\n return new FieldValidatorBuilder(field, this.parent);\n }\n\n /**\n * Flushes any pending fields in the current row to the configuration.\n */\n flushCurrentRow(): void {\n if (this.currentRow.length > 0) {\n this.config.rows!.push({\n columns: this.currentRowColumns,\n fields: [...this.currentRow],\n });\n this.currentRow = [];\n this.currentRowColumns = 1;\n }\n }\n}\n\n/**\n * A builder for adding validation rules to a field fluently.\n */\nexport class FieldValidatorBuilder<TModel = unknown, TParent = unknown> {\n constructor(\n private field: FormFieldConfig<TModel>,\n private parent: TParent\n ) {\n (this.field as WithValidators).validators = (this.field as WithValidators).validators || [];\n }\n\n required(_message?: string): this {\n (this.field as WithValidators).validators!.push(Validators.required);\n return this;\n }\n\n minLength(length: number): this {\n (this.field as WithValidators).validators!.push(Validators.minLength(length));\n return this;\n }\n\n maxLength(length: number): this {\n (this.field as WithValidators).validators!.push(Validators.maxLength(length));\n return this;\n }\n\n pattern(pattern: string | RegExp): this {\n (this.field as WithValidators).validators!.push(Validators.pattern(pattern));\n return this;\n }\n\n email(): this {\n (this.field as WithValidators).validators!.push(Validators.email);\n return this;\n }\n\n min(value: number): this {\n (this.field as WithValidators).validators!.push(Validators.min(value));\n return this;\n }\n\n max(value: number): this {\n (this.field as WithValidators).validators!.push(Validators.max(value));\n return this;\n }\n\n /**\n * Add a custom validator.\n */\n custom(validator: ValidatorFn): this {\n (this.field as WithValidators).validators!.push(validator);\n return this;\n }\n\n /**\n * Return to the parent builder.\n */\n done(): TParent {\n return this.parent;\n }\n}\n","import {\n WizardStepConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormValidator,\n StepBodyConfig,\n StepState,\n StepGuard,\n StepValidator,\n ModalStepId,\n} from '../mn-modal.types';\nimport {FormLayoutBuilder, ChainableGroupBuilder} from './form-layout.builder';\nimport {ValidatorFn} from '@angular/forms';\n\nexport class StepBuilder<TModel = unknown> {\n private config: WizardStepConfig<TModel>;\n private layoutBuilder: FormLayoutBuilder<TModel, this>;\n\n constructor(id: string, title: string) {\n this.config = {\n id,\n title,\n fields: [],\n state: StepState.PENDING,\n };\n this.layoutBuilder = new FormLayoutBuilder(this.config, this);\n }\n\n body(body: StepBodyConfig): this {\n this.config.body = body;\n return this;\n }\n\n state(state: StepState): this {\n this.config.state = state;\n return this;\n }\n\n guard(guard: StepGuard): this {\n this.config.guard = guard;\n return this;\n }\n\n validators(validators: StepValidator[]): this {\n this.config.validators = validators;\n return this;\n }\n\n field(field: FormFieldConfig<TModel>): this {\n return this.layoutBuilder.field(field);\n }\n\n row(columns = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n addToRow(field: FormFieldConfig<TModel>, span = 1): this {\n return this.layoutBuilder.addToRow(field, span);\n }\n\n addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): this {\n return this.layoutBuilder.addRow(columns, buildFn);\n }\n\n fieldGroup(group: FormFieldGroup<TModel>): this;\n fieldGroup(title: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(title: string, description: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: ChainableGroupBuilder<TModel>) => void),\n arg3?: (group: ChainableGroupBuilder<TModel>) => void\n ): this {\n if (typeof arg1 !== 'string') {\n return this.layoutBuilder.fieldGroup(arg1);\n }\n if (typeof arg2 === 'string') {\n return this.layoutBuilder.fieldGroup(arg1, arg2, arg3!);\n }\n return this.layoutBuilder.fieldGroup(arg1, arg2!);\n }\n\n formValidators(validators: FormValidator<TModel>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n initialValue(value: Partial<TModel>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n visible(\n condition: (aggregatedData: Record<ModalStepId, Record<string, unknown>>) => boolean\n ): this {\n this.config.visible = condition;\n return this;\n }\n\n nextLabel(label: string): this {\n this.config.nextLabel = label;\n return this;\n }\n\n backLabel(label: string): this {\n this.config.backLabel = label;\n return this;\n }\n\n hideBack(hide = true): this {\n this.config.hideBack = hide;\n return this;\n }\n\n build(): WizardStepConfig<TModel> {\n this.layoutBuilder.flushCurrentRow();\n return this.config;\n }\n}\n","import {\n ChainableGroupBuilder,\n FieldValidatorBuilder,\n FormContainerConfig,\n FormLayoutBuilder\n} from './form-layout.builder';\nimport {\n AnimationOptions,\n BackdropMode,\n BaseModalConfig,\n CloseMode,\n FormFieldConfig,\n FormFieldGroup,\n KeyboardMode,\n ModalCancelHandler,\n ModalFooterAction,\n ModalI18nLabels,\n ModalInputMap,\n ModalIntent,\n ModalPollingConfig,\n ModalSize,\n StepBodyConfig,\n TemplateRef,\n Type,\n} from '../mn-modal.types';\nimport {ValidatorFn} from '@angular/forms';\n\nexport abstract class BaseModalBuilder<TConfig extends BaseModalConfig<TResult> & FormContainerConfig<TModel>, TResult = unknown, TModel = unknown> {\n protected config: TConfig;\n protected layoutBuilder: FormLayoutBuilder<TModel, this>;\n\n protected constructor(initialConfig: TConfig) {\n this.config = initialConfig;\n this.layoutBuilder = new FormLayoutBuilder<TModel, this>(\n this.config,\n this\n );\n }\n\n title(title: string): this {\n this.config.title = title;\n return this;\n }\n\n subtitle(subtitle: string): this {\n this.config.subtitle = subtitle;\n return this;\n }\n\n description(description: string): this {\n this.config.description = description;\n return this;\n }\n\n closeGuard(guard: () => Promise<boolean> | boolean): this {\n this.config.closeGuard = guard;\n return this;\n }\n\n /** Set the width of the modal */\n sizeWidth(size: ModalSize): this {\n this.config.sizeWidth = size;\n return this;\n }\n\n /** Set the height of the modal */\n sizeHeight(size: ModalSize): this {\n this.config.sizeHeight = size;\n return this;\n }\n\n closeMode(mode: CloseMode): this {\n this.config.closeMode = mode;\n return this;\n }\n\n backdrop(mode: BackdropMode): this {\n this.config.backdrop = mode;\n return this;\n }\n\n keyboard(mode: KeyboardMode): this {\n this.config.keyboard = mode;\n return this;\n }\n\n intent(intent: ModalIntent): this {\n this.config.intent = intent;\n return this;\n }\n\n readOnly(readOnly = true): this {\n this.config.readOnly = readOnly;\n return this;\n }\n\n disabled(disabled = true): this {\n this.config.disabled = disabled;\n return this;\n }\n\n footerActions(actions: ModalFooterAction<TResult>[]): this {\n this.config.footerActions = actions;\n return this;\n }\n\n polling(config: ModalPollingConfig<TResult>): this {\n this.config.polling = config;\n return this;\n }\n\n onCancel(handler: ModalCancelHandler<TResult>): this {\n this.config.onCancel = handler;\n return this;\n }\n\n i18n(labels: ModalI18nLabels): this {\n this.config.i18n = labels;\n return this;\n }\n\n component(component: Type<unknown>): this {\n this.config.component = component;\n return this;\n }\n\n template(template: TemplateRef<unknown>): this {\n this.config.template = template;\n return this;\n }\n\n inputs(inputs: ModalInputMap): this {\n this.config.inputs = inputs;\n return this;\n }\n\n animation(animation: AnimationOptions | AnimationOptions['type']): this {\n this.config.animation = animation;\n return this;\n }\n\n /**\n * Control whether the modal renders as a bottom sheet on small screens (< 640px).\n * Enabled by default; pass `false` to keep a centered dialog on mobile.\n */\n mobileBottomSheet(enabled = true): this {\n this.config.mobileBottomSheet = enabled;\n return this;\n }\n\n /**\n * Add a custom body/content to the modal.\n */\n body(body: StepBodyConfig): this {\n return this.layoutBuilder.body(body);\n }\n\n /**\n * Add a field.\n */\n field(field: FormFieldConfig<TModel>): this {\n return this.layoutBuilder.field(field);\n }\n\n /**\n * Add a field with a fluent validation builder.\n */\n fieldWithValidators(field: FormFieldConfig<TModel>): FieldValidatorBuilder<TModel, this> {\n return this.layoutBuilder.fieldWithValidators(field);\n }\n\n /**\n * Start a new row.\n */\n row(columns = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n /**\n * Add a field to the current row.\n */\n addToRow(field: FormFieldConfig<TModel>, span = 1): this {\n return this.layoutBuilder.addToRow(field, span);\n }\n\n /**\n * Declarative way to add a row.\n */\n addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): this {\n return this.layoutBuilder.addRow(columns, buildFn);\n }\n\n /**\n * Add a field group.\n */\n fieldGroup(group: FormFieldGroup<TModel>): this;\n fieldGroup(title: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(title: string, description: string, buildFn: (group: ChainableGroupBuilder<TModel>) => void): this;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: ChainableGroupBuilder<TModel>) => void),\n arg3?: (group: ChainableGroupBuilder<TModel>) => void\n ): this {\n if (typeof arg1 !== 'string') {\n return this.layoutBuilder.fieldGroup(arg1);\n }\n if (typeof arg2 === 'string') {\n return this.layoutBuilder.fieldGroup(arg1, arg2, arg3!);\n }\n return this.layoutBuilder.fieldGroup(arg1, arg2!);\n }\n\n groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n build(): Readonly<TConfig> {\n this.layoutBuilder.flushCurrentRow();\n return Object.freeze({ ...this.config });\n }\n}\n","import {BaseModalBuilder} from './base-modal.builder';\nimport {StepBuilder} from './step.builder';\nimport {\n ModalKind,\n ModalResultHandler,\n ModalStepId,\n WizardBeforeCompleteValidator,\n WizardFlowMode,\n WizardModalConfig,\n WizardResult,\n WizardStepChangeHandler,\n WizardStepConfig,\n} from '../mn-modal.types';\n\nexport class WizardModalBuilder<TResult = WizardResult> extends BaseModalBuilder<\n WizardModalConfig<TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.WIZARD,\n steps: [],\n } as unknown as WizardModalConfig<TResult>);\n }\n\n /**\n * Set initial values for the entire wizard.\n * Note: This will be merged with individual step initial values.\n */\n initialValue(value: Partial<TResult>): this {\n this.config.initialValue = value;\n return this;\n }\n\n /**\n * Description is not supported for wizard modals.\n * Use step-level body text instead.\n */\n override description(_description: string): this {\n return this;\n }\n\n step<TStepModel = unknown>(\n step: WizardStepConfig<TStepModel> | ((builder: StepBuilder<TStepModel>) => void)\n ): this {\n if (typeof step === 'function') {\n const builder = new StepBuilder<TStepModel>('', '');\n step(builder);\n const builtStep = builder.build();\n this.config.steps.push(builtStep as unknown as WizardStepConfig<unknown>);\n } else {\n this.config.steps.push(step as unknown as WizardStepConfig<unknown>);\n }\n return this;\n }\n\n addStep<TStepModel = unknown>(\n title: string,\n buildFn: (builder: StepBuilder<TStepModel>) => void,\n id?: ModalStepId\n ): this {\n const stepId = id || `step-${this.config.steps.length}`;\n const builder = new StepBuilder<TStepModel>(stepId, title);\n buildFn(builder);\n const builtStep = builder.build();\n this.config.steps.push(builtStep as unknown as WizardStepConfig<unknown>);\n return this;\n }\n\n startAt(stepId: ModalStepId): this {\n this.config.startStepId = stepId;\n return this;\n }\n\n flow(mode: WizardFlowMode): this {\n this.config.flow = mode;\n return this;\n }\n\n onStepChange(handler: WizardStepChangeHandler): this {\n this.config.onStepChange = handler;\n return this;\n }\n\n onComplete(handler: ModalResultHandler<TResult>): this {\n this.config.onComplete = handler;\n return this;\n }\n\n onBeforeComplete(validators: WizardBeforeCompleteValidator<TResult>[]): this {\n this.config.onBeforeComplete = validators;\n return this;\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport {\n FormModalConfig,\n ModalKind,\n FormFieldConfig,\n FormLayoutMode,\n SubmitMode,\n ModalResultHandler,\n FormValidator,\n MultiSelectTableFieldConfig,\n SingleSelectTableFieldConfig,\n} from '../mn-modal.types';\nimport {ValidatorFn} from '@angular/forms';\n\nexport class FormModalBuilder<TModel = unknown, TResult = TModel> extends BaseModalBuilder<\n FormModalConfig<TModel, TResult>,\n TResult,\n TModel\n> {\n constructor() {\n super({\n kind: ModalKind.FORM,\n fields: [],\n rows: [],\n });\n }\n\n /**\n * Override to also accept table field configs with a concrete TRow (BehaviorSubject is invariant,\n * so TableDataSource<TeamMember> is not assignable to TableDataSource<unknown>).\n */\n override field(field: FormFieldConfig<TModel>): this;\n override field<TRow>(field: MultiSelectTableFieldConfig<TModel, TRow> | SingleSelectTableFieldConfig<TModel, TRow>): this;\n override field<TRow = unknown>(\n field: FormFieldConfig<TModel> | MultiSelectTableFieldConfig<TModel, TRow> | SingleSelectTableFieldConfig<TModel, TRow>\n ): this {\n return super.field(field as FormFieldConfig<TModel>);\n }\n\n layout(mode: FormLayoutMode): this {\n this.config.layout = mode;\n return this;\n }\n\n initialValue(value: Partial<TModel>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n submitMode(mode: SubmitMode): this {\n this.config.submitMode = mode;\n return this;\n }\n\n onComplete(handler: ModalResultHandler<TResult>): this {\n this.config.onComplete = handler;\n return this;\n }\n\n formValidators(validators: FormValidator<TModel>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n override groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n override build(): Readonly<FormModalConfig<TModel, TResult>> {\n return super.build();\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport {\n ConfirmationModalConfig,\n ModalKind,\n ConfirmationTone,\n ConfirmationActionConfig,\n CancellationActionConfig,\n FormValidator,\n} from '../mn-modal.types';\nimport {ValidatorFn} from '@angular/forms';\n\nexport class ConfirmationModalBuilder<TResult = boolean> extends BaseModalBuilder<\n ConfirmationModalConfig<TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.CONFIRMATION,\n message: '',\n fields: [],\n rows: [],\n });\n }\n\n message(text: string): this {\n this.config.message = text;\n return this;\n }\n\n tone(tone: ConfirmationTone): this {\n this.config.tone = tone;\n return this;\n }\n\n confirmAction(action: ConfirmationActionConfig<TResult>): this {\n this.config.confirm = action;\n return this;\n }\n\n cancelAction(action: CancellationActionConfig): this {\n this.config.cancel = action;\n return this;\n }\n\n initialValue(value: Partial<unknown>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n formValidators(validators: FormValidator<unknown>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n override groupValidators(validators: ValidatorFn[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n override build(): Readonly<ConfirmationModalConfig<TResult>> {\n return super.build();\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport {\n CustomModalConfig,\n ModalKind,\n ModalResultHandler,\n} from '../mn-modal.types';\n\nexport class CustomModalBuilder<TResult = unknown> extends BaseModalBuilder<\n CustomModalConfig<TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.CUSTOM,\n });\n }\n\n onComplete(handler: ModalResultHandler<TResult>): this {\n this.config.onComplete = handler;\n return this;\n }\n}\n","import { WizardModalBuilder } from './wizard-modal.builder';\nimport { FormModalBuilder } from './form-modal.builder';\nimport { ConfirmationModalBuilder } from './confirmation-modal.builder';\nimport { CustomModalBuilder } from './custom-modal.builder';\nimport {WizardResult} from '../mn-modal.types';\n\nexport class ModalBuilder {\n static wizard<TResult = WizardResult>(): WizardModalBuilder<TResult> {\n return new WizardModalBuilder<TResult>();\n }\n\n static form<TModel = unknown, TResult = TModel>(): FormModalBuilder<TModel, TResult> {\n return new FormModalBuilder<TModel, TResult>();\n }\n\n static confirmation<TResult = boolean>(): ConfirmationModalBuilder<TResult> {\n return new ConfirmationModalBuilder<TResult>();\n }\n\n static custom<TResult = unknown>(): CustomModalBuilder<TResult> {\n return new CustomModalBuilder<TResult>();\n }\n}\n","import { Observable, Subject } from 'rxjs';\nimport {ComponentRef} from '@angular/core';\nimport {\n ModalRef,\n ModalCloseEvent,\n ModalCloseReason,\n BaseModalConfig,\n} from './mn-modal.types';\n\nexport class MnModalRef<TResult = unknown> implements ModalRef<TResult> {\n private readonly closeSubject = new Subject<ModalCloseEvent<TResult>>();\n public readonly afterClosed$: Observable<ModalCloseEvent<TResult>> = this.closeSubject.asObservable();\n\n constructor(\n private componentRef: ComponentRef<unknown>,\n private config: BaseModalConfig<TResult>\n ) {}\n\n close(result?: TResult): void {\n const event: ModalCloseEvent<TResult> = {\n reason: ModalCloseReason.COMPLETED,\n result,\n };\n this.animateAndDestroy(event);\n }\n\n dismiss(reason: ModalCloseReason): void {\n const event: ModalCloseEvent<TResult> = {\n reason,\n };\n this.animateAndDestroy(event);\n }\n\n private async animateAndDestroy(event: ModalCloseEvent<TResult>): Promise<void> {\n const shell = this.componentRef.instance as { startClosing?: () => Promise<void> };\n if (shell && typeof shell.startClosing === 'function') {\n await shell.startClosing();\n }\n this.closeSubject.next(event);\n this.closeSubject.complete();\n this.destroy();\n }\n\n update(config: Partial<BaseModalConfig<TResult>>): void {\n Object.assign(this.config, config);\n // Trigger change detection on the shell component\n this.componentRef.changeDetectorRef.detectChanges();\n }\n\n get component(): unknown {\n return this.componentRef.instance;\n }\n\n private destroy(): void {\n this.componentRef.destroy();\n }\n}\n","import {\n Directive,\n Input,\n ViewContainerRef,\n OnInit,\n OnDestroy,\n ComponentRef,\n Type,\n forwardRef,\n inject\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { ModalInputMap } from '../../mn-modal.types';\n\n@Directive({\n selector: '[mnCustomFieldHost]',\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MnCustomFieldHostDirective),\n multi: true,\n },\n ],\n})\nexport class MnCustomFieldHostDirective implements OnInit, OnDestroy, ControlValueAccessor {\n private vcr = inject(ViewContainerRef);\n\n @Input() component!: Type<unknown>;\n @Input() inputs?: ModalInputMap;\n\n private componentRef?: ComponentRef<unknown>;\n private onChange: (val: unknown) => void = () => {\n };\n private onTouched: () => void = () => {};\n\n ngOnInit(): void {\n if (!this.component) return;\n\n this.vcr.clear();\n this.componentRef = this.vcr.createComponent(this.component);\n\n // Pass inputs to the component\n if (this.inputs) {\n Object.entries(this.inputs).forEach(([key, value]) => {\n (this.componentRef!.instance as Record<string, unknown>)[key] = value;\n });\n }\n\n // Wire up value accessor if the component supports it\n const instance = this.componentRef.instance as {\n registerOnChange?: (fn: (val: unknown) => void) => void;\n registerOnTouched?: (fn: () => void) => void;\n };\n if (typeof instance.registerOnChange === 'function') {\n instance.registerOnChange((val: unknown) => this.onChange(val));\n }\n if (typeof instance.registerOnTouched === 'function') {\n instance.registerOnTouched(() => this.onTouched());\n }\n }\n\n ngOnDestroy(): void {\n this.componentRef?.destroy();\n }\n\n writeValue(val: unknown): void {\n const instance = this.componentRef?.instance as { writeValue?: (val: unknown) => void };\n if (instance && typeof instance.writeValue === 'function') {\n instance.writeValue(val);\n }\n }\n\n registerOnChange(fn: (val: unknown) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n const instance = this.componentRef?.instance as { setDisabledState?: (isDisabled: boolean) => void };\n if (instance && typeof instance.setDisabledState === 'function') {\n instance.setDisabledState(isDisabled);\n }\n }\n}\n","import {TemplateRef} from '@angular/core';\nimport {MnSkeletonProps} from '../mn-skeleton';\nimport {MnCollectionLabels, MnSelectableCollectionDataSource} from '../mn-collection';\n\n// ── Column Sort Type ──\nexport enum ColumnSortType {\n ALPHABETICAL = 'ALPHABETICAL',\n NUMERICAL = 'NUMERICAL',\n DATE = 'DATE',\n NONE = 'NONE',\n}\n\n// ── Sort State ──\nexport type SortState = {\n columnKey: string;\n direction: 'asc' | 'desc';\n}\n\n// ── Appearance ──\nexport type TableAppearance = {\n striped?: boolean;\n hover?: boolean;\n compact?: boolean;\n bordered?: boolean;\n}\n\n// ── Column Filter Type ──\nexport type ColumnFilterType = 'text' | 'select';\n\n// ── Column Filter Option ──\nexport type ColumnFilterOption = {\n label: string;\n value: string;\n}\n\n// ── Column Skeleton ──\n/**\n * Customizes the loading-skeleton placeholder rendered in a column's cells.\n * Either a partial {@link MnSkeletonProps} (shape/width/height/animated) or a\n * `TemplateRef` for a fully custom placeholder. When omitted, a text-shaped\n * skeleton at 75% width is used (matching the previous default).\n */\nexport type ColumnSkeleton = Partial<MnSkeletonProps> | TemplateRef<unknown>;\n\n// ── Column Definition ──\nexport type ColumnDefinition<T> = {\n key: string;\n header: string | TemplateRef<unknown>;\n /** Translation key for the column header. When set, mn-table resolves it via MnLanguageService and keeps it updated on locale change. */\n headerKey?: string;\n cell: ((row: T) => string) | TemplateRef<unknown>;\n /** Alternative cell renderer shown below the given breakpoint. When set, `cell` is hidden below this breakpoint and `cellSm` is shown instead. */\n cellSm?: { below: 'sm' | 'md' | 'lg'; cell: ((row: T) => string) | TemplateRef<unknown> };\n sortType?: ColumnSortType;\n getRawValueToSort?: (row: T) => unknown;\n width?: string;\n align?: 'left' | 'center' | 'right';\n hiddenBelow?: 'sm' | 'md' | 'lg';\n /** Whether this column supports per-column filtering. */\n filterable?: boolean;\n /** Type of filter input: 'text' for free-text, 'select' for dropdown. Defaults to 'text'. */\n filterType?: ColumnFilterType;\n /** Options for 'select' filter type. */\n filterOptions?: ColumnFilterOption[];\n /** Placeholder text for the filter input. */\n filterPlaceholder?: string;\n /** Translation key for the filter placeholder. When set, mn-table resolves it via MnLanguageService. */\n filterPlaceholderKey?: string;\n /** Whether the filter input is disabled. */\n filterDisabled?: boolean;\n /** Autocomplete attribute for the filter input. */\n filterAutocomplete?: string;\n /** Maximum character length for text filter inputs. */\n filterMaxLength?: number;\n /** Custom filter function. Receives the row and the current filter value. */\n filterFn?: (row: T, filterValue: string) => boolean;\n /** Customizes the loading-skeleton placeholder shown in this column's cells while data loads. */\n skeleton?: ColumnSkeleton;\n}\n\n// ── Table Data Source ──\nexport type TableDataSource<T> = MnSelectableCollectionDataSource<T> & {\n columns: ColumnDefinition<T>[];\n\n // Sorting\n defaultSort?: SortState;\n\n // Row interaction\n onRowClick?: (row: T) => void;\n\n // Appearance\n appearance?: TableAppearance;\n\n // Toolbar\n /** Template rendered on the left side of the toolbar (before the search field). */\n toolbarLeftTemplate?: TemplateRef<unknown>;\n /** Template rendered on the right side of the toolbar (after the search field). */\n toolbarRightTemplate?: TemplateRef<unknown>;\n\n // Responsive filters\n /**\n * Label for the toggle button that opens the stacked filter panel on small\n * screens (below 640px). Defaults to \"Filters\".\n */\n filtersLabel?: string;\n /** Translation key for {@link filtersLabel}. Resolved via MnLanguageService. */\n filtersLabelKey?: string;\n /**\n * Label for the action that resets every column filter in the small-screen\n * panel. Defaults to \"Clear all\".\n */\n clearFiltersLabel?: string;\n /** Translation key for {@link clearFiltersLabel}. Resolved via MnLanguageService. */\n clearFiltersLabelKey?: string;\n}\n\n/** @deprecated Use {@link MnCollectionLabels}. */\nexport type TableLabels = MnCollectionLabels;\n","import {tv, type VariantProps} from 'tailwind-variants';\n\nexport const mnSkeletonVariants = tv({\n base: 'bg-base-300 relative overflow-hidden',\n variants: {\n shape: {\n // Each shape carries a sensible default size so a bare <mn-skeleton> stays\n // visible. The width/height inputs are applied as inline styles, which win\n // over these utility classes whenever the consumer supplies dimensions.\n rectangle: 'rounded-md h-4',\n circle: 'rounded-full h-10 w-10',\n text: 'rounded h-4',\n },\n },\n defaultVariants: {\n shape: 'rectangle',\n },\n});\n\nexport type MnSkeletonVariantProps = VariantProps<typeof mnSkeletonVariants>;\n","import {Component, HostBinding, Input} from '@angular/core';\nimport {MnSkeletonProps} from './mn-skeletonTypes';\nimport {mnSkeletonVariants} from './mn-skeletonVariants';\n\n@Component({\n selector: 'mn-skeleton',\n standalone: true,\n templateUrl: './mn-skeleton.html',\n styleUrls: ['./mn-skeleton.css'],\n})\nexport class MnSkeleton {\n @Input() data: Partial<MnSkeletonProps> = {};\n\n // Skeletons are decorative loading placeholders; hide them from assistive tech.\n // The container that swaps skeleton↔content should carry aria-busy / a live region.\n @HostBinding('attr.aria-hidden') readonly ariaHidden = 'true';\n\n @HostBinding('class')\n get hostClasses(): string {\n return mnSkeletonVariants({shape: this.data.shape});\n }\n\n @HostBinding('style.width')\n get width(): string | null {\n return this.data.width ?? null;\n }\n\n @HostBinding('style.height')\n get height(): string | null {\n return this.data.height ?? null;\n }\n\n get isAnimated(): boolean {\n return this.data.animated !== false;\n }\n}\n","@if (isAnimated) {\n <span class=\"mn-skeleton-shimmer-bar\"></span>\n}\n","import {Directive, ElementRef, Input, OnChanges, Renderer2, inject} from '@angular/core';\n\n/**\n * Attribute directive that applies responsive-hiding classes to table cells/headers.\n * Hides the element by default and shows it as `table-cell` at the specified breakpoint.\n *\n * Uses a static class map so Tailwind CSS can detect the full class names at build time.\n *\n * Usage: `<td [mnHiddenBelow]=\"column.hiddenBelow\">`\n */\n@Directive({\n selector: '[mnHiddenBelow]',\n standalone: true,\n})\nexport class MnHiddenBelowDirective implements OnChanges {\n /** The breakpoint below which the element is hidden. */\n @Input() mnHiddenBelow: 'sm' | 'md' | 'lg' | undefined;\n\n private readonly el = inject(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private appliedClasses: string[] = [];\n\n /** Static mapping of breakpoints to their full Tailwind class names. */\n private readonly classMap: Record<string, string[]> = {\n sm: ['hidden', 'sm:table-cell'],\n md: ['hidden', 'md:table-cell'],\n lg: ['hidden', 'lg:table-cell'],\n };\n\n ngOnChanges(): void {\n // Remove previously applied classes\n for (const cls of this.appliedClasses) {\n this.renderer.removeClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = [];\n\n if (this.mnHiddenBelow && this.classMap[this.mnHiddenBelow]) {\n const classes = this.classMap[this.mnHiddenBelow];\n for (const cls of classes) {\n this.renderer.addClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = classes;\n }\n }\n}\n","import {Directive, ElementRef, inject, Input, OnChanges, Renderer2} from '@angular/core';\n\n/**\n * Attribute directive that hides an element below the given breakpoint and shows it at/above.\n * Uses `hidden` + `{bp}:inline` so the element is invisible on small screens.\n *\n * Usage: `<span [mnShowAbove]=\"'sm'\">`\n */\n@Directive({\n selector: '[mnShowAbove]',\n standalone: true,\n})\nexport class MnShowAboveDirective implements OnChanges {\n /** The breakpoint at/above which the element becomes visible. */\n @Input() mnShowAbove: 'sm' | 'md' | 'lg' | undefined;\n\n private readonly el = inject(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private appliedClasses: string[] = [];\n\n /** Static mapping of breakpoints to their full Tailwind class names. */\n private readonly classMap: Record<string, string[]> = {\n sm: ['hidden', 'sm:inline'],\n md: ['hidden', 'md:inline'],\n lg: ['hidden', 'lg:inline'],\n };\n\n ngOnChanges(): void {\n for (const cls of this.appliedClasses) {\n this.renderer.removeClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = [];\n\n if (this.mnShowAbove && this.classMap[this.mnShowAbove]) {\n const classes = this.classMap[this.mnShowAbove];\n for (const cls of classes) {\n this.renderer.addClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = classes;\n }\n }\n}\n","import {Directive, ElementRef, inject, Input, OnChanges, Renderer2} from '@angular/core';\n\n/**\n * Attribute directive that shows an element below the given breakpoint and hides it at/above.\n * Uses `inline` by default + `{bp}:hidden` so the element is only visible on small screens.\n *\n * Usage: `<span [mnShowBelow]=\"'sm'\">`\n */\n@Directive({\n selector: '[mnShowBelow]',\n standalone: true,\n})\nexport class MnShowBelowDirective implements OnChanges {\n /** The breakpoint below which the element is visible. */\n @Input() mnShowBelow: 'sm' | 'md' | 'lg' | undefined;\n\n private readonly el = inject(ElementRef);\n private readonly renderer = inject(Renderer2);\n\n private appliedClasses: string[] = [];\n\n /** Static mapping of breakpoints to their full Tailwind class names. */\n private readonly classMap: Record<string, string[]> = {\n sm: ['inline', 'sm:hidden'],\n md: ['inline', 'md:hidden'],\n lg: ['inline', 'lg:hidden'],\n };\n\n ngOnChanges(): void {\n for (const cls of this.appliedClasses) {\n this.renderer.removeClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = [];\n\n if (this.mnShowBelow && this.classMap[this.mnShowBelow]) {\n const classes = this.classMap[this.mnShowBelow];\n for (const cls of classes) {\n this.renderer.addClass(this.el.nativeElement, cls);\n }\n this.appliedClasses = classes;\n }\n }\n}\n","import {TemplateRef} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\n\n// ── Pagination Strategy ──\nexport type PaginationStrategy = {\n hasMoreRows: boolean;\n loadMore: () => Promise<void>;\n reset?: () => void;\n}\n\nexport type CursorPaginationStrategy = {\n endCursor?: string;\n} & PaginationStrategy\n\nexport type OffsetPaginationStrategy = {\n currentPage: number;\n pageSize: number;\n totalItems?: number;\n} & PaginationStrategy\n\n// ── Data lifecycle state ──\n/**\n * Lifecycle state of a collection's data, driving which chrome the component\n * renders: skeleton placeholders ({@link LOADING}), the rows or empty state\n * ({@link RETRIEVED}), or an error placeholder ({@link ERROR}).\n *\n * Because the components are zoneless and OnPush, a consumer that flips `state`\n * to `ERROR` (or `RETRIEVED`) must also emit on `dataRows` (e.g. `dataRows.next([])`)\n * so the component runs change detection and re-reads the new state.\n */\nexport enum MnCollectionState {\n /** Data is being (re)loaded; skeleton placeholders are shown. */\n LOADING = 'LOADING',\n /** Data has loaded (possibly empty); rows or the empty state are shown. */\n RETRIEVED = 'RETRIEVED',\n /** Loading failed; the error placeholder is shown. */\n ERROR = 'ERROR',\n}\n\n// ── Pagination Mode ──\nexport type PaginationMode =\n | 'none'\n | 'load-more'\n | 'paginated'\n | 'client-side-pagination'\n | 'infinite-scroll';\n\n// ── Shared Labels / i18n ──\nexport type MnCollectionLabels = {\n loadMore?: string;\n /** Translation key for the \"Load more\" button label. */\n loadMoreKey?: string;\n rowsPerPage?: string;\n /** Translation key for the \"Rows per page\" label. */\n rowsPerPageKey?: string;\n}\n\n/**\n * Chrome shared by every MnLib collection component (table, list, grid):\n * data, search, pagination, loading/skeleton, empty state and i18n. Component\n * data sources ({@link import('../mn-table').TableDataSource},\n * {@link import('../mn-list').ListDataSource},\n * {@link import('../mn-grid').GridDataSource}) extend this with their own\n * rendering contract (columns / item template / card template).\n */\nexport type MnCollectionDataSource<T> = {\n dataRows: BehaviorSubject<T[]>;\n getID: (row: T) => string;\n\n emptyMessage: string;\n /** Translation key for the empty message. When set, the component resolves it via MnLanguageService. */\n emptyMessageKey?: string;\n emptyTemplate?: TemplateRef<unknown>;\n\n /**\n * Lifecycle state of the data, controlling loading / error / empty rendering.\n * Defaults to {@link MnCollectionState.RETRIEVED} when not set.\n */\n state?: MnCollectionState;\n /** Number of placeholder rows rendered while data is loading. Defaults to 5. */\n skeletonRowCount?: number;\n\n /** Message shown in the error placeholder when {@link state} is ERROR. */\n errorMessage?: string;\n /** Translation key for {@link errorMessage}; resolved via MnLanguageService. */\n errorMessageKey?: string;\n /** Custom template rendered in place of the default error placeholder. */\n errorTemplate?: TemplateRef<unknown>;\n\n // Search\n canSearch: boolean;\n searchPlaceholder?: string;\n /** Translation key for the search placeholder. When set, the component resolves it via MnLanguageService. */\n searchPlaceholderKey?: string;\n isInSearch?: (row: T, searchValue: string) => boolean;\n searchForAdditionalItems?: (searchValue: string) => Promise<T[]>;\n\n /**\n * Callback invoked when the user types in the search box (server-side search).\n * When provided, the component skips client-side filtering and delegates to the consumer.\n */\n onServerSearch?: (searchValue: string) => void;\n\n // Pagination\n paginationMode?: PaginationMode;\n paginationStrategy?: PaginationStrategy;\n loadAdditionalRows?: () => Promise<T[]>;\n\n /** Number of items per page when paginationMode is 'paginated'. Defaults to 10. */\n pageSize?: number;\n\n /** Options for the page-size selector dropdown. Defaults to [5, 10, 25, 50]. */\n pageSizeOptions?: number[];\n\n /** Callback invoked when the user changes the page size via the dropdown. */\n onPageSizeChange?: (newSize: number) => void;\n\n /**\n * Total number of items on the server.\n * When set, pagination and infinite-scroll use this instead of filteredItems.length.\n */\n totalItems?: number;\n\n /**\n * Callback invoked when the user navigates to a different page.\n * When provided, the component delegates pagination to the consumer (server-side).\n */\n onPageChange?: (page: number) => void;\n\n /**\n * Callback invoked when the user scrolls to the bottom in infinite-scroll mode.\n * When provided, the component delegates loading more rows to the consumer (server-side).\n */\n onLoadMore?: () => void;\n\n // Labels / i18n\n labels?: MnCollectionLabels;\n}\n\n/**\n * Adds row/item selection to {@link MnCollectionDataSource}. Used by components\n * that support selection (table, list); grid intentionally omits it.\n */\nexport type MnSelectableCollectionDataSource<T> = MnCollectionDataSource<T> & {\n selectionMode?: 'none' | 'single' | 'multi';\n selectedRows?: BehaviorSubject<T[]>;\n /** IDs to pre-select when the component initializes. */\n initialSelectedIds?: string[];\n}\n","import {\n afterEveryRender,\n ChangeDetectorRef,\n Directive,\n DoCheck,\n ElementRef,\n inject,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n} from '@angular/core';\nimport {debounceTime, skip, Subject, Subscription} from 'rxjs';\nimport {MnLanguageService} from '../../language';\nimport {MnSelectOption} from '../mn-select';\nimport {MnCollectionDataSource, MnCollectionState} from './mn-collection.types';\n\n/**\n * Shared chrome for MnLib collection components (table, list, grid):\n * data subscription, client/server search, every pagination mode, load-more,\n * skeleton-row count, empty-state plumbing, common i18n key resolution and\n * toolbar change-detection.\n *\n * Concrete components extend this (or {@link MnSelectableCollectionBase}) and\n * implement only their rendering. The class is decorated `@Directive()` so it can\n * declare `@Input`s and use `inject()` while remaining abstract.\n *\n * Init runs in a fixed order (see {@link ngOnInit}); subclasses hook in via the\n * `protected` template methods rather than overriding `ngOnInit`.\n */\n@Directive()\nexport abstract class MnCollectionBase<T, DS extends MnCollectionDataSource<T>>\n implements OnInit, OnDestroy, DoCheck {\n @Input() dataSource!: DS;\n\n filteredItems: T[] = [];\n paginatedItems: T[] = [];\n searchValue = '';\n loadingMoreRows = false;\n\n currentPage = 1;\n pageSize = 10;\n\n /**\n * Measured pixel height of the body container, applied as a `min-height` floor\n * while a server reload is in flight so the container can't collapse when the\n * data rows are swapped for skeletons. Released in {@link ngDoCheck} the moment\n * the loading state clears. `0` means no lock.\n */\n lockedMinHeight = 0;\n\n /**\n * Measured pixel height of one full page, applied as a persistent `min-height` floor\n * while paginated so a short page (the last page, or after a row is removed/filtered)\n * can't collapse the body and jump the layout below it. Blank space fills the remaindernpm\n * at the bottom. Captured once a full page is actually on screen; `0` means unmeasured.\n * Distinct from the transient {@link lockedMinHeight} reload lock — both combine in\n * {@link bodyMinHeight} via `Math.max`.\n */\n fullPageHeight = 0;\n\n /** Write-once guard so {@link fullPageHeight} is measured once per pageSize. */\n private pageHeightMeasured = false;\n\n protected readonly cdr = inject(ChangeDetectorRef);\n protected readonly lang = inject(MnLanguageService);\n /** Prefix used in validation error messages, e.g. `MnList`. Overridden by subclasses. */\n protected readonly componentName: string = 'MnCollection';\n private dataSubscription?: Subscription;\n private searchSubject = new Subject<string>();\n private searchSubscription?: Subscription;\n private langSubscription?: Subscription;\n /** Tracks the previous toolbar template reference for change detection. */\n private previousToolbarTemplate?: TemplateRef<unknown>;\n\n constructor() {\n // Measure the body's height once a full page is on screen and cache it as the persistent\n // {@link fullPageHeight} floor. Runs after every render (outside change detection, so\n // writing the bound field can't trigger `ExpressionChangedAfterItHasBeenChecked`); the\n // {@link pageHeightMeasured} guard limits the actual measurement to once per pageSize.\n afterEveryRender(() => {\n if (this.pageHeightMeasured || !this.isPaginated || this.isLoadingState) return;\n if (this.paginatedItems.length !== this.pageSize) return;\n const el = this.collectionBody?.nativeElement;\n if (!el) return;\n this.fullPageHeight = el.offsetHeight;\n this.pageHeightMeasured = true;\n this.cdr.markForCheck();\n });\n }\n\n // ── Data lifecycle state ──\n\n /**\n * Single source of truth for the data lifecycle: the explicit\n * {@link MnCollectionDataSource.state}, defaulting to RETRIEVED when unset.\n * Every internal loading check routes through this.\n */\n get collectionState(): MnCollectionState {\n return this.dataSource.state ?? MnCollectionState.RETRIEVED;\n }\n\n /** Whether the collection is currently loading (skeleton placeholders shown). */\n get isLoadingState(): boolean {\n return this.collectionState === MnCollectionState.LOADING;\n }\n\n /** Whether loading failed (the error placeholder is shown instead of rows/empty). */\n get isErrorState(): boolean {\n return this.collectionState === MnCollectionState.ERROR;\n }\n\n // ── Template-method hooks ──\n\n /** Whether the component delegates search to the consumer (server-side). */\n get isServerSearched(): boolean {\n return !!this.dataSource.onServerSearch;\n }\n\n get isPaginated(): boolean {\n const mode = this.dataSource.paginationMode;\n return mode === 'paginated' || mode === 'client-side-pagination';\n }\n\n /** Whether the component delegates pagination to the consumer (server-side). */\n get isServerPaginated(): boolean {\n const mode = this.dataSource.paginationMode ?? 'load-more';\n return mode === 'paginated' || mode === 'load-more';\n }\n\n get showLoadMore(): boolean {\n const mode = this.dataSource.paginationMode ?? 'load-more';\n // Server-side load-more: check if there are more items to load.\n if (this.dataSource.onLoadMore) {\n const totalItems = this.dataSource.totalItems ?? 0;\n return mode === 'load-more' && this.filteredItems.length < totalItems;\n }\n const strategy = this.dataSource.paginationStrategy;\n const hasMore = strategy ? strategy.hasMoreRows : !!this.dataSource.loadAdditionalRows;\n return mode === 'load-more' && hasMore;\n }\n\n // ── Height stabilization ──\n\n /**\n * The measured full-page {@link fullPageHeight} floor, but only while it should apply:\n * paginated, not loading, with rows present. Keeps a short page from collapsing the body.\n */\n get reservedPageHeight(): number {\n if (this.isPaginated && !this.isLoadingState && this.filteredItems.length > 0) {\n return this.fullPageHeight;\n }\n return 0;\n }\n\n /**\n * `min-height` (px) applied to the body: the larger of the transient reload lock and the\n * persistent full-page floor, so neither can shrink the body below the other. `null` clears it.\n */\n get bodyMinHeight(): number | null {\n return Math.max(this.lockedMinHeight, this.reservedPageHeight) || null;\n }\n\n // ── Lifecycle ──\n\n /** Total number of items, accounting for server-side pagination. */\n get totalItemCount(): number {\n if (this.isServerPaginated && this.dataSource.totalItems != null) {\n return this.dataSource.totalItems;\n }\n return this.filteredItems.length;\n }\n\n get totalPages(): number {\n return Math.max(1, Math.ceil(this.totalItemCount / this.pageSize));\n }\n\n get resolvedPageSizeOptions(): number[] {\n return this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n }\n\n // ── Search ──\n\n /** Page-size options formatted for mn-select. */\n get pageSizeSelectOptions(): MnSelectOption<number>[] {\n return this.resolvedPageSizeOptions.map(opt => ({label: String(opt), value: opt}));\n }\n\n get visiblePages(): number[] {\n const total = this.totalPages;\n const current = this.currentPage;\n const maxVisible = 3;\n let start = Math.max(1, current - Math.floor(maxVisible / 2));\n let end = start + maxVisible - 1;\n if (end > total) {\n end = total;\n start = Math.max(1, end - maxVisible + 1);\n }\n const pages: number[] = [];\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n return pages;\n }\n\n // ── Pagination ──\n /**\n * Body container wrapping the skeleton/data swap region, used to measure its\n * height for {@link lockBodyHeight}. Implemented by each component with a\n * `@ViewChild('collectionBody')` so the template reference resolves there.\n */\n protected abstract collectionBody?: ElementRef<HTMLElement>;\n\n /** The toolbar template whose identity is watched in change detection. */\n protected abstract get trackedToolbarTemplate(): TemplateRef<unknown> | undefined;\n\n get skeletonRows(): number[] {\n // Explicit override wins; otherwise match the rows currently on screen so the\n // skeleton fills the same space on a reload; fall back to 5 on the first load.\n const count = this.dataSource.skeletonRowCount ?? (this.paginatedItems.length || 5);\n return Array.from({length: count});\n }\n\n ngOnInit(): void {\n this.validateDataSource();\n this.resolveTranslationKeys();\n this.pageSize = this.dataSource.pageSize ?? 10;\n this.beforeInitialFilter();\n\n this.applyFilter(false);\n\n // Skip the initial BehaviorSubject emission (already handled above).\n this.dataSubscription = this.dataSource.dataRows.pipe(skip(1)).subscribe(() => {\n this.applyFilter(false);\n this.cdr.markForCheck();\n });\n\n this.searchSubscription = this.searchSubject\n .pipe(debounceTime(300))\n .subscribe(value => {\n this.searchValue = value;\n this.applyFilter(true);\n this.cdr.markForCheck();\n });\n\n // Re-resolve translation keys whenever the locale changes.\n this.langSubscription = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.resolveTranslationKeys();\n this.cdr.markForCheck();\n });\n }\n\n ngDoCheck(): void {\n // Release the height lock as soon as loading ends — same CD cycle that clears\n // the skeleton, so the lock can never outlive the skeleton it protects.\n if (this.lockedMinHeight && !this.isLoadingState) {\n this.lockedMinHeight = 0;\n }\n const currentTemplate = this.trackedToolbarTemplate;\n if (currentTemplate !== this.previousToolbarTemplate) {\n this.previousToolbarTemplate = currentTemplate;\n this.cdr.markForCheck();\n }\n }\n\n ngOnDestroy(): void {\n this.dataSubscription?.unsubscribe();\n this.searchSubscription?.unsubscribe();\n this.langSubscription?.unsubscribe();\n }\n\n onSearch(searchString: string): void {\n this.currentPage = 1;\n if (this.isServerSearched) {\n this.lockBodyHeight();\n this.searchValue = searchString;\n this.dataSource.onServerSearch?.(searchString);\n this.cdr.markForCheck();\n } else {\n this.searchSubject.next(searchString);\n }\n }\n\n goToPage(page: number): void {\n if (page < 1 || page > this.totalPages) return;\n this.currentPage = page;\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else {\n this.lockBodyHeight();\n this.dataSource.onPageChange?.(page);\n }\n this.cdr.markForCheck();\n }\n\n onPageSizeChange(newSize: number): void {\n this.invalidatePageHeight();\n this.pageSize = newSize;\n this.currentPage = 1;\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else {\n this.lockBodyHeight();\n this.dataSource.onPageSizeChange?.(newSize);\n }\n this.cdr.markForCheck();\n }\n\n loadMoreRows(): void {\n // Server-side infinite scroll: delegate to consumer callback.\n if (this.dataSource.onLoadMore) {\n this.dataSource.onLoadMore();\n return;\n }\n\n if (!this.dataSource.loadAdditionalRows || this.loadingMoreRows) return;\n\n this.loadingMoreRows = true;\n const promise = (this.searchValue && this.searchValue.length > 0 && this.dataSource.searchForAdditionalItems)\n ? this.dataSource.searchForAdditionalItems(this.searchValue)\n : this.dataSource.loadAdditionalRows();\n\n promise\n .then(rows => this.processLoadedRows(rows))\n .catch(() => this.loadingMoreRows = false);\n }\n\n isTemplateRef(value: unknown): value is TemplateRef<unknown> {\n return value instanceof TemplateRef;\n }\n\n trackByID = (_index: number, item: T): string => {\n return this.dataSource.getID(item);\n };\n\n // ── Skeleton ──\n\n /** Applies search/sort/filtering and pagination to the current rows. */\n protected abstract applyFilter(searchForItems: boolean): void;\n\n // ── Template helpers ──\n\n /** Runs after pageSize is set but before the first {@link applyFilter}. */\n protected beforeInitialFilter(): void {\n // no-op by default\n }\n\n /**\n * Resolves translation keys to display strings via {@link MnLanguageService}.\n * Subclasses override to resolve their own keys; call `super` to keep these.\n */\n protected resolveTranslationKeys(): void {\n if (this.dataSource.emptyMessageKey) {\n this.dataSource.emptyMessage = this.lang.t(this.dataSource.emptyMessageKey);\n }\n if (this.dataSource.errorMessageKey) {\n this.dataSource.errorMessage = this.lang.t(this.dataSource.errorMessageKey);\n }\n if (this.dataSource.searchPlaceholderKey) {\n this.dataSource.searchPlaceholder = this.lang.t(this.dataSource.searchPlaceholderKey);\n }\n if (this.dataSource.labels) {\n if (this.dataSource.labels.loadMoreKey) {\n this.dataSource.labels.loadMore = this.lang.t(this.dataSource.labels.loadMoreKey);\n }\n if (this.dataSource.labels.rowsPerPageKey) {\n this.dataSource.labels.rowsPerPage = this.lang.t(this.dataSource.labels.rowsPerPageKey);\n }\n }\n }\n\n // ── Shared internals ──\n\n /**\n * Captures the body container's current height into {@link lockedMinHeight} so it\n * holds while a server reload swaps the data rows for skeletons. Must be called\n * while the old rows are still rendered (before delegating to the consumer), and\n * only locks when rows are present — the first load has nothing to preserve.\n */\n protected lockBodyHeight(): void {\n const el = this.collectionBody?.nativeElement;\n if (el && this.paginatedItems.length > 0) {\n this.lockedMinHeight = el.offsetHeight;\n }\n }\n\n /**\n * Drops the cached {@link fullPageHeight} floor so it is re-measured on the next full page.\n * Must run whenever the page size changes (the old floor is for a different row count).\n */\n protected invalidatePageHeight(): void {\n this.fullPageHeight = 0;\n this.pageHeightMeasured = false;\n }\n\n protected applyPagination(): void {\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n const start = (this.currentPage - 1) * this.pageSize;\n this.paginatedItems = this.filteredItems.slice(start, start + this.pageSize);\n } else {\n // Server always provides the correct page/slice — no client-side slicing.\n this.paginatedItems = this.filteredItems;\n }\n }\n\n /** Client-side search filtering shared by list and grid. */\n protected applySearchFilter(items: T[]): T[] {\n if (!this.isServerSearched && this.dataSource.isInSearch && this.dataSource.canSearch && this.searchValue && this.searchValue.length > 0) {\n const term = this.searchValue.toLowerCase();\n return items.filter(row => this.dataSource.isInSearch!(row, term));\n }\n return items;\n }\n\n protected processLoadedRows(rows: T[]): void {\n const merged = [...new Map(\n [...this.dataSource.dataRows.value, ...rows].map(item => [this.dataSource.getID(item), item])\n ).values()];\n this.dataSource.dataRows.next(merged);\n this.loadingMoreRows = false;\n this.applyFilter(false);\n }\n\n protected validateDataSource(): void {\n const mode = this.dataSource.paginationMode;\n if (mode === 'paginated') {\n if (!this.dataSource.onPageChange) {\n throw new Error(`[${this.componentName}] paginationMode is 'paginated' but 'onPageChange' callback is missing. Server-side pagination requires 'onPageChange'.`);\n }\n if (this.dataSource.totalItems == null) {\n throw new Error(`[${this.componentName}] paginationMode is 'paginated' but 'totalItems' is missing. Server-side pagination requires 'totalItems'.`);\n }\n }\n if (mode === 'load-more' || mode === 'infinite-scroll') {\n if (!this.dataSource.onLoadMore && !this.dataSource.loadAdditionalRows && !this.dataSource.paginationStrategy) {\n throw new Error(`[${this.componentName}] paginationMode is '${mode}' but no load-more mechanism is provided. Provide 'onLoadMore', 'loadAdditionalRows', or 'paginationStrategy'.`);\n }\n }\n // Validate pageSize is one of pageSizeOptions when pagination is active\n if (mode && mode !== 'none') {\n const options = this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n const size = this.dataSource.pageSize ?? 10;\n if (!options.includes(size)) {\n throw new Error(`[${this.componentName}] pageSize '${size}' is not one of the allowed pageSizeOptions [${options.join(', ')}]. pageSize must be one of pageSizeOptions.`);\n }\n }\n }\n}\n","import {Directive, EventEmitter, Output} from '@angular/core';\nimport {MnCollectionBase} from './mn-collection-base.directive';\nimport {MnSelectableCollectionDataSource} from './mn-collection.types';\n\n/**\n * Extends {@link MnCollectionBase} with single/multi row selection, shared by\n * components that support it (table, list). Grid extends the plain base instead.\n */\n@Directive()\nexport abstract class MnSelectableCollectionBase<\n T,\n DS extends MnSelectableCollectionDataSource<T>,\n> extends MnCollectionBase<T, DS> {\n @Output() selectionChange = new EventEmitter<T[]>();\n\n selectedIds = new Set<string>();\n\n get allSelected(): boolean {\n return this.filteredItems.length > 0 && this.selectedIds.size === this.filteredItems.length;\n }\n\n get hasSelection(): boolean {\n return (this.dataSource.selectionMode ?? 'none') !== 'none';\n }\n\n get isMultiSelect(): boolean {\n return this.dataSource.selectionMode === 'multi';\n }\n\n isSelected(item: T): boolean {\n return this.selectedIds.has(this.dataSource.getID(item));\n }\n\n toggle(item: T): void {\n const id = this.dataSource.getID(item);\n const mode = this.dataSource.selectionMode ?? 'none';\n\n if (mode === 'single') {\n this.selectedIds.clear();\n this.selectedIds.add(id);\n } else if (mode === 'multi') {\n if (this.selectedIds.has(id)) {\n this.selectedIds.delete(id);\n } else {\n this.selectedIds.add(id);\n }\n }\n\n this.emitSelection();\n }\n\n toggleAll(): void {\n if (this.selectedIds.size === this.filteredItems.length) {\n this.selectedIds.clear();\n } else {\n this.filteredItems.forEach(item => this.selectedIds.add(this.dataSource.getID(item)));\n }\n this.emitSelection();\n }\n\n /** Seeds selection from `initialSelectedIds` before the first filter pass. */\n protected override beforeInitialFilter(): void {\n super.beforeInitialFilter();\n if (this.dataSource.initialSelectedIds?.length) {\n for (const id of this.dataSource.initialSelectedIds) {\n this.selectedIds.add(id);\n }\n this.emitSelection();\n }\n }\n\n protected emitSelection(): void {\n const rows = (this.dataSource.dataRows.value ?? []).filter(r => this.selectedIds.has(this.dataSource.getID(r)));\n this.dataSource.selectedRows?.next(rows);\n this.selectionChange.emit(rows);\n }\n}\n","import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core';\nimport {FormsModule} from '@angular/forms';\nimport {MnButton} from '../mn-button';\nimport {MnSelect, MnSelectOption} from '../mn-select';\nimport {MnCollectionLabels} from './mn-collection.types';\n\n/**\n * Presentational pagination footer shared by every MnLib collection component\n * (table, list, grid): the load-more button, the page-size selector and the\n * page navigator. It holds no state — the host component owns pagination state\n * (via {@link import('./mn-collection-base.directive').MnCollectionBase}) and\n * reacts to the outputs.\n */\n@Component({\n selector: 'mn-collection-pagination',\n standalone: true,\n imports: [MnButton, MnSelect, FormsModule],\n templateUrl: './mn-collection-pagination.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnCollectionPagination {\n /** Prefix for the page-size select's id, keeping it unique per host. */\n @Input() idPrefix = 'mn-collection';\n\n @Input() isPaginated = false;\n @Input() isServerPaginated = false;\n @Input() showLoadMore = false;\n @Input() loadingMoreRows = false;\n\n @Input() currentPage = 1;\n @Input() pageSize = 10;\n @Input() totalPages = 1;\n @Input() totalItemCount = 0;\n @Input() visiblePages: number[] = [];\n @Input() pageSizeSelectOptions: MnSelectOption<number>[] = [];\n @Input() labels?: MnCollectionLabels;\n\n @Output() loadMore = new EventEmitter<void>();\n @Output() pageChange = new EventEmitter<number>();\n @Output() pageSizeChange = new EventEmitter<number>();\n\n get showPagination(): boolean {\n return this.isPaginated && (this.totalPages > 1 || this.isServerPaginated);\n }\n}\n","<!-- Load more button -->\n@if (showLoadMore) {\n <div class=\"flex justify-center py-4\">\n <button\n (click)=\"loadMore.emit()\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'primary' }\"\n [disabled]=\"loadingMoreRows\"\n class=\"px-4 py-1.5 text-sm rounded border border-primary-500 text-primary-500 hover:bg-primary-100 transition-colors disabled:opacity-50\"\n mnButton\n >\n @if (loadingMoreRows) {\n <span\n class=\"inline-block w-3 h-3 border-2 border-primary-500 border-t-transparent rounded-full animate-spin mr-2\"></span>\n }\n {{ labels?.loadMore || 'Load more' }}\n </button>\n </div>\n}\n\n<!-- Pagination controls -->\n@if (showPagination) {\n <div class=\"flex items-center justify-center md:justify-between px-2 py-3 text-sm text-base-content\">\n @if (pageSizeSelectOptions.length > 1) {\n <div class=\"hidden md:flex items-center gap-2\">\n <span>{{ labels?.rowsPerPage || 'Items per page:' }}</span>\n <mn-lib-select\n (ngModelChange)=\"pageSizeChange.emit($event)\"\n [ngModel]=\"pageSize\"\n [props]=\"{\n id: idPrefix + '-page-size',\n options: pageSizeSelectOptions,\n size: 'sm'\n }\"\n ></mn-lib-select>\n </div>\n } @else {\n <div class=\"hidden md:block\"></div>\n }\n\n <div class=\"flex items-center gap-1\">\n <span class=\"text-xs mr-2 hidden md:inline\">{{ (currentPage - 1) * pageSize + 1 }}\n – {{ currentPage * pageSize > totalItemCount ? totalItemCount : currentPage * pageSize }}\n of {{ totalItemCount }}</span>\n\n <button\n (click)=\"pageChange.emit(1)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\n [disabled]=\"currentPage === 1\"\n aria-label=\"First page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >«\n </button>\n\n <button\n (click)=\"pageChange.emit(currentPage - 1)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\n [disabled]=\"currentPage === 1\"\n aria-label=\"Previous page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >‹\n </button>\n\n @for (page of visiblePages; track page) {\n <button\n (click)=\"pageChange.emit(page)\"\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\n [attr.aria-label]=\"'Page ' + page\"\n [data]=\"{ size: 'sm', variant: 'text', color: page === currentPage ? 'primary' : 'gray' }\"\n class=\"px-2.5 py-1 rounded underline underline-offset-2 transition-colors text-xs\"\n mnButton\n >{{ page }}\n </button>\n }\n\n <button\n (click)=\"pageChange.emit(currentPage + 1)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\n [disabled]=\"currentPage === totalPages\"\n aria-label=\"Next page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >›\n </button>\n\n <button\n (click)=\"pageChange.emit(totalPages)\"\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\n [disabled]=\"currentPage === totalPages\"\n aria-label=\"Last page\"\n class=\"px-2 py-1 rounded border border-base-300 hover:bg-base-200 transition-colors disabled:opacity-40 disabled:cursor-not-allowed aspect-square leading-none\"\n mnButton\n >»\n </button>\n </div>\n </div>\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {ColumnDefinition, ColumnSortType, SortState, TableDataSource} from './mn-table.types';\nimport {MnSkeleton, MnSkeletonProps} from '../mn-skeleton';\nimport {MnSelect, MnSelectOption} from '../mn-select';\nimport {MnCheckbox} from '../mn-checkbox';\nimport {MnHiddenBelowDirective} from './mn-hidden-below.directive';\nimport {MnShowAboveDirective} from './mn-show-above.directive';\nimport {MnShowBelowDirective} from './mn-show-below.directive';\nimport {MnInputField} from '../mn-input-field';\nimport {FormsModule} from '@angular/forms';\nimport {MnCollectionPagination, MnSelectableCollectionBase} from '../mn-collection';\nimport {MnButton} from '../mn-button';\nimport {LucideFilter, LucideFunnel, LucideX} from '@lucide/angular';\n\n/** Map of column key to its current filter value. */\nexport type ColumnFilterState = Record<string, string | undefined>;\n\n@Component({\n selector: 'mn-table',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, MnCheckbox, MnHiddenBelowDirective, MnShowAboveDirective, MnShowBelowDirective, MnInputField, MnSelect, MnSkeleton, FormsModule, MnCollectionPagination, MnButton, LucideFilter, LucideX, LucideFunnel],\n templateUrl: './mn-table.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnTable<T = object>\n extends MnSelectableCollectionBase<T, TableDataSource<T>> {\n @Output() sortChange = new EventEmitter<SortState | null>();\n @Output() rowClick = new EventEmitter<T>();\n\n currentSort: SortState | null = null;\n\n /** Per-column filter values keyed by column key. */\n columnFilters: ColumnFilterState = {};\n\n /** Viewport width (px) below which the inline filter row collapses into a panel. */\n private static readonly FILTER_COLLAPSE_WIDTH = 640;\n\n /**\n * True when the viewport is narrow enough that the per-column filter inputs no\n * longer fit under their headers; the inline row is then replaced by a toggle\n * button and a stacked filter panel.\n */\n protected filtersCollapsed = false;\n\n /** Whether the small-screen filter panel is currently expanded. */\n protected filtersPanelOpen = false;\n\n protected override readonly componentName = 'MnTable';\n\n protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined {\n return this.dataSource?.toolbarLeftTemplate;\n }\n\n @ViewChild('collectionBody') protected collectionBody?: ElementRef<HTMLElement>;\n\n /** Updates a column filter value and re-applies filtering. */\n onColumnFilter(columnKey: string, value: string): void {\n this.columnFilters[columnKey] = value;\n this.currentPage = 1;\n this.applyFilter(false);\n this.cdr.markForCheck();\n }\n\n /** Filter options formatted for mn-select for a given column. */\n getFilterSelectOptions(column: ColumnDefinition<T>): MnSelectOption<string>[] {\n const placeholder = column.filterPlaceholder ?? 'All';\n return [\n {label: placeholder, value: ''},\n ...(column.filterOptions ?? []).map(opt => ({label: opt.label, value: String(opt.value)})),\n ];\n }\n\n // ── Column Filters ──\n\n /** Whether any column has filtering enabled. */\n get hasColumnFilters(): boolean {\n return this.dataSource.columns.some(c => c.filterable);\n }\n\n /** Whether at least one column filter is active. */\n get hasActiveFilters(): boolean {\n return this.dataSource.columns.some(col => col.filterable && !!this.columnFilters[col.key]);\n }\n\n /** Label for the small-screen filters toggle button. */\n get filtersButtonLabel(): string {\n return this.dataSource.filtersLabel ?? 'Filters';\n }\n\n /** Label for the \"clear all filters\" action in the small-screen panel. */\n get clearFiltersButtonLabel(): string {\n return this.dataSource.clearFiltersLabel ?? 'Clear all';\n }\n\n /** Opens/closes the stacked filter panel shown on small screens. */\n toggleFiltersPanel(): void {\n this.filtersPanelOpen = !this.filtersPanelOpen;\n }\n\n /** Resets every column filter and re-applies filtering. */\n clearAllFilters(): void {\n for (const col of this.dataSource.columns) {\n if (col.filterable) this.columnFilters[col.key] = '';\n }\n this.currentPage = 1;\n this.applyFilter(false);\n this.cdr.markForCheck();\n }\n\n /** True when the viewport is below the filter-collapse breakpoint. */\n private isFilterViewport(): boolean {\n return typeof window !== 'undefined' && window.innerWidth < MnTable.FILTER_COLLAPSE_WIDTH;\n }\n\n /**\n * Recomputes whether the inline filter row should collapse into the panel.\n * Closes the panel when returning to the wide layout so reopened state never\n * leaks across the breakpoint. Marks for check only when the layout flips.\n */\n private updateFilterLayout(reflow: boolean): void {\n const collapsed = this.isFilterViewport();\n if (collapsed === this.filtersCollapsed) return;\n this.filtersCollapsed = collapsed;\n if (!collapsed) this.filtersPanelOpen = false;\n if (reflow) this.cdr.markForCheck();\n }\n\n sort(column: ColumnDefinition<T>): void {\n if (!column.sortType || column.sortType === ColumnSortType.NONE) return;\n\n if (this.currentSort?.columnKey === column.key) {\n this.currentSort = this.currentSort.direction === 'asc'\n ? {columnKey: column.key, direction: 'desc'}\n : null;\n } else {\n this.currentSort = {columnKey: column.key, direction: 'asc'};\n }\n\n this.sortChange.emit(this.currentSort);\n this.applyFilter(false);\n }\n\n onRowClick(row: T): void {\n if (this.hasSelection) {\n this.toggle(row);\n }\n this.dataSource.onRowClick?.(row);\n this.rowClick.emit(row);\n }\n\n // ── Sorting ──\n\n /**\n * Resolves the skeleton placeholder config for a column's cells.\n * Falls back to a text-shaped bar at 75% width (the previous default); any\n * fields the column provides override that default.\n */\n getColumnSkeletonData(column: ColumnDefinition<T>): Partial<MnSkeletonProps> {\n const skeleton = column.skeleton;\n const overrides = skeleton && !this.isTemplateRef(skeleton) ? skeleton : {};\n return {shape: 'text', width: '75%', ...overrides};\n }\n\n getSortIcon(column: ColumnDefinition<T>): string {\n if (!this.currentSort || this.currentSort.columnKey !== column.key) return '';\n return this.currentSort.direction === 'asc' ? '▲' : '▼';\n }\n\n isSortable(column: ColumnDefinition<T>): boolean {\n return !!column.sortType && column.sortType !== ColumnSortType.NONE;\n }\n\n // ── Row interaction ──\n\n /** Rows shown per page on mobile (< md). Forced regardless of any configured pageSize. */\n private static readonly MOBILE_PAGE_SIZE = 10;\n\n /** Page size to use at/above the `md` breakpoint (consumer's pageSize, or the user's selection). */\n private desktopPageSize = 10;\n\n /** True when the viewport is below the `md` (768px) breakpoint. */\n private isMobileViewport(): boolean {\n return typeof window !== 'undefined' && window.innerWidth < 768;\n }\n\n /**\n * Applies the breakpoint-appropriate page size: {@link MOBILE_PAGE_SIZE} below `md`,\n * the desktop size at/above it. When the size actually changes, client-side tables\n * re-slice locally and server-side tables ask the consumer to refetch, so the\n * rendered rows update in every pagination mode (used at init and on window resize).\n */\n private applyResponsivePageSize(reflow: boolean): void {\n const target = this.isMobileViewport() ? MnTable.MOBILE_PAGE_SIZE : this.desktopPageSize;\n if (target === this.pageSize) return;\n this.invalidatePageHeight();\n this.pageSize = target;\n this.currentPage = 1;\n\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else if (this.isServerPaginated) {\n // Server owns the slice — tell the consumer to refetch with the new size.\n this.dataSource.onPageSizeChange?.(target);\n }\n\n if (reflow) this.cdr.markForCheck();\n }\n\n /** Re-evaluate responsive page size and filter layout when the viewport changes. */\n @HostListener('window:resize')\n protected onWindowResize(): void {\n this.applyResponsivePageSize(true);\n this.updateFilterLayout(true);\n }\n\n /** Tracks the desktop page size when the user picks one (selector only shows at >= md). */\n override onPageSizeChange(newSize: number): void {\n this.desktopPageSize = newSize;\n super.onPageSizeChange(newSize);\n }\n\n /** Sets sort/filter state seeded from the data source before the first filter pass. */\n protected override beforeInitialFilter(): void {\n super.beforeInitialFilter();\n\n // Force the mobile row count below `md`; use the consumer's pageSize (or 10) above it.\n this.desktopPageSize = this.dataSource.pageSize ?? 10;\n this.applyResponsivePageSize(false);\n\n // Seed the filter layout for the initial viewport (no markForCheck pre-render).\n this.updateFilterLayout(false);\n\n this.currentSort = this.dataSource.defaultSort ?? null;\n for (const col of this.dataSource.columns) {\n if (col.filterable) {\n this.columnFilters[col.key] = '';\n }\n }\n }\n\n // ── Template helpers ──\n\n getCellValue(column: ColumnDefinition<T>, row: T): string {\n if (typeof column.cell === 'function') return column.cell(row);\n return '';\n }\n\n /** Returns the small-screen cell value for a column with cellSm defined. */\n getCellSmValue(column: ColumnDefinition<T>, row: T): string {\n if (column.cellSm && typeof column.cellSm.cell === 'function') return column.cellSm.cell(row);\n return '';\n }\n\n trackByKey = (_index: number, column: ColumnDefinition<T>): string => {\n return column.key;\n };\n\n // ── Table CSS classes ──\n\n readonly tableClasses = 'w-full border-collapse overflow-y-hidden';\n\n get totalColumnCount(): number {\n let count = this.dataSource.columns.length;\n if (this.hasSelection) count++;\n return count;\n }\n\n // ── Skeleton ──\n\n /**\n * Resolves table-specific translation keys (column headers/filters) plus the\n * shared keys handled by the base.\n */\n protected override resolveTranslationKeys(): void {\n super.resolveTranslationKeys();\n for (const col of this.dataSource.columns) {\n if (col.headerKey) {\n col.header = this.lang.t(col.headerKey);\n }\n if (col.filterPlaceholderKey) {\n col.filterPlaceholder = this.lang.t(col.filterPlaceholderKey);\n }\n }\n if (this.dataSource.filtersLabelKey) {\n this.dataSource.filtersLabel = this.lang.t(this.dataSource.filtersLabelKey);\n }\n if (this.dataSource.clearFiltersLabelKey) {\n this.dataSource.clearFiltersLabel = this.lang.t(this.dataSource.clearFiltersLabelKey);\n }\n }\n\n // ── Filtering & sorting ──\n\n protected applyFilter(searchForItems: boolean): void {\n let items = this.applySearchFilter(this.dataSource.dataRows.value ?? []);\n\n // Per-column filters\n for (const col of this.dataSource.columns) {\n const filterValue = this.columnFilters[col.key];\n if (!col.filterable || !filterValue) continue;\n\n if (col.filterFn) {\n items = items.filter(row => col.filterFn!(row, filterValue));\n } else {\n const term = filterValue.toLowerCase();\n items = items.filter(row => {\n const cellValue = typeof col.cell === 'function' ? col.cell(row) : '';\n return (cellValue ?? '').toLowerCase().includes(term);\n });\n }\n }\n\n items = this.applySorting(items);\n this.filteredItems = items;\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n\n private applySorting(items: T[]): T[] {\n if (!this.currentSort) return items;\n\n const column = this.dataSource.columns.find(c => c.key === this.currentSort!.columnKey);\n if (!column || !column.sortType || column.sortType === ColumnSortType.NONE) return items;\n\n const getValue = column.getRawValueToSort ?? ((row: T) => {\n if (typeof column.cell === 'function') return column.cell(row);\n return '';\n });\n\n const dir = this.currentSort.direction === 'asc' ? 1 : -1;\n\n return [...items].sort((a, b) => {\n const va = getValue(a);\n const vb = getValue(b);\n\n if (va == null && vb == null) return 0;\n if (va == null) return 1;\n if (vb == null) return -1;\n\n switch (column.sortType) {\n case ColumnSortType.ALPHABETICAL:\n return String(va).localeCompare(String(vb)) * dir;\n case ColumnSortType.NUMERICAL:\n return (Number(va) - Number(vb)) * dir;\n case ColumnSortType.DATE:\n return (new Date(va as string | number).getTime() - new Date(vb as string | number).getTime()) * dir;\n default:\n return 0;\n }\n });\n }\n}\n","<!-- Toolbar: custom toolbar template + search -->\n<div class=\"flex flex-col min-[375px]:flex-row min-[375px]:items-center justify-between gap-2 mb-3\">\n <div class=\"flex items-center gap-2 w-full min-[375px]:w-auto\">\n @if (dataSource.toolbarLeftTemplate) {\n <div class=\"flex flex-col w-full min-[375px]:w-auto min-[375px]:flex-row\">\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarLeftTemplate\"></ng-container>\n </div>\n }\n </div>\n <div class=\"flex flex-col min-[375px]:flex-row min-[375px]:items-center gap-2 w-full min-[375px]:flex-1 min-[480px]:flex-none min-[480px]:w-auto\">\n @if (dataSource.canSearch) {\n <mn-lib-input-field\n class=\"w-full min-[375px]:flex-1 min-[480px]:max-w-64\"\n [props]=\"{\n id: 'mn-table-search',\n type: 'search',\n label: '',\n placeholder: dataSource.searchPlaceholder ?? 'Search...',\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true\n }\"\n [ngModel]=\"searchValue\"\n (ngModelChange)=\"onSearch($event)\"\n ></mn-lib-input-field>\n }\n @if (dataSource.toolbarRightTemplate) {\n <div class=\"flex flex-col w-full min-[375px]:w-auto min-[375px]:flex-row\">\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarRightTemplate\"></ng-container>\n </div>\n }\n <!-- Small-screen filter toggle: replaces the inline per-column filter row below 640px -->\n @if (hasColumnFilters && filtersCollapsed) {\n <button\n type=\"button\"\n mnButton\n [data]=\"{ variant: 'outline', color: 'gray', size: 'md', borderRadius: 'md', hover: true }\"\n class=\"w-full min-[375px]:w-auto gap-1.5\"\n [class.border-primary]=\"hasActiveFilters\"\n [class.text-primary]=\"hasActiveFilters\"\n [attr.aria-expanded]=\"filtersPanelOpen\"\n aria-controls=\"mn-table-filters-panel\"\n (click)=\"toggleFiltersPanel()\"\n >\n <svg lucideFunnel [size]=\"15\"></svg>\n <span>{{ filtersButtonLabel }}</span>\n </button>\n }\n </div>\n</div>\n\n<!-- Small-screen filter panel: stacked, full-width fields decoupled from column widths -->\n@if (hasColumnFilters && filtersCollapsed) {\n <div\n id=\"mn-table-filters-panel\"\n class=\"grid transition-all duration-200 ease-out motion-reduce:transition-none\"\n [style.grid-template-rows]=\"filtersPanelOpen ? '1fr' : '0fr'\"\n >\n <div class=\"overflow-hidden\" [attr.inert]=\"filtersPanelOpen ? null : ''\">\n <div class=\"flex flex-col gap-3 rounded-md border border-base-300 bg-base-100 p-3 mb-3\">\n @for (column of dataSource.columns; track column.key) {\n @if (column.filterable) {\n <div class=\"flex flex-col gap-1\">\n <label\n class=\"text-xs font-medium text-base-content/70\"\n [attr.for]=\"'mn-table-filter-' + column.key\"\n >\n @if (isTemplateRef(column.header)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.header)\"></ng-container>\n } @else {\n {{ column.header }}\n }\n </label>\n @if ((column.filterType ?? 'text') === 'text') {\n <mn-lib-input-field\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n type: 'text',\n label: '',\n placeholder: column.filterPlaceholder ?? '',\n autocomplete: column.filterAutocomplete ?? undefined,\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true,\n hover: true\n }\"\n [ngModel]=\"columnFilters[column.key]\"\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n ></mn-lib-input-field>\n } @else if (column.filterType === 'select') {\n <mn-lib-select\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n [ngModel]=\"columnFilters[column.key] ?? ''\"\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n options: getFilterSelectOptions(column),\n size: 'sm',\n fullWidth: true\n }\"\n ></mn-lib-select>\n }\n </div>\n }\n }\n @if (hasActiveFilters) {\n <button\n type=\"button\"\n mnButton\n [data]=\"{ variant: 'text', color: 'gray', size: 'sm', borderRadius: 'md', hover: true }\"\n class=\"self-start gap-1\"\n (click)=\"clearAllFilters()\"\n >\n <svg lucideX [size]=\"14\"></svg>\n <span>{{ clearFiltersButtonLabel }}</span>\n </button>\n }\n </div>\n </div>\n </div>\n}\n\n<!-- Table wrapper with horizontal scroll -->\n<div #collectionBody [style.min-height.px]=\"bodyMinHeight\" aria-label=\"Data table\" class=\"overflow-x-auto\"\n role=\"region\">\n <table [class]=\"tableClasses\">\n <thead>\n <tr class=\"bg-base-100\">\n <!-- Selection checkbox column header -->\n @if (hasSelection) {\n <th class=\"w-10 text-center text-sm bg-base-200 px-2 py-2\">\n @if (isMultiSelect) {\n <mn-lib-checkbox\n (checkedChange)=\"toggleAll()\"\n [checked]=\"allSelected\"\n [props]=\"{ id: 'mn-table-select-all', size: 'sm' }\"\n ></mn-lib-checkbox>\n }\n </th>\n }\n\n <!-- Data columns -->\n @for (column of dataSource.columns; track column.key) {\n <th\n class=\"text-sm px-2 py-1 md:px-4 md:py-2 whitespace-nowrap\"\n [class.cursor-pointer]=\"isSortable(column)\"\n [class.select-none]=\"isSortable(column)\"\n [class.hover:bg-base-200]=\"isSortable(column)\"\n [class.text-left]=\"(column.align ?? 'left') === 'left'\"\n [class.text-center]=\"column.align === 'center'\"\n [class.text-right]=\"column.align === 'right'\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n [style.width]=\"column.width ?? null\"\n [attr.aria-sort]=\"currentSort?.columnKey === column.key ? (currentSort!.direction === 'asc' ? 'ascending' : 'descending') : null\"\n (click)=\"sort(column)\"\n >\n <span class=\"inline-flex items-center gap-1\">\n @if (isTemplateRef(column.header)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.header)\"></ng-container>\n } @else {\n <span>{{ column.header }}</span>\n }\n @if (isSortable(column)) {\n <span class=\"text-[0.65rem] opacity-70 min-w-3 inline-block\">{{ getSortIcon(column) }}</span>\n }\n </span>\n </th>\n }\n\n </tr>\n\n <!-- Per-column filter row (wide screens only; collapses into a panel below 640px) -->\n @if (hasColumnFilters && !filtersCollapsed) {\n <tr class=\"bg-base-100 border-b border-base-300\">\n @if (hasSelection) {\n <th class=\"px-2 py-1 \"></th>\n }\n @for (column of dataSource.columns; track column.key) {\n <th\n class=\"px-4 py-2\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n >\n @if (column.filterable) {\n @if ((column.filterType ?? 'text') === 'text') {\n <mn-lib-input-field\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n type: 'text',\n label: '',\n placeholder: column.filterPlaceholder ?? '',\n autocomplete: column.filterAutocomplete ?? undefined,\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true,\n hover: true\n }\"\n [ngModel]=\"columnFilters[column.key]\"\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n ></mn-lib-input-field>\n } @else if (column.filterType === 'select') {\n <mn-lib-select\n (ngModelChange)=\"onColumnFilter(column.key, $event)\"\n [ngModel]=\"columnFilters[column.key] ?? ''\"\n [props]=\"{\n id: 'mn-table-filter-' + column.key,\n options: getFilterSelectOptions(column),\n size: 'sm',\n fullWidth: true\n }\"\n (click)=\"$event.stopPropagation()\"\n ></mn-lib-select>\n }\n }\n </th>\n }\n </tr>\n }\n </thead>\n\n <tbody>\n <!-- Loading state -->\n @if (isLoadingState) {\n @for (_ of skeletonRows; track $index) {\n <tr>\n @if (hasSelection) {\n <td class=\"px-2 py-3\">\n <mn-skeleton [data]=\"{ shape: 'rectangle', width: '1rem', height: '1rem' }\"></mn-skeleton>\n </td>\n }\n @for (column of dataSource.columns; track column.key) {\n <td class=\"px-4 py-3\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n [style.width]=\"column.width ?? null\"\n >\n @if (isTemplateRef(column.skeleton)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.skeleton)\"></ng-container>\n } @else {\n <mn-skeleton [data]=\"getColumnSkeletonData(column)\"></mn-skeleton>\n }\n </td>\n }\n </tr>\n }\n } @else if (isErrorState) {\n <!-- Error state -->\n <tr class=\"bg-base-100\">\n <td [attr.colspan]=\"totalColumnCount\" class=\"text-center text-xs py-8\">\n @if (dataSource.errorTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.errorTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-error\">\n <p class=\"text-sm\">{{ dataSource.errorMessage }}</p>\n </div>\n }\n </td>\n </tr>\n } @else {\n <!-- Empty state -->\n @if (filteredItems.length === 0) {\n <tr class=\"bg-base-100\">\n <td [attr.colspan]=\"totalColumnCount\" class=\"text-center text-xs py-8\">\n @if (dataSource.emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.emptyTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-base-content/50\">\n <p class=\"text-sm\">{{ dataSource.emptyMessage }}</p>\n </div>\n }\n </td>\n </tr>\n }\n\n <!-- Data rows -->\n @for (row of paginatedItems; track trackByID($index, row); let odd = $odd; let last = $last) {\n <tr\n class=\"bg-base-100 transition-colors duration-150 hover:cursor-pointer\"\n [ngClass]=\"{'bg-primary/10': isSelected(row)}\"\n [class.bg-base-200]=\"!isSelected(row) && odd && dataSource.appearance?.striped\"\n [class.hover:bg-base-200]=\"dataSource.appearance?.hover !== false\"\n [class.cursor-pointer]=\"!!dataSource.onRowClick\"\n [class.border-b]=\"!last\"\n [class.border-base-300]=\"!last\"\n [class.border-b-1]=\"last\"\n [class.border-black]=\"last\"\n [class.shadow-3xl]=\"last\"\n (click)=\"onRowClick(row)\"\n >\n <!-- Selection checkbox -->\n @if (hasSelection) {\n <td (click)=\"$event.stopPropagation()\" class=\"w-10 text-center px-2 py-2\">\n <mn-lib-checkbox\n (checkedChange)=\"toggle(row)\"\n [checked]=\"isSelected(row)\"\n [props]=\"{ id: 'mn-table-row-' + $index, size: 'sm' }\"\n ></mn-lib-checkbox>\n </td>\n }\n\n <!-- Data cells -->\n @for (column of dataSource.columns; track column.key) {\n <td\n class=\"text-xs px-2 py-1 md:px-4 md:py-2\"\n [class.text-left]=\"(column.align ?? 'left') === 'left'\"\n [class.text-center]=\"column.align === 'center'\"\n [class.text-right]=\"column.align === 'right'\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n [style.width]=\"column.width ?? null\"\n >\n @if (column.cellSm) {\n <!-- Default cell: hidden below the cellSm breakpoint -->\n <span [mnShowAbove]=\"column.cellSm.below\">\n @if (isTemplateRef(column.cell)) {\n <ng-container [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"\n [ngTemplateOutlet]=\"$any(column.cell)\"></ng-container>\n } @else {\n {{ getCellValue(column, row) }}\n }\n </span>\n <!-- Small cell: shown only below the cellSm breakpoint -->\n <span [mnShowBelow]=\"column.cellSm.below\">\n @if (isTemplateRef(column.cellSm.cell)) {\n <ng-container [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"\n [ngTemplateOutlet]=\"$any(column.cellSm.cell)\"></ng-container>\n } @else {\n {{ getCellSmValue(column, row) }}\n }\n </span>\n } @else {\n @if (isTemplateRef(column.cell)) {\n <ng-container [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"\n [ngTemplateOutlet]=\"$any(column.cell)\"></ng-container>\n } @else {\n {{ getCellValue(column, row) }}\n }\n }\n </td>\n }\n\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n<!-- Load more + pagination -->\n<mn-collection-pagination\n (loadMore)=\"loadMoreRows()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n [currentPage]=\"currentPage\"\n [isPaginated]=\"isPaginated\"\n [isServerPaginated]=\"isServerPaginated\"\n [labels]=\"dataSource.labels\"\n [loadingMoreRows]=\"loadingMoreRows\"\n [pageSizeSelectOptions]=\"pageSizeSelectOptions\"\n [pageSize]=\"pageSize\"\n [showLoadMore]=\"showLoadMore\"\n [totalItemCount]=\"totalItemCount\"\n [totalPages]=\"totalPages\"\n [visiblePages]=\"visiblePages\"\n idPrefix=\"mn-table\"\n></mn-collection-pagination>\n","import {\n Component,\n Input,\n OnInit,\n Type,\n ViewChild,\n ViewContainerRef,\n ComponentRef,\n TemplateRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnModalRef } from '../../mn-modal-ref';\nimport { CustomModalConfig } from '../../mn-modal.types';\n\n@Component({\n selector: 'mn-custom-body-host',\n standalone: true,\n imports: [CommonModule],\n template: '<ng-container #container></ng-container>',\n})\nexport class MnCustomBodyHostComponent implements OnInit {\n @Input() config!: CustomModalConfig;\n @Input() modalRef!: MnModalRef<unknown>;\n\n @ViewChild('container', { read: ViewContainerRef }) container!: ViewContainerRef;\n\n private componentRef?: ComponentRef<unknown>;\n\n ngOnInit(): void {\n setTimeout(() => this.loadContent(), 0);\n }\n\n private loadContent(): void {\n if (!this.container) return;\n\n this.container.clear();\n\n if (this.config.component) {\n this.attachComponent(this.config.component);\n } else if (this.config.template) {\n this.attachTemplate(this.config.template);\n }\n }\n\n attachComponent(component: Type<unknown>): void {\n this.componentRef = this.container.createComponent(component);\n\n // Pass inputs to the component\n if (this.config.inputs) {\n Object.entries(this.config.inputs).forEach(([key, value]) => {\n (this.componentRef!.instance as Record<string, unknown>)[key] = value;\n });\n }\n\n // Pass modalRef if the component has a modalRef property\n const instance = this.componentRef.instance as Record<string, unknown>;\n if (instance && 'modalRef' in instance) {\n instance['modalRef'] = this.modalRef;\n }\n }\n\n attachTemplate(template: TemplateRef<unknown>): void {\n this.container.createEmbeddedView(template, {\n $implicit: this.modalRef,\n modalRef: this.modalRef,\n });\n }\n}\n","import {\n AfterViewInit,\n Component,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n QueryList,\n Type,\n ViewChildren,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {\n AbstractControlOptions,\n FormBuilder,\n FormGroup,\n ReactiveFormsModule,\n ValidatorFn,\n Validators\n} from '@angular/forms';\nimport {Subscription} from 'rxjs';\nimport {MnModalRef} from '../../mn-modal-ref';\nimport {\n FieldDataSource,\n FieldKind,\n FieldRequiredCondition,\n FieldVisibilityCondition,\n FileFieldConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormModalConfig,\n FormRow,\n ModalCloseReason,\n ModalI18nLabels,\n ModalInputMap,\n MultiSelectTableFieldConfig,\n RatingFieldConfig,\n SelectOption,\n SingleSelectTableFieldConfig,\n SliderFieldConfig,\n SubmitMode,\n} from '../../mn-modal.types';\nimport {MnButton} from '../../../mn-button';\nimport {MnInputField} from '../../../mn-input-field';\nimport {MnCheckbox} from '../../../mn-checkbox';\nimport {MnDatetime} from '../../../mn-datetime';\nimport {MnMultiSelect} from '../../../mn-multi-select';\nimport {MnTextarea} from '../../../mn-textarea';\nimport {MnFileInput} from '../../../mn-file-input';\nimport {MnSelect, MnSelectOption, MnSelectProps} from '../../../mn-select';\nimport {MnCustomFieldHostDirective} from './mn-custom-field-host.directive';\nimport {MnLanguageService} from '../../../../language';\nimport {MnTable, TableDataSource} from '../../../mn-table';\nimport {MnCustomBodyHostComponent} from '../mn-custom-body-host/mn-custom-body-host.component';\n\n/**\n * A structural \"view\" over the {@link FormFieldConfig} discriminated union that\n * exposes every member-specific property as optional. The template and several\n * helpers need to read properties that only exist on some union members (e.g.\n * `placeholder`, `swatches`, `mode`, `dataSource`, `validators`). Casting the\n * field to this view keeps that access type-checked without resorting to `any`.\n */\ntype FormFieldView<TModel> = FormFieldConfig<TModel> & {\n label?: string;\n placeholder?: string;\n validators?: ValidatorFn[];\n asyncValidators?: ValidatorFn[];\n updateOn?: 'change' | 'blur' | 'submit';\n options?: SelectOption[];\n dataSource?: FieldDataSource;\n disabled?: boolean;\n readOnly?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n conditionallyRequired?: FieldRequiredCondition<TModel>;\n autoFocus?: boolean;\n defaultValue?: unknown;\n mask?: string;\n autocomplete?: string;\n minDate?: string;\n maxDate?: string;\n mode?: 'date' | 'time' | 'datetime-local';\n min?: number | string;\n max?: number | string;\n step?: number;\n rows?: number;\n searchable?: boolean;\n searchPlaceholder?: string;\n maxSelections?: number;\n swatches?: string[];\n showValue?: boolean;\n unit?: string;\n accept?: string;\n multiple?: boolean;\n displayMode?: 'dropzone' | 'thumbnail' | 'list' | 'compact';\n dropzoneHint?: string;\n replaceLabel?: string;\n removeLabel?: string;\n currentUrl?: string | null;\n currentUrls?: string[] | null;\n onClear?: () => void;\n // Non-optional in the view: the template only reads these inside the\n // matching @case/@if guards where the runtime value is always present.\n // Keeping them non-undefined avoids spurious template type errors that the\n // previous `any` cast masked, without changing runtime behavior.\n maxSize: number;\n maxFiles?: number;\n component: Type<unknown>;\n inputs?: ModalInputMap;\n};\n\n@Component({\n selector: 'mn-form-body',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MnButton, MnInputField, MnCheckbox, MnDatetime, MnMultiSelect, MnTextarea, MnFileInput, MnSelect, MnCustomFieldHostDirective, MnTable, MnCustomBodyHostComponent],\n templateUrl: './mn-form-body.component.html',\n styleUrls: ['./mn-form-body.component.css'],\n})\nexport class MnFormBodyComponent<TModel = unknown, TResult = TModel> implements OnInit, OnDestroy, AfterViewInit {\n private fb = inject(FormBuilder);\n\n @Input() config!: FormModalConfig<TModel, TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n @Input() hideFooter = false;\n @Input() hideCustomBody = false;\n @Output() formStatusChange = new EventEmitter<string>();\n\n @ViewChildren(MnInputField) inputFields?: QueryList<MnInputField>;\n @ViewChildren(MnTextarea) textareas?: QueryList<MnTextarea>;\n\n form!: FormGroup;\n rows: FormRow<TModel>[] = [];\n fieldGroups: FormFieldGroup<TModel>[] = [];\n isSubmitting = false;\n readonly FieldKind = FieldKind;\n readonly ModalCloseReason = ModalCloseReason;\n\n /** Cross-field validation errors: { fieldKey: errorMessage } */\n formErrors: Record<string, string> = {};\n\n /** Track which fields are currently visible (for conditional fields) */\n fieldVisibility: Record<string, boolean> = {};\n\n /** Track which fields are currently conditionally required */\n fieldConditionallyRequired: Record<string, boolean> = {};\n\n /** Track loading state per field for async data sources */\n fieldLoading: Record<string, boolean> = {};\n\n /** Dynamic options loaded from data sources */\n fieldOptions: Record<string, SelectOption[]> = {};\n\n private valueChangesSubscription?: Subscription;\n\n asField(field: FormFieldConfig<TModel>): FormFieldView<TModel> {\n return field as FormFieldView<TModel>;\n }\n\n asKey(key: keyof TModel | string): string {\n return key as string;\n }\n\n // The template builds untyped `props` object literals and passes them to\n // strongly-typed child component `[props]` inputs. There is no single static\n // type for those literals, so this identity bridge must return `any` to keep\n // the template assignment-compatible. This is a genuine template-bridge case.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n asAny(val: unknown): any {\n return val;\n }\n\n hasRequiredValidator(field: FormFieldConfig<TModel>): boolean {\n const view = field as FormFieldView<TModel>;\n // Check if conditionallyRequired is currently active\n if (view.conditionallyRequired) {\n const formValue = (this.form?.value ?? {}) as Partial<TModel>;\n if (view.conditionallyRequired(formValue)) return true;\n }\n const validators = view.validators;\n if (!validators) return false;\n // Check if Validators.required is in the array by testing a dummy control\n const control = this.fb.control(null, validators);\n const errors = control.errors;\n return errors != null && 'required' in errors;\n }\n\n /** Store table data sources keyed by field key for template access */\n tableDataSources: Record<string, TableDataSource<unknown>> = {};\n\n private languageService = inject(MnLanguageService);\n\n private static readonly DEFAULT_LABELS: Record<string, string> = {\n submit: 'Submit',\n cancel: 'Cancel',\n submitting: 'Submitting...',\n selectPlaceholder: 'Select...',\n loading: 'Loading...',\n fileUploadPrompt: 'Click or drag files here',\n fieldRequired: 'This field is required',\n loadingOptions: 'Loading options...',\n accepted: 'Accepted:',\n maxSize: 'Max size:',\n };\n\n private resolveLabel(i18nValue: string | undefined, key: string): string {\n if (i18nValue) return i18nValue;\n const translated = this.languageService.translate(`common.${key}`);\n return translated === `common.${key}` ? MnFormBodyComponent.DEFAULT_LABELS[key] : translated;\n }\n\n /** Resolved i18n labels with defaults, falling back to translated keys */\n get labels() {\n // The config's i18n map may carry extra keys beyond ModalI18nLabels (e.g.\n // fieldRequired, loadingOptions), so widen the type to expose them as\n // declared optional properties (keeps dot access type-checked).\n const i18n: ModalI18nLabels &\n Partial<Record<'fieldRequired' | 'loadingOptions' | 'accepted' | 'maxSize', string>> =\n this.config.i18n || {};\n return {\n submit: this.resolveLabel(i18n.submit, 'submit'),\n cancel: this.resolveLabel(i18n.cancel, 'cancel'),\n submitting: this.resolveLabel(i18n.submitting, 'submitting'),\n selectPlaceholder: this.resolveLabel(i18n.selectPlaceholder, 'selectPlaceholder'),\n loading: this.resolveLabel(i18n.loading, 'loading'),\n fileUploadPrompt: this.resolveLabel(i18n.fileUploadPrompt, 'fileUploadPrompt'),\n fieldRequired: this.resolveLabel(i18n.fieldRequired, 'fieldRequired'),\n loadingOptions: this.resolveLabel(i18n.loadingOptions, 'loadingOptions'),\n accepted: this.resolveLabel(i18n.accepted, 'accepted'),\n maxSize: this.resolveLabel(i18n.maxSize, 'maxSize'),\n };\n }\n\n ngOnInit(): void {\n this.initializeForm();\n this.buildRows();\n this.initializeVisibility();\n this.initializeDataSources();\n this.initializeTableFields();\n this.subscribeToValueChanges();\n\n if (this.config.disabled || this.config.readOnly) {\n this.form.disable();\n }\n\n // Emit initial status\n setTimeout(() => {\n this.formStatusChange.emit(this.form.status);\n });\n }\n\n ngAfterViewInit(): void {\n // Small delay to ensure children are fully rendered and MnModalShell hasn't just stolen focus\n setTimeout(() => {\n this.applyAutoFocus();\n }, 100);\n }\n\n public applyAutoFocus(): void {\n const autoFocusField = this.config.fields.find(f => (f as FormFieldView<TModel>).autoFocus);\n if (!autoFocusField) return;\n\n const key = autoFocusField.key as string;\n\n // Small delay to ensure browser is ready to focus\n setTimeout(() => {\n // Try finding in MnInputField components\n const inputField = this.inputFields?.find(f => f.props.id === key);\n if (inputField) {\n inputField.focus();\n return;\n }\n\n // Try finding in MnTextarea components\n const textarea = this.textareas?.find(f => f.props?.id === key);\n if (textarea) {\n textarea.focus();\n return;\n }\n\n // Fallback to native element if possible\n const el = document.getElementById(key);\n if (el) el.focus();\n }, 50);\n }\n\n ngOnDestroy(): void {\n this.valueChangesSubscription?.unsubscribe();\n }\n\n private initializeForm(): void {\n const formControls: Record<string, [unknown, AbstractControlOptions]> = {};\n\n this.config.fields.forEach(field => {\n const fieldConfig = field as FormFieldView<TModel>;\n let initialValue: unknown = this.config.initialValue?.[field.key as keyof TModel] ?? null;\n\n // Handle checkbox default values\n if (field.kind === FieldKind.CHECKBOX && initialValue === null) {\n initialValue = fieldConfig.defaultValue ?? false;\n }\n\n const validators = fieldConfig.validators || [];\n const asyncValidators = fieldConfig.asyncValidators || [];\n const updateOn = fieldConfig.updateOn || 'change';\n\n formControls[field.key as string] = [\n initialValue,\n {\n validators,\n asyncValidators,\n updateOn\n }\n ];\n });\n\n this.form = this.fb.group(formControls);\n\n // Apply Angular FormGroup-level validators\n if (this.config.groupValidators && this.config.groupValidators.length > 0) {\n this.form.setValidators(this.config.groupValidators);\n this.form.updateValueAndValidity();\n }\n\n // Apply disabled/readOnly state to controls\n this.config.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n const control = this.form.get(field.key as string);\n if (control && (fieldView.disabled || fieldView.readOnly)) {\n control.disable();\n }\n });\n }\n\n isFieldReadOnly(field: FormFieldConfig<TModel>): boolean {\n return this.config.readOnly === true || (field as FormFieldView<TModel>).readOnly === true;\n }\n\n isFieldDisabled(field: FormFieldConfig<TModel>): boolean {\n return this.config.disabled === true || (field as FormFieldView<TModel>).disabled === true;\n }\n\n /** Track which field groups are currently visible */\n groupVisibility: Record<string, boolean> = {};\n\n private buildRows(): void {\n if (this.config.rows && this.config.rows.length > 0) {\n this.rows = this.config.rows;\n } else {\n // Create rows for fields that are not in any row or group\n const fieldsInGroups = new Set<string>();\n (this.config.fieldGroups || []).forEach(g => {\n (g.rows || []).forEach(r => r.fields.forEach(f => fieldsInGroups.add(f.field.key as string)));\n // Also check if group has flat fields list (compatibility)\n if (g.fields) {\n g.fields.forEach(f => fieldsInGroups.add(f.key as string));\n }\n });\n\n const fieldsInRows = new Set<string>();\n (this.config.rows || []).forEach(r => r.fields.forEach(f => fieldsInRows.add(f.field.key as string)));\n\n const standaloneFields = this.config.fields.filter(f => !fieldsInGroups.has(f.key as string) && !fieldsInRows.has(f.key as string));\n\n if (standaloneFields.length > 0) {\n this.rows = standaloneFields.map(field => ({\n columns: 1,\n fields: [{ field, span: 1 }],\n }));\n }\n }\n // Build field groups\n this.fieldGroups = this.config.fieldGroups || [];\n // Initialize group visibility\n this.initializeGroupVisibility();\n }\n\n private initializeGroupVisibility(): void {\n this.fieldGroups.forEach((group, index) => {\n const key = group.title || `group-${index}`;\n const isVisible = group.visible ? group.visible(this.form.value) : true;\n this.groupVisibility[key] = isVisible;\n // If group is hidden, clear validators on its fields\n if (!isVisible) {\n group.fields.forEach(field => {\n const control = this.form.get(field.key as string);\n if (control) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n }\n });\n }\n });\n }\n\n private updateGroupVisibility(): void {\n const formValue = this.form.value;\n this.fieldGroups.forEach((group, index) => {\n const key = group.title || `group-${index}`;\n const wasVisible = this.groupVisibility[key];\n const isVisible = group.visible ? group.visible(formValue) : true;\n this.groupVisibility[key] = isVisible;\n\n if (!isVisible && wasVisible) {\n // Group became hidden — clear validators on its fields\n group.fields.forEach(field => {\n const control = this.form.get(field.key as string);\n if (control) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n }\n });\n } else if (isVisible && !wasVisible) {\n // Group became visible — restore validators\n group.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n const validators = fieldView.validators || [];\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValidators(validators);\n control.updateValueAndValidity({ emitEvent: false });\n }\n });\n }\n });\n }\n\n isGroupVisible(group: FormFieldGroup<TModel>): boolean {\n const key = group.title || `group-${this.fieldGroups.indexOf(group)}`;\n return this.groupVisibility[key];\n }\n\n // =========================\n // Feature 1: Conditional/Dynamic Fields\n // =========================\n\n private initializeVisibility(): void {\n const formValue = this.form.value as Partial<TModel>;\n this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldView = field as FormFieldView<TModel>;\n const isVisible = fieldView.visible ? fieldView.visible(formValue) : true;\n this.fieldVisibility[key] = isVisible;\n\n // If initially hidden, clear validators so they don't block submit\n if (!isVisible) {\n const control = this.form.get(key);\n if (control) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n }\n } else if (fieldView.conditionallyRequired) {\n // Initialize conditionallyRequired state for visible fields\n const isRequired = fieldView.conditionallyRequired(formValue);\n this.fieldConditionallyRequired[key] = isRequired;\n if (isRequired) {\n const control = this.form.get(key);\n if (control) {\n const validators = this.buildValidators(fieldView, formValue);\n control.setValidators(validators);\n control.updateValueAndValidity({emitEvent: false});\n }\n }\n }\n });\n }\n\n private updateVisibility(): void {\n const formValue = this.form.value as Partial<TModel>;\n this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldView = field as FormFieldView<TModel>;\n const wasVisible = this.fieldVisibility[key];\n const isVisible = fieldView.visible ? fieldView.visible(formValue) : true;\n this.fieldVisibility[key] = isVisible;\n\n // When a field becomes hidden, clear its validators so it doesn't block submit\n const control = this.form.get(key);\n if (control) {\n if (!isVisible && wasVisible) {\n control.clearValidators();\n control.updateValueAndValidity({ emitEvent: false });\n } else if (isVisible && !wasVisible) {\n // Restore validators (including conditionallyRequired if active)\n const validators = this.buildValidators(fieldView, formValue);\n control.setValidators(validators);\n control.updateValueAndValidity({emitEvent: false});\n } else if (isVisible) {\n // Update conditionallyRequired for visible fields\n this.updateConditionallyRequired(fieldView, formValue);\n }\n }\n });\n }\n\n /**\n * Builds the full validator array for a field, including conditionallyRequired.\n * @param field The field configuration view.\n * @param formValue The current form values.\n * @returns Array of validators to apply.\n */\n private buildValidators(field: FormFieldView<TModel>, formValue: Partial<TModel>): ValidatorFn[] {\n const baseValidators = field.validators ? [...field.validators] : [];\n if (field.conditionallyRequired && field.conditionallyRequired(formValue)) {\n if (!baseValidators.includes(Validators.required)) {\n baseValidators.push(Validators.required);\n }\n }\n return baseValidators;\n }\n\n /**\n * Updates the conditionallyRequired state for a single field and adjusts validators.\n * @param field The field configuration view.\n * @param formValue The current form values.\n */\n private updateConditionallyRequired(field: FormFieldView<TModel>, formValue: Partial<TModel>): void {\n if (!field.conditionallyRequired) return;\n const key = field.key as string;\n const wasRequired = this.fieldConditionallyRequired[key] ?? false;\n const isRequired = field.conditionallyRequired(formValue);\n this.fieldConditionallyRequired[key] = isRequired;\n\n if (isRequired !== wasRequired) {\n const control = this.form.get(key);\n if (control) {\n const validators = this.buildValidators(field, formValue);\n control.setValidators(validators);\n control.updateValueAndValidity({emitEvent: false});\n }\n }\n }\n\n isFieldVisible(field: FormFieldConfig<TModel>): boolean {\n return this.fieldVisibility[field.key as string];\n }\n\n // =========================\n // Feature 2: Cross-Field Validation\n // =========================\n\n private runFormValidators(): void {\n this.formErrors = {};\n if (!this.config.formValidators) return;\n\n const formValue = this.form.value;\n for (const validator of this.config.formValidators) {\n const errors = validator(formValue);\n if (errors) {\n Object.assign(this.formErrors, errors);\n }\n }\n }\n\n getFieldError(key: string): string | null {\n return this.formErrors[key] || null;\n }\n\n get hasFormErrors(): boolean {\n return Object.keys(this.formErrors).length > 0;\n }\n\n // =========================\n // Feature 3: Async Data Sources\n // =========================\n\n private initializeDataSources(): void {\n this.config.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n if (fieldView.dataSource) {\n this.loadFieldOptions(field.key as string, fieldView.dataSource, this.form.value as Partial<TModel>);\n }\n });\n }\n\n isFieldLoading(key: string): boolean {\n return this.fieldLoading[key];\n }\n\n /** Get options for a field — uses dataSource options if available, otherwise static options */\n getFieldOptions(field: FormFieldConfig<TModel>): SelectOption[] {\n const key = field.key as string;\n if (this.fieldOptions[key] !== undefined) {\n return this.fieldOptions[key];\n }\n return (field as FormFieldView<TModel>).options || [];\n }\n\n /** Convert SelectOption[] to MnSelectOption[] for mn-lib-select */\n getSelectOptions(field: FormFieldConfig<TModel>): MnSelectOption[] {\n return this.getFieldOptions(field).map(o => ({\n label: o.label,\n value: o.value,\n disabled: o.state === 'disabled',\n }));\n }\n\n getSelectProps(field: FormFieldConfig<TModel>): MnSelectProps {\n return {\n id: field.key as string,\n label: this.asField(field).label,\n placeholder: this.isFieldLoading(field.key as string) ? this.labels.loading : this.labels.selectPlaceholder,\n options: this.getSelectOptions(field),\n fullWidth: true,\n };\n }\n\n private async loadFieldOptions(key: string, dataSource: FieldDataSource, formValue: Partial<TModel>): Promise<void> {\n this.fieldLoading[key] = true;\n try {\n this.fieldOptions[key] = await dataSource.load(formValue);\n } catch (error) {\n console.error(`Failed to load options for field '${key}':`, error);\n this.fieldOptions[key] = [];\n } finally {\n this.fieldLoading[key] = false;\n }\n }\n\n // =========================\n // Feature: Multi-Select Table Fields\n // =========================\n\n private initializeTableFields(): void {\n this.config.fields.forEach(field => {\n if (field.kind === FieldKind.MULTI_SELECT_TABLE) {\n const tableField = field as MultiSelectTableFieldConfig<TModel>;\n const ds = tableField.tableDataSource;\n // Force multi selection mode\n ds.selectionMode = 'multi';\n\n // Pre-select rows from the form's initial value\n const control = this.form.get(field.key as string);\n if (control && Array.isArray(control.value) && control.value.length > 0) {\n ds.initialSelectedIds = control.value.map((v: unknown) => String(v));\n } else if (control && control.value === null) {\n control.setValue([], { emitEvent: false });\n }\n\n this.tableDataSources[field.key as string] = ds;\n } else if (field.kind === FieldKind.SINGLE_SELECT_TABLE) {\n const tableField = field as SingleSelectTableFieldConfig<TModel>;\n const ds = tableField.tableDataSource;\n // Force single selection mode\n ds.selectionMode = 'single';\n\n // Pre-select row from the form's initial value\n const control = this.form.get(field.key as string);\n if (control && control.value != null) {\n ds.initialSelectedIds = [String(control.value)];\n }\n\n this.tableDataSources[field.key as string] = ds;\n }\n });\n }\n\n onTableSelectionChange(field: FormFieldConfig<TModel>, selectedRows: unknown[]): void {\n if (field.kind === FieldKind.SINGLE_SELECT_TABLE) {\n const tableField = field as SingleSelectTableFieldConfig<TModel>;\n const getVal = tableField.getRowValue || tableField.tableDataSource.getID;\n const value = selectedRows.length > 0 ? getVal(selectedRows[0]) : null;\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(value);\n control.markAsTouched();\n }\n } else {\n const tableField = field as MultiSelectTableFieldConfig<TModel>;\n const getVal = tableField.getRowValue || tableField.tableDataSource.getID;\n const values = selectedRows.map(row => getVal(row));\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(values);\n control.markAsTouched();\n }\n }\n }\n\n // =========================\n // Feature: Rating Fields\n // =========================\n\n getRatingRange(field: FormFieldConfig<TModel>): number[] {\n const max = (field as RatingFieldConfig<TModel>).max || 5;\n return Array.from({ length: max }, (_, i) => i + 1);\n }\n\n setRating(field: FormFieldConfig<TModel>, value: number): void {\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(value);\n control.markAsTouched();\n }\n }\n\n getRatingValue(field: FormFieldConfig<TModel>): number {\n return this.form.get(field.key as string)?.value || 0;\n }\n\n // =========================\n // Feature: Slider Fields\n // =========================\n\n onSliderChange(field: FormFieldConfig<TModel>, event: Event): void {\n const input = event.target as HTMLInputElement;\n const value = parseFloat(input.value);\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(value);\n control.markAsTouched();\n }\n }\n\n getSliderValue(field: FormFieldConfig<TModel>): number {\n const f = field as SliderFieldConfig<TModel>;\n return this.form.get(field.key as string)?.value ?? f.min ?? 0;\n }\n\n // =========================\n // Feature: Color Fields\n // =========================\n\n onColorChange(field: FormFieldConfig<TModel>, event: Event): void {\n const input = event.target as HTMLInputElement;\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(input.value);\n control.markAsTouched();\n }\n }\n\n setColorFromSwatch(field: FormFieldConfig<TModel>, color: string): void {\n const control = this.form.get(field.key as string);\n if (control) {\n control.setValue(color);\n control.markAsTouched();\n }\n }\n\n getColorValue(field: FormFieldConfig<TModel>): string {\n return this.form.get(field.key as string)?.value || '#000000';\n }\n\n // =========================\n // Value Changes Subscription\n // =========================\n\n private subscribeToValueChanges(): void {\n // Initialize previousFormValue with current form state to avoid false \"changed\" on first emission\n this.previousFormValue = { ...this.form.value };\n\n this.valueChangesSubscription = this.form.valueChanges.subscribe(formValue => {\n // Update conditional visibility\n this.updateVisibility();\n\n // Update group visibility\n this.updateGroupVisibility();\n\n // Run cross-field validators\n this.runFormValidators();\n\n // Reload data sources that depend on changed fields\n this.reloadDependentDataSources(formValue);\n\n // Emit status change\n this.formStatusChange.emit(this.form.status);\n });\n }\n\n private previousFormValue: Partial<TModel> = {};\n\n private reloadDependentDataSources(formValue: Partial<TModel>): void {\n this.config.fields.forEach(field => {\n const fieldView = field as FormFieldView<TModel>;\n const dataSource: FieldDataSource | undefined = fieldView.dataSource;\n if (!dataSource?.dependsOn) return;\n\n // Check if any dependency changed\n const changed = dataSource.dependsOn.some(depKey => {\n return formValue[depKey as keyof TModel] !== this.previousFormValue[depKey as keyof TModel];\n });\n\n if (changed) {\n this.loadFieldOptions(field.key as string, dataSource, formValue);\n }\n });\n this.previousFormValue = { ...formValue };\n }\n\n // =========================\n // Feature: File Upload Fields\n // =========================\n\n /**\n * Invokes a FILE field's `onClear` callback when its existing image is removed.\n * FILE fields render {@link MnFileInput}, which owns selection/validation and\n * writes the value (`File | File[] | null`) straight to the form control.\n * @param field The field whose existing image was cleared.\n */\n onFileCleared(field: FormFieldConfig<TModel>): void {\n (field as FileFieldConfig<TModel>).onClear?.();\n }\n\n async submit(): Promise<void> {\n // Run cross-field validators before submit\n this.runFormValidators();\n\n if (this.form.invalid || this.isSubmitting || this.hasFormErrors) {\n this.form.markAllAsTouched();\n return;\n }\n\n if (this.config.submitMode === SubmitMode.ONCE) {\n this.isSubmitting = true;\n }\n\n const formValue = this.form.value as TResult;\n\n try {\n if (this.config.onComplete) {\n await this.config.onComplete.handle(formValue);\n }\n this.modalRef.close(formValue);\n } catch (error) {\n // Always allow retry on error, regardless of submit mode\n this.isSubmitting = false;\n console.error('Form submission error:', error);\n }\n }\n}\n","@if ((config.component || config.template) && !hideCustomBody) {\n <mn-custom-body-host\n [config]=\"asAny(config)\"\n [modalRef]=\"asAny(modalRef)\"\n class=\"mb-6 block\"\n ></mn-custom-body-host>\n}\n\n<form (ngSubmit)=\"submit()\" [formGroup]=\"form\" class=\"flex flex-col gap-6 h-full\">\n <!-- Shared field rendering template (must be inside form for formControlName) -->\n <ng-template #fieldTemplate let-rowField>\n @switch (rowField.field.kind) {\n @case (FieldKind.TEXT) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'text',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n mask: asField(rowField.field).mask,\n autocomplete: asField(rowField.field).autocomplete,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.NUMBER) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'number',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.PASSWORD) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'password',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.SELECT) {\n <div class=\"flex flex-col\">\n <mn-lib-select\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"getSelectProps(rowField.field)\"\n ></mn-lib-select>\n @if (isFieldLoading(asKey(rowField.field.key))) {\n <div class=\"flex items-center gap-1 pl-2 pt-1\">\n <div class=\"w-4 h-4 border-2 border-base-300 border-t-blue-500 rounded-full animate-spin\"></div>\n </div>\n }\n @if (getFieldError(asKey(rowField.field.key))) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ getFieldError(asKey(rowField.field.key)) }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.CHECKBOX) {\n <div>\n <mn-lib-checkbox\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n disabled: isFieldDisabled(rowField.field) || isFieldReadOnly(rowField.field)\n })\"\n ></mn-lib-checkbox>\n </div>\n }\n\n @case (FieldKind.DATE) {\n <div>\n <mn-lib-input-field\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n type: 'date',\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n startDate: asField(rowField.field).minDate,\n endDate: asField(rowField.field).maxDate,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.DATETIME) {\n <div>\n <mn-lib-datetime\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n mode: asField(rowField.field).mode || 'datetime-local',\n min: asField(rowField.field).min,\n max: asField(rowField.field).max,\n step: asField(rowField.field).step,\n readonly: isFieldReadOnly(rowField.field),\n fullWidth: true\n })\"\n ></mn-lib-datetime>\n </div>\n }\n\n @case (FieldKind.TEXTAREA) {\n <div>\n <mn-lib-textarea\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n placeholder: asField(rowField.field).placeholder,\n rows: asField(rowField.field).rows || 4,\n resize: 'vertical',\n autocomplete: asField(rowField.field).autocomplete,\n readonly: isFieldReadOnly(rowField.field)\n })\"\n ></mn-lib-textarea>\n </div>\n }\n\n @case (FieldKind.MULTI_SELECT) {\n <div>\n @if (isFieldLoading(asKey(rowField.field.key))) {\n <div class=\"flex items-center gap-2 py-2 text-sm text-base-content/50\">\n <div class=\"w-4 h-4 border-2 border-base-300 border-t-blue-500 rounded-full animate-spin\"></div>\n {{ labels.loadingOptions }}\n </div>\n }\n @if (!isFieldLoading(asKey(rowField.field.key))) {\n <mn-lib-multi-select\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n options: getFieldOptions(rowField.field),\n searchable: asField(rowField.field).searchable,\n searchPlaceholder: asField(rowField.field).searchPlaceholder,\n maxSelections: asField(rowField.field).maxSelections,\n disabled: isFieldDisabled(rowField.field) || isFieldReadOnly(rowField.field)\n })\"\n ></mn-lib-multi-select>\n }\n @if (getFieldError(asKey(rowField.field.key))) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ getFieldError(asKey(rowField.field.key)) }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.MULTI_SELECT_TABLE) {\n <ng-container [ngTemplateOutlet]=\"selectTableTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n }\n\n @case (FieldKind.SINGLE_SELECT_TABLE) {\n <ng-container [ngTemplateOutlet]=\"selectTableTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n }\n\n @case (FieldKind.COLOR) {\n <div class=\"flex flex-col gap-1\">\n <label [for]=\"'field-' + asKey(rowField.field.key)\"\n class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n <div class=\"flex items-center gap-3\">\n <input\n type=\"color\"\n [id]=\"'field-' + asKey(rowField.field.key)\"\n class=\"w-10 h-10 rounded-lg border border-base-300 cursor-pointer p-0.5\"\n [value]=\"getColorValue(rowField.field)\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (input)=\"onColorChange(rowField.field, $event)\"\n />\n <span class=\"text-sm text-base-content/60 font-mono\">{{ getColorValue(rowField.field) }}</span>\n </div>\n @if (asField(rowField.field).swatches) {\n <div class=\"flex gap-1.5 mt-1\">\n @for (swatch of asField(rowField.field).swatches; track swatch) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n type=\"button\"\n class=\"w-6 h-6 rounded-md border border-base-300 cursor-pointer transition-transform hover:scale-110\"\n [style.background-color]=\"swatch\"\n [class.ring-2]=\"getColorValue(rowField.field) === swatch\"\n [class.ring-blue-500]=\"getColorValue(rowField.field) === swatch\"\n (click)=\"setColorFromSwatch(rowField.field, swatch)\"\n [attr.aria-label]=\"'Select color ' + swatch\"\n ></button>\n }\n </div>\n }\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.RATING) {\n <div class=\"flex flex-col gap-1\">\n <span [id]=\"'rating-label-' + asKey(rowField.field.key)\"\n class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n <div [attr.aria-labelledby]=\"'rating-label-' + asKey(rowField.field.key)\" class=\"flex items-center gap-1\"\n role=\"group\">\n @for (star of getRatingRange(rowField.field); track star) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n type=\"button\"\n class=\"text-2xl cursor-pointer transition-colors focus:outline-none\"\n [class.text-yellow-400]=\"star <= getRatingValue(rowField.field)\"\n [class.text-base-300]=\"star > getRatingValue(rowField.field)\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (click)=\"setRating(rowField.field, star)\"\n >\n ★\n </button>\n }\n <span class=\"text-sm text-base-content/50 ml-2\">{{ getRatingValue(rowField.field) }} / {{ asField(rowField.field).max || 5 }}</span>\n </div>\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.SLIDER) {\n <div class=\"flex flex-col gap-1\">\n <label [for]=\"'field-' + asKey(rowField.field.key)\"\n class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n <div class=\"flex items-center gap-3\">\n <input\n type=\"range\"\n [id]=\"'field-' + asKey(rowField.field.key)\"\n class=\"flex-1 h-2 bg-base-200 rounded-lg appearance-none cursor-pointer accent-blue-500\"\n [attr.min]=\"asField(rowField.field).min ?? 0\"\n [attr.max]=\"asField(rowField.field).max ?? 100\"\n [attr.step]=\"asField(rowField.field).step ?? 1\"\n [value]=\"getSliderValue(rowField.field)\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (input)=\"onSliderChange(rowField.field, $event)\"\n />\n @if (asField(rowField.field).showValue !== false) {\n <span class=\"text-sm text-base-content/60 min-w-[3rem] text-right\">\n {{ getSliderValue(rowField.field) }}{{ asField(rowField.field).unit || '' }}\n </span>\n }\n </div>\n <div class=\"flex justify-between text-xs text-base-content/40 px-1\">\n <span>{{ asField(rowField.field).min ?? 0 }}</span>\n <span>{{ asField(rowField.field).max ?? 100 }}</span>\n </div>\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n }\n\n @case (FieldKind.FILE) {\n <div>\n <mn-lib-file-input\n (cleared)=\"onFileCleared(rowField.field)\"\n [formControlName]=\"asKey(rowField.field.key)\"\n [props]=\"asAny({\n id: asKey(rowField.field.key),\n label: asField(rowField.field).label,\n accept: asField(rowField.field).accept,\n multiple: asField(rowField.field).multiple,\n maxFiles: asField(rowField.field).maxFiles,\n maxSize: asField(rowField.field).maxSize,\n displayMode: asField(rowField.field).displayMode,\n dropzoneHint: asField(rowField.field).dropzoneHint,\n replaceLabel: asField(rowField.field).replaceLabel,\n removeLabel: asField(rowField.field).removeLabel,\n currentUrl: asField(rowField.field).currentUrl,\n currentUrls: asField(rowField.field).currentUrls,\n disabled: isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\n })\"\n ></mn-lib-file-input>\n </div>\n }\n\n @case (FieldKind.CUSTOM) {\n <div>\n <ng-container\n mnCustomFieldHost\n [component]=\"asField(rowField.field).component\"\n [inputs]=\"asField(rowField.field).inputs\"\n [formControlName]=\"asKey(rowField.field.key)\"\n ></ng-container>\n </div>\n }\n\n @default {\n <div></div>\n }\n }\n\n <!-- Show cross-field error below any field that has one -->\n @if (getFieldError(asKey(rowField.field.key)) && rowField.field.kind !== FieldKind.SELECT && rowField.field.kind !== FieldKind.MULTI_SELECT) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ getFieldError(asKey(rowField.field.key)) }}\n </div>\n }\n </ng-template>\n\n <!-- Shared template for MULTI_SELECT_TABLE and SINGLE_SELECT_TABLE -->\n <ng-template #selectTableTemplate let-rowField>\n <div class=\"flex flex-col gap-1\">\n @if (asField(rowField.field).label) {\n <span class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </span>\n }\n <mn-table\n [dataSource]=\"tableDataSources[asKey(rowField.field.key)]\"\n [attr.aria-label]=\"asField(rowField.field).label || null\"\n (selectionChange)=\"onTableSelectionChange(rowField.field, $event)\"\n ></mn-table>\n @if (form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched) {\n <div class=\"text-red-500 text-xs pl-2 pt-1\">\n {{ labels.fieldRequired }}\n </div>\n }\n </div>\n </ng-template>\n\n <!-- Field Groups (sections with headers) -->\n @if (fieldGroups.length > 0) {\n <div class=\"flex flex-col gap-6\">\n @for (group of fieldGroups; track group.title) {\n <div class=\"flex flex-col gap-4\" [style.display]=\"isGroupVisible(group) ? '' : 'none'\">\n <div class=\"border-b border-base-300 pb-2\">\n <h3 class=\"text-base font-semibold text-base-content\">{{ group.title }}</h3>\n @if (group.description) {\n <p class=\"text-sm text-base-content/50 mt-0.5\">{{ group.description }}</p>\n }\n </div>\n @for (row of group.rows; track $index) {\n <div [style.--mn-form-cols]=\"row.columns || 1\" class=\"grid gap-4 mn-form-row\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div [style.--mn-form-span]=\"rowField.span || 1\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\"\n class=\"flex flex-col gap-2 mn-form-cell\">\n <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Standard rows (no groups) -->\n @if (rows.length > 0) {\n <div class=\"flex flex-col gap-4\">\n @for (row of rows; track $index) {\n <div [style.--mn-form-cols]=\"row.columns || 1\" class=\"grid gap-4 mn-form-row\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div [style.--mn-form-span]=\"rowField.span || 1\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\"\n class=\"flex flex-col gap-2 mn-form-cell\">\n <ng-container [ngTemplateOutlet]=\"fieldTemplate\" [ngTemplateOutletContext]=\"{ $implicit: rowField }\"></ng-container>\n </div>\n }\n </div>\n }\n </div>\n }\n\n <!-- Form-level errors (not tied to a specific field) -->\n @if (formErrors['_form']) {\n <div class=\"text-red-500 text-sm px-2 py-1 bg-red-50 rounded-md\">\n {{ formErrors['_form'] }}\n </div>\n }\n\n @if (!hideFooter) {\n <div class=\"flex gap-3 pt-4 pb-6 border-t border-base-300 mt-auto sticky bottom-0 bg-base-100 z-10\">\n <button\n mnButton\n type=\"button\"\n [data]=\"{ variant: 'outline', color: 'secondary' }\"\n (mousedown)=\"modalRef.dismiss(ModalCloseReason.CANCELLED)\"\n >\n {{ labels.cancel }}\n </button>\n\n <div class=\"flex-1\"></div>\n\n <button\n mnButton\n type=\"submit\"\n [data]=\"{ variant: 'fill', color: 'primary', disabled: form.invalid || isSubmitting }\"\n [disabled]=\"form.invalid || isSubmitting\"\n >\n {{ isSubmitting ? labels.submitting : labels.submit }}\n </button>\n </div>\n }\n</form>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnButton } from '../../../mn-button/mn-button';\nimport {MnButtonTypes} from '../../../mn-button/mn-buttonTypes';\nimport { ModalFooterAction, ActionStyle } from '../../mn-modal.types';\n\n@Component({\n selector: 'mn-footer-actions',\n standalone: true,\n imports: [CommonModule, MnButton],\n host: { class: 'contents' },\n template: `\n @for (action of leftActions; track action.label) {\n <button\n mnButton\n [data]=\"getButtonData(action)\"\n [disabled]=\"action.disabled || false\"\n (click)=\"actionClick.emit(action)\"\n >\n {{ action.label }}\n </button>\n }\n\n <div class=\"flex-1\"></div>\n\n @for (action of rightActions; track action.label) {\n <button\n mnButton\n [data]=\"getButtonData(action)\"\n [disabled]=\"action.disabled || false\"\n (click)=\"actionClick.emit(action)\"\n >\n {{ action.label }}\n </button>\n }\n `,\n})\nexport class MnFooterActionsComponent<TResult = unknown> {\n @Input() actions: ModalFooterAction<TResult>[] = [];\n @Output() actionClick = new EventEmitter<ModalFooterAction<TResult>>();\n\n get leftActions(): ModalFooterAction<TResult>[] {\n return this.actions.filter(a => a.position === 'left');\n }\n\n get rightActions(): ModalFooterAction<TResult>[] {\n return this.actions.filter(a => a.position !== 'left');\n }\n\n getButtonData(action: ModalFooterAction<TResult>): Partial<MnButtonTypes> {\n switch (action.style) {\n case ActionStyle.PRIMARY:\n return { variant: 'fill', color: 'primary', disabled: action.disabled };\n case ActionStyle.DANGER:\n return { variant: 'fill', color: 'danger', disabled: action.disabled };\n case ActionStyle.GHOST:\n return { variant: 'text', color: 'secondary', disabled: action.disabled };\n case ActionStyle.SECONDARY:\n default:\n return { variant: 'outline', color: 'secondary', disabled: action.disabled };\n }\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n ViewChildren,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {ReactiveFormsModule} from '@angular/forms';\nimport {Subscription} from 'rxjs';\nimport {MnModalRef} from '../../mn-modal-ref';\nimport {\n ActionStyle,\n FormModalConfig,\n ModalCloseReason,\n ModalFooterAction,\n ModalKind,\n ModalRef,\n ModalSize,\n ModalStepId,\n NavigationDirection,\n WizardFlowMode,\n WizardModalConfig,\n WizardResult,\n WizardStepConfig,\n} from '../../mn-modal.types';\nimport {MnButton, MnButtonTypes} from '../../../mn-button';\nimport {MnFormBodyComponent} from '../mn-form-body/mn-form-body.component';\nimport {MnCustomBodyHostComponent} from '../mn-custom-body-host/mn-custom-body-host.component';\nimport {MnFooterActionsComponent} from '../mn-footer-actions/mn-footer-actions.component';\nimport {MnLanguageService} from '../../../../language';\n\n@Component({\n selector: 'mn-wizard-body',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MnButton, MnFormBodyComponent, MnCustomBodyHostComponent, MnFooterActionsComponent],\n templateUrl: './mn-wizard-body.component.html',\n styleUrls: ['./mn-wizard-body.component.css'],\n})\nexport class MnWizardBodyComponent implements OnInit, AfterViewInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() config!: WizardModalConfig;\n @Input() modalRef!: MnModalRef<WizardResult>;\n\n @ViewChildren(MnFormBodyComponent) formBodies!: QueryList<MnFormBodyComponent>;\n @ViewChildren('stepWrapper') stepWrappers!: QueryList<ElementRef<HTMLElement>>;\n\n currentStepId!: ModalStepId;\n visitedStepIds: ModalStepId[] = [];\n isCurrentStepValid = true;\n isCompleting = false;\n wizardErrors: Record<string, string> = {};\n\n /**\n * Min-height (px) for the step container, sized to the tallest step so the\n * modal does not jump when navigating between steps. Monotonic — only grows.\n */\n measuredMinHeight = 0;\n\n private languageService = inject(MnLanguageService);\n\n private static readonly DEFAULT_LABELS: Record<string, string> = {\n next: 'Next',\n back: 'Back',\n close: 'Close',\n complete: 'Complete',\n completing: 'Completing...',\n };\n\n private resolveLabel(i18nValue: string | undefined, key: string): string {\n if (i18nValue) return i18nValue;\n const translated = this.languageService.translate(`common.${key}`);\n return translated === `common.${key}` ? MnWizardBodyComponent.DEFAULT_LABELS[key] : translated;\n }\n\n /** Resolved i18n labels with defaults, falling back to translated keys */\n get labels() {\n const i18n = (this.config as { i18n?: Record<string, string> }).i18n || {};\n return {\n next: this.resolveLabel(i18n['next'], 'next'),\n back: this.resolveLabel(i18n['back'], 'back'),\n close: this.resolveLabel(i18n['close'], 'close'),\n complete: this.resolveLabel(i18n['complete'], 'complete'),\n completing: this.resolveLabel(i18n['completing'], 'completing'),\n };\n }\n\n /** Pre-built form configs keyed by step id — only for steps that have fields */\n stepFormConfigs: Record<ModalStepId, FormModalConfig<unknown, unknown>> = {};\n\n private statusSubscription?: Subscription;\n private formBodiesSubscription?: Subscription;\n\n ngOnInit(): void {\n // Pre-build form configs for all form-driven steps\n for (const step of this.config.steps) {\n if (step.fields && step.fields.length > 0) {\n // Merge top-level initialValue with step-level initialValue\n const mergedInitialValue = {\n ...(this.config.initialValue || {}),\n ...(step.initialValue || {})\n };\n\n this.stepFormConfigs[step.id] = {\n kind: ModalKind.FORM,\n fields: step.fields,\n rows: step.rows,\n fieldGroups: step.fieldGroups,\n formValidators: step.formValidators,\n groupValidators: step.groupValidators,\n initialValue: mergedInitialValue,\n readOnly: this.config.readOnly,\n disabled: this.config.disabled\n } as FormModalConfig<unknown, unknown>;\n }\n }\n\n this.currentStepId = this.config.startStepId || this.config.steps[0]?.id;\n if (this.currentStepId) {\n this.visitedStepIds.push(this.currentStepId);\n }\n }\n\n ngAfterViewInit(): void {\n // Subscribe to form bodies list changes to track validity\n this.formBodiesSubscription = this.formBodies.changes.subscribe(() => {\n this.trackCurrentStepValidity();\n // Apply autofocus when form bodies change (e.g. step navigation)\n setTimeout(() => {\n this.getCurrentFormBody()?.applyAutoFocus();\n }, 100);\n // Re-measure in case dynamic field visibility changed a step's height\n this.measureTallestStep();\n });\n // Initial validity check\n this.trackCurrentStepValidity();\n\n // Pre-size the modal to the tallest step so it does not jump between steps.\n // All steps are already rendered (display:none), so this is a pure layout\n // read — it creates no components and triggers no data loads or autofocus.\n setTimeout(() => this.measureTallestStep(), 0);\n // A second pass catches content that grows after async data sources resolve.\n setTimeout(() => this.measureTallestStep(), 300);\n }\n\n isTextBody(step: WizardStepConfig): boolean {\n return typeof step.body === 'string';\n }\n\n ngOnDestroy(): void {\n this.statusSubscription?.unsubscribe();\n this.formBodiesSubscription?.unsubscribe();\n }\n\n /**\n * Measures every step's natural height and records the tallest as\n * {@link measuredMinHeight}. Monotonic: the value only ever grows, so a\n * re-measure can never shrink the modal. Skipped when the modal has an\n * explicit height or is full-size (those are already fixed-height).\n */\n private measureTallestStep(): void {\n if (this.config.sizeHeight || this.config.sizeWidth === ModalSize.FULL) return;\n const wrappers = this.stepWrappers?.toArray().map(ref => ref.nativeElement) ?? [];\n if (wrappers.length === 0) return;\n\n // Synchronous pre-paint pass: show one step at a time, read its height,\n // then restore the original display values (so there is no visible flicker).\n const originalDisplay = wrappers.map(el => el.style.display);\n let tallest = 0;\n for (let i = 0; i < wrappers.length; i++) {\n for (let j = 0; j < wrappers.length; j++) {\n wrappers[j].style.display = i === j ? 'block' : 'none';\n }\n tallest = Math.max(tallest, wrappers[i].offsetHeight);\n }\n wrappers.forEach((el, i) => (el.style.display = originalDisplay[i]));\n\n if (tallest > this.measuredMinHeight) {\n this.measuredMinHeight = tallest;\n this.cdr.detectChanges();\n }\n }\n\n /** Get visible steps (filtered by visibility condition) */\n get visibleSteps(): WizardStepConfig[] {\n return this.config.steps.filter(s => this.isStepVisible(s));\n }\n\n isStepVisible(step: WizardStepConfig): boolean {\n if (!step.visible) return true;\n return step.visible(this.getAggregatedData());\n }\n\n get currentStep() {\n return this.config.steps.find(s => s.id === this.currentStepId);\n }\n\n get currentVisibleIndex(): number {\n return this.visibleSteps.findIndex(s => s.id === this.currentStepId);\n }\n\n get currentStepIndex(): number {\n return this.config.steps.findIndex(s => s.id === this.currentStepId);\n }\n\n get canGoBack(): boolean {\n return this.currentVisibleIndex > 0;\n }\n\n get canGoNext(): boolean {\n return this.currentVisibleIndex < this.visibleSteps.length - 1;\n }\n\n get isLastStep(): boolean {\n return this.currentVisibleIndex === this.visibleSteps.length - 1;\n }\n\n /** Index of the current step for the progress line */\n get currentProgressIndex(): number {\n return this.currentVisibleIndex;\n }\n\n get isFreeFlow(): boolean {\n return this.config.flow === WizardFlowMode.FREE;\n }\n\n canNavigateToStep(step: WizardStepConfig): boolean {\n if (!this.isFreeFlow) return false;\n return this.isStepVisible(step);\n }\n\n async goToStep(step: WizardStepConfig): Promise<void> {\n if (!this.canNavigateToStep(step)) return;\n if (step.id === this.currentStepId) return;\n\n // Validate current step's form before allowing direct step navigation\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form.invalid) {\n formBody.form.markAllAsTouched();\n return;\n }\n\n const previousStepId = this.currentStepId;\n this.currentStepId = step.id;\n\n if (!this.visitedStepIds.includes(this.currentStepId)) {\n this.visitedStepIds.push(this.currentStepId);\n }\n\n await this.notifyStepChange(previousStepId, NavigationDirection.DIRECT);\n this.trackCurrentStepValidity();\n }\n\n /** Find the MnFormBodyComponent for the current step */\n private getCurrentFormBody(): MnFormBodyComponent | undefined {\n if (!this.formBodies) return undefined;\n // formBodies only contains entries for steps that have stepFormConfigs\n // We need to find which form body index corresponds to the current step\n const formStepIds = this.config.steps\n .filter(s => this.stepFormConfigs[s.id])\n .map(s => s.id);\n const formIndex = formStepIds.indexOf(this.currentStepId);\n if (formIndex === -1) return undefined;\n return this.formBodies.toArray()[formIndex];\n }\n\n private trackCurrentStepValidity(): void {\n // Unsubscribe from previous\n this.statusSubscription?.unsubscribe();\n this.statusSubscription = undefined;\n\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form) {\n this.isCurrentStepValid = formBody.form.valid;\n this.statusSubscription = formBody.form.statusChanges.subscribe(() => {\n this.isCurrentStepValid = formBody.form.valid;\n this.cdr.detectChanges();\n });\n } else {\n this.isCurrentStepValid = true;\n }\n this.cdr.detectChanges();\n }\n\n async next(): Promise<void> {\n if (!this.canGoNext) return;\n\n const currentStep = this.currentStep;\n\n // Validate embedded form if present\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form.invalid) {\n formBody.form.markAllAsTouched();\n return;\n }\n\n if (currentStep?.guard?.canExit) {\n const canExit = await currentStep.guard.canExit();\n if (!canExit) return;\n }\n\n if (currentStep?.validators) {\n for (const validator of currentStep.validators) {\n const result = await validator.validate();\n if (result.status === 'invalid') return;\n }\n }\n\n // Find next visible step\n const nextStep = this.visibleSteps[this.currentVisibleIndex + 1];\n if (!nextStep) return;\n\n if (nextStep.guard?.canEnter) {\n const canEnter = await nextStep.guard.canEnter();\n if (!canEnter) return;\n }\n\n const previousStepId = this.currentStepId;\n this.currentStepId = nextStep.id;\n\n if (!this.visitedStepIds.includes(this.currentStepId)) {\n this.visitedStepIds.push(this.currentStepId);\n }\n\n await this.notifyStepChange(previousStepId, NavigationDirection.FORWARD);\n this.trackCurrentStepValidity();\n }\n\n async back(): Promise<void> {\n if (!this.canGoBack) {\n // Call onCancel handler if configured\n if (this.config.onCancel) {\n await this.config.onCancel(ModalCloseReason.CANCELLED);\n }\n this.modalRef.dismiss(ModalCloseReason.CANCELLED);\n return;\n }\n\n const prevStep = this.visibleSteps[this.currentVisibleIndex - 1];\n const previousStepId = this.currentStepId;\n\n // Remove current step from visited so the circle resets\n this.visitedStepIds = this.visitedStepIds.filter(id => id !== this.currentStepId);\n\n this.currentStepId = prevStep.id;\n\n await this.notifyStepChange(previousStepId, NavigationDirection.BACKWARD);\n this.trackCurrentStepValidity();\n }\n\n async complete(): Promise<void> {\n if (this.isCompleting) return;\n\n const currentStep = this.currentStep;\n\n // Validate embedded form if present\n const formBody = this.getCurrentFormBody();\n if (formBody && formBody.form.invalid) {\n formBody.form.markAllAsTouched();\n return;\n }\n\n if (currentStep?.validators) {\n for (const validator of currentStep.validators) {\n const result = await validator.validate();\n if (result.status === 'invalid') return;\n }\n }\n\n this.isCompleting = true;\n this.wizardErrors = {};\n this.cdr.detectChanges();\n\n try {\n const aggregatedData = this.getAggregatedData();\n\n // Run cross-step validators (onBeforeComplete)\n if (this.config.onBeforeComplete) {\n for (const validator of this.config.onBeforeComplete) {\n const errors = await validator(aggregatedData);\n if (errors) {\n this.wizardErrors = { ...this.wizardErrors, ...errors };\n }\n }\n if (Object.keys(this.wizardErrors).length > 0) {\n this.isCompleting = false;\n this.cdr.detectChanges();\n return;\n }\n }\n\n const result: WizardResult = {\n status: ModalCloseReason.COMPLETED,\n visitedStepIds: this.visitedStepIds,\n payload: aggregatedData,\n };\n\n if (this.config.onComplete) {\n await this.config.onComplete.handle(result);\n }\n\n this.modalRef.close(result);\n } catch (error) {\n this.isCompleting = false;\n this.cdr.detectChanges();\n console.error('Wizard completion error:', error);\n }\n }\n\n /** Collect form data from all form-driven steps, namespaced by step ID */\n private getAggregatedData(): Record<ModalStepId, Record<string, unknown>> {\n const aggregated: Record<ModalStepId, Record<string, unknown>> = {};\n if (!this.formBodies) return aggregated;\n\n const formStepIds = this.config.steps\n .filter(s => this.stepFormConfigs[s.id])\n .map(s => s.id);\n\n this.formBodies.toArray().forEach((fb, index) => {\n if (fb.form && formStepIds[index]) {\n aggregated[formStepIds[index]] = { ...fb.form.value };\n }\n });\n\n return aggregated;\n }\n\n /**\n * Maps a footer action's ActionStyle to mnButton data props.\n * @param action The footer action configuration.\n */\n getFooterActionButtonData(action: ModalFooterAction<unknown>): Partial<MnButtonTypes> {\n switch (action.style) {\n case ActionStyle.DANGER:\n return { variant: 'outline', color: 'danger' };\n case ActionStyle.PRIMARY:\n return { variant: 'fill', color: 'primary' };\n case ActionStyle.SECONDARY:\n return { variant: 'outline', color: 'secondary' };\n case ActionStyle.GHOST:\n return {variant: 'text', color: 'secondary'};\n default:\n return { variant: 'outline', color: 'secondary' };\n }\n }\n\n /**\n * Handles a custom footer action click.\n * @param action The footer action configuration.\n */\n async handleFooterAction(action: ModalFooterAction<unknown>): Promise<void> {\n if (action.handler) {\n await action.handler(this.modalRef as unknown as ModalRef<unknown>);\n }\n if (action.closesModal) {\n this.modalRef.close((action.closeReason || ModalCloseReason.PROGRAMMATIC) as unknown as WizardResult);\n }\n }\n\n private async notifyStepChange(previousStepId: ModalStepId, direction: NavigationDirection): Promise<void> {\n if (this.config.onStepChange) {\n await this.config.onStepChange.handle({\n previousStepId,\n currentStepId: this.currentStepId,\n direction,\n });\n }\n }\n}\n","<div class=\"flex flex-col flex-auto min-h-0\">\n @if (config.component || config.template) {\n <mn-custom-body-host\n [config]=\"$any(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"block flex-none px-6 pt-6\"\n ></mn-custom-body-host>\n }\n\n <!-- Steps header — fixed (does not scroll with the step body) -->\n <div class=\"flex-none px-6 pt-2 pb-4 border-b border-base-300 bg-base-100\">\n <div class=\"relative flex items-start\">\n <!-- Background line spanning from first circle center to last circle center -->\n <div\n [style.left]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n [style.right]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n class=\"absolute top-3.75 h-1 bg-base-300 z-0\"\n ></div>\n\n <!-- Progress fill line -->\n @if (visibleSteps.length > 1) {\n <div\n [style.left]=\"'calc(' + 100 / (2 * visibleSteps.length) + '%)'\"\n [style.width]=\"'calc(' + (currentProgressIndex / (visibleSteps.length - 1)) * (100 - 100 / visibleSteps.length) + '%)'\"\n class=\"absolute top-3.75 h-1 bg-success z-1 transition-all duration-500\"\n ></div>\n }\n\n @for (step of visibleSteps; track step.id; let i = $index; ) {\n <div\n (keyup.enter)=\"isFreeFlow ? goToStep(step) : null\"\n (click)=\"isFreeFlow ? goToStep(step) : null\"\n [attr.tabindex]=\"isFreeFlow && canNavigateToStep(step) ? 0 : null\"\n [class.cursor-pointer]=\"isFreeFlow && canNavigateToStep(step)\"\n class=\"relative flex flex-col items-center gap-1 z-10 w-0 flex-1\"\n >\n <div\n [ngClass]=\"{\n 'bg-primary text-primary-content': step.id === currentStepId,\n 'bg-success text-success-content': visitedStepIds.includes(step.id) && step.id !== currentStepId,\n 'bg-base-200 text-base-content/50': !visitedStepIds.includes(step.id) && step.id !== currentStepId\n }\"\n class=\"w-8 h-8 rounded-full flex items-center justify-center font-semibold transition-all text-sm\"\n >{{ i + 1 }}\n </div>\n <div\n [ngClass]=\"{\n 'text-base-content font-semibold': step.id === currentStepId,\n 'text-base-content/50': step.id !== currentStepId\n }\"\n class=\"text-xs text-center whitespace-nowrap hidden sm:block\"\n >{{ step.title }}\n </div>\n\n </div>\n }\n </div>\n </div>\n\n <!-- Step body — the only scrolling region in the wizard -->\n <div class=\"flex-auto min-h-0 overflow-y-auto px-6 py-6\">\n <div [style.min-height]=\"measuredMinHeight ? measuredMinHeight + 'px' : null\" class=\"min-h-48\">\n @for (step of config.steps; track step.id) {\n <div #stepWrapper [style.display]=\"step.id === currentStepId ? 'block' : 'none'\">\n <h3 class=\"text-lg font-semibold text-base-content mb-4\">{{ step.title }}</h3>\n <div class=\"text-base-content/80\">\n <!-- Form step -->\n @if (stepFormConfigs[step.id]) {\n <mn-form-body\n [config]=\"stepFormConfigs[step.id]\"\n [modalRef]=\"$any(modalRef)\"\n [hideFooter]=\"true\"\n [hideCustomBody]=\"true\"\n ></mn-form-body>\n }\n\n <!-- Text body -->\n @if (!stepFormConfigs[step.id] && isTextBody(step)) {\n <div>\n {{ step.body }}\n </div>\n }\n\n <!-- Dynamic content container for component/template bodies -->\n <ng-container #dynamicContainer></ng-container>\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Wizard-level errors (from onBeforeComplete) — fixed, above the footer -->\n @if (wizardErrors && (wizardErrors | keyvalue).length > 0) {\n <div class=\"flex flex-col gap-1 mx-6 mb-2 px-2 py-2 bg-red-50 rounded-md\">\n @for (err of wizardErrors | keyvalue; track err.key) {\n <div class=\"text-red-500 text-sm\">\n {{ err.value }}\n </div>\n }\n </div>\n }\n\n <!-- Footer — fixed (does not scroll with the step body) -->\n <div class=\"flex-none flex gap-3 px-6 pt-4 pb-6 border-t border-base-300 bg-base-100\">\n @if (!currentStep?.hideBack) {\n <button\n mnButton\n [data]=\"{ variant: 'outline', color: 'secondary' }\"\n (click)=\"back()\"\n >\n {{ currentStep?.backLabel || (canGoBack ? labels.back : labels.close) }}\n </button>\n }\n\n <!-- Custom footer actions -->\n @if (config.footerActions) {\n <mn-footer-actions\n [actions]=\"config.footerActions\"\n (actionClick)=\"handleFooterAction($any($event))\"\n ></mn-footer-actions>\n } @else {\n <div class=\"flex-1\"></div>\n }\n\n @if (!isLastStep) {\n <button\n mnButton\n [data]=\"{ variant: 'fill', color: 'primary', disabled: !isCurrentStepValid }\"\n (click)=\"next()\"\n >\n {{ currentStep?.nextLabel || labels.next }}\n </button>\n }\n\n @if (isLastStep) {\n <button\n mnButton\n [data]=\"{ variant: 'fill', color: 'primary', disabled: !isCurrentStepValid || isCompleting }\"\n [disabled]=\"!isCurrentStepValid || isCompleting\"\n (click)=\"complete()\"\n >\n {{ currentStep?.nextLabel || (isCompleting ? labels.completing : labels.complete) }}\n </button>\n }\n </div>\n</div>\n","import {ChangeDetectorRef, Component, Input, OnInit, ViewChild, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { MnModalRef } from '../../mn-modal-ref';\nimport {\n ConfirmationModalConfig,\n ConfirmationTone,\n ActionStyle,\n ModalCloseReason,\n} from '../../mn-modal.types';\nimport { MnButton } from '../../../mn-button/mn-button';\nimport { MnFormBodyComponent } from '../mn-form-body/mn-form-body.component';\nimport { MnCustomBodyHostComponent } from '../mn-custom-body-host/mn-custom-body-host.component';\nimport { MnLanguageService } from '../../../../language/mn-language.service';\n\n@Component({\n selector: 'mn-confirmation-body',\n standalone: true,\n imports: [CommonModule, MnButton, MnFormBodyComponent, MnCustomBodyHostComponent, ReactiveFormsModule],\n templateUrl: './mn-confirmation-body.component.html',\n styleUrls: ['./mn-confirmation-body.component.css'],\n})\nexport class MnConfirmationBodyComponent<TResult = boolean> implements OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n @Input() config!: ConfirmationModalConfig<TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n\n @ViewChild(MnFormBodyComponent) formBody?: MnFormBodyComponent;\n\n confirmButtonStatus = 'VALID';\n hasFormFields = false;\n\n private languageService = inject(MnLanguageService);\n\n ngOnInit(): void {\n this.hasFormFields = !!(\n (this.config.fields && this.config.fields.length > 0) ||\n (this.config.fieldGroups && this.config.fieldGroups.length > 0) ||\n (this.config.rows && this.config.rows.length > 0)\n );\n }\n\n onFormStatusChange(status: string): void {\n this.confirmButtonStatus = status;\n this.cdr.markForCheck();\n this.cdr.detectChanges();\n }\n\n async confirm(): Promise<void> {\n if (this.hasFormFields && this.formBody?.form.invalid) {\n this.formBody.form.markAllAsTouched();\n return;\n }\n\n const result = (this.hasFormFields ? this.formBody?.form.value : true) as TResult;\n\n if (this.config.confirm?.handler) {\n await this.config.confirm.handler.handle(result);\n }\n\n this.modalRef.close(result);\n }\n\n cancel(): void {\n const reason = this.config.cancel?.reason || ModalCloseReason.CANCELLED;\n this.modalRef.dismiss(reason);\n }\n\n private resolveLabel(value: string | undefined, key: string, fallback: string): string {\n if (value) return value;\n const translated = this.languageService.translate(`common.${key}`);\n return translated === `common.${key}` ? fallback : translated;\n }\n\n get confirmLabel(): string {\n return this.resolveLabel(this.config.confirm?.label, 'confirm', 'Confirm');\n }\n\n get cancelLabel(): string {\n return this.resolveLabel(this.config.cancel?.label, 'cancel', 'Cancel');\n }\n\n get confirmStyle(): ActionStyle {\n return this.config.confirm?.style || ActionStyle.PRIMARY;\n }\n\n get cancelStyle(): ActionStyle {\n return this.config.cancel?.style || ActionStyle.SECONDARY;\n }\n\n get toneClass(): string {\n switch (this.config.tone) {\n case ConfirmationTone.WARNING:\n return 'tone-warning';\n case ConfirmationTone.DANGER:\n return 'tone-danger';\n default:\n return 'tone-default';\n }\n }\n\n getButtonColor(style: ActionStyle): 'primary' | 'secondary' | 'danger' | 'warning' | 'success' {\n switch (style) {\n case ActionStyle.PRIMARY:\n return 'primary';\n case ActionStyle.DANGER:\n return 'danger';\n case ActionStyle.GHOST:\n return 'secondary';\n default:\n return 'secondary';\n }\n }\n\n getButtonVariant(style: ActionStyle): 'fill' | 'outline' | 'text' {\n switch (style) {\n case ActionStyle.PRIMARY:\n case ActionStyle.DANGER:\n return 'fill';\n case ActionStyle.GHOST:\n return 'text';\n default:\n return 'outline';\n }\n }\n get isConfirmDisabled(): boolean {\n if (this.hasFormFields) {\n return this.confirmButtonStatus !== 'VALID';\n }\n return false;\n }\n}\n","<div class=\"flex flex-col gap-6\" [ngClass]=\"toneClass\">\n <!-- Custom Content (Component or Template) -->\n @if (config.component || config.template) {\n <mn-custom-body-host\n [config]=\"$any(config)\"\n [modalRef]=\"$any(modalRef)\"\n ></mn-custom-body-host>\n }\n\n <div class=\"flex flex-col items-center text-center gap-6\">\n @if (config.tone === 'warning' || config.tone === 'danger') {\n <div\n class=\"w-12 h-12 rounded-full flex items-center justify-center\"\n [ngClass]=\"{\n 'bg-blue-100 text-blue-500': config.tone !== 'warning' && config.tone !== 'danger',\n 'bg-amber-100 text-amber-500': config.tone === 'warning',\n 'bg-red-100 text-red-500': config.tone === 'danger'\n }\">\n @if (config.tone === 'warning') {\n <svg\n class=\"w-6 h-6\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\"\n />\n </svg>\n }\n @if (config.tone === 'danger') {\n <svg\n class=\"w-6 h-6\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n />\n </svg>\n }\n </div>\n }\n\n @if (config.message) {\n <div class=\"text-base text-base-content/80 leading-relaxed max-w-[28rem]\">\n {{ config.message }}\n </div>\n }\n </div>\n\n <!-- Form Fields / Rows -->\n @if (hasFormFields) {\n <mn-form-body\n [config]=\"$any(config)\"\n [modalRef]=\"$any(modalRef)\"\n [hideFooter]=\"true\"\n [hideCustomBody]=\"true\"\n (formStatusChange)=\"onFormStatusChange($event)\"\n ></mn-form-body>\n }\n\n <div class=\"flex gap-3 w-full pb-6 sticky bottom-0 bg-base-100 z-10\">\n <button\n mnButton\n [data]=\"{\n variant: getButtonVariant(cancelStyle),\n color: getButtonColor(cancelStyle)\n }\"\n (click)=\"cancel()\"\n >\n {{ cancelLabel }}\n </button>\n\n <div class=\"flex-1\"></div>\n\n <button\n mnButton\n [data]=\"{\n variant: getButtonVariant(confirmStyle),\n color: getButtonColor(confirmStyle),\n disabled: isConfirmDisabled\n }\"\n [disabled]=\"isConfirmDisabled\"\n (click)=\"confirm()\"\n >\n {{ confirmLabel }}\n </button>\n </div>\n</div>\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n Input,\n OnDestroy,\n OnInit,\n signal\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MnModalRef} from '../../mn-modal-ref';\nimport {\n ActionStyle,\n BackdropMode,\n CloseMode,\n ConfirmationModalConfig,\n CustomModalConfig,\n FormModalConfig,\n KeyboardMode,\n ModalCloseReason,\n ModalConfig,\n ModalFooterAction,\n ModalKind,\n ModalSize,\n WizardModalConfig,\n} from '../../mn-modal.types';\nimport {MnWizardBodyComponent} from '../mn-wizard-body/mn-wizard-body.component';\nimport {MnFormBodyComponent} from '../mn-form-body/mn-form-body.component';\nimport {MnConfirmationBodyComponent} from '../mn-confirmation-body/mn-confirmation-body.component';\nimport {MnCustomBodyHostComponent} from '../mn-custom-body-host/mn-custom-body-host.component';\nimport {MnFooterActionsComponent} from '../mn-footer-actions/mn-footer-actions.component';\nimport {MnButton} from '../../../mn-button';\nimport {LucideX} from '@lucide/angular';\nimport {MN_HAPTICS} from '../../mn-modal-haptics';\n\n@Component({\n selector: 'mn-modal-shell',\n standalone: true,\n imports: [\n CommonModule,\n MnWizardBodyComponent,\n MnFormBodyComponent,\n MnConfirmationBodyComponent,\n MnCustomBodyHostComponent,\n MnFooterActionsComponent,\n MnButton,\n LucideX,\n ],\n templateUrl: './mn-modal-shell.component.html',\n styleUrls: ['./mn-modal-shell.component.css'],\n})\nexport class MnModalShellComponent<TResult = unknown> implements OnInit, AfterViewInit, OnDestroy {\n private el = inject<ElementRef<HTMLElement>>(ElementRef);\n private cdr = inject(ChangeDetectorRef);\n /** Downward release speed (px/ms) above which a short drag still dismisses — a \"flick\".\n * Native sheets dismiss on a quick flick regardless of distance, not just a long drag. */\n private static readonly FLICK_VELOCITY = 0.5;\n\n @Input() config!: ModalConfig<TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n\n isClosing = false;\n /**\n * Whether another modal is stacked on top of this one. Set imperatively by\n * `MnModalService` on the already-rendered shell below the newly opened one, so it must\n * be a signal: mutating a plain field there changes the host `[class]` after the view was\n * checked (NG0100 ExpressionChangedAfterItHasBeenChecked) and does not schedule change\n * detection in a zoneless app. A signal write both notifies the host binding and schedules CD.\n */\n readonly isStacked = signal(false);\n readonly ModalKind = ModalKind;\n private previouslyFocusedElement: HTMLElement | null = null;\n private focusTrapListener: ((e: KeyboardEvent) => void) | null = null;\n private pollingTimer: ReturnType<typeof setInterval> | null = null;\n private pollAttempts = 0;\n\n ngOnInit(): void {\n this.startPollingIfConfigured();\n }\n /** Minimum drag distance (px) that must accompany a flick, so an incidental fast tap\n * on the grabber never dismisses. Below the distance threshold, only a flick dismisses. */\n private static readonly FLICK_MIN_DISTANCE = 32;\n\n ngOnDestroy(): void {\n this.removeFocusTrap();\n this.stopPolling();\n // Restore focus to previously focused element\n if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.focus === 'function') {\n this.previouslyFocusedElement.focus();\n }\n }\n\n private setupFocusTrap(): void {\n this.focusTrapListener = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n const focusable = this.el.nativeElement.querySelectorAll<HTMLElement>(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n );\n if (focusable.length === 0) return;\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n this.el.nativeElement.addEventListener('keydown', this.focusTrapListener);\n }\n\n private removeFocusTrap(): void {\n if (this.focusTrapListener) {\n this.el.nativeElement.removeEventListener('keydown', this.focusTrapListener);\n this.focusTrapListener = null;\n }\n }\n\n asWizard(config: ModalConfig<TResult>): WizardModalConfig {\n return config as unknown as WizardModalConfig;\n }\n\n asForm(config: ModalConfig<TResult>): FormModalConfig {\n return config as unknown as FormModalConfig;\n }\n\n asConfirmation(config: ModalConfig<TResult>): ConfirmationModalConfig {\n return config as unknown as ConfirmationModalConfig;\n }\n\n asCustom(config: ModalConfig<TResult>): CustomModalConfig {\n return config as unknown as CustomModalConfig;\n }\n\n private static readonly SWIPE_DISMISS_THRESHOLD = 150;\n /** Optional native haptic engine. Absent on the web — every call is null-guarded. */\n private haptics = inject(MN_HAPTICS, {optional: true});\n /** The two most recent (y, timestamp) pointer samples, used to estimate the release\n * velocity for flick-to-dismiss. `t` uses the event timestamp (monotonic, no Date). */\n private lastSample: { y: number; t: number } | null = null;\n\n /** Upper bound for the close wait if no animation/transition end event fires\n * (e.g. an animation was suppressed). Must stay longer than the slowest close\n * path (mobile sheet slide-down 0.45s, swipe glide 0.3s) so it never preempts. */\n private static readonly CLOSE_FALLBACK_MS = 700;\n\n /** Whether this modal renders as a bottom sheet on small screens (default: true). */\n get isMobileSheet(): boolean {\n return this.config.mobileBottomSheet !== false;\n }\n\n /**\n * Triggers the closing animation and resolves once it has actually finished.\n *\n * Deferred via setTimeout to avoid NG0100 when called during a CD cycle.\n * Rather than guess a fixed duration (the old hardcoded 150ms truncated the\n * mobile slide-down, which runs 250ms — and the swipe glide, 300ms), we wait\n * for the container's `animationend`/`transitionend` and tear down then. A\n * fallback timeout guarantees resolution if no such event fires, and we\n * short-circuit entirely under reduced motion (the CSS collapses to instant).\n */\n startClosing(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(() => {\n this.isClosing = true;\n // @HostBinding('class') updates are flushed when the host view is checked\n // (appRef.tick), not by a bare detectChanges() on this dynamically-created\n // root component. Relying on CD alone means the `.closing` class — and thus\n // the slide-down animation — never lands in a zoneless app and is timing-\n // fragile elsewhere. Apply it directly so the close animation is reliable.\n this.el.nativeElement.classList.add('closing');\n this.cdr.detectChanges();\n\n if (this.prefersReducedMotion()) {\n resolve();\n return;\n }\n\n const container = this.el.nativeElement.querySelector('.modal-container') as HTMLElement | null;\n if (!container) {\n resolve();\n return;\n }\n\n let settled = false;\n const done = (event?: Event): void => {\n // Ignore end events bubbling up from descendant animations/transitions.\n if (event && event.target !== container) return;\n if (settled) return;\n settled = true;\n container.removeEventListener('animationend', done);\n container.removeEventListener('transitionend', done);\n clearTimeout(fallback);\n resolve();\n };\n\n // Normal close ends via a keyframe (animationend); the swipe-dismiss\n // glide ends via the transform transition (transitionend).\n container.addEventListener('animationend', done);\n container.addEventListener('transitionend', done);\n // `done` only runs asynchronously, after this assignment completes.\n const fallback = setTimeout(done, MnModalShellComponent.CLOSE_FALLBACK_MS);\n });\n });\n }\n\n private prefersReducedMotion(): boolean {\n return typeof window !== 'undefined'\n && typeof window.matchMedia === 'function'\n && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: Event): void {\n if (this.config.keyboard === KeyboardMode.ENABLED) {\n this.handleClose(ModalCloseReason.ESCAPE);\n if (event && event.preventDefault) {\n event.preventDefault();\n }\n }\n }\n\n onBackdropClick(): void {\n const shouldClose = this.config.backdrop === BackdropMode.CLOSABLE\n || (this.isMobileSheet && this.config.backdrop !== BackdropMode.STATIC);\n if (shouldClose) {\n this.handleClose(ModalCloseReason.BACKDROP);\n }\n }\n\n onCloseButtonClick(): void {\n this.handleClose(ModalCloseReason.DISMISSED);\n }\n /** True once a swipe has crossed the dismiss threshold — slides the sheet off-screen\n * via the transform transition instead of replaying the slide-up keyframe. */\n swipeDismissing = false;\n\n // =========================\n // Mobile bottom-sheet swipe-to-dismiss (via the grabber handle)\n // =========================\n /** Current downward drag offset (px) applied to the sheet while swiping. */\n sheetDragY = 0;\n /** True while the user is actively dragging the grabber (disables snap transition). */\n isDraggingSheet = false;\n private prevSample: { y: number; t: number } | null = null;\n\n @HostBinding('class') get hostClasses(): string {\n const size = this.config.sizeWidth || ModalSize.MD;\n // `closing` is intentionally NOT derived here. startClosing() adds the\n // `.closing` class imperatively (classList.add) for reliable, zoneless-safe\n // application. Deriving it from `isClosing` in this getter as well makes the\n // host class string flip value after the view has been checked, which throws\n // NG0100 (ExpressionChangedAfterItHasBeenCheckedError) in dev. Angular's class\n // binding only manages the tokens it emits, so it leaves the imperatively\n // added `.closing` untouched.\n const animType = typeof this.config.animation === 'string'\n ? this.config.animation\n : this.config.animation?.type || 'slide';\n const animation = ` anim-${animType}`;\n const stacked = this.isStacked() ? ' is-stacked' : '';\n const mobileSheet = this.isMobileSheet ? ' mobile-sheet' : '';\n const swiping = this.swipeDismissing ? ' swipe-dismissing' : '';\n return `modal-shell modal-${size}${animation}${stacked}${mobileSheet}${swiping}`;\n }\n private dragStartY = 0;\n\n /** Whether the sheet can be dismissed at all (drives whether the swipe is armed). */\n private get canClose(): boolean {\n return this.config.closeMode !== CloseMode.DISABLED;\n }\n\n /** Tailwind's `sm` breakpoint — below this the modal renders as a bottom sheet. */\n private static readonly SHEET_MAX_WIDTH = 639.98;\n\n ngAfterViewInit(): void {\n this.previouslyFocusedElement = document.activeElement as HTMLElement;\n this.setupFocusTrap();\n // Focus the modal container\n const container = this.el.nativeElement.querySelector('.modal-container') as HTMLElement;\n if (container) {\n container.focus();\n }\n }\n\n onSheetPointerDown(event: PointerEvent): void {\n if (!this.isMobileSheet || !this.canClose) return;\n // Only a bottom sheet (mobile-width viewport) can be swiped away.\n if (window.innerWidth > MnModalShellComponent.SHEET_MAX_WIDTH) return;\n // Don't hijack drags that begin on an interactive control (e.g. the close button).\n if ((event.target as HTMLElement).closest('button')) return;\n this.isDraggingSheet = true;\n this.dragStartY = event.clientY;\n // Seed the velocity samples so a fast flick that releases on the first move still\n // has a baseline to measure against.\n this.lastSample = {y: event.clientY, t: event.timeStamp};\n this.prevSample = this.lastSample;\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n }\n\n onSheetPointerMove(event: PointerEvent): void {\n if (!this.isDraggingSheet) return;\n // Only track downward movement.\n this.sheetDragY = Math.max(0, event.clientY - this.dragStartY);\n // Roll the sample window forward so pointer-up can read the latest instantaneous speed.\n this.prevSample = this.lastSample;\n this.lastSample = {y: event.clientY, t: event.timeStamp};\n }\n\n async onSheetPointerUp(): Promise<void> {\n if (!this.isDraggingSheet) return;\n this.isDraggingSheet = false;\n\n if (this.shouldDismissSheet()) {\n const closed = await this.handleClose(ModalCloseReason.DISMISSED);\n if (closed) {\n // A confirmed dismissal gets a slightly firmer tick than the open tap.\n this.haptics?.impact('medium');\n // Continue the gesture: glide the sheet the rest of the way down rather than\n // snapping back to 0 and replaying the slide-up keyframe (which looked un-animated).\n this.swipeDismissing = true;\n this.sheetDragY = window.innerHeight;\n this.cdr.detectChanges();\n } else {\n this.snapBack(); // guard rejected — spring back\n }\n } else {\n this.snapBack(); // not far enough / not a flick — spring back\n }\n\n this.lastSample = null;\n this.prevSample = null;\n }\n\n /** Whether the release should dismiss: a long-enough drag OR a fast downward flick. */\n private shouldDismissSheet(): boolean {\n if (this.sheetDragY > MnModalShellComponent.SWIPE_DISMISS_THRESHOLD) {\n return true;\n }\n return this.releaseVelocity() > MnModalShellComponent.FLICK_VELOCITY\n && this.sheetDragY > MnModalShellComponent.FLICK_MIN_DISTANCE;\n }\n\n /** Downward release speed (px/ms) from the last two pointer samples. Positive means\n * moving down. Returns 0 when there is no usable sample window. */\n private releaseVelocity(): number {\n if (!this.lastSample || !this.prevSample) return 0;\n const dt = this.lastSample.t - this.prevSample.t;\n if (dt <= 0) return 0;\n return (this.lastSample.y - this.prevSample.y) / dt;\n }\n\n /** Springs the sheet back to its resting position after a drag that didn't dismiss. */\n private snapBack(): void {\n this.sheetDragY = 0;\n }\n\n /** Attempts to dismiss the modal. Resolves true if it was actually dismissed,\n * false if blocked by a DISABLED close mode or a rejected close guard. */\n private async handleClose(reason: ModalCloseReason): Promise<boolean> {\n if (this.config.closeMode === CloseMode.DISABLED) {\n return false;\n }\n\n if (this.config.closeMode === CloseMode.GUARDED) {\n if (this.config.closeGuard) {\n const allowed = await this.config.closeGuard();\n if (!allowed) return false;\n }\n }\n\n this.modalRef.dismiss(reason);\n return true;\n }\n\n get showBackdrop(): boolean {\n return this.config.backdrop !== BackdropMode.HIDE;\n }\n\n get containerSizeClass(): string {\n switch (this.config.sizeWidth || ModalSize.MD) {\n case ModalSize.SM: return 'w-96';\n case ModalSize.MD: return 'w-[32rem]';\n case ModalSize.LG: return 'w-[48rem]';\n case ModalSize.XL: return 'w-[64rem]';\n case ModalSize.FULL: return 'w-[95vw]';\n default: return 'w-[32rem]';\n }\n }\n\n get containerHeightStyle(): string | null {\n if (this.config.sizeWidth === ModalSize.FULL && !this.config.sizeHeight) {\n return '95vh';\n }\n if (!this.config.sizeHeight) return null;\n switch (this.config.sizeHeight) {\n case ModalSize.SM: return '30vh';\n case ModalSize.MD: return '50vh';\n case ModalSize.LG: return '70vh';\n case ModalSize.XL: return '85vh';\n case ModalSize.FULL: return '95vh';\n default: return null;\n }\n }\n\n get showCloseButton(): boolean {\n return this.config.closeMode !== CloseMode.DISABLED;\n }\n\n // =========================\n // Footer Actions\n // =========================\n\n get hasCustomFooterActions(): boolean {\n return !!this.config.footerActions && this.config.footerActions.length > 0;\n }\n\n get leftFooterActions(): ModalFooterAction<TResult>[] {\n return (this.config.footerActions || []).filter(a => a.position === 'left');\n }\n\n get rightFooterActions(): ModalFooterAction<TResult>[] {\n return (this.config.footerActions || []).filter(a => a.position !== 'left');\n }\n\n async onFooterAction(action: ModalFooterAction<TResult>): Promise<void> {\n if (action.disabled) return;\n if (action.handler) {\n await action.handler(this.modalRef);\n }\n if (action.closesModal) {\n if (action.closeReason === ModalCloseReason.COMPLETED) {\n this.modalRef.close();\n } else {\n this.modalRef.dismiss(action.closeReason || ModalCloseReason.DISMISSED);\n }\n }\n }\n\n getActionButtonColor(style?: ActionStyle): 'primary' | 'secondary' | 'danger' | 'warning' | 'success' {\n switch (style) {\n case ActionStyle.PRIMARY: return 'primary';\n case ActionStyle.DANGER: return 'danger';\n case ActionStyle.GHOST: return 'secondary';\n default: return 'secondary';\n }\n }\n\n getActionButtonVariant(style?: ActionStyle): 'fill' | 'outline' | 'text' {\n switch (style) {\n case ActionStyle.PRIMARY:\n case ActionStyle.DANGER: return 'fill';\n case ActionStyle.GHOST: return 'text';\n default: return 'outline';\n }\n }\n\n // =========================\n // Polling\n // =========================\n\n private startPollingIfConfigured(): void {\n const polling = this.config.polling;\n if (!polling) return;\n if (polling.autoStart === false) return;\n this.startPolling();\n }\n\n private startPolling(): void {\n const polling = this.config.polling;\n if (!polling) return;\n\n this.pollingTimer = setInterval(async () => {\n this.pollAttempts++;\n try {\n const shouldStop = await polling.onPoll(this.modalRef);\n if (shouldStop === true) {\n this.stopPolling();\n }\n } catch (e) {\n console.error('Polling error:', e);\n }\n if (polling.maxAttempts && this.pollAttempts >= polling.maxAttempts) {\n this.stopPolling();\n }\n }, polling.interval);\n }\n\n private stopPolling(): void {\n if (this.pollingTimer) {\n clearInterval(this.pollingTimer);\n this.pollingTimer = null;\n }\n }\n}\n","@if (showBackdrop) {\n <!-- The backdrop is a visual overlay — keyboard dismiss is handled at component level via Escape key -->\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div class=\"modal-backdrop absolute inset-0 bg-black/50 animate-[fadeIn_0.2s_ease-in-out]\" (click)=\"onBackdropClick()\"></div>\n}\n\n<!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events -->\n<div\n class=\"modal-container relative bg-base-100 rounded-lg shadow-xl max-h-[90vh] overflow-hidden flex flex-col\"\n [class.sheet-dragging]=\"isDraggingSheet\"\n [ngClass]=\"containerSizeClass\"\n [style.height]=\"containerHeightStyle\"\n [style.transform]=\"sheetDragY ? 'translateY(' + sheetDragY + 'px)' : null\"\n role=\"dialog\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"config.title ? 'mn-modal-title' : null\"\n [attr.aria-describedby]=\"config.description ? 'mn-modal-description' : null\"\n tabindex=\"-1\"\n (click)=\"$event.stopPropagation()\"\n>\n @if (isMobileSheet) {\n <!-- Drag handle for swipe-to-dismiss, visible only on mobile bottom sheets -->\n <div\n (pointercancel)=\"onSheetPointerUp()\"\n (pointerdown)=\"onSheetPointerDown($event)\"\n (pointermove)=\"onSheetPointerMove($event)\"\n (pointerup)=\"onSheetPointerUp()\"\n class=\"sm:hidden flex justify-center pt-2 pb-1 touch-none cursor-grab\"\n >\n <div class=\"h-1.5 w-10 rounded-full bg-base-300\"></div>\n </div>\n }\n\n <!-- On mobile the whole header doubles as a swipe-to-dismiss surface (drags that\n start on the close button are ignored). The grabber above is the visual cue. -->\n <div [class.border-b]=\"config.kind !== ModalKind.WIZARD\"\n [class.border-base-300]=\"config.kind !== ModalKind.WIZARD\"\n (pointercancel)=\"onSheetPointerUp()\"\n (pointerdown)=\"onSheetPointerDown($event)\"\n (pointermove)=\"onSheetPointerMove($event)\"\n (pointerup)=\"onSheetPointerUp()\"\n [class.cursor-grab]=\"isMobileSheet\"\n [class.sm:cursor-auto]=\"isMobileSheet\"\n [class.sm:touch-auto]=\"isMobileSheet\"\n [class.touch-none]=\"isMobileSheet\"\n class=\"flex items-center justify-between p-6\">\n <div class=\"flex flex-col gap-0.5\">\n @if (config.title) {\n <h2 class=\"m-0 text-xl font-semibold text-base-content\" id=\"mn-modal-title\">{{ config.title }}</h2>\n }\n @if (config.subtitle) {\n <p class=\"m-0 text-sm text-base-content/60 font-normal\">{{ config.subtitle }}</p>\n }\n </div>\n @if (showCloseButton) {\n <div [class]=\"isMobileSheet ? 'hidden sm:flex' : ''\">\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'gray', hover: true, borderRadius: 'md' }\"\n type=\"button\"\n class=\"w-8 h-8\"\n (click)=\"onCloseButtonClick()\"\n aria-label=\"Close modal\"\n >\n <svg lucideX [size]=\"18\"></svg>\n </button>\n </div>\n }\n </div>\n @if (config.description) {\n <p class=\"m-0 px-6 text-sm text-base-content/60 leading-relaxed\" id=\"mn-modal-description\">{{ config.description }}</p>\n }\n\n @if (config.kind === ModalKind.WIZARD) {\n <!-- Wizard manages its own internal scrolling so the steps header and footer\n stay fixed while only the step body scrolls. No padding/scroll here. -->\n <div class=\"flex-auto min-h-0 overflow-hidden flex flex-col\">\n <mn-wizard-body\n [config]=\"asWizard(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"flex-auto min-h-0 flex flex-col\"\n ></mn-wizard-body>\n </div>\n } @else {\n <div class=\"flex-1 overflow-y-auto px-6 pt-6\">\n @if (config.kind === ModalKind.FORM) {\n <mn-form-body\n [config]=\"asForm(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"block h-full\"\n ></mn-form-body>\n }\n\n @if (config.kind === ModalKind.CONFIRMATION) {\n <mn-confirmation-body\n [config]=\"asConfirmation(config)\"\n [modalRef]=\"$any(modalRef)\"\n ></mn-confirmation-body>\n }\n\n @if (config.kind === ModalKind.CUSTOM) {\n <mn-custom-body-host\n [config]=\"asCustom(config)\"\n [modalRef]=\"$any(modalRef)\"\n class=\"block pb-6\"\n ></mn-custom-body-host>\n }\n </div>\n }\n\n <!-- Custom Footer Actions (not for wizard modals, they render their own) -->\n @if (hasCustomFooterActions && config.kind !== ModalKind.WIZARD) {\n <div class=\"flex gap-3 p-6 border-t border-base-300\">\n <mn-footer-actions\n [actions]=\"config.footerActions || []\"\n (actionClick)=\"onFooterAction($event)\"\n ></mn-footer-actions>\n </div>\n }\n</div>\n","import {ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, Injectable,} from '@angular/core';\nimport {MnModalRef} from './mn-modal-ref';\nimport {ModalConfig} from './mn-modal.types';\nimport {MnModalShellComponent} from './components/mn-modal-shell/mn-modal-shell.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class MnModalService {\n private readonly appRef = inject(ApplicationRef);\n private readonly injector = inject(EnvironmentInjector);\n private readonly modalStack: MnModalRef<unknown>[] = [];\n\n open<TResult = unknown, TModel = unknown>(config: ModalConfig<TResult, TModel>): MnModalRef<TResult> {\n // Create the modal shell component\n const componentRef = createComponent(MnModalShellComponent, {\n environmentInjector: this.injector,\n }) as unknown as ComponentRef<MnModalShellComponent<TResult>>;\n\n // TModel is erased at the shell boundary — the shell only needs TResult\n componentRef.instance.config = config as ModalConfig<TResult>;\n\n // Create modal ref\n const modalRef = new MnModalRef<TResult>(componentRef, config as ModalConfig<TResult>);\n componentRef.instance.modalRef = modalRef;\n\n // Update stack and dim previous modal\n if (this.modalStack.length > 0) {\n const prevModal = this.modalStack[this.modalStack.length - 1];\n (prevModal.component as MnModalShellComponent<unknown>).isStacked.set(true);\n }\n this.modalStack.push(modalRef as unknown as MnModalRef<unknown>);\n\n // Attach to application\n this.appRef.attachView(componentRef.hostView);\n const domElem = componentRef.location.nativeElement;\n document.body.appendChild(domElem);\n\n // Clean up on close\n modalRef.afterClosed$.subscribe(() => {\n this.appRef.detachView(componentRef.hostView);\n domElem.remove();\n\n // Update stack\n const index = this.modalStack.indexOf(modalRef as unknown as MnModalRef<unknown>);\n if (index > -1) {\n this.modalStack.splice(index, 1);\n if (this.modalStack.length > 0) {\n const topModal = this.modalStack[this.modalStack.length - 1];\n (topModal.component as MnModalShellComponent<unknown>).isStacked.set(false);\n }\n }\n });\n\n return modalRef;\n }\n}\n","// Types\nexport * from './mn-modal.types';\n\n// Haptics (optional native feedback hook)\nexport * from './mn-modal-haptics';\n\n// Builders\nexport * from './builder';\n\n// Service\nexport { MnModalService } from './mn-modal.service';\nexport { MnModalRef } from './mn-modal-ref';\n\n// Components\nexport { MnModalShellComponent } from './components/mn-modal-shell/mn-modal-shell.component';\nexport { MnWizardBodyComponent } from './components/mn-wizard-body/mn-wizard-body.component';\nexport { MnFormBodyComponent } from './components/mn-form-body/mn-form-body.component';\nexport { MnConfirmationBodyComponent } from './components/mn-confirmation-body/mn-confirmation-body.component';\nexport { MnCustomBodyHostComponent } from './components/mn-custom-body-host/mn-custom-body-host.component';\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {ListDataSource} from './mn-list.types';\nimport {MnCheckbox} from '../mn-checkbox';\nimport {MnSkeleton, MnSkeletonProps} from '../mn-skeleton';\nimport {MnCollectionPagination, MnSelectableCollectionBase} from '../mn-collection';\n\n/** Default skeleton lines reproducing the previous two-bar placeholder. */\nconst DEFAULT_LIST_SKELETON_LINES: Partial<MnSkeletonProps>[] = [\n {shape: 'text', width: '75%'},\n {shape: 'text', width: '50%', height: '0.75rem'},\n];\n\n@Component({\n selector: 'mn-list',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, MnCheckbox, MnSkeleton, MnCollectionPagination],\n templateUrl: './mn-list.component.html',\n styleUrl: './mn-list.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnList<T = unknown>\n extends MnSelectableCollectionBase<T, ListDataSource<T>> {\n @Output() itemClick = new EventEmitter<T>();\n\n protected override readonly componentName = 'MnList';\n\n /** Skeleton lines rendered for each placeholder item, falling back to the default two-bar layout. */\n get skeletonLines(): Partial<MnSkeletonProps>[] {\n const skeleton = this.dataSource.skeleton;\n if (skeleton && !this.isTemplateRef(skeleton)) {\n return skeleton.lines;\n }\n return DEFAULT_LIST_SKELETON_LINES;\n }\n\n // ── Item interaction ──\n\n onItemClick(item: T): void {\n this.dataSource.onItemClick?.(item);\n this.itemClick.emit(item);\n }\n\n // ── Skeleton ──\n\n protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined {\n return this.dataSource?.toolbarTemplate;\n }\n\n @ViewChild('collectionBody') protected collectionBody?: ElementRef<HTMLElement>;\n\n // ── Filtering ──\n\n protected applyFilter(searchForItems: boolean): void {\n this.filteredItems = this.applySearchFilter(this.dataSource.dataRows.value);\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n}\n","<!-- Toolbar: search + custom toolbar template -->\n<div class=\"flex flex-row items-center justify-end gap-2 mb-3\">\n @if (dataSource.canSearch) {\n <div>\n <input\n type=\"text\"\n class=\"input input-sm rounded border border-base-300 bg-base-200 px-3 py-1.5 text-sm text-base-content placeholder-base-content/50 focus:outline-none focus:border-primary-500 w-full max-w-xs\"\n [placeholder]=\"dataSource.searchPlaceholder ?? 'Search...'\"\n (input)=\"onSearch($any($event.target).value)\"\n aria-label=\"Search list\"\n />\n </div>\n }\n @if (dataSource.toolbarTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarTemplate\"></ng-container>\n }\n</div>\n\n<!-- List wrapper -->\n<div\n #collectionBody\n [style.min-height.px]=\"bodyMinHeight\"\n class=\"w-full\"\n [class.border]=\"dataSource.appearance?.bordered\"\n [class.border-base-300]=\"dataSource.appearance?.bordered\"\n [class.rounded]=\"dataSource.appearance?.bordered\"\n role=\"list\"\n aria-label=\"Data list\"\n>\n <!-- Loading state -->\n @if (isLoadingState) {\n @for (_ of skeletonRows; track $index) {\n <div [class.py-2]=\"dataSource.appearance?.compact\" class=\"px-4 py-3\" role=\"listitem\">\n @if (isTemplateRef(dataSource.skeleton)) {\n <ng-container [ngTemplateOutlet]=\"$any(dataSource.skeleton)\"></ng-container>\n } @else {\n <div class=\"flex flex-col gap-1\">\n @for (line of skeletonLines; track $index) {\n <mn-skeleton [data]=\"line\"></mn-skeleton>\n }\n </div>\n }\n </div>\n @if (!$last && (dataSource.appearance?.dividers !== false)) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\n } @else if (isErrorState) {\n <!-- Error state -->\n <div class=\"text-center text-xs py-8\" role=\"listitem\">\n @if (dataSource.errorTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.errorTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-error\">\n <p class=\"text-sm\">{{ dataSource.errorMessage }}</p>\n </div>\n }\n </div>\n } @else {\n <!-- Empty state -->\n @if (filteredItems.length === 0) {\n <div class=\"text-center text-xs py-8\" role=\"listitem\">\n @if (dataSource.emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.emptyTemplate\"></ng-container>\n } @else {\n <div class=\"flex flex-col items-center gap-2 text-base-content/50\">\n <p class=\"text-sm\">{{ dataSource.emptyMessage }}</p>\n </div>\n }\n </div>\n }\n\n <!-- Select all (multi-select) -->\n @if (isMultiSelect && filteredItems.length > 0) {\n <div class=\"flex items-center gap-2 px-4 py-2 bg-base-200 text-sm\">\n <mn-lib-checkbox\n (checkedChange)=\"toggleAll()\"\n [checked]=\"allSelected\"\n [props]=\"{ id: 'mn-list-select-all', label: 'Select all', size: 'sm' }\"\n ></mn-lib-checkbox>\n </div>\n @if (dataSource.appearance?.dividers !== false) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\n\n <!-- Data items -->\n @for (item of paginatedItems; track trackByID($index, item); let odd = $odd; let last = $last) {\n <div\n class=\"flex items-center gap-2 bg-base-100 transition-colors duration-150\"\n [ngClass]=\"{'bg-primary/10': isSelected(item)}\"\n [class.bg-base-200]=\"!isSelected(item) && odd && dataSource.appearance?.dividers !== false\"\n [class.hover:bg-base-200]=\"dataSource.appearance?.hover !== false\"\n [class.cursor-pointer]=\"!!dataSource.onItemClick\"\n [class.px-4]=\"true\"\n [class.py-3]=\"!dataSource.appearance?.compact\"\n [class.py-2]=\"dataSource.appearance?.compact\"\n role=\"listitem\"\n (keyup.enter)=\"onItemClick(item)\"\n (click)=\"onItemClick(item)\"\n [attr.tabindex]=\"dataSource.onItemClick ? 0 : null\"\n >\n <!-- Selection checkbox -->\n @if (hasSelection) {\n <!-- eslint-disable-next-line @angular-eslint/template/click-events-have-key-events,@angular-eslint/template/interactive-supports-focus -->\n <div (click)=\"$event.stopPropagation()\" class=\"shrink-0\">\n <mn-lib-checkbox\n (checkedChange)=\"toggle(item)\"\n [checked]=\"isSelected(item)\"\n [props]=\"{ id: 'mn-list-item-' + $index, size: 'sm' }\"\n ></mn-lib-checkbox>\n </div>\n }\n\n <!-- Item content via template -->\n <div class=\"flex-1 min-w-0\">\n <ng-container\n [ngTemplateOutlet]=\"dataSource.itemTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: item, data: item }\"\n ></ng-container>\n </div>\n </div>\n @if (!last && (dataSource.appearance?.dividers !== false)) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\n }\n</div>\n\n<!-- Load more + pagination -->\n<mn-collection-pagination\n (loadMore)=\"loadMoreRows()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n [currentPage]=\"currentPage\"\n [isPaginated]=\"isPaginated\"\n [isServerPaginated]=\"isServerPaginated\"\n [labels]=\"dataSource.labels\"\n [loadingMoreRows]=\"loadingMoreRows\"\n [pageSizeSelectOptions]=\"pageSizeSelectOptions\"\n [pageSize]=\"pageSize\"\n [showLoadMore]=\"showLoadMore\"\n [totalItemCount]=\"totalItemCount\"\n [totalPages]=\"totalPages\"\n [visiblePages]=\"visiblePages\"\n idPrefix=\"mn-list\"\n></mn-collection-pagination>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Output,\n TemplateRef,\n ViewChild,\n} from '@angular/core';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {FormsModule} from '@angular/forms';\nimport {GridDataSource} from './mn-grid.types';\nimport {MnSkeleton, MnSkeletonProps} from '../mn-skeleton';\nimport {MnInputField} from '../mn-input-field';\nimport {MnCollectionBase, MnCollectionPagination} from '../mn-collection';\n\n/** Default card skeleton: an image block plus two text bars. */\nconst DEFAULT_GRID_SKELETON_LINES: Partial<MnSkeletonProps>[] = [\n {shape: 'rectangle', width: '100%', height: '8rem'},\n {shape: 'text', width: '75%'},\n {shape: 'text', width: '50%', height: '0.75rem'},\n];\n\n/**\n * Responsive card-grid component. Shares the collection chrome (search, every\n * pagination mode, loading skeleton, empty state, toolbar, i18n) with\n * {@link import('../mn-list').MnList} and {@link import('../mn-table').MnTable}\n * via {@link MnCollectionBase}, and lays items out as cards instead of rows.\n * Selection is intentionally not supported.\n */\n@Component({\n selector: 'mn-grid',\n standalone: true,\n imports: [NgTemplateOutlet, FormsModule, MnSkeleton, MnInputField, MnCollectionPagination],\n templateUrl: './mn-grid.component.html',\n styleUrl: './mn-grid.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnGrid<T = unknown> extends MnCollectionBase<T, GridDataSource<T>> {\n @Output() itemClick = new EventEmitter<T>();\n\n protected override readonly componentName = 'MnGrid';\n\n /** Whether the grid uses auto-fit (minCardWidth) instead of explicit columns. */\n get isAutoLayout(): boolean {\n return !!this.dataSource.layout?.minCardWidth;\n }\n\n // ── Layout ──\n\n /** Skeleton lines for the default/lines placeholder; null when a custom template is used. */\n get skeletonLines(): Partial<MnSkeletonProps>[] {\n const skeleton = this.dataSource.skeleton;\n if (skeleton && !this.isTemplateRef(skeleton)) {\n return skeleton.lines;\n }\n return DEFAULT_GRID_SKELETON_LINES;\n }\n\n // ── Item interaction ──\n\n protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined {\n return this.dataSource?.toolbarTemplate;\n }\n\n @ViewChild('collectionBody') protected collectionBody?: ElementRef<HTMLElement>;\n\n // ── Skeleton ──\n\n onItemClick(item: T): void {\n this.dataSource.onItemClick?.(item);\n this.itemClick.emit(item);\n }\n\n // ── Filtering ──\n\n protected applyFilter(searchForItems: boolean): void {\n let items = this.applySearchFilter(this.dataSource.dataRows.value ?? []);\n\n // Preview cap: show only the first `maxItems` cards (pager stays hidden).\n const maxItems = this.dataSource.layout?.maxItems;\n if (maxItems != null) {\n items = items.slice(0, maxItems);\n }\n\n this.filteredItems = items;\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n}\n","<!-- Toolbar: search + custom toolbar template -->\n@if (dataSource.canSearch || dataSource.toolbarTemplate) {\n <div class=\"flex flex-row items-center justify-end gap-2 mb-3\">\n @if (dataSource.canSearch) {\n <mn-lib-input-field\n (ngModelChange)=\"onSearch($event)\"\n [ngModel]=\"searchValue\"\n [props]=\"{\n id: 'mn-grid-search',\n type: 'search',\n label: '',\n placeholder: dataSource.searchPlaceholder ?? 'Search...',\n size: 'sm',\n borderRadius: 'md',\n fullWidth: true\n }\"\n class=\"w-full max-w-xs\"\n ></mn-lib-input-field>\n }\n @if (dataSource.toolbarTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarTemplate\"></ng-container>\n }\n </div>\n}\n\n<!-- Body: skeleton/data swap region. Wrapper holds its height during a server reload. -->\n<div #collectionBody [style.min-height.px]=\"bodyMinHeight\">\n<!-- Loading state -->\n @if (isLoadingState) {\n <div\n [class.mn-grid--auto]=\"isAutoLayout\"\n [style.--mn-grid-cols-base]=\"dataSource.layout?.cols?.base\"\n [style.--mn-grid-cols-lg]=\"dataSource.layout?.cols?.lg\"\n [style.--mn-grid-cols-md]=\"dataSource.layout?.cols?.md\"\n [style.--mn-grid-cols-sm]=\"dataSource.layout?.cols?.sm\"\n [style.--mn-grid-cols-xl]=\"dataSource.layout?.cols?.xl\"\n [style.--mn-grid-gap]=\"dataSource.layout?.gap\"\n [style.--mn-grid-min]=\"dataSource.layout?.minCardWidth\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n class=\"mn-grid\"\n role=\"list\"\n >\n @for (_ of skeletonRows; track $index) {\n <div role=\"listitem\">\n @if (isTemplateRef(dataSource.skeleton)) {\n <ng-container [ngTemplateOutlet]=\"$any(dataSource.skeleton)\"></ng-container>\n } @else {\n <div class=\"flex flex-col gap-2 p-4 border border-base-300 rounded-lg\">\n @for (line of skeletonLines; track $index) {\n <mn-skeleton [data]=\"line\"></mn-skeleton>\n }\n </div>\n }\n </div>\n }\n </div>\n } @else if (isErrorState) {\n <!-- Error state -->\n @if (dataSource.errorTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.errorTemplate\"></ng-container>\n } @else {\n <div\n class=\"flex items-center justify-center min-h-[6rem] py-8 rounded-xl border border-dashed border-error/30 bg-base-100\">\n <p class=\"text-sm text-error\">{{ dataSource.errorMessage }}</p>\n </div>\n }\n} @else {\n <!-- Empty state: a caller-provided template/component (rendered unwrapped, full\n control over its own layout) or, when none is given, the default text. -->\n @if (filteredItems.length === 0) {\n @if (dataSource.emptyTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.emptyTemplate\"></ng-container>\n } @else {\n <div\n class=\"flex items-center justify-center min-h-[6rem] py-8 rounded-xl border border-dashed border-base-content/15 bg-base-100\">\n <p class=\"text-sm text-base-content/40\">{{ dataSource.emptyMessage }}</p>\n </div>\n }\n } @else {\n <!-- Card grid -->\n <div\n [class.mn-grid--auto]=\"isAutoLayout\"\n [style.--mn-grid-cols-base]=\"dataSource.layout?.cols?.base\"\n [style.--mn-grid-cols-lg]=\"dataSource.layout?.cols?.lg\"\n [style.--mn-grid-cols-md]=\"dataSource.layout?.cols?.md\"\n [style.--mn-grid-cols-sm]=\"dataSource.layout?.cols?.sm\"\n [style.--mn-grid-cols-xl]=\"dataSource.layout?.cols?.xl\"\n [style.--mn-grid-gap]=\"dataSource.layout?.gap\"\n [style.--mn-grid-min]=\"dataSource.layout?.minCardWidth\"\n aria-label=\"Card grid\"\n class=\"mn-grid\"\n role=\"list\"\n >\n @for (item of paginatedItems; track trackByID($index, item)) {\n <div\n (click)=\"onItemClick(item)\"\n (keyup.enter)=\"onItemClick(item)\"\n [attr.tabindex]=\"dataSource.onItemClick ? 0 : null\"\n [class.cursor-pointer]=\"!!dataSource.onItemClick\"\n class=\"transition-colors duration-150\"\n role=\"listitem\"\n >\n <ng-container\n [ngTemplateOutletContext]=\"{ $implicit: item, data: item }\"\n [ngTemplateOutlet]=\"dataSource.cardTemplate\"\n ></ng-container>\n </div>\n }\n </div>\n }\n}\n</div>\n\n<!-- Load more + pagination -->\n<mn-collection-pagination\n (loadMore)=\"loadMoreRows()\"\n (pageChange)=\"goToPage($event)\"\n (pageSizeChange)=\"onPageSizeChange($event)\"\n [currentPage]=\"currentPage\"\n [isPaginated]=\"isPaginated\"\n [isServerPaginated]=\"isServerPaginated\"\n [labels]=\"dataSource.labels\"\n [loadingMoreRows]=\"loadingMoreRows\"\n [pageSizeSelectOptions]=\"pageSizeSelectOptions\"\n [pageSize]=\"pageSize\"\n [showLoadMore]=\"showLoadMore\"\n [totalItemCount]=\"totalItemCount\"\n [totalPages]=\"totalPages\"\n [visiblePages]=\"visiblePages\"\n idPrefix=\"mn-grid\"\n></mn-collection-pagination>\n","import { InjectionToken } from '@angular/core';\nimport { CalendarEvent } from './calendar-event.model';\nimport { provideMnComponentConfig } from '../../../config/mn-component-config.providers';\n\n/**\n * Available calendar view modes.\n */\nexport enum CalendarView {\n MONTH = 'MONTH',\n WEEK = 'WEEK',\n DAY = 'DAY'\n}\n\n/**\n * Configuration for the calendar component.\n * All properties are optional — sensible defaults are provided.\n * Can be supplied via the `CALENDAR_CONFIG` injection token or through\n * the `provideMnComponentConfig` helper using component name `'mn-calendar'`.\n */\nexport type CalendarConfig = {\n /** First visible hour in week/day views (0–23). Default: `7`. */\n startHour: number;\n /** Last visible hour in week/day views (1–24, exclusive). Default: `22`. */\n endHour: number;\n /** BCP 47 locale tag used for date/time formatting (e.g. `'en-US'`, `'nl-NL'`). Default: `'en-US'`. */\n locale: string;\n /** Label for the \"Today\" navigation button. Default: `'Today'`. */\n todayLabel: string;\n /** Title shown above the upcoming-events sidebar. Default: `'Upcoming events'`. */\n upcomingEventsTitle: string;\n /** Message shown when there are no upcoming events. Default: `'No upcoming events'`. */\n noUpcomingEvents: string;\n /** Display labels for each calendar view mode. */\n viewLabels: Record<string, string>;\n /** Abbreviated day names starting from Monday (length 7). Derived from `locale` when not set. */\n shortDayNames: string[];\n /** Full day names starting from Monday (length 7). Derived from `locale` when not set. */\n longDayNames: string[];\n /** Screen-width breakpoint (px) below which only day view is shown. Default: `768`. */\n mobileBreakpoint: number;\n}\n\n/**\n * Builds locale-derived day name arrays from a BCP 47 locale string.\n * Uses January 1 2024 (a Monday) as the reference date.\n */\nfunction buildDayNames(locale: string): { short: string[]; long: string[] } {\n const base = new Date(2024, 0, 1); // 2024-01-01 is a Monday\n const short: string[] = [];\n const long: string[] = [];\n for (let i = 0; i < 7; i++) {\n const d = new Date(base);\n d.setDate(base.getDate() + i);\n short.push(d.toLocaleDateString(locale, { weekday: 'short' }));\n long.push(d.toLocaleDateString(locale, { weekday: 'long' }));\n }\n return { short, long };\n}\n\n/** Default calendar configuration values. */\nexport const DEFAULT_CALENDAR_CONFIG: CalendarConfig = (() => {\n const locale = 'en-US';\n const names = buildDayNames(locale);\n return {\n startHour: 7,\n endHour: 22,\n locale,\n todayLabel: 'Today',\n upcomingEventsTitle: 'Upcoming events',\n noUpcomingEvents: 'No upcoming events',\n viewLabels: { MONTH: 'Month', WEEK: 'Week', DAY: 'Day' },\n shortDayNames: names.short,\n longDayNames: names.long,\n mobileBreakpoint: 768,\n };\n})();\n\n/**\n * Injection token for the resolved calendar configuration.\n *\n * Prefer using {@link MN_CALENDAR_CONFIG} with `provideMnComponentConfig`\n * so that settings can be managed via `mn-config.json5`. This token is\n * kept for backward compatibility and manual `providers` usage.\n *\n * @example\n * ```ts\n * providers: [\n * { provide: CALENDAR_CONFIG, useValue: { startHour: 8, endHour: 20, locale: 'nl-NL' } }\n * ]\n * ```\n */\nexport const CALENDAR_CONFIG = new InjectionToken<CalendarConfig>('CalendarConfig', {\n providedIn: 'root',\n factory: () => DEFAULT_CALENDAR_CONFIG\n});\n\n/**\n * Injection token resolved via `MnConfigService` (the `mn-config.json5` system).\n *\n * Use the helper {@link provideMnCalendarConfig} in the component's `providers`\n * array so that calendar settings are read from the config file and support\n * `$translate` markers, section scoping, and instance-id overrides.\n *\n * Component name in the config file: `'mn-calendar'`.\n *\n * @example\n * ```json5\n * // mn-config.json5\n * {\n * defaults: {\n * \"mn-calendar\": {\n * startHour: 8,\n * endHour: 20,\n * locale: \"nl-NL\",\n * todayLabel: { $translate: \"calendar.today\" }\n * }\n * }\n * }\n * ```\n */\nexport const MN_CALENDAR_CONFIG = new InjectionToken<CalendarConfig>('MN_CALENDAR_CONFIG');\n\n/** Component name used to look up calendar settings in `mn-config.json5`. */\nexport const MN_CALENDAR_COMPONENT_NAME = 'mn-calendar';\n\n/**\n * Provider helper that wires the calendar into the `mn-config` system.\n *\n * Add this to the `providers` array of the component (or module) that hosts\n * `<mn-calendar-view>`. It reads defaults and overrides from `mn-config.json5`\n * under the key `\"mn-calendar\"` and provides them via {@link MN_CALENDAR_CONFIG}.\n *\n * @param initial — optional partial defaults merged before config-file values.\n */\nexport function provideMnCalendarConfig(initial?: Partial<CalendarConfig>) {\n return provideMnComponentConfig<CalendarConfig>(MN_CALENDAR_CONFIG, MN_CALENDAR_COMPONENT_NAME, initial);\n}\n\n/**\n * Merges a partial config with defaults, re-deriving day names from locale when needed.\n */\nexport function resolveCalendarConfig(partial?: Partial<CalendarConfig>): CalendarConfig {\n if (!partial) return { ...DEFAULT_CALENDAR_CONFIG };\n const locale = partial.locale ?? DEFAULT_CALENDAR_CONFIG.locale;\n const names = buildDayNames(locale);\n return {\n ...DEFAULT_CALENDAR_CONFIG,\n ...partial,\n locale,\n shortDayNames: partial.shortDayNames ?? names.short,\n longDayNames: partial.longDayNames ?? names.long,\n };\n}\n\n/**\n * Represents a half-hour row in the week/day time grid.\n */\nexport type HourRow = {\n /** The hour value (e.g. 7, 8, …). */\n hour: number;\n /** CSS grid row start (1-based). */\n topRow: number;\n /** CSS grid row end (1-based, exclusive). */\n bottomRow: number;\n}\n\n/**\n * Represents a single day column in the week view header.\n */\nexport type ColumnDay = {\n /** The date this column represents. */\n date: Date;\n /** Abbreviated day name (e.g. \"Mon\"). */\n dayName: string;\n /** Day-of-month number (1–31). */\n dayNumber: number;\n /** Whether this column is today. */\n isToday: boolean;\n}\n\n/**\n * Represents a single cell in the month grid.\n */\nexport type MonthItem = {\n /** The date this cell represents. */\n date: Date;\n /** Day-of-month number (1–31). */\n dayNumber: number;\n /** Whether this date belongs to the currently focused month. */\n isCurrentMonth: boolean;\n /** Whether this date is today. */\n isToday: boolean;\n /** Events occurring on this date. */\n events: CalendarEvent[];\n}\n","import { InjectionToken } from '@angular/core';\nimport { Observable } from 'rxjs';\n\n/**\n * Abstraction for date/time formatting used by calendar components.\n *\n * The library ships a default implementation ({@link DefaultCalendarDateFormatter})\n * that uses `Intl.DateTimeFormat`. Consumers can provide their own implementation\n * (e.g. wrapping `@ngx-translate`) via the {@link CALENDAR_DATE_FORMATTER} token.\n *\n * Locale-independent settings (day names, view labels, \"Today\" label) have been\n * moved to {@link CalendarConfig} so they can be configured declaratively.\n */\nexport type CalendarDateFormatter = {\n /** Formats an hour + minute pair (e.g. `9, 0` → `\"09:00 AM\"`). */\n formatTimeI(hour: number, minute: number): Promise<string>;\n /** Formats the time portion of a Date. Returns `''` for `undefined`. */\n formatTime(date: Date | undefined): Promise<string>;\n /** Formats a full date-time string as an Observable. */\n formatDateTime(date: Date): Observable<string>;\n /** Formats a date-only string as an Observable. */\n formatDate(date: Date): Observable<string>;\n /** Formats a Date as `YYYY-MM-DD` for `<input type=\"date\">`. */\n formatDateForFormControl(date: Date): string;\n /** Returns `true` when both dates fall on the same calendar day. */\n isSameDay(date1: Date, date2: Date): boolean;\n /** Formats a Date as \"Month Year\" (e.g. \"January 2026\"). */\n formatMonthName(date: Date): Promise<string>;\n}\n\n/**\n * Injection token for the calendar date formatter.\n *\n * @example\n * ```ts\n * providers: [\n * { provide: CALENDAR_DATE_FORMATTER, useClass: MyCustomFormatter }\n * ]\n * ```\n */\nexport const CALENDAR_DATE_FORMATTER = new InjectionToken<CalendarDateFormatter>('CalendarDateFormatter');\n","import {Injectable, inject} from '@angular/core';\nimport { Observable, of } from 'rxjs';\nimport { CalendarDateFormatter } from './calendar-date-formatter';\nimport { CALENDAR_CONFIG, CalendarConfig, DEFAULT_CALENDAR_CONFIG } from '../models/calendar-config.model';\n\n/**\n * Default implementation of {@link CalendarDateFormatter} that uses the\n * browser's `Intl.DateTimeFormat` API for locale-aware formatting.\n *\n * The locale is read from the injected {@link CALENDAR_CONFIG}. If no config\n * is provided, `'en-US'` is used as the fallback.\n *\n * This service has no dependency on `@ngx-translate` or any other i18n library,\n * so the calendar library works out of the box. Consumers can replace it with\n * their own implementation via the `CALENDAR_DATE_FORMATTER` injection token.\n */\n@Injectable()\nexport class DefaultCalendarDateFormatter implements CalendarDateFormatter {\n private readonly locale: string;\n\n constructor() {\n const config = inject<CalendarConfig | null>(CALENDAR_CONFIG, {optional: true});\n\n this.locale = config?.locale ?? DEFAULT_CALENDAR_CONFIG.locale;\n }\n\n /** Formats an hour and minute pair into a locale time string (e.g. \"09:00 AM\"). */\n formatTimeI(hour: number, minute: number): Promise<string> {\n const date = new Date();\n date.setHours(hour, minute, 0, 0);\n return Promise.resolve(\n date.toLocaleTimeString(this.locale, { hour: '2-digit', minute: '2-digit' })\n );\n }\n\n /** Formats the time portion of a Date (e.g. \"2:30 PM\"). Returns empty string for undefined. */\n formatTime(date: Date | undefined): Promise<string> {\n if (!date) return Promise.resolve('');\n return Promise.resolve(\n date.toLocaleTimeString(this.locale, { hour: '2-digit', minute: '2-digit' })\n );\n }\n\n /** Formats a Date as a full date-time string (e.g. \"May 15, 2026, 02:30 PM\"). */\n formatDateTime(date: Date): Observable<string> {\n return of(\n date.toLocaleString(this.locale, {\n year: 'numeric', month: 'short', day: 'numeric',\n hour: '2-digit', minute: '2-digit'\n })\n );\n }\n\n /** Formats a Date as a date-only string (e.g. \"May 15, 2026\"). */\n formatDate(date: Date): Observable<string> {\n return of(\n date.toLocaleDateString(this.locale, {\n year: 'numeric', month: 'short', day: 'numeric'\n })\n );\n }\n\n /** Formats a Date as `YYYY-MM-DD` for use in `<input type=\"date\">` controls. */\n formatDateForFormControl(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, '0');\n const d = String(date.getDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n }\n\n /** Returns `true` if both dates fall on the same calendar day. */\n isSameDay(date1: Date, date2: Date): boolean {\n return date1.getFullYear() === date2.getFullYear()\n && date1.getMonth() === date2.getMonth()\n && date1.getDate() === date2.getDate();\n }\n\n /** Formats a Date as \"Month Year\" (e.g. \"January 2026\"). */\n formatMonthName(date: Date): Promise<string> {\n return Promise.resolve(\n date.toLocaleString(this.locale, { month: 'long', year: 'numeric' })\n );\n }\n}\n","import { Component, Input, OnDestroy, OnInit, Output, EventEmitter } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, Subject, takeUntil } from 'rxjs';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarConfig, DEFAULT_CALENDAR_CONFIG, MonthItem, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\n\n/**\n * Month grid view showing a 7×6 grid of day cells.\n *\n * Each cell displays the day number and up to 3 coloured dots representing\n * events on that day. Clicking a cell emits `dayClicked`.\n */\n@Component({\n selector: 'mn-calendar-month',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './calendar-month.component.html',\n styles: [`\n .calendar-month { width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden; }\n .month-header {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n text-align: center;\n font-weight: 600;\n font-size: 13px;\n padding: 8px 0;\n border-bottom: 1px solid var(--color-base-300);\n }\n .month-grid {\n display: grid;\n grid-template-columns: repeat(7, 1fr);\n grid-template-rows: repeat(6, 1fr);\n flex: 1;\n min-height: 0;\n }\n .month-cell {\n min-height: 0;\n padding: 4px 8px;\n border: 1px solid var(--color-base-200);\n cursor: pointer;\n transition: background 0.15s;\n }\n .month-cell:hover { background: var(--color-base-200); }\n .month-cell.other-month { opacity: 0.4; }\n .month-cell.today .day-number {\n background: var(--color-primary);\n color: var(--color-primary-content, white);\n border-radius: 50%;\n width: 24px;\n height: 24px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .day-number { font-size: 13px; font-weight: 500; }\n .month-events { display: flex; gap: 2px; flex-wrap: wrap; margin-top: 4px; }\n .month-event-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n }\n .more-events { font-size: 10px; color: var(--color-base-content, #6b7280); opacity: 0.6; }\n `]\n})\nexport class CalendarMonthComponent implements OnInit, OnDestroy {\n /** The date whose month is displayed. */\n @Input() focusDay!: Date;\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Observable that emits when the focus day changes. */\n @Input() focusDayChanged!: Observable<Date>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Emits the date of a clicked day cell. */\n @Output() dayClicked = new EventEmitter<Date>();\n\n monthItems: MonthItem[] = [];\n longDayNames: string[];\n\n private events: CalendarEvent[] = [];\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n\n constructor() {\n this.formatter = new DefaultCalendarDateFormatter();\n this.longDayNames = DEFAULT_CALENDAR_CONFIG.longDayNames;\n }\n\n ngOnInit() {\n const resolved = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.longDayNames = resolved.longDayNames;\n this.buildMonth();\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.events = events;\n this.buildMonth();\n });\n }\n\n if (this.focusDayChanged) {\n this.focusDayChanged.pipe(takeUntil(this.destroy$)).subscribe(date => {\n this.focusDay = date;\n this.buildMonth();\n });\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Emits the clicked day's date. */\n onDayClick(date: Date) {\n this.dayClicked.emit(date);\n }\n\n /** trackBy for day name headers. */\n trackByDayName(index: number): number {\n return index;\n }\n\n /** trackBy for month grid cells. */\n trackByMonthItem(_index: number, item: MonthItem): number {\n return item.date.getTime();\n }\n\n /** trackBy for event dots. */\n trackByEventDot(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n\n /** Builds the 42-cell month grid (6 rows × 7 columns). */\n private buildMonth() {\n if (!this.focusDay) return;\n\n const year = this.focusDay.getFullYear();\n const month = this.focusDay.getMonth();\n const firstDay = new Date(year, month, 1);\n const lastDay = new Date(year, month + 1, 0);\n\n let startOffset = firstDay.getDay() - 1;\n if (startOffset < 0) startOffset = 6;\n\n const today = new Date();\n this.monthItems = [];\n\n for (let i = startOffset - 1; i >= 0; i--) {\n const date = new Date(year, month, -i);\n this.monthItems.push(this.createMonthItem(date, false, today));\n }\n\n for (let d = 1; d <= lastDay.getDate(); d++) {\n const date = new Date(year, month, d);\n this.monthItems.push(this.createMonthItem(date, true, today));\n }\n\n const remaining = 42 - this.monthItems.length;\n for (let i = 1; i <= remaining; i++) {\n const date = new Date(year, month + 1, i);\n this.monthItems.push(this.createMonthItem(date, false, today));\n }\n }\n\n private createMonthItem(date: Date, isCurrentMonth: boolean, today: Date): MonthItem {\n const isToday = this.formatter.isSameDay(date, today);\n const dayEvents = this.events.filter(e =>\n this.formatter.isSameDay(e.startTime, date) ||\n this.formatter.isSameDay(e.endTime, date) ||\n (e.startTime < date && e.endTime > date)\n );\n\n return {\n date,\n dayNumber: date.getDate(),\n isCurrentMonth,\n isToday,\n events: dayEvents\n };\n }\n}\n","<div class=\"calendar-month\" role=\"grid\" aria-label=\"Month view\">\n <div class=\"month-header\">\n @for (day of longDayNames; track day) {\n <div class=\"day-header\" role=\"columnheader\">{{ day }}</div>\n }\n </div>\n <div class=\"month-grid\">\n @for (item of monthItems; track item.date.getTime()) {\n <div\n class=\"month-cell\"\n [class.other-month]=\"!item.isCurrentMonth\"\n [class.today]=\"item.isToday\"\n (keyup.enter)=\"onDayClick(item.date)\"\n (click)=\"onDayClick(item.date)\"\n tabindex=\"0\"\n role=\"gridcell\"\n [attr.aria-label]=\"item.date.toDateString()\">\n <span class=\"day-number\">{{ item.dayNumber }}</span>\n <div class=\"month-events\">\n @for (event of item.events.slice(0, 3); track $index) {\n <div\n class=\"month-event-dot\"\n [style.background-color]=\"event.color.primaryColor\"\n [title]=\"event.title\">\n </div>\n }\n @if (item.events.length > 3) {\n <span class=\"more-events\">+{{ item.events.length - 3 }}</span>\n }\n </div>\n </div>\n }\n </div>\n</div>\n","import { Injectable } from '@angular/core';\nimport { CalendarEvent } from '../models/calendar-event.model';\n\n/**\n * Service that computes the visual layout of calendar events within a\n * time-grid (week or day view).\n *\n * Responsibilities:\n * - Splitting multi-day events into per-day segments.\n * - Assigning non-overlapping column indices to concurrent events.\n * - Computing the width (column span) each event should occupy.\n *\n * This service is stateless — all state is passed via method parameters.\n * Provide it per-component (not root) so each view gets its own instance.\n */\n@Injectable()\nexport class CalendarEventLayoutService {\n\n /**\n * Returns `true` when two time ranges overlap (exclusive boundaries).\n */\n eventsOverlap(startA: Date, endA: Date, startB: Date, endB: Date): boolean {\n return startA < endB && startB < endA;\n }\n\n /**\n * Returns all events whose time range overlaps the given `[start, end)` window.\n */\n getAllEventsOnSpecificTime(events: CalendarEvent[], start: Date, end: Date): CalendarEvent[] {\n return events.filter(e =>\n this.eventsOverlap(e.startTime, e.endTime, start, end)\n );\n }\n\n /**\n * Splits multi-day events into per-day segments that fit within the\n * visible hour range (`startHour`–`endHour`) and date range.\n *\n * Single-day events are shallow-copied as-is. Multi-day events produce\n * one segment per day with `continued` / `continuedEnd` flags set.\n */\n calculateMultiDayEvents(\n events: CalendarEvent[],\n startHour: number,\n endHour: number,\n rangeStart: Date,\n rangeEnd: Date\n ): CalendarEvent[] {\n const result: CalendarEvent[] = [];\n\n for (const event of events) {\n const eventStart = new Date(event.startTime);\n const eventEnd = new Date(event.endTime);\n\n if (eventStart.toDateString() === eventEnd.toDateString()) {\n result.push({ ...event });\n continue;\n }\n\n const current = new Date(eventStart);\n let isFirst = true;\n\n while (current < eventEnd && current < rangeEnd) {\n if (current >= rangeStart) {\n const dayStart = new Date(current);\n const dayEnd = new Date(current);\n\n if (isFirst) {\n dayEnd.setHours(endHour, 0, 0, 0);\n } else {\n dayStart.setHours(startHour, 0, 0, 0);\n if (current.toDateString() === eventEnd.toDateString()) {\n dayEnd.setHours(eventEnd.getHours(), eventEnd.getMinutes(), 0, 0);\n } else {\n dayEnd.setHours(endHour, 0, 0, 0);\n }\n }\n\n result.push({\n ...event,\n startTime: isFirst ? eventStart : dayStart,\n endTime: current.toDateString() === eventEnd.toDateString() ? eventEnd : dayEnd,\n continued: !isFirst,\n continuedEnd: current.toDateString() !== eventEnd.toDateString()\n });\n }\n\n isFirst = false;\n current.setDate(current.getDate() + 1);\n current.setHours(0, 0, 0, 0);\n }\n }\n\n return result;\n }\n\n /**\n * Assigns a zero-based `column` index to each event so that overlapping\n * events occupy different columns.\n *\n * Events are processed in start-time order (longest duration first for ties).\n * Each event gets the earliest column not already occupied by an overlapping event.\n */\n assignColumnsToEvents(events: CalendarEvent[]): void {\n const sorted = [...events].sort((a, b) => {\n const diff = a.startTime.getTime() - b.startTime.getTime();\n if (diff !== 0) return diff;\n return (b.endTime.getTime() - b.startTime.getTime()) - (a.endTime.getTime() - a.startTime.getTime());\n });\n\n for (const event of sorted) {\n event.column = this.findEarliestPossibleColumn(event, sorted);\n }\n }\n\n /**\n * Assigns a `width` (column span) to each event, expanding it to fill\n * unused columns to its right within the overlapping group.\n */\n assignWidthsToEvents(events: CalendarEvent[], scanStart: Date, scanEnd: Date): void {\n for (const event of events) {\n const overlapping = this.getAllEventsOnSpecificTime(events, event.startTime, event.endTime);\n const maxCol = Math.max(...overlapping.map(e => e.column ?? 0));\n const biggestPossible = this.findBiggestPossibleWidth(event, events, scanStart, scanEnd);\n event.width = Math.max(1, biggestPossible);\n\n if ((event.column ?? 0) + event.width > maxCol + 1) {\n event.width = maxCol + 1 - (event.column ?? 0);\n }\n if (event.width < 1) event.width = 1;\n }\n }\n\n /** Finds the lowest column index not occupied by any overlapping event. */\n private findEarliestPossibleColumn(event: CalendarEvent, allEvents: CalendarEvent[]): number {\n const overlapping = allEvents.filter(e =>\n e !== event\n && e.column !== undefined\n && this.eventsOverlap(e.startTime, e.endTime, event.startTime, event.endTime)\n );\n\n let column = 0;\n while (overlapping.some(e => e.column === column)) {\n column++;\n }\n return column;\n }\n\n /** Computes the maximum width an event can span without overlapping a neighbour to its right. */\n private findBiggestPossibleWidth(\n event: CalendarEvent,\n allEvents: CalendarEvent[],\n _scanStart: Date,\n _scanEnd: Date\n ): number {\n const overlapping = this.getAllEventsOnSpecificTime(allEvents, event.startTime, event.endTime);\n const maxCol = Math.max(...overlapping.map(e => e.column ?? 0));\n const totalColumns = maxCol + 1;\n\n const occupiedCols = overlapping\n .filter(e => e !== event && (e.column ?? 0) > (event.column ?? 0))\n .map(e => e.column ?? 0);\n\n if (occupiedCols.length === 0) {\n return totalColumns - (event.column ?? 0);\n }\n\n return Math.min(...occupiedCols) - (event.column ?? 0);\n }\n}\n","/**\n * Static utility methods for calendar grid positioning.\n */\nexport class CalendarUtility {\n /**\n * Converts a weekday (from `Date.getDay()`) to a 1-based Monday-first column index.\n * Monday = 1, Tuesday = 2, …, Sunday = 7.\n */\n static getCorrectColumn(date: Date): number {\n const day = date.getDay();\n return day === 0 ? 7 : day;\n }\n\n /**\n * Converts an hour + minute pair to a 1-based CSS grid row index\n * within a half-hour grid starting at `startHour`.\n *\n * Each hour occupies two rows (one per 30-minute slot).\n * Formula: `(hour - startHour) * 2 + (minute >= 30 ? 1 : 0) + 1`\n *\n * @returns Grid row number (minimum 1).\n */\n static getCorrectRow(hour: number, minute: number, startHour: number): number {\n const hourOffset = hour - startHour;\n const row = hourOffset * 2 + (minute >= 30 ? 1 : 0) + 1;\n return Math.max(1, row);\n }\n}\n","import {ChangeDetectorRef, Component, OnInit, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CALENDAR_DATE_FORMATTER, CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\n\n/**\n * Default event renderer used when no custom component is provided.\n *\n * Displays the event title, formatted time range, and optional description\n * with the event's colour scheme applied as background and left-border accent.\n */\n@Component({\n selector: 'mn-calendar-event-default',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './calendar-event-default.component.html',\n styles: [`\n .calendar-event-default {\n padding: 4px 8px;\n border-left: 3px solid var(--color-primary, #3b82f6);\n border-radius: 4px;\n font-size: 12px;\n height: 100%;\n overflow: hidden;\n cursor: pointer;\n }\n .event-title {\n font-weight: 600;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: inherit;\n }\n .event-time {\n font-size: 11px;\n opacity: 0.85;\n color: inherit;\n }\n .event-description {\n font-size: 11px;\n opacity: 0.75;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n color: inherit;\n }\n `]\n})\nexport class CalendarEventDefaultComponent implements CalendarEventData, OnInit {\n private cdr = inject(ChangeDetectorRef);\n\n /** The event to render. Set by {@link CalendarEventComponent} after creation. */\n event!: CalendarEvent;\n formattedTime = '';\n\n private formatter: CalendarDateFormatter;\n\n constructor() {\n const formatter = inject<CalendarDateFormatter | null>(CALENDAR_DATE_FORMATTER, {optional: true});\n\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\n }\n\n async ngOnInit() {\n if (this.event) {\n const start = await this.formatter.formatTime(this.event.startTime);\n const end = await this.formatter.formatTime(this.event.endTime);\n this.formattedTime = `${start} - ${end}`;\n this.cdr.markForCheck();\n }\n }\n}\n","<div class=\"calendar-event-default\" [style.background-color]=\"event.color.secondaryColor\" [style.border-left-color]=\"event.color.primaryColor\" [style.color]=\"event.color.primaryColor\">\n <div class=\"event-title\">{{ event.title }}</div>\n <div class=\"event-time\">{{ formattedTime }}</div>\n @if (event.description) {\n <div class=\"event-description\">{{ event.description }}</div>\n }\n</div>\n","import {\n Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef,\n AfterViewInit, Type, OnChanges, SimpleChanges\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarEventDefaultComponent } from '../calendar-event-default/calendar-event-default.component';\n\n/**\n * Dynamic event renderer that injects a custom or default event component\n * into its view container.\n *\n * The component to render is resolved in this order:\n * 1. `customComponent` input (set on the parent week/day view)\n * 2. `event.component` (per-event override)\n * 3. {@link CalendarEventDefaultComponent} (library default)\n */\n@Component({\n selector: 'mn-calendar-event',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './calendar-event.component.html',\n styles: [`\n .calendar-event-wrapper {\n height: 100%;\n width: 100%;\n }\n `]\n})\nexport class CalendarEventComponent implements AfterViewInit, OnChanges {\n /** The event data to render. */\n @Input() event!: CalendarEvent;\n /** Optional custom component type that overrides the default renderer. */\n @Input() customComponent?: Type<CalendarEventData>;\n /** Emits when the rendered event is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n @ViewChild('eventContainer', { read: ViewContainerRef, static: true }) eventContainer!: ViewContainerRef;\n\n private rendered = false;\n\n ngAfterViewInit() {\n this.renderComponent();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n if (this.rendered && (changes['event'] || changes['customComponent'])) {\n this.renderComponent();\n }\n }\n\n /** Emits the event click. */\n onEventClick() {\n this.eventClicked.emit(this.event);\n }\n\n /** Creates the event component dynamically and sets its `event` property. */\n private renderComponent() {\n if (!this.eventContainer) return;\n this.eventContainer.clear();\n const component = this.customComponent ?? this.event?.component ?? CalendarEventDefaultComponent;\n const ref = this.eventContainer.createComponent(component);\n (ref.instance as CalendarEventData).event = this.event;\n ref.changeDetectorRef.detectChanges();\n this.rendered = true;\n }\n}\n","<div (click)=\"onEventClick()\" (keyup.enter)=\"onEventClick()\" class=\"calendar-event-wrapper\" tabindex=\"0\">\n <ng-template #eventContainer></ng-template>\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Output,\n EventEmitter,\n Type,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, Subject, takeUntil } from 'rxjs';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarConfig, ColumnDay, DEFAULT_CALENDAR_CONFIG, HourRow, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\nimport { CalendarEventLayoutService } from '../../services/calendar-event-layout.service';\nimport { CalendarUtility } from '../../utils/calendar-utils';\nimport { CalendarEventComponent } from '../calendar-event/calendar-event.component';\n\n/** Extended hour row with a pre-resolved display label. */\ntype DisplayHourRow = {\n hourLabel: string;\n} & HourRow\n\n/**\n * Week grid view showing 7 day columns with half-hour time slots.\n *\n * Overlapping events within the same day are laid out in sub-columns\n * so they appear side-by-side rather than stacked.\n */\n@Component({\n selector: 'mn-calendar-week',\n standalone: true,\n imports: [CommonModule, CalendarEventComponent],\n templateUrl: './calendar-week.component.html',\n providers: [CalendarEventLayoutService],\n styles: [`\n .calendar-week { width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden; }\n .week-header {\n display: grid;\n border-bottom: 1px solid var(--color-base-300);\n }\n .time-gutter-header { min-width: 60px; }\n .day-column-header {\n text-align: center;\n padding: 8px 4px;\n font-size: 13px;\n }\n .day-column-header.today { color: var(--color-primary); font-weight: 700; }\n .day-name { display: block; font-size: 11px; text-transform: uppercase; color: var(--color-base-content, #6b7280); opacity: 0.7; }\n .day-number { font-size: 18px; font-weight: 600; }\n .week-body { display: grid; grid-template-columns: 60px 1fr; flex: 1; min-height: 0; overflow: hidden; align-items: stretch; }\n .time-gutter {\n display: grid;\n height: 100%;\n min-height: 0;\n }\n .hour-label {\n font-size: 11px;\n color: var(--color-base-content, #6b7280); opacity: 0.7;\n text-align: right;\n padding-right: 8px;\n display: flex;\n align-items: start;\n min-height: 0;\n overflow: hidden;\n }\n .week-grid {\n display: grid;\n position: relative;\n grid-auto-rows: 1fr;\n height: 100%;\n min-height: 0;\n }\n .hour-line {\n border-top: 1px solid var(--color-base-200);\n pointer-events: none;\n min-height: 0;\n }\n .week-event {\n z-index: 1;\n padding: 1px 2px;\n overflow: hidden;\n min-height: 0;\n }\n .current-time-line {\n position: relative;\n z-index: 2;\n pointer-events: none;\n }\n .current-time-dot {\n width: 8px;\n height: 8px;\n background: var(--color-error, #ef4444);\n border-radius: 50%;\n position: absolute;\n left: -4px;\n top: -4px;\n }\n .current-time-rule {\n height: 2px;\n background: var(--color-error, #ef4444);\n width: 100%;\n }\n `]\n})\nexport class CalendarWeekComponent implements OnInit, OnDestroy {\n private layoutService = inject(CalendarEventLayoutService);\n private cdr = inject(ChangeDetectorRef);\n\n /** The date around which the week is centred. */\n @Input() focusDay!: Date;\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Observable that emits when the focus day changes. */\n @Input() focusDayChanged!: Observable<Date>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Optional custom event renderer component. */\n @Input() calendarEventComponent?: Type<CalendarEventData>;\n /** Emits when a calendar event is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n columns: ColumnDay[] = [];\n hourRows: DisplayHourRow[] = [];\n displayEvents: CalendarEvent[] = [];\n totalRows = 0;\n currentTimeRow = 0;\n currentTimeCol = '';\n gridTemplateColumns = 'repeat(7, 1fr)';\n\n private dayColumnMap: { subColumns: number; startCol: number }[] = [];\n private events: CalendarEvent[] = [];\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n private resolvedConfig!: CalendarConfig;\n private currentTimeInterval?: ReturnType<typeof setInterval>;\n\n constructor() {\n this.formatter = new DefaultCalendarDateFormatter();\n }\n\n ngOnInit() {\n this.resolvedConfig = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.buildColumns();\n this.updateCurrentTime();\n this.currentTimeInterval = setInterval(() => this.updateCurrentTime(), 60000);\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.events = events;\n this.refreshEvents();\n this.cdr.markForCheck();\n });\n }\n\n if (this.focusDayChanged) {\n this.focusDayChanged.pipe(takeUntil(this.destroy$)).subscribe(date => {\n this.focusDay = date;\n this.buildColumns();\n this.refreshEvents();\n this.updateCurrentTime();\n this.cdr.markForCheck();\n });\n }\n\n // Build hour rows asynchronously (formatTimeI returns a Promise).\n this.buildHourRows().then(() => this.cdr.markForCheck());\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.currentTimeInterval) clearInterval(this.currentTimeInterval);\n }\n\n /** Returns the CSS `grid-row` value for an event based on its start/end times. */\n getEventRow(event: CalendarEvent): string {\n const startRow = CalendarUtility.getCorrectRow(\n event.startTime.getHours(), event.startTime.getMinutes(), this.resolvedConfig.startHour\n );\n const endRow = CalendarUtility.getCorrectRow(\n event.endTime.getHours(), event.endTime.getMinutes(), this.resolvedConfig.startHour\n );\n return `${startRow} / ${Math.max(endRow, startRow + 1)}`;\n }\n\n /** Returns the CSS `grid-column` span for a day header, accounting for sub-columns. */\n getHeaderColumn(dayIndex: number): string {\n if (!this.dayColumnMap.length) return `${dayIndex + 2} / span 1`;\n const dayInfo = this.dayColumnMap[dayIndex];\n return `${dayInfo.startCol + 1} / span ${dayInfo.subColumns}`;\n }\n\n /** Returns the CSS `grid-column` value for an event within its day's sub-columns. */\n getEventColumn(event: CalendarEvent): string {\n const dayIdx = this.columns.findIndex(c => this.formatter.isSameDay(c.date, event.startTime));\n if (dayIdx < 0) return '1 / span 1';\n const dayInfo = this.dayColumnMap[dayIdx];\n const subCol = (event.column ?? 0) + dayInfo.startCol;\n const width = event.width ?? 1;\n return `${subCol} / span ${width}`;\n }\n\n /** Forwards event click to parent. */\n onEventClick(event: CalendarEvent) {\n this.eventClicked.emit(event);\n }\n\n /** trackBy for hour rows. */\n trackByHour(_index: number, row: DisplayHourRow): number {\n return row.hour;\n }\n\n /** trackBy for day columns. */\n trackByColumn(_index: number, col: ColumnDay): number {\n return col.date.getTime();\n }\n\n /** trackBy for events. */\n trackByEvent(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n\n private async buildHourRows() {\n const hours = this.resolvedConfig.endHour - this.resolvedConfig.startHour;\n this.totalRows = hours * 2;\n\n const rows: DisplayHourRow[] = [];\n for (let i = 0; i < hours; i++) {\n const hour = this.resolvedConfig.startHour + i;\n const label = await this.formatter.formatTimeI(hour, 0);\n rows.push({\n hour,\n topRow: i * 2 + 1,\n bottomRow: i * 2 + 3,\n hourLabel: label\n });\n }\n this.hourRows = rows;\n }\n\n /** Builds the 7 day columns for the current week (Monday–Sunday). */\n private buildColumns() {\n if (!this.focusDay) return;\n\n const shortNames = this.resolvedConfig.shortDayNames;\n const today = new Date();\n\n const day = this.focusDay.getDay();\n const mondayOffset = day === 0 ? -6 : 1 - day;\n const monday = new Date(this.focusDay);\n monday.setDate(this.focusDay.getDate() + mondayOffset);\n\n this.columns = [];\n for (let i = 0; i < 7; i++) {\n const date = new Date(monday);\n date.setDate(monday.getDate() + i);\n this.columns.push({\n date,\n dayName: shortNames[i],\n dayNumber: date.getDate(),\n isToday: this.formatter.isSameDay(date, today)\n });\n }\n }\n\n /** Filters, splits, and lays out events for the current week. */\n private refreshEvents() {\n if (!this.columns.length) return;\n\n const rangeStart = this.columns[0].date;\n const rangeEnd = new Date(this.columns[6].date);\n rangeEnd.setHours(23, 59, 59, 999);\n\n const filtered = this.events.filter(e =>\n this.layoutService.eventsOverlap(e.startTime, e.endTime, rangeStart, rangeEnd)\n );\n\n this.displayEvents = this.layoutService.calculateMultiDayEvents(\n filtered, this.resolvedConfig.startHour, this.resolvedConfig.endHour, rangeStart, rangeEnd\n );\n\n // Assign columns per day so overlapping events within a day get sub-columns\n for (let i = 0; i < 7; i++) {\n const dayStart = new Date(this.columns[i].date);\n dayStart.setHours(0, 0, 0, 0);\n const dayEnd = new Date(this.columns[i].date);\n dayEnd.setHours(23, 59, 59, 999);\n\n const dayEvents = this.displayEvents.filter(e =>\n this.formatter.isSameDay(e.startTime, this.columns[i].date)\n );\n\n this.layoutService.assignColumnsToEvents(dayEvents);\n this.layoutService.assignWidthsToEvents(dayEvents, dayStart, dayEnd);\n }\n\n this.buildGridColumns();\n this.updateCurrentTime();\n }\n\n /** Computes the CSS grid-template-columns string based on per-day sub-column counts. */\n private buildGridColumns() {\n this.dayColumnMap = [];\n let currentCol = 1;\n\n for (let i = 0; i < 7; i++) {\n const dayEvents = this.displayEvents.filter(e =>\n this.formatter.isSameDay(e.startTime, this.columns[i].date)\n );\n\n let maxSubCols = 1;\n for (const e of dayEvents) {\n maxSubCols = Math.max(maxSubCols, (e.column ?? 0) + (e.width ?? 1));\n }\n\n this.dayColumnMap.push({ subColumns: maxSubCols, startCol: currentCol });\n currentCol += maxSubCols;\n }\n\n const parts: string[] = [];\n for (const day of this.dayColumnMap) {\n for (let j = 0; j < day.subColumns; j++) {\n parts.push(`${1 / day.subColumns}fr`);\n }\n }\n this.gridTemplateColumns = parts.join(' ');\n }\n\n /** Updates the current-time red line position. */\n private updateCurrentTime() {\n const now = new Date();\n const dayIdx = this.columns.findIndex(c => this.formatter.isSameDay(c.date, now));\n if (dayIdx >= 0 && this.dayColumnMap.length > 0) {\n const dayInfo = this.dayColumnMap[dayIdx];\n this.currentTimeCol = `${dayInfo.startCol} / span ${dayInfo.subColumns}`;\n this.currentTimeRow = CalendarUtility.getCorrectRow(now.getHours(), now.getMinutes(), this.resolvedConfig.startHour);\n } else {\n this.currentTimeCol = '';\n this.currentTimeRow = 0;\n }\n }\n}\n","<div class=\"calendar-week\" role=\"grid\" aria-label=\"Week view\">\n <div class=\"week-header\" [style.grid-template-columns]=\"'60px ' + gridTemplateColumns\">\n <div class=\"time-gutter-header\"></div>\n @for (col of columns; track col.dayName; let i = $index) {\n <div class=\"day-column-header\"\n [class.today]=\"col.isToday\"\n [style.grid-column]=\"getHeaderColumn(i)\"\n role=\"columnheader\">\n <span class=\"day-name\">{{ col.dayName }}</span>\n <span class=\"day-number\">{{ col.dayNumber }}</span>\n </div>\n }\n </div>\n <div class=\"week-body\">\n <div class=\"time-gutter\" [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-label\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\">\n {{ row.hourLabel }}\n </div>\n }\n </div>\n <div class=\"week-grid\"\n [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\"\n [style.grid-template-columns]=\"gridTemplateColumns\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-line\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\"\n [style.grid-column]=\"'1 / -1'\">\n </div>\n }\n @if (currentTimeRow > 0 && currentTimeCol) {\n <div class=\"current-time-line\"\n [style.grid-row]=\"currentTimeRow\"\n [style.grid-column]=\"currentTimeCol\">\n <div class=\"current-time-dot\"></div>\n <div class=\"current-time-rule\"></div>\n </div>\n }\n @for (event of displayEvents; track $index) {\n <div class=\"week-event\"\n [style.grid-row]=\"getEventRow(event)\"\n [style.grid-column]=\"getEventColumn(event)\"\n (click)=\"onEventClick(event)\"\n (keyup.enter)=\"onEventClick(event)\"\n tabindex=\"0\">\n <mn-calendar-event [customComponent]=\"calendarEventComponent\" [event]=\"event\"></mn-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import {\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n Output,\n EventEmitter,\n Type,\n inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Observable, Subject, takeUntil } from 'rxjs';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarConfig, DEFAULT_CALENDAR_CONFIG, HourRow, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\nimport { CalendarEventLayoutService } from '../../services/calendar-event-layout.service';\nimport { CalendarUtility } from '../../utils/calendar-utils';\nimport { CalendarEventComponent } from '../calendar-event/calendar-event.component';\n\n/** Extended hour row with a pre-resolved display label. */\ntype DisplayHourRow = {\n hourLabel: string;\n} & HourRow\n\n/**\n * Day grid view showing a single day with half-hour time slots.\n *\n * Shares the same layout algorithm as the week view via\n * {@link CalendarEventLayoutService}.\n */\n@Component({\n selector: 'mn-calendar-day',\n standalone: true,\n imports: [CommonModule, CalendarEventComponent],\n templateUrl: './calendar-day.component.html',\n providers: [CalendarEventLayoutService],\n styles: [`\n .calendar-day { width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden; }\n .day-header {\n display: grid;\n grid-template-columns: 60px 1fr;\n border-bottom: 1px solid var(--color-base-300);\n }\n .time-gutter-header { min-width: 60px; }\n .day-column-header {\n text-align: center;\n padding: 8px 4px;\n font-size: 13px;\n }\n .day-column-header.today { color: var(--color-primary); font-weight: 700; }\n .day-name { display: block; font-size: 11px; text-transform: uppercase; color: var(--color-base-content, #6b7280); opacity: 0.7; }\n .day-number { font-size: 18px; font-weight: 600; }\n .day-body { display: grid; grid-template-columns: 60px 1fr; flex: 1; min-height: 0; overflow: hidden; align-items: stretch; }\n .time-gutter { display: grid; height: 100%; min-height: 0; }\n .hour-label {\n font-size: 11px;\n color: var(--color-base-content, #6b7280); opacity: 0.7;\n text-align: right;\n padding-right: 8px;\n display: flex;\n align-items: start;\n min-height: 0;\n overflow: hidden;\n }\n .day-grid {\n display: grid;\n position: relative;\n grid-auto-rows: 1fr;\n height: 100%;\n min-height: 0;\n }\n .hour-line { border-top: 1px solid var(--color-base-200); pointer-events: none; min-height: 0; }\n .day-event { z-index: 1; padding: 1px 2px; overflow: hidden; min-height: 0; }\n .current-time-line { position: relative; z-index: 2; pointer-events: none; }\n .current-time-dot {\n width: 8px; height: 8px; background: var(--color-error, #ef4444); border-radius: 50%;\n position: absolute; left: -4px; top: -4px;\n }\n .current-time-rule { height: 2px; background: var(--color-error, #ef4444); width: 100%; }\n `]\n})\nexport class CalendarDayComponent implements OnInit, OnDestroy {\n private layoutService = inject(CalendarEventLayoutService);\n private cdr = inject(ChangeDetectorRef);\n\n /** The date to display. */\n @Input() focusDay!: Date;\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Observable that emits when the focus day changes. */\n @Input() focusDayChanged!: Observable<Date>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Optional custom event renderer component. */\n @Input() calendarEventComponent?: Type<CalendarEventData>;\n /** Emits when a calendar event is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n hourRows: DisplayHourRow[] = [];\n displayEvents: CalendarEvent[] = [];\n totalRows = 0;\n totalColumns = 1;\n currentTimeRow = 0;\n isToday = false;\n dayName = '';\n\n private events: CalendarEvent[] = [];\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n private resolvedConfig!: CalendarConfig;\n private currentTimeInterval?: ReturnType<typeof setInterval>;\n\n constructor() {\n this.formatter = new DefaultCalendarDateFormatter();\n }\n\n ngOnInit() {\n this.resolvedConfig = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.updateDayInfo();\n this.updateCurrentTime();\n this.currentTimeInterval = setInterval(() => this.updateCurrentTime(), 60000);\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.events = events;\n this.refreshEvents();\n this.cdr.markForCheck();\n });\n }\n\n if (this.focusDayChanged) {\n this.focusDayChanged.pipe(takeUntil(this.destroy$)).subscribe(date => {\n this.focusDay = date;\n this.updateDayInfo();\n this.refreshEvents();\n this.updateCurrentTime();\n this.cdr.markForCheck();\n });\n }\n\n // Build hour rows asynchronously (formatTimeI returns a Promise).\n this.buildHourRows().then(() => this.cdr.markForCheck());\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n if (this.currentTimeInterval) clearInterval(this.currentTimeInterval);\n }\n\n /** Returns the CSS `grid-row` value for an event. */\n getEventRow(event: CalendarEvent): string {\n const startRow = CalendarUtility.getCorrectRow(\n event.startTime.getHours(), event.startTime.getMinutes(), this.resolvedConfig.startHour\n );\n const endRow = CalendarUtility.getCorrectRow(\n event.endTime.getHours(), event.endTime.getMinutes(), this.resolvedConfig.startHour\n );\n return `${startRow} / ${Math.max(endRow, startRow + 1)}`;\n }\n\n /** Returns the CSS `grid-column` value for an event within its sub-columns. */\n getEventColumn(event: CalendarEvent): string {\n const col = (event.column ?? 0) + 1;\n const width = event.width ?? 1;\n return `${col} / span ${width}`;\n }\n\n /** Forwards event click to parent. */\n onEventClick(event: CalendarEvent) {\n this.eventClicked.emit(event);\n }\n\n /** trackBy for hour rows. */\n trackByHour(_index: number, row: DisplayHourRow): number {\n return row.hour;\n }\n\n /** trackBy for events. */\n trackByEvent(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n\n private async buildHourRows() {\n const hours = this.resolvedConfig.endHour - this.resolvedConfig.startHour;\n this.totalRows = hours * 2;\n\n const rows: DisplayHourRow[] = [];\n for (let i = 0; i < hours; i++) {\n const hour = this.resolvedConfig.startHour + i;\n const label = await this.formatter.formatTimeI(hour, 0);\n rows.push({\n hour,\n topRow: i * 2 + 1,\n bottomRow: i * 2 + 3,\n hourLabel: label\n });\n }\n this.hourRows = rows;\n }\n\n /** Updates the day name and isToday flag. */\n private updateDayInfo() {\n if (!this.focusDay) return;\n const today = new Date();\n this.isToday = this.formatter.isSameDay(this.focusDay, today);\n const longNames = this.resolvedConfig.longDayNames;\n const dayIdx = this.focusDay.getDay();\n const mondayIdx = dayIdx === 0 ? 6 : dayIdx - 1;\n this.dayName = longNames[mondayIdx];\n }\n\n /** Filters, splits, and lays out events for the focus day. */\n private refreshEvents() {\n if (!this.focusDay) return;\n\n const rangeStart = new Date(this.focusDay);\n rangeStart.setHours(0, 0, 0, 0);\n const rangeEnd = new Date(this.focusDay);\n rangeEnd.setHours(23, 59, 59, 999);\n\n const filtered = this.events.filter(e =>\n this.layoutService.eventsOverlap(e.startTime, e.endTime, rangeStart, rangeEnd)\n );\n\n this.displayEvents = this.layoutService.calculateMultiDayEvents(\n filtered, this.resolvedConfig.startHour, this.resolvedConfig.endHour, rangeStart, rangeEnd\n );\n\n this.layoutService.assignColumnsToEvents(this.displayEvents);\n this.layoutService.assignWidthsToEvents(this.displayEvents, rangeStart, rangeEnd);\n\n const maxCol = this.displayEvents.reduce((max, e) => Math.max(max, (e.column ?? 0) + (e.width ?? 1)), 1);\n this.totalColumns = maxCol;\n }\n\n /** Updates the current-time red line position. */\n private updateCurrentTime() {\n const now = new Date();\n if (this.focusDay && this.formatter.isSameDay(this.focusDay, now)) {\n this.currentTimeRow = CalendarUtility.getCorrectRow(now.getHours(), now.getMinutes(), this.resolvedConfig.startHour);\n this.isToday = true;\n } else {\n this.currentTimeRow = 0;\n this.isToday = false;\n }\n }\n}\n","<div class=\"calendar-day\" role=\"grid\" aria-label=\"Day view\">\n <div class=\"day-header\">\n <div class=\"time-gutter-header\"></div>\n <div class=\"day-column-header\" [class.today]=\"isToday\" role=\"columnheader\">\n <span class=\"day-name\">{{ dayName }}</span>\n <span class=\"day-number\">{{ focusDay.getDate() }}</span>\n </div>\n </div>\n <div class=\"day-body\">\n <div class=\"time-gutter\" [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-label\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\">\n {{ row.hourLabel }}\n </div>\n }\n </div>\n <div class=\"day-grid\"\n [style.grid-template-rows]=\"'repeat(' + totalRows + ', 1fr)'\"\n [style.grid-template-columns]=\"'repeat(' + totalColumns + ', 1fr)'\">\n @for (row of hourRows; track row.topRow) {\n <div class=\"hour-line\"\n [style.grid-row]=\"row.topRow + '/' + row.bottomRow\"\n [style.grid-column]=\"'1 / -1'\">\n </div>\n }\n @if (currentTimeRow > 0 && isToday) {\n <div class=\"current-time-line\"\n [style.grid-row]=\"currentTimeRow\"\n [style.grid-column]=\"'1 / -1'\">\n <div class=\"current-time-dot\"></div>\n <div class=\"current-time-rule\"></div>\n </div>\n }\n @for (event of displayEvents; track $index) {\n <div class=\"day-event\"\n [style.grid-row]=\"getEventRow(event)\"\n [style.grid-column]=\"getEventColumn(event)\"\n (click)=\"onEventClick(event)\"\n (keyup.enter)=\"onEventClick(event)\"\n tabindex=\"0\">\n <mn-calendar-event [customComponent]=\"calendarEventComponent\" [event]=\"event\"></mn-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import {Component, Input, OnInit, Output, EventEmitter, inject} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CalendarEvent } from '../../models/calendar-event.model';\nimport { CALENDAR_DATE_FORMATTER, CalendarDateFormatter } from '../../services/calendar-date-formatter';\nimport { DefaultCalendarDateFormatter } from '../../services/default-calendar-date-formatter';\n\n/**\n * Renders a single row in the upcoming-events sidebar.\n * Shows the event title, formatted date/time, and optional description.\n */\n@Component({\n selector: 'mn-upcoming-event-row',\n standalone: true,\n imports: [CommonModule],\n templateUrl: './upcoming-event-row.component.html',\n styles: [`\n .upcoming-event-row {\n padding: 8px 12px;\n border-left: 3px solid var(--color-primary, #3b82f6);\n margin-bottom: 8px;\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s;\n }\n .upcoming-event-row:hover { background: var(--color-base-200); }\n .event-title { font-weight: 600; font-size: 13px; }\n .event-time { font-size: 12px; color: var(--color-base-content, #6b7280); opacity: 0.7; }\n .event-description { font-size: 12px; color: var(--color-base-content, #9ca3af); opacity: 0.5; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }\n `]\n})\nexport class UpcomingEventRowComponent implements OnInit {\n /** The event to display. */\n @Input() event!: CalendarEvent;\n /** Emits the event when this row is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n formattedDate = '';\n\n private formatter: CalendarDateFormatter;\n\n constructor() {\n const formatter = inject<CalendarDateFormatter | null>(CALENDAR_DATE_FORMATTER, {optional: true});\n\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\n }\n\n async ngOnInit() {\n if (this.event) {\n const start = await this.formatter.formatTime(this.event.startTime);\n const end = await this.formatter.formatTime(this.event.endTime);\n this.formattedDate = `${start} - ${end}`;\n }\n }\n}\n","<div (click)=\"eventClicked.emit(event)\" (keyup.enter)=\"eventClicked.emit(event)\" [style.border-left-color]=\"event.color.primaryColor\" class=\"upcoming-event-row\"\n tabindex=\"0\">\n <div class=\"event-title\">{{ event.title }}</div>\n <div class=\"event-time\">{{ formattedDate }}</div>\n @if (event.description) {\n <div class=\"event-description\">{{ event.description }}</div>\n }\n</div>\n","import {Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {Observable, Subject, takeUntil} from 'rxjs';\nimport {CalendarEvent} from '../../models/calendar-event.model';\nimport {CalendarConfig, DEFAULT_CALENDAR_CONFIG, resolveCalendarConfig} from '../../models/calendar-config.model';\nimport {UpcomingEventRowComponent} from '../upcoming-event-row/upcoming-event-row.component';\n\n/**\n * Sidebar component that lists the next 10 upcoming events\n * (events whose end time is in the future), sorted by start time.\n */\n@Component({\n selector: 'mn-upcoming-events',\n standalone: true,\n imports: [CommonModule, UpcomingEventRowComponent],\n templateUrl: './upcoming-events.component.html',\n styles: [`\n .upcoming-events {\n padding: 16px;\n }\n .upcoming-title {\n font-size: 16px;\n font-weight: 600;\n margin-bottom: 12px;\n }\n .no-events {\n color: var(--color-base-content, #9ca3af); opacity: 0.5;\n font-size: 14px;\n }\n `]\n})\nexport class UpcomingEventsComponent implements OnInit, OnChanges, OnDestroy {\n /** Observable that emits the full event list whenever it changes. */\n @Input() eventsChanged!: Observable<CalendarEvent[]>;\n /** Resolved calendar configuration passed from the parent view. */\n @Input() config?: CalendarConfig;\n /** Emits when an upcoming event row is clicked. */\n @Output() eventClicked = new EventEmitter<CalendarEvent>();\n\n upcomingEvents: CalendarEvent[] = [];\n title: string;\n noEventsMessage: string;\n\n private destroy$ = new Subject<void>();\n\n constructor() {\n this.title = DEFAULT_CALENDAR_CONFIG.upcomingEventsTitle;\n this.noEventsMessage = DEFAULT_CALENDAR_CONFIG.noUpcomingEvents;\n }\n\n /** Re-read labels when the config input changes (e.g. after a locale switch). */\n ngOnChanges(changes: SimpleChanges) {\n if (changes['config'] && this.config) {\n const resolved = resolveCalendarConfig(this.config);\n this.title = resolved.upcomingEventsTitle;\n this.noEventsMessage = resolved.noUpcomingEvents;\n }\n }\n\n ngOnInit() {\n const resolved = this.config ? resolveCalendarConfig(this.config) : { ...DEFAULT_CALENDAR_CONFIG };\n this.title = resolved.upcomingEventsTitle;\n this.noEventsMessage = resolved.noUpcomingEvents;\n\n if (this.eventsChanged) {\n this.eventsChanged.pipe(takeUntil(this.destroy$)).subscribe(events => {\n const now = new Date();\n this.upcomingEvents = events\n .filter(e => e.endTime > now)\n .sort((a, b) => a.startTime.getTime() - b.startTime.getTime())\n .slice(0, 10);\n });\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** trackBy for upcoming event rows. */\n trackByEvent(_index: number, event: CalendarEvent): string {\n return event.id;\n }\n}\n","<div class=\"upcoming-events\" role=\"complementary\" aria-label=\"Upcoming events\">\n <div class=\"upcoming-title\">{{ title }}</div>\n @for (event of upcomingEvents; track $index) {\n <mn-upcoming-event-row\n [event]=\"event\"\n (eventClicked)=\"eventClicked.emit($event)\">\n </mn-upcoming-event-row>\n }\n @if (upcomingEvents.length === 0) {\n <div class=\"no-events\">{{ noEventsMessage }}</div>\n }\n</div>\n","import {\n Component,\n DestroyRef,\n EventEmitter,\n HostListener,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Type\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {BehaviorSubject, skip, Subject, takeUntil} from 'rxjs';\nimport {CalendarButton, CalendarEvent} from '../../models/calendar-event.model';\nimport {CalendarEventData} from '../../models/calendar-event-data.model';\nimport {\n CALENDAR_CONFIG,\n CalendarConfig,\n CalendarView,\n DEFAULT_CALENDAR_CONFIG,\n MN_CALENDAR_CONFIG,\n provideMnCalendarConfig,\n resolveCalendarConfig\n} from '../../models/calendar-config.model';\nimport {MnLanguageService} from '../../../../language';\nimport {CALENDAR_DATE_FORMATTER, CalendarDateFormatter} from '../../services/calendar-date-formatter';\nimport {DefaultCalendarDateFormatter} from '../../services/default-calendar-date-formatter';\nimport {CalendarMonthComponent} from '../calendar-month/calendar-month.component';\nimport {CalendarWeekComponent} from '../calendar-week/calendar-week.component';\nimport {CalendarDayComponent} from '../calendar-day/calendar-day.component';\nimport {UpcomingEventsComponent} from '../upcoming-events/upcoming-events.component';\nimport {MnButton} from '../../../mn-button';\nimport {MnDatetime} from '../../../mn-datetime';\nimport {FormsModule} from '@angular/forms';\n\n/**\n * Main calendar orchestrator component.\n *\n * Provides a toolbar with view switching (month / week / day), date navigation,\n * and an optional action button. The active view and an upcoming-events sidebar\n * are rendered inside a responsive grid layout.\n *\n * All configuration (visible hours, locale, labels, mobile breakpoint) is read\n * from the `mn-config.json5` system via {@link MN_CALENDAR_CONFIG}, falling back\n * to the legacy {@link CALENDAR_CONFIG} injection token, then to built-in defaults.\n * Date formatting is delegated to the {@link CALENDAR_DATE_FORMATTER} token.\n *\n * @example\n * ```html\n * <mn-calendar-view\n * [showButton]=\"true\"\n * [buttonTitle]=\"'New Event'\"\n * [NewCalendarItemsEvent]=\"eventsEmitter\"\n * (RequestNewCalendarItemsEvent)=\"loadEvents($event)\"\n * (CalendarItemClickedEvent)=\"onEventClick($event)\"\n * (ButtonClickedEvent)=\"openModal()\">\n * </mn-calendar-view>\n * ```\n */\n@Component({\n selector: 'mn-calendar-view',\n standalone: true,\n imports: [\n CommonModule,\n CalendarMonthComponent,\n CalendarWeekComponent,\n CalendarDayComponent,\n UpcomingEventsComponent,\n MnButton,\n MnDatetime,\n FormsModule\n ],\n templateUrl: './calendar-view.component.html',\n providers: [\n provideMnCalendarConfig(DEFAULT_CALENDAR_CONFIG),\n ],\n styles: [`:host { display: flex; flex-direction: column; width: 100%; height: 100%; }`]\n})\nexport class CalendarViewComponent implements OnInit, OnDestroy {\n /** Whether to show the action button in the toolbar. */\n @Input() showButton = false;\n /** Label text for the action button. */\n @Input() buttonTitle = '';\n /** Array of buttons to display in the toolbar's top-right area. */\n @Input() buttons: CalendarButton[] = [];\n /** Custom event renderer component type. */\n @Input() CalendarEventComponent?: Type<CalendarEventData>;\n /** Observable or EventEmitter that pushes new event arrays into the calendar. */\n @Input() NewCalendarItemsEvent?: EventEmitter<CalendarEvent[]>;\n\n /** Emits when the calendar needs fresh event data (e.g. after navigation). */\n @Output() RequestNewCalendarItemsEvent = new EventEmitter<Date>();\n /** Emits when a calendar event is clicked. */\n @Output() CalendarItemClickedEvent = new EventEmitter<CalendarEvent>();\n /** Emits when the action button is clicked. */\n @Output() ButtonClickedEvent = new EventEmitter<void>();\n\n readonly CalendarView = CalendarView;\n currentView = CalendarView.WEEK;\n focusDay = new Date();\n dateInputValue = '';\n viewOptions: { value: CalendarView; label: string }[] = [];\n isMobileView = false;\n isTabletView = false;\n\n /** BehaviorSubject so late-subscribing child views receive the last emitted events. */\n internalEventsChanged = new BehaviorSubject<CalendarEvent[]>([]);\n /** Subject for broadcasting focus-day changes to child views. */\n internalFocusDayChanged = new Subject<Date>();\n\n private destroy$ = new Subject<void>();\n private formatter: CalendarDateFormatter;\n protected config: CalendarConfig;\n /** Reference to the injected mn-config object (mutated in-place on locale change). */\n private readonly mnConfigRef: CalendarConfig | null;\n private readonly destroyRef = inject(DestroyRef);\n private readonly lang = inject(MnLanguageService);\n\n constructor() {\n const formatter = inject<CalendarDateFormatter | null>(CALENDAR_DATE_FORMATTER, {optional: true});\n const mnConfig = inject<CalendarConfig | null>(MN_CALENDAR_CONFIG, {optional: true});\n const legacyConfig = inject<CalendarConfig | null>(CALENDAR_CONFIG, {optional: true});\n\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\n // Keep a reference to the injected config so we can re-read it after locale changes.\n this.mnConfigRef = mnConfig;\n // Priority: mn-config system > legacy CALENDAR_CONFIG > built-in defaults\n const raw = mnConfig ?? legacyConfig ?? undefined;\n this.config = resolveCalendarConfig(raw as Partial<CalendarConfig> | undefined);\n }\n\n @HostListener('window:resize')\n onResize() {\n this.checkMobileView();\n }\n\n ngOnInit() {\n this.rebuildFromConfig();\n\n // Re-resolve config when locale changes (supports $translate in mn-config).\n const sub = this.lang.locale$.pipe(skip(1)).subscribe(() => {\n this.rebuildFromConfig();\n });\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n\n this.checkMobileView();\n this.updateDateInput();\n this.RequestNewCalendarItemsEvent.emit(this.focusDay);\n\n if (this.NewCalendarItemsEvent) {\n this.NewCalendarItemsEvent.pipe(takeUntil(this.destroy$)).subscribe(events => {\n this.internalEventsChanged.next(events);\n });\n }\n }\n\n ngOnDestroy() {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n /** Switches the active view. On mobile, forces day view. */\n switchView(view: CalendarView) {\n if (this.isMobileView) {\n this.currentView = CalendarView.DAY;\n return;\n }\n this.currentView = view;\n }\n\n /** Navigates to the previous period (month / week / day). */\n navigatePrevious() {\n const d = new Date(this.focusDay);\n switch (this.currentView) {\n case CalendarView.MONTH: d.setMonth(d.getMonth() - 1); break;\n case CalendarView.WEEK: d.setDate(d.getDate() - 7); break;\n case CalendarView.DAY: d.setDate(d.getDate() - 1); break;\n }\n this.setFocusDay(d);\n }\n\n /** Navigates to the next period (month / week / day). */\n navigateNext() {\n const d = new Date(this.focusDay);\n switch (this.currentView) {\n case CalendarView.MONTH: d.setMonth(d.getMonth() + 1); break;\n case CalendarView.WEEK: d.setDate(d.getDate() + 7); break;\n case CalendarView.DAY: d.setDate(d.getDate() + 1); break;\n }\n this.setFocusDay(d);\n }\n\n /** Navigates to today. */\n goToToday() {\n this.setFocusDay(new Date());\n }\n\n /** Handles the date-picker input change. */\n onDateInputChange(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n if (value) {\n this.setFocusDay(new Date(value));\n }\n }\n\n /** Handles the mn-lib-datetime ngModel change. */\n onDateStringChange(value: string) {\n if (value) {\n this.setFocusDay(new Date(value));\n }\n }\n\n /** Handles a day click from the month view — switches to day view. */\n onMonthDayClick(date: Date) {\n this.currentView = CalendarView.DAY;\n this.setFocusDay(date);\n }\n\n /** Forwards a child event click to the parent output. */\n onEventClick(event: CalendarEvent) {\n this.CalendarItemClickedEvent.emit(event);\n }\n\n /** trackBy for view option buttons. */\n trackByView(_index: number, item: { value: CalendarView }): string {\n return item.value;\n }\n\n /** Rebuilds view options and labels from the current config. */\n private rebuildFromConfig() {\n // Re-resolve from the injected config reference which is mutated in-place by the provider on locale change.\n if (this.mnConfigRef) {\n this.config = resolveCalendarConfig(this.mnConfigRef as Partial<CalendarConfig>);\n }\n this.viewOptions = [\n { value: CalendarView.MONTH, label: this.config.viewLabels['MONTH'] ?? 'Month' },\n { value: CalendarView.WEEK, label: this.config.viewLabels['WEEK'] ?? 'Week' },\n { value: CalendarView.DAY, label: this.config.viewLabels['DAY'] ?? 'Day' }\n ];\n }\n\n private checkMobileView() {\n const wasMobile = this.isMobileView;\n const width = window.innerWidth;\n this.isMobileView = width < 475;\n this.isTabletView = width >= 475 && width < 1024;\n if (this.isMobileView && !wasMobile) {\n this.currentView = CalendarView.DAY;\n }\n }\n\n private setFocusDay(date: Date) {\n this.focusDay = date;\n this.updateDateInput();\n this.internalFocusDayChanged.next(date);\n this.RequestNewCalendarItemsEvent.emit(date);\n }\n\n private updateDateInput() {\n this.dateInputValue = this.formatter.formatDateForFormControl(this.focusDay);\n }\n}\n","<div class=\"w-full h-full flex flex-col\" role=\"application\" aria-label=\"Calendar\">\n\n @if (isMobileView) {\n <!-- Mobile (<475px): action button as a full-width CTA on top; Today folds into the date-nav row below. -->\n <div class=\"flex flex-col gap-2 py-3\">\n @if (buttons.length || showButton) {\n <div class=\"flex items-center gap-2\">\n @for (btn of buttons; track btn.label) {\n <button class=\"flex-1\" mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">{{ btn.label }}</button>\n }\n @if (showButton) {\n <button class=\"flex-1\" mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">{{ buttonTitle }}</button>\n }\n </div>\n }\n <div class=\"flex items-center gap-1\">\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'primary' }\" (click)=\"goToToday()\">\n {{ config.todayLabel }}\n </button>\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <div class=\"min-w-0 flex-1\">\n <mn-lib-datetime [props]=\"{ id: 'calendar-date-picker', mode: 'date', size: 'md' }\" [ngModel]=\"dateInputValue\" (ngModelChange)=\"onDateStringChange($event)\"></mn-lib-datetime>\n </div>\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n </div>\n </div>\n } @else if (isTabletView) {\n <!-- Tablet (375px–1023px): single row — Today / date-nav / action buttons -->\n <div class=\"flex items-center gap-3 py-3\">\n <div class=\"flex items-center gap-3 min-w-0 flex-1\">\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'fill', color: 'primary' }\" (click)=\"goToToday()\">\n {{ config.todayLabel }}\n </button>\n <div class=\"flex items-center gap-1 min-w-0\">\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <div class=\"min-w-0 flex-1\">\n <mn-lib-datetime [props]=\"{ id: 'calendar-date-picker', mode: 'date', size: 'md' }\" [ngModel]=\"dateInputValue\" (ngModelChange)=\"onDateStringChange($event)\"></mn-lib-datetime>\n </div>\n <button class=\"shrink-0\" mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n </div>\n </div>\n <div class=\"flex items-center gap-2 shrink-0\">\n @for (btn of buttons; track btn.label) {\n <button mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">{{ btn.label }}</button>\n }\n @if (showButton) {\n <button mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">{{ buttonTitle }}</button>\n }\n </div>\n </div>\n } @else {\n <!-- Desktop (≥1024px): full row — Today / date-nav / view-switcher / action buttons -->\n <div class=\"flex items-center justify-between gap-3 py-3\">\n <div class=\"flex items-center gap-3\">\n <button mnButton [data]=\"{ size: 'md', variant: 'fill', color: 'primary' }\" (click)=\"goToToday()\">\n {{ config.todayLabel }}\n </button>\n <div class=\"flex items-center gap-1\">\n <button mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <mn-lib-datetime [props]=\"{ id: 'calendar-date-picker', mode: 'date', size: 'md' }\" [ngModel]=\"dateInputValue\" (ngModelChange)=\"onDateStringChange($event)\"></mn-lib-datetime>\n <button mnButton [data]=\"{ size: 'md', variant: 'outline', color: 'gray' }\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n </div>\n <div class=\"flex border border-base-300 rounded-md overflow-hidden\" role=\"tablist\" aria-label=\"Calendar view\">\n @for (view of viewOptions; track view.value) {\n <button\n mnButton\n [data]=\"{ size: 'md', variant: currentView === view.value ? 'fill' : 'text', color: 'primary' }\"\n role=\"tab\"\n [attr.aria-selected]=\"currentView === view.value\"\n (click)=\"switchView(view.value)\">\n {{ view.label }}\n </button>\n }\n </div>\n </div>\n <div class=\"flex items-center gap-2\">\n @for (btn of buttons; track btn.label) {\n <button mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">{{ btn.label }}</button>\n }\n @if (showButton) {\n <button mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">{{ buttonTitle }}</button>\n }\n </div>\n </div>\n }\n\n <div class=\"grid grid-cols-1 lg:grid-cols-[1fr_220px] gap-3 flex-1 min-h-0\">\n <div class=\"min-w-0 min-h-0 overflow-hidden overflow-y-auto\">\n @if (currentView === CalendarView.MONTH) {\n <mn-calendar-month\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n (dayClicked)=\"onMonthDayClick($event)\">\n </mn-calendar-month>\n }\n @if (currentView === CalendarView.WEEK) {\n <mn-calendar-week\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </mn-calendar-week>\n }\n @if (currentView === CalendarView.DAY) {\n <mn-calendar-day\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </mn-calendar-day>\n }\n </div>\n <div class=\"hidden lg:block border-l border-base-300 overflow-auto\">\n <mn-upcoming-events\n [eventsChanged]=\"internalEventsChanged\"\n [config]=\"config\"\n (eventClicked)=\"onEventClick($event)\">\n </mn-upcoming-events>\n </div>\n </div>\n\n</div>\n","// Main component\nexport { CalendarViewComponent } from './components/calendar-view/calendar-view.component';\n\n// Sub-components\nexport { CalendarWeekComponent } from './components/calendar-week/calendar-week.component';\nexport { CalendarDayComponent } from './components/calendar-day/calendar-day.component';\nexport { CalendarMonthComponent } from './components/calendar-month/calendar-month.component';\nexport { CalendarEventComponent } from './components/calendar-event/calendar-event.component';\nexport { CalendarEventDefaultComponent } from './components/calendar-event-default/calendar-event-default.component';\nexport { UpcomingEventsComponent } from './components/upcoming-events/upcoming-events.component';\nexport { UpcomingEventRowComponent } from './components/upcoming-event-row/upcoming-event-row.component';\n\n// Models\nexport type { CalendarEvent, CurrentTimeCalendarEvent, CalendarButton } from './models/calendar-event.model';\nexport type { CalendarEventData } from './models/calendar-event-data.model';\nexport { CalendarView, CALENDAR_CONFIG, DEFAULT_CALENDAR_CONFIG, MN_CALENDAR_CONFIG, MN_CALENDAR_COMPONENT_NAME, provideMnCalendarConfig, resolveCalendarConfig } from './models/calendar-config.model';\nexport type { CalendarConfig, HourRow, ColumnDay, MonthItem } from './models/calendar-config.model';\nexport type { ColorPreset } from './models/color-preset.model';\n\n// Services / Tokens\nexport { CALENDAR_DATE_FORMATTER } from './services/calendar-date-formatter';\nexport type { CalendarDateFormatter } from './services/calendar-date-formatter';\nexport { DefaultCalendarDateFormatter } from './services/default-calendar-date-formatter';\nexport { CalendarEventLayoutService } from './services/calendar-event-layout.service';\n\n// Utility\nexport { CalendarUtility } from './utils/calendar-utils';\n","import {Component, DoCheck, EventEmitter, Input, isSignal, Output} from '@angular/core';\nimport {MnTranslatePipe} from '../../language';\nimport {MnCollectionState} from '../mn-collection';\nimport {MnTabDataSource, MnTabItem} from './mn-tab.types';\nimport {CommonModule} from '@angular/common';\nimport {MnBadge} from '../mn-badge';\nimport {MnSkeleton} from '../mn-skeleton';\n\n/** Fallback number of skeleton tabs when no items are known and no count is given. */\nconst DEFAULT_SKELETON_TAB_COUNT = 3;\n\n/**\n * Tab component that renders a horizontal tab bar.\n * Supports translation keys for labels via MnTranslatePipe.\n */\n@Component({\n selector: 'mn-tab',\n standalone: true,\n imports: [MnTranslatePipe, CommonModule, MnBadge, MnSkeleton],\n templateUrl: './mn-tab.component.html',\n})\nexport class MnTabComponent implements DoCheck {\n /** Data source containing tab items and default active index. */\n @Input() dataSource!: MnTabDataSource;\n\n /**\n * Whether to enable horizontal scrolling when items overflow.\n * If true, tabs will scroll horizontally instead of shrinking too much.\n */\n @Input() scrollable = false;\n\n /**\n * Whether tabs should stretch to fill the available width.\n * Defaults to false, so tabs only take as much space as their content.\n */\n @Input() justified = false;\n\n /** Emits the newly activated tab item whenever the active tab changes. */\n @Output() activeChange = new EventEmitter<MnTabItem>();\n\n /** The currently active tab item. */\n currentActive?: MnTabItem;\n\n /**\n * Whether the tab bar is loading and should render skeleton tabs, from\n * {@link MnTabDataSource.state}.\n */\n get isLoadingState(): boolean {\n return this.dataSource.state === MnCollectionState.LOADING;\n }\n\n /**\n * Index array sizing the loading skeleton: `skeletonCount` when provided,\n * otherwise the number of known items, falling back to a default when none.\n */\n get skeletonTabs(): number[] {\n const count =\n this.dataSource.skeletonCount ??\n (this.dataSource.items.length || DEFAULT_SKELETON_TAB_COUNT);\n return Array.from({length: count}, (_, index) => index);\n }\n\n /**\n * Re-resolves the active tab on every change-detection pass.\n *\n * The data source is often populated or rebuilt asynchronously (tabs that\n * depend on fetched data or permissions). Resolving the active tab only once\n * at init would leave {@link currentActive} pointing at a stale item — the\n * tab bar would then highlight nothing and swallow the first click — so the\n * selection is kept in sync with whatever the data source currently holds.\n */\n ngDoCheck(): void {\n this.syncActiveTab();\n }\n\n /**\n * Sets the given tab item as active, invoking deactivate/activate callbacks.\n * @param item - The tab item to activate.\n */\n setActive(item: MnTabItem): void {\n if (this.currentActive === item) {\n return;\n }\n this.currentActive?.onDeactivate?.();\n item.onClick?.();\n this.currentActive = item;\n this.activeChange.emit(item);\n }\n\n /**\n * Returns the resolved badge value for a tab item, supporting both plain numbers and Signal<number>.\n * @param item - The tab item whose badge to resolve.\n */\n getBadge(item: MnTabItem): number | undefined {\n if (isSignal(item.badge)) return item.badge();\n return item.badge;\n }\n\n /**\n * Ensures {@link currentActive} references a tab that still exists in the data\n * source, falling back to the configured default tab when the current\n * selection is missing or stale (e.g. after the items array is replaced).\n */\n private syncActiveTab(): void {\n const items = this.dataSource?.items;\n if (!items || items.length === 0) {\n this.currentActive = undefined;\n return;\n }\n if (this.currentActive && items.includes(this.currentActive)) {\n return;\n }\n const defaultIndex = this.dataSource.defaultActive;\n const index =\n defaultIndex >= 0 && defaultIndex < items.length ? defaultIndex : 0;\n this.currentActive = items[index];\n }\n}\n","<div class=\"mb-10\">\n <div\n class=\"flex justify-start scrollbar-hide\"\n [class.overflow-x-auto]=\"scrollable\"\n [class.overflow-y-hidden]=\"scrollable\"\n >\n <div\n role=\"tablist\"\n class=\"tabs flex flex-nowrap -mb-[1px] border-b border-base-300\"\n [class.w-full]=\"justified\"\n >\n @if (isLoadingState) {\n @for (i of skeletonTabs; track i) {\n <div\n [class.flex-1]=\"justified\"\n class=\"tab px-4 py-2 border-b-2 border-transparent flex items-center justify-center\"\n >\n <mn-skeleton [data]=\"{ shape: 'rectangle', width: '4.5rem', height: '1rem' }\"></mn-skeleton>\n </div>\n }\n } @else {\n @for (item of dataSource.items; track item.label) {\n <div\n (click)=\"setActive(item)\"\n (keyup.enter)=\"setActive(item)\"\n (keyup.space)=\"setActive(item)\"\n [attr.aria-selected]=\"currentActive === item\"\n [class.border-primary]=\"currentActive === item\"\n [class.border-transparent]=\"currentActive !== item\"\n [class.flex-1]=\"justified\"\n [class.font-bold]=\"currentActive === item\"\n [class.text-base-content]=\"currentActive !== item\"\n [class.text-primary]=\"currentActive === item\"\n class=\"tab px-4 py-2 border-b-2 cursor-pointer select-none transition-colors whitespace-nowrap text-center flex items-center gap-2\"\n role=\"tab\"\n tabindex=\"0\"\n >\n {{ item.label | mnTranslate }}\n @let badge = getBadge(item);\n @if (badge && badge > 0) {\n <span [data]=\"{ size: 'sm', color: 'accent', variant: 'fill' }\" mnBadge>{{ badge }}</span>\n }\n </div>\n }\n }\n </div>\n </div>\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnIconVariants = tv({\n base: 'inline-flex shrink-0',\n variants: {\n color: {\n current: 'text-current',\n primary: 'text-primary',\n secondary: 'text-neutral',\n danger: 'text-error',\n warning: 'text-warning',\n success: 'text-success',\n accent: 'text-accent',\n },\n },\n\n defaultVariants: {\n color: 'current',\n },\n});\n\nexport type MnIconVariants = VariantProps<typeof mnIconVariants>;\n","// Custom SVGs that are NOT available in lucide (https://lucide.dev).\n// For any lucide icon, use the @lucide/angular directive directly instead —\n// e.g. `<svg lucideX [size]=\"18\"></svg>` — rather than adding it here.\n// Sourced from the .svg files in the ./icons/ directory.\nconst pistolSvg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M8.72 14.56 9 10h12a1 1 0 0 0 1-1V6a1 1 0 0 0-1-1H3a1 1 0 0 0-1 1v4c2.5 0 1 4 1 4-4 6-1 6-1 6h3.38a1 1 0 0 0 .89-.55za1 1 0 0 1 .9-.56H13a2 2 0 0 0 2-2v-1a1 1 0 0 1 1-1\" /></svg>`;\nconst pendingSvg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 7v5l4 2\" /><path d=\"M14 20.775A9 9 0 0112 21\" /><path d=\"M19 17.656a9 9 0 01-1.5 1.456\" /><path d=\"M21 12a9 9 0 01-.228 2\" /><path d=\"M21 8h-5\" /><path d=\"M7.5 19.794c-6-3.464-6-12.124 0-15.588A9 9 0 0112 3a9.75 9.75 0 016.74 2.74L21 8V3\" /></svg>`;\n\nexport const MN_ICON_MAP: Record<string, string> = {\n pistol: pistolSvg,\n pending: pendingSvg,\n};\n","import { Component, HostBinding, Input, OnChanges, OnInit, inject, ElementRef } from '@angular/core';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { MnIconTypes } from './mn-iconTypes';\nimport { mnIconVariants } from './mn-iconVariants';\nimport { MN_ICON_MAP } from './mn-icon-map';\n\n@Component({\n selector: 'mn-icon',\n standalone: true,\n templateUrl: './mn-icon.html',\n})\nexport class MnIcon implements OnChanges, OnInit {\n @Input() data: Partial<MnIconTypes> = {};\n\n private sanitizer = inject(DomSanitizer);\n private el = inject(ElementRef);\n\n svgContent: SafeHtml = '';\n\n get iconSize(): number {\n return this.data.size ?? 24;\n }\n\n @HostBinding('class')\n get hostClasses(): string {\n return mnIconVariants({\n color: this.data.color,\n });\n }\n\n private resolvedName: string | null = null;\n\n ngOnInit(): void {\n const attrs = this.el.nativeElement.attributes;\n for (const item of Array.from<Attr>(attrs)) {\n const attr = item.name.toLowerCase();\n if (attr.startsWith('mnicon')) {\n const iconKey = attr.slice('mnicon'.length);\n for (const key of Object.keys(MN_ICON_MAP)) {\n if (key.toLowerCase() === iconKey) {\n this.resolvedName = key;\n break;\n }\n }\n if (this.resolvedName) break;\n }\n }\n this.updateContent();\n }\n\n ngOnChanges(): void {\n this.updateContent();\n }\n\n private updateContent(): void {\n const name = this.data.name ?? this.resolvedName;\n if (name) {\n const raw = MN_ICON_MAP[name];\n if (raw) {\n const size = this.iconSize;\n const isFullSvg = raw.trim().startsWith('<svg');\n if (isFullSvg) {\n const sized = raw.replace(/<svg([^>]*)>/, (_match: string, attrs: string) => {\n let updated = attrs.replace(/width=\"[^\"]*\"/, `width=\"${size}\"`);\n updated = updated.replace(/height=\"[^\"]*\"/, `height=\"${size}\"`);\n if (!attrs.includes('width=')) updated += ` width=\"${size}\"`;\n if (!attrs.includes('height=')) updated += ` height=\"${size}\"`;\n return `<svg${updated}>`;\n });\n this.svgContent = this.sanitizer.bypassSecurityTrustHtml(sized);\n } else {\n const svg = `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${raw}</svg>`;\n this.svgContent = this.sanitizer.bypassSecurityTrustHtml(svg);\n }\n } else {\n this.svgContent = '';\n }\n } else {\n this.svgContent = '';\n }\n }\n}\n","<span\n [style.width.px]=\"iconSize\"\n [style.height.px]=\"iconSize\"\n style=\"display: inline-flex; align-items: center; justify-content: center;\"\n [innerHTML]=\"svgContent\"\n></span>\n","import { Directive } from '@angular/core';\n\n// AUTO-GENERATED — do not edit manually.\n// Run `npm run generate:icons` to regenerate after modifying MN_ICON_MAP.\n@Directive({\n selector: 'mn-icon[mnIconPistol], mn-icon[mnIconPending]',\n standalone: true,\n})\nexport class MnIconAttributes {}\n","import { InjectionToken } from '@angular/core';\n\n/**\n * Injection token for the base URL used by all CRUD service requests.\n *\n * Provide this token at the application or module level to configure\n * the root API URL that `CrudService` prepends to every endpoint.\n */\nexport const API_BASE_URL = new InjectionToken<string>('API_BASE_URL');\n","import {inject} from '@angular/core';\nimport {ApiError, FailureResult, QueryParams, Result, ResultMeta, SuccessResult} from './crud.model';\nimport {catchError, map, Observable, of} from 'rxjs';\nimport {HttpClient, HttpErrorResponse, HttpParams, HttpResponse, HttpStatusCode} from '@angular/common/http';\nimport {API_BASE_URL} from './crud.tokens';\n\n/**\n * Configuration for a CRUD service endpoint.\n *\n * Passed to the `CrudService` constructor to define which API\n * resource the service operates on.\n */\nexport type CrudConfig = {\n endpoint: string;\n}\n\n/**\n * Abstract base class for CRUD services.\n * Provides standard HTTP operations with typed `Result<T>` responses.\n *\n * @template TEntity The entity type returned by single-item operations.\n * @template TListResponse The response type for list operations (defaults to `TEntity[]`).\n * @template TCreatePayload The payload type for create operations (defaults to `Partial<TEntity>`).\n * @template TUpdatePayload The payload type for update operations (defaults to `Partial<TEntity>`).\n * @template TId The type of the entity identifier (defaults to `number`).\n * @template TGetByIdResponse The response type for getById (defaults to `TEntity`).\n * @template TCreateResponse The response type for create (defaults to `TEntity`).\n * @template TUpdateResponse The response type for update and patch (defaults to `TEntity`).\n * @template TDeleteResponse The response type for delete (defaults to `void`).\n */\nexport abstract class CrudService<\n TEntity,\n TListResponse = TEntity[],\n TCreatePayload = Partial<TEntity>,\n TUpdatePayload = Partial<TEntity>,\n TId extends string | number = number,\n TGetByIdResponse = TEntity,\n TCreateResponse = TEntity,\n TUpdateResponse = TEntity,\n TDeleteResponse = void\n> {\n protected readonly http = inject(HttpClient);\n protected readonly baseUrl = inject(API_BASE_URL);\n protected readonly endpoint: string;\n\n protected constructor(config: CrudConfig) {\n this.endpoint = `${this.baseUrl}${config.endpoint}`;\n }\n\n /**\n * Retrieves all entities from the configured endpoint.\n *\n * Sends a GET request to the base endpoint. Query values are\n * converted to `HttpParams` before the request is sent.\n *\n * @param query Optional query parameters appended to the request URL.\n * @returns An observable emitting a `Result` with the list response or a structured failure.\n */\n getAll(query?: QueryParams): Observable<Result<TListResponse>> {\n return this.http\n .get<TListResponse>(this.endpoint, {\n params: this.toHttpParams(query)\n })\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Retrieves a single entity by its identifier.\n *\n * Sends a GET request to `{endpoint}/{id}`.\n *\n * @param id The unique identifier of the entity to retrieve.\n * @returns An observable emitting a `Result` with the entity or a structured failure.\n */\n getById(id: TId): Observable<Result<TGetByIdResponse>> {\n return this.http\n .get<TGetByIdResponse>(this.itemUrl(id))\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Creates a new entity at the configured endpoint.\n *\n * Sends a POST request with the provided payload as the request body.\n *\n * @param payload The data used to create the entity.\n * @returns An observable emitting a `Result` with the created entity or a structured failure.\n */\n create(payload: TCreatePayload): Observable<Result<TCreateResponse>> {\n return this.http\n .post<TCreateResponse>(this.endpoint, payload)\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Fully replaces an existing entity.\n *\n * Sends a PUT request to `{endpoint}/{id}` with the provided payload,\n * replacing the entire entity.\n *\n * @param id The unique identifier of the entity to update.\n * @param payload The complete data to replace the existing entity with.\n * @returns An observable emitting a `Result` with the updated entity or a structured failure.\n */\n update(id: TId, payload: TUpdatePayload): Observable<Result<TUpdateResponse>> {\n return this.http\n .put<TUpdateResponse>(this.itemUrl(id), payload)\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Partially updates an existing entity.\n *\n * Sends a PATCH request to `{endpoint}/{id}` with the provided payload,\n * merging changes into the existing entity.\n *\n * @param id The unique identifier of the entity to patch.\n * @param payload A partial set of fields to update on the existing entity.\n * @returns An observable emitting a `Result` with the updated entity or a structured failure.\n */\n patch(id: TId, payload: Partial<TUpdatePayload>): Observable<Result<TUpdateResponse>> {\n return this.http\n .patch<TUpdateResponse>(this.itemUrl(id), payload)\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Deletes an entity by its identifier.\n *\n * Sends a DELETE request to `{endpoint}/{id}`.\n *\n * @param id The unique identifier of the entity to delete.\n * @returns An observable emitting a `Result` with the delete response or a structured failure.\n */\n delete(id: TId): Observable<Result<TDeleteResponse>> {\n return this.http\n .delete<TDeleteResponse>(this.itemUrl(id))\n .pipe(\n map((data) => this.success(data)),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Retrieves all entities with the full `HttpResponse` wrapper.\n *\n * Behaves like {@link getAll} but observes the complete HTTP response,\n * giving access to headers, status code, and URL alongside the body.\n *\n * @param query Optional query parameters appended to the request URL.\n * @returns An observable emitting a `Result` with the full HTTP response or a structured failure.\n */\n getAllResponse(query?: QueryParams): Observable<Result<HttpResponse<TListResponse>>> {\n return this.http\n .get<TListResponse>(this.endpoint, {\n params: this.toHttpParams(query),\n observe: 'response',\n })\n .pipe(\n map((response) =>\n this.success(response, {\n statusCode: response.status,\n headers: response.headers,\n url: response.url ?? undefined,\n })\n ),\n catchError((error) => of(this.failure(this.mapHttpError(error))))\n );\n }\n\n /**\n * Builds the URL for a single entity by appending the identifier to the endpoint.\n *\n * @param id The unique identifier to append.\n * @returns The full URL targeting the specific entity.\n */\n protected itemUrl(id: TId): string {\n return `${this.endpoint}/${id}`;\n }\n\n /**\n * Wraps a value in a `SuccessResult`.\n *\n * @template T The type of the response data.\n * @param data The response data to wrap.\n * @param meta Optional metadata (status code, headers, URL) to attach.\n * @returns A `SuccessResult` containing the provided data.\n */\n protected success<T>(data: T, meta?: ResultMeta): SuccessResult<T> {\n return {ok: true, data, meta};\n }\n\n /**\n * Wraps an error in a `FailureResult`.\n *\n * When no explicit metadata is provided, metadata is derived from\n * the `ApiError` itself (status code, headers, URL).\n *\n * @param error The structured API error.\n * @param meta Optional metadata to override the error-derived values.\n * @returns A `FailureResult` containing the error and metadata.\n */\n protected failure(error: ApiError, meta?: ResultMeta): FailureResult {\n return {\n ok: false,\n error,\n meta: meta ?? {\n statusCode: error.status ?? undefined,\n headers: error.headers,\n url: error.url ?? undefined,\n },\n };\n }\n\n /**\n * Maps an unknown error into a structured `ApiError`.\n *\n * Handles both `HttpErrorResponse` instances and unexpected error types.\n * Extracts backend messages, validation errors, and retry information\n * so callers receive a consistent error shape.\n *\n * @param error The raw error caught from the HTTP pipeline.\n * @returns A fully populated `ApiError` object.\n */\n protected mapHttpError(error: unknown): ApiError {\n const timestamp = new Date().toISOString();\n\n if (!(error instanceof HttpErrorResponse)) {\n return {\n status: null,\n message: 'Unknown error',\n original: error instanceof Error ? error : new Error(String(error)),\n retryable: false,\n timestamp,\n };\n }\n\n const status = this.normalizeStatus(error.status);\n const details = error.error;\n const backendMessage = this.extractBackendMessage(details);\n const validationErrors = this.extractValidationErrors(details);\n\n return {\n status,\n message: backendMessage ?? this.defaultMessage(status),\n details,\n backendMessage,\n validationErrors,\n url: error.url,\n headers: error.headers,\n original: error,\n retryable: this.isRetryable(status),\n timestamp,\n };\n }\n\n /**\n * Extracts a human-readable message from the error response body.\n *\n * Checks common keys (`message`, `title`, `detail`, `error`) on the\n * body object and returns the first non-empty string found.\n *\n * @param body The parsed error response body.\n * @returns The extracted message, or `undefined` if none was found.\n */\n protected extractBackendMessage(body: unknown): string | undefined {\n if (typeof body === 'string' && body.trim()) {\n return body;\n }\n\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const obj = body as Record<string, unknown>;\n\n for (const key of ['message', 'title', 'detail', 'error']) {\n const value = obj[key];\n if (typeof value === 'string' && value.trim()) {\n return value;\n }\n }\n return undefined;\n }\n\n /**\n * Extracts field-level validation errors from the error response body.\n *\n * Expects an `errors` property on the body containing a record of\n * field names to error messages (string or string array).\n *\n * @param body The parsed error response body.\n * @returns A record mapping field names to their error messages, or `undefined` if none were found.\n */\n protected extractValidationErrors(body: unknown): Record<string, string[]> | undefined {\n if (!body || typeof body !== 'object') {\n return undefined;\n }\n\n const obj = body as Record<string, unknown>;\n const errors = obj['errors'];\n\n if (!errors || typeof errors !== 'object') {\n return undefined;\n }\n\n const result: Record<string, string[]> = {};\n\n for (const [key, value] of Object.entries(errors as Record<string, unknown>)) {\n if (Array.isArray(value)) {\n result[key] = value.map(String);\n } else if (typeof value === 'string') {\n result[key] = [value];\n }\n }\n return Object.keys(result).length ? result : undefined;\n }\n\n /**\n * Returns a default user-facing message for the given HTTP status code.\n *\n * Provides human-readable messages for common HTTP status codes.\n * Override this method to customise messages.\n *\n * @param status The HTTP status code, or `null` when unknown.\n * @returns A descriptive error message.\n */\n protected defaultMessage(status: HttpStatusCode | null): string {\n switch (status) {\n case HttpStatusCode.BadRequest:\n return 'Bad request';\n case HttpStatusCode.Unauthorized:\n return 'Unauthorized';\n case HttpStatusCode.Forbidden:\n return 'Forbidden';\n case HttpStatusCode.NotFound:\n return 'Not found';\n case HttpStatusCode.Conflict:\n return 'Conflict';\n case HttpStatusCode.UnprocessableEntity:\n return 'Unprocessable entity';\n case HttpStatusCode.InternalServerError:\n return 'Internal server error';\n case null:\n return 'Unknown error';\n default:\n return `Request failed with status ${status}`;\n }\n }\n\n /**\n * Determines whether a request with the given status can be retried.\n *\n * Timeouts, rate-limiting responses, and server errors\n * (5xx) are considered retryable by default.\n *\n * @param status The HTTP status code, or `null` when unknown.\n * @returns `true` if the request is safe to retry.\n */\n protected isRetryable(status: HttpStatusCode | null): boolean {\n if (status === HttpStatusCode.RequestTimeout) return true;\n if (status === HttpStatusCode.TooManyRequests) return true;\n if (typeof status === 'number' && status >= 500) return true;\n return false;\n }\n\n /**\n * Normalises a raw HTTP status into an `HttpStatusCode | null` value.\n *\n * Converts `undefined`, `NaN`, and `0` (network error) to `null`\n * so downstream code only needs to handle `HttpStatusCode | null`.\n *\n * @param status The raw status value from the HTTP response.\n * @returns The normalised status code, or `null` when indeterminate.\n */\n protected normalizeStatus(status: number | null | undefined): HttpStatusCode | null {\n if (status === null || status === undefined || status === 0 || Number.isNaN(status)) return null;\n return status as HttpStatusCode;\n }\n\n /**\n * Converts query parameters into Angular `HttpParams`.\n *\n * `null` and `undefined` values are silently skipped.\n * Array values are appended as multiple entries for the same key.\n *\n * @param query The query parameter record to convert.\n * @returns An `HttpParams` instance, or `undefined` when no parameters are provided.\n */\n protected toHttpParams(query?: QueryParams): HttpParams | undefined {\n if (!query) return undefined;\n\n let params = new HttpParams();\n\n for (const [key, rawValue] of Object.entries(query)) {\n if (rawValue === null || rawValue === undefined) continue;\n\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n\n for (const value of values) {\n if (value === null || value === undefined) continue;\n params = params.append(key, String(value));\n }\n }\n return params;\n }\n}\n","import {inject} from '@angular/core';\nimport {HttpClient, HttpParams} from '@angular/common/http';\nimport {firstValueFrom} from 'rxjs';\nimport {API_BASE_URL} from '../crud';\n\n/** A single query parameter value. */\ntype MnQueryValue = string | number | boolean | null | undefined;\n\n/** A record of query parameter key-value pairs. Arrays are appended as multiple entries. */\nexport type MnQueryParams = Record<string, MnQueryValue | MnQueryValue[]>;\n\n/**\n * Lightweight abstract HTTP base class that removes common boilerplate\n * from API services.\n *\n * Provides typed `get`, `post`, `patch`, `put`, and `delete` methods\n * that return Promises, automatic query-param building, and base-URL\n * injection via the `API_BASE_URL` token.\n *\n * Subclass this directly for services with static or mixed endpoints.\n * No CRUD structure is imposed — every method accepts a free-form path.\n */\nexport abstract class MnHttpService {\n /** Angular HTTP client injected automatically. */\n protected readonly http = inject(HttpClient);\n\n /** Base API URL provided via the `API_BASE_URL` injection token. */\n protected readonly baseUrl = inject(API_BASE_URL);\n\n /**\n * Sends a typed GET request.\n * @param path The path appended to the base URL.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected get<T>(path: string, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.get<T>(`${this.baseUrl}${path}`, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed POST request.\n * @param path The path appended to the base URL.\n * @param body Optional request body.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected post<T>(path: string, body?: unknown, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.post<T>(`${this.baseUrl}${path}`, body ?? {}, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed PATCH request.\n * @param path The path appended to the base URL.\n * @param body Optional request body.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected patch<T>(path: string, body?: unknown, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.patch<T>(`${this.baseUrl}${path}`, body ?? {}, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed PUT request.\n * @param path The path appended to the base URL.\n * @param body Optional request body.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected put<T>(path: string, body?: unknown, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.put<T>(`${this.baseUrl}${path}`, body ?? {}, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Sends a typed DELETE request.\n * @param path The path appended to the base URL.\n * @param query Optional query parameters.\n * @returns A promise resolving to the typed response body.\n */\n protected delete<T = void>(path: string, query?: MnQueryParams): Promise<T> {\n return firstValueFrom(\n this.http.delete<T>(`${this.baseUrl}${path}`, {\n params: this.toHttpParams(query),\n }),\n );\n }\n\n /**\n * Converts a query-params record to Angular `HttpParams`.\n * Null and undefined values are silently skipped.\n * Array values are appended as multiple entries for the same key.\n * @param query The query parameter record to convert.\n * @returns An `HttpParams` instance, or `undefined` when no parameters are provided.\n */\n protected toHttpParams(query?: MnQueryParams): HttpParams | undefined {\n if (!query) return undefined;\n\n let params = new HttpParams();\n\n for (const [key, rawValue] of Object.entries(query)) {\n if (rawValue === null || rawValue === undefined) continue;\n\n const values = Array.isArray(rawValue) ? rawValue : [rawValue];\n\n for (const value of values) {\n if (value === null || value === undefined) continue;\n params = params.append(key, String(value));\n }\n }\n\n return params;\n }\n}\n","import { MnConfigService } from '../config/mn-config.service';\nimport { MnLanguageService } from '../language/mn-language.service';\n\nexport type MnPreviewMessage = {\n type: 'mn-config-update' | 'mn-translations-update';\n config?: Record<string, unknown>;\n translations?: Record<string, Record<string, string>>;\n}\n\n/**\n * Enable live preview mode. Listens for postMessage events from\n * Mn Web Manager and hot-swaps config/translations at runtime.\n *\n * Call this once in your app's bootstrap (e.g., APP_INITIALIZER or root component).\n *\n * @param configService - The MnConfigService instance\n * @param langService - The MnLanguageService instance\n * @param allowedOrigins - Optional whitelist of allowed origins (security)\n */\nexport function enableMnPreviewMode(\n configService: MnConfigService,\n langService: MnLanguageService,\n allowedOrigins?: string[]\n): void {\n window.addEventListener('message', async (event: MessageEvent<MnPreviewMessage>) => {\n if (allowedOrigins?.length && !allowedOrigins.includes(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data?.type) return;\n\n switch (data.type) {\n case 'mn-config-update':\n if (data.config) {\n await configService.loadFromObject(data.config);\n }\n break;\n\n case 'mn-translations-update':\n if (data.translations) {\n for (const [locale, translations] of Object.entries(data.translations)) {\n langService.registerTranslations(locale, translations);\n }\n await langService.setLocale(langService.locale);\n }\n break;\n }\n });\n}\n","/*\n * Public API Surface of mn-lib\n */\nexport * from './lib';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|