mn-angular-lib 1.0.3 → 1.0.6
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.
- package/fesm2022/mn-angular-lib.mjs +478 -120
- package/fesm2022/mn-angular-lib.mjs.map +1 -1
- package/package.json +1 -1
- package/types/mn-angular-lib.d.ts +252 -17
|
@@ -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-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.service.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.types.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/language/mn-language.providers.ts","../../../projects/mn-angular-lib/src/lib/language/mn-translate.pipe.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-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-modal/mn-modal.types.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-table/mn-hidden-below.directive.ts","../../../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-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/shared/crud/crud.tokens.ts","../../../projects/mn-angular-lib/src/lib/shared/crud/crud.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 interface 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 any).duration ?? (DEFAULT_MN_ALERT_CONFIG.durations as any)[(partial as any).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, Optional } 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 interface 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 cfg: Required<MnAlertConfig>;\n private readonly userDurations?: Partial<Record<MnAlertKind, number | null>>;\n private readonly hasUserDurations: boolean;\n\n constructor(\n private readonly store: MnAlertStore,\n @Optional() @Inject(MN_ALERT_CONFIG) cfg: MnAlertConfig | null\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',\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: '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 },\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 },\n\n compoundVariants: [\n // Fill\n { variant: 'fill', color: 'primary', class: 'bg-primary text-primary-content hover:brightness-60' },\n { variant: 'fill', color: 'secondary', class: 'bg-neutral text-neutral-content hover:brightness-60' },\n { variant: 'fill', color: 'danger', class: 'bg-error text-error-content hover:brightness-60' },\n { variant: 'fill', color: 'warning', class: 'bg-warning text-warning-content hover:brightness-60' },\n { variant: 'fill', color: 'success', class: 'bg-success text-success-content hover:brightness-60' },\n { variant: 'fill', color: 'accent', class: 'bg-accent text-accent-content hover:brightness-60' },\n // Outline\n { variant: 'outline', color: 'primary', class: 'border-primary text-primary hover:bg-primary/40' },\n { variant: 'outline', color: 'secondary', class: 'border-neutral text-neutral hover:bg-neutral/40' },\n { variant: 'outline', color: 'danger', class: 'border-error text-error hover:bg-error/40' },\n { variant: 'outline', color: 'warning', class: 'border-warning text-warning hover:bg-warning/40' },\n { variant: 'outline', color: 'success', class: 'border-success text-success hover:bg-success/40' },\n { variant: 'outline', color: 'accent', class: 'border-accent text-accent hover:bg-accent/40' },\n // Text\n { variant: 'text', color: 'primary', class: 'text-primary hover:bg-primary/10' },\n { variant: 'text', color: 'secondary', class: 'text-neutral hover:bg-neutral/10' },\n { variant: 'text', color: 'danger', class: 'text-error hover:bg-error/10' },\n { variant: 'text', color: 'warning', class: 'text-warning hover:bg-warning/10' },\n { variant: 'text', color: 'success', class: 'text-success hover:bg-success/10' },\n { variant: 'text', color: 'accent', class: 'text-accent hover:bg-accent/10' },\n // Text Underline\n { variant: 'textUnderline', color: 'primary', class: 'text-primary underline underline-offset-2 hover:bg-primary/10' },\n { variant: 'textUnderline', color: 'secondary', class: 'text-neutral underline underline-offset-2 hover:bg-neutral/10' },\n { variant: 'textUnderline', color: 'danger', class: 'text-error underline underline-offset-2 hover:bg-error/10' },\n { variant: 'textUnderline', color: 'warning', class: 'text-warning underline underline-offset-2 hover:bg-warning/10' },\n { variant: 'textUnderline', color: 'success', class: 'text-success underline underline-offset-2 hover:bg-success/10' },\n { variant: 'textUnderline', color: 'accent', class: 'text-accent underline underline-offset-2 hover:bg-accent/10' },\n ],\n\n defaultVariants: {\n size: 'md',\n variant: 'fill',\n color: 'primary',\n borderRadius: 'lg',\n disabled: false,\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 // 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 });\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.data.disabled ? '' : null;\n }\n\n // Make disabled anchors unfocusable + prevent activation\n @HostBinding('attr.tabindex')\n get tabIndex() {\n return this.data.disabled ? '-1' : null;\n }\n\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 interface 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 right-4 z-[9999] flex flex-col gap-3 w-full 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\">\n <div class=\"flex-1 min-w-0\">\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: 'sm', variant: 'text', color: 'secondary' }\"\n (click)=\"dismissAlert(a.id)\"\n class=\"shrink-0\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n }\n }\n </div>\n}\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 interface 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<any> {\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 },\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: 'lib-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 interface MnConfigSettings {\n /** Application or library version. */\n version?: string;\n /** Application or library name. */\n name?: string;\n}\n\nexport interface 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: unknown;\n}\n","import { Injectable } 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 _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 constructor(private readonly http: HttpClient) {}\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 }\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: any, key: string): string | undefined {\n if (map[key] !== undefined) return map[key];\n\n const parts = key.split('.');\n let current = map;\n\n for (const part of parts) {\n if (current === null || typeof current !== 'object') return undefined;\n current = current[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","/**\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 interface 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 interface 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 any).$translate === 'string'\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 { MnLanguageService } from '../language/mn-language.service';\nimport { isTranslatable, MnLanguageConfig } from '../language/mn-language.types';\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 _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 constructor(private readonly http: HttpClient) {}\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 any;\n const defaults = isPlainObject(cfg.defaults) ? cfg.defaults : {};\n const overrides = isPlainObject(cfg.overrides) ? 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 unknown 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, any>, 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 unknown 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 = any>(\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 any)[componentName])) {\n resolved = this.deepMerge(resolved, (leaf as any)[componentName] as Record<string, unknown>);\n }\n\n if (instanceId) {\n const instKey = `#${instanceId}`;\n if (leaf && isPlainObject((leaf as any)[instKey])) {\n resolved = this.deepMerge(resolved, (leaf as any)[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, any>, B extends Record<string, any>>(base: A, patch: B): A & B {\n const out: Record<string, any> = { ...base };\n for (const key of Object.keys(patch)) {\n const bVal = (base as any)[key];\n const pVal = (patch as any)[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';\nimport { skip } from 'rxjs';\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) as Array<keyof T>) {\n (cfg as any)[key] = (updated as any)[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 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 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 { 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 } 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 constructor(private readonly lang: MnLanguageService) {}\n\n transform(key: string, params?: Record<string, string | number>): string {\n return this.lang.translate(key, params);\n }\n}\n","import {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n InjectionToken,\n Input,\n OnInit,\n Optional,\n Self\n} from '@angular/core';\nimport {CommonModule, NgClass} from '@angular/common';\nimport {MnInputProps, MnErrorMessageData, MnInputFieldUIConfig} 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})\nexport class MnInputField implements OnInit {\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: any) => void = () => {};\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: any) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args: any) => `Maximum ${args.requiredLength} characters allowed`,\n mnMin: (args: any) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args: any) => `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 * @param ngControl - Angular's NgControl (injected via Dependency Injection)\n */\n constructor(@Optional() @Self() public ngControl: NgControl) {\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: any): 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: any): 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 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.props.hover,\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 (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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-mn-error-message>\n\n }\n }\n }\n</div>\n","import {Component, inject, InjectionToken, Input} from '@angular/core';\nimport {NgOptimizedImage} from '@angular/common';\nimport { MnDualHorizontalImageTypes } from './mn-dual-horizontal-imageTypes';\nimport {provideMnComponentConfig} from '../../config';\n\nexport interface 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-brand-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',\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 {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n InjectionToken,\n Input,\n OnInit,\n Optional,\n Self\n} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnTextareaProps, MnTextareaErrorMessageData, 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/mn-config.service\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context/mn-context.tokens\";\nimport {MnLanguageService} from \"../../language/mn-language.service\";\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 /** 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: any) => void = () => {};\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: any) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args: any) => `Maximum ${args.requiredLength} characters allowed`,\n };\n\n /**\n * Constructor - Registers this component as the ControlValueAccessor\n * for the injected NgControl (FormControl).\n *\n * @param ngControl - Angular's NgControl (injected via Dependency Injection)\n */\n constructor(@Optional() @Self() public ngControl: NgControl) {\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: any): 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: any): 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 (typeof msgDef === 'string' && 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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-mn-error-message>\n }\n }\n }\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnCheckboxVariants = tv({\n base: 'accent-brand-500 cursor-pointer',\n variants: {\n size: {\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\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 borderRadius: 'sm',\n },\n});\n\nexport type MnCheckboxVariants = VariantProps<typeof mnCheckboxVariants>;\n","import {Component, DestroyRef, inject, InjectionToken, Input, OnInit, Optional, Self} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnCheckboxProps, MnCheckboxErrorMessageData, MnCheckboxUIConfig} from './mn-checkboxTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnCheckboxVariants} from './mn-checkboxVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config/mn-config.service\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context/mn-context.tokens\";\nimport {MnLanguageService} from \"../../language/mn-language.service\";\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})\nexport class MnCheckbox implements OnInit {\n protected uiConfig: MnCheckboxUIConfig = {};\n\n @Input({ required: true }) props!: MnCheckboxProps;\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: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnCheckboxErrorMessageData> = {\n required: 'This field is required',\n };\n\n constructor(@Optional() @Self() public ngControl: NgControl) {\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 registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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 }\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 borderRadius: this.props.borderRadius,\n });\n }\n}\n","<div class=\"flex flex-col\">\n <label class=\"flex flex-row items-center gap-x-2 cursor-pointer\" [attr.for]=\"resolvedId\">\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=\"text-sm text-base-content select-none\">{{ uiConfig.label || props.label }}</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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-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 text-base-content text-sm',\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 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, Optional, Self} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnDatetimeProps, MnDatetimeErrorMessageData, MnDatetimeUIConfig, MnDatetimeMode} 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})\nexport class MnDatetime implements OnInit {\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: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnDatetimeErrorMessageData> = {\n required: 'This field is required',\n mnMin: (args: any) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args: any) => `Date/time must be up to ${args.max}`,\n };\n\n constructor(@Optional() @Self() public ngControl: NgControl) {\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: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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 // ========== 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 [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 (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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-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 {Component, DestroyRef, ElementRef, HostListener, inject, InjectionToken, Input, OnInit, Optional, Self, ViewChild} 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/mn-button';\nimport {MnConfigService} from \"../../config/mn-config.service\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context/mn-context.tokens\";\nimport {MnLanguageService} from \"../../language/mn-language.service\";\nimport {skip} from \"rxjs\";\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],\n templateUrl: './mn-multi-select.html',\n})\nexport class MnMultiSelect implements OnInit {\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: any) => void = () => {};\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(@Optional() @Self() public ngControl: NgControl) {\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: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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 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-1 flex-wrap min-h-[1.5rem]\">\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 <span class=\"inline-flex items-center gap-x-1 bg-base-200 text-base-content text-xs px-2 py-0.5 rounded-md\">\n {{ opt.label }}\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n type=\"button\"\n class=\"text-base-content/50 hover:text-base-content cursor-pointer\"\n (click)=\"removeOption(opt, $event)\"\n [attr.aria-label]=\"'Remove ' + opt.label\"\n >×</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 <div\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-brand-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 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 >\n <input\n type=\"checkbox\"\n class=\"w-4 h-4 accent-brand-500 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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-mn-error-message>\n }\n }\n }\n</div>\n","import { Type, TemplateRef } from '@angular/core';\nexport { Type, TemplateRef };\nimport { Observable } from 'rxjs';\nimport { TableDataSource } from '../mn-table/mn-table.types';\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 = any> = (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 = any> = (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 interface FieldDataSource<TValue = unknown, TModel = any> {\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 interface ValidationResult {\n status: ValidationStatus;\n code?: ValidationCode;\n message?: string;\n}\n\nexport interface StepValidator {\n validate(): Promise<ValidationResult> | ValidationResult;\n}\n\nexport interface FieldValidator {\n validate(value: unknown): Promise<ValidationResult> | ValidationResult;\n}\n\nexport interface StepGuard {\n canEnter(): Promise<boolean> | boolean;\n canExit(): Promise<boolean> | boolean;\n}\n\n// =========================\n// Modal Result & Events\n// =========================\n\nexport interface ModalCloseEvent<TResult = unknown> {\n reason: ModalCloseReason;\n result?: TResult;\n}\n\nexport interface 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 interface ModalResultHandler<TResult = unknown> {\n handle(result: TResult): Promise<void> | void;\n}\n\nexport interface WizardStepChangeEvent {\n previousStepId?: ModalStepId;\n currentStepId: ModalStepId;\n direction: NavigationDirection;\n}\n\nexport interface 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 interface WizardStepConfig<TModel = any> {\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?: any[];\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, any>>) => boolean;\n}\n\nexport interface WizardResult {\n status: ModalCloseReason;\n visitedStepIds: ModalStepId[];\n payload?: Record<ModalStepId, Record<string, any>>;\n}\n\n// =========================\n// Form Types\n// =========================\n\nexport interface SelectOption<TValue = unknown> {\n label: string;\n value: TValue;\n state?: OptionState;\n}\n\nexport interface TextFieldConfig<TModel = unknown> {\n kind: FieldKind.TEXT;\n key: keyof TModel;\n label: string;\n appearance?: FieldAppearance;\n validators?: any[];\n asyncValidators?: any[];\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 /** 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 interface NumberFieldConfig<TModel = unknown> {\n kind: FieldKind.NUMBER;\n key: keyof TModel;\n label: string;\n validators?: any[];\n asyncValidators?: any[];\n placeholder?: string;\n min?: number;\n max?: number;\n step?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<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 interface CheckboxFieldConfig<TModel = unknown> {\n kind: FieldKind.CHECKBOX;\n key: keyof TModel;\n label: string;\n defaultValue?: boolean;\n validators?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface DateFieldConfig<TModel = unknown> {\n kind: FieldKind.DATE;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\n minDate?: string;\n maxDate?: string;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface TextareaFieldConfig<TModel = unknown> {\n kind: FieldKind.TEXTAREA;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\n rows?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface DatetimeFieldConfig<TModel = unknown> {\n kind: FieldKind.DATETIME;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\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 autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface MultiSelectFieldConfig<TModel = unknown, TValue = unknown> {\n kind: FieldKind.MULTI_SELECT;\n key: keyof TModel;\n label: string;\n options: SelectOption<TValue>[];\n validators?: any[];\n asyncValidators?: any[];\n searchable?: boolean;\n searchPlaceholder?: string;\n maxSelections?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<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 interface PasswordFieldConfig<TModel = unknown> {\n kind: FieldKind.PASSWORD;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface MultiSelectTableFieldConfig<TModel = unknown, TRow = any> {\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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface SingleSelectTableFieldConfig<TModel = unknown, TRow = any> {\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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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 validators?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface CustomFieldConfig<TModel = unknown> {\n kind: FieldKind.CUSTOM;\n key: keyof TModel;\n component: Type<unknown>;\n inputs?: ModalInputMap;\n label?: string;\n validators?: any[];\n asyncValidators?: any[];\n visible?: FieldVisibilityCondition<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>\n | SingleSelectTableFieldConfig<TModel>\n | PasswordFieldConfig<TModel>\n | FileFieldConfig<TModel>\n | ColorFieldConfig<TModel>\n | RatingFieldConfig<TModel>\n | SliderFieldConfig<TModel>\n | CustomFieldConfig<TModel>;\n\nexport interface AnimationOptions {\n type: 'slide' | 'fade' | 'zoom';\n duration?: number; // ms\n}\n\n// =========================\n// Form Layout Types\n// =========================\n\nexport interface FormRowField<TModel = unknown> {\n field: FormFieldConfig<TModel>;\n span?: number; // Number of columns this field spans (default: 1)\n}\n\nexport interface 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 interface 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 interface ConfirmationActionConfig<TResult = unknown> {\n label: string;\n style?: ActionStyle;\n handler?: ModalResultHandler<TResult>;\n}\n\nexport interface CancellationActionConfig {\n label: string;\n style?: ActionStyle;\n reason?: ModalCloseReason;\n}\n\n// =========================\n// Footer Action Types\n// =========================\n\nexport interface 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 interface 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 interface 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 interface 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 /** 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 = any> = (\n payload: Record<ModalStepId, Record<string, any>>\n) => Promise<Partial<Record<keyof TResult, string>> | null> | Partial<Record<keyof TResult, string>> | null;\n\nexport interface WizardModalConfig<TResult = WizardResult> extends BaseModalConfig<TResult> {\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}\n\nexport interface FormModalConfig<TModel = unknown, TResult = TModel> extends BaseModalConfig<TResult> {\n kind: ModalKind.FORM;\n body?: any;\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?: any[];\n /** Field groups with section headers */\n fieldGroups?: FormFieldGroup<TModel>[];\n}\n\nexport interface ConfirmationModalConfig<TResult = boolean> extends BaseModalConfig<TResult> {\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?: any;\n fields?: FormFieldConfig<any>[];\n rows?: FormRow<any>[];\n fieldGroups?: FormFieldGroup<any>[];\n formValidators?: FormValidator<any>[];\n groupValidators?: any[];\n initialValue?: Partial<any>;\n}\n\nexport interface CustomModalConfig<TResult = unknown> extends BaseModalConfig<TResult> {\n kind: ModalKind.CUSTOM;\n onComplete?: ModalResultHandler<TResult>;\n}\n\n// =========================\n// Union Root Config\n// =========================\n\nexport type ModalConfig<TResult = any> =\n | WizardModalConfig<TResult>\n | FormModalConfig<any, TResult>\n | ConfirmationModalConfig<TResult>\n | CustomModalConfig<TResult>;\n","import { Validators } from '@angular/forms';\nimport {\n FormFieldConfig,\n FormFieldGroup,\n FormRow,\n FormRowField,\n FormValidator,\n} from '../mn-modal.types';\n\n/**\n * Shared interface for configurations that support form layouts.\n */\nexport interface FormContainerConfig<TModel = any> {\n fields?: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n fieldGroups?: FormFieldGroup<TModel>[];\n formValidators?: FormValidator<TModel>[];\n groupValidators?: any[];\n initialValue?: Partial<TModel>;\n body?: any;\n}\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 = any, TParent = any> {\n private currentRow: FormRowField<TModel>[] = [];\n private currentRowColumns = 1;\n\n constructor(\n private readonly config: FormContainerConfig<TModel>,\n private readonly 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: any): 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: number = 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: number = 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: number = 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: FormLayoutBuilder<TModel, any>) => 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: FormLayoutBuilder<TModel, any>) => void\n ): TParent;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: FormLayoutBuilder<TModel, any>) => void),\n arg3?: (group: FormLayoutBuilder<TModel, any>) => 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: FormLayoutBuilder<TModel, any>) => 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, any>(groupConfig, {} as any);\n // Overwrite the groupBuilder's parent to itself for proper chaining within the group\n (groupBuilder as any).parent = groupBuilder;\n buildFn(groupBuilder);\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: any[]): 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 // Clear autoFocus from other fields first to ensure only one is focused\n this.config.fields?.forEach(f => {\n (f as any).autoFocus = false;\n });\n this.config.fieldGroups?.forEach(g => {\n g.fields.forEach(f => {\n (f as any).autoFocus = false;\n });\n });\n\n const field = this.config.fields?.find(f => f.key === key);\n if (field) {\n (field as any).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 fieldAny = field as any;\n fieldAny.validators = fieldAny.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 = any, TParent = any> {\n constructor(\n private field: FormFieldConfig<TModel>,\n private parent: TParent\n ) {\n this.field.validators = this.field.validators || [];\n }\n\n required(message?: string): this {\n this.field.validators!.push(Validators.required);\n return this;\n }\n\n minLength(length: number): this {\n this.field.validators!.push(Validators.minLength(length));\n return this;\n }\n\n maxLength(length: number): this {\n this.field.validators!.push(Validators.maxLength(length));\n return this;\n }\n\n pattern(pattern: string | RegExp): this {\n this.field.validators!.push(Validators.pattern(pattern));\n return this;\n }\n\n email(): this {\n this.field.validators!.push(Validators.email);\n return this;\n }\n\n min(value: number): this {\n this.field.validators!.push(Validators.min(value));\n return this;\n }\n\n max(value: number): this {\n this.field.validators!.push(Validators.max(value));\n return this;\n }\n\n /**\n * Add a custom validator.\n */\n custom(validator: any): this {\n this.field.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 // Allow continuing with other builder methods by proxying to parent if needed,\n // but usually .done() is clearer.\n // For convenience, we can add some common layout methods here too or just use .done()\n}\n","import {\n WizardStepConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormValidator,\n StepState,\n StepGuard,\n StepValidator,\n ModalStepId,\n} from '../mn-modal.types';\nimport { FormLayoutBuilder } from './form-layout.builder';\n\nexport class StepBuilder<TModel = any> {\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: any): 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 /**\n * Add a field to this step. This is the single API for all field types.\n *\n * @example\n * s.field({ kind: FieldKind.TEXT, key: 'email', label: 'Email', validators: [Validators.required] })\n * s.field({ kind: FieldKind.SELECT, key: 'role', label: 'Role', options: [...] })\n */\n field(field: FormFieldConfig<TModel>): this {\n return this.layoutBuilder.field(field);\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: number = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n /**\n * Add a field to the current row started by `row()`.\n */\n addToRow(field: FormFieldConfig<TModel>, span: number = 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 with a section header.\n */\n fieldGroup(group: FormFieldGroup<TModel>): this;\n /**\n * Add a field group using a functional builder.\n */\n fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<TModel, any>) => void\n ): this;\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: FormLayoutBuilder<TModel, any>) => void\n ): this;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: FormLayoutBuilder<TModel, any>) => void),\n arg3?: (group: FormLayoutBuilder<TModel, any>) => void\n ): this {\n return this.layoutBuilder.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n /**\n * Add form-level validators for cross-field validation within this step.\n */\n formValidators(validators: FormValidator<TModel>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n /**\n * Add Angular FormGroup-level validators for this step.\n */\n groupValidators(validators: any[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n /**\n * Set initial values for fields in this step.\n */\n initialValue(value: Partial<TModel>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n /**\n * Set a visibility condition for this step based on aggregated wizard data.\n */\n visible(\n condition: (aggregatedData: Record<ModalStepId, Record<string, any>>) => boolean\n ): this {\n this.config.visible = condition;\n return this;\n }\n\n /**\n * Set a custom label for the 'Next' button on this step.\n */\n nextLabel(label: string): this {\n this.config.nextLabel = label;\n return this;\n }\n\n /**\n * Set a custom label for the 'Back' button on this step.\n */\n backLabel(label: string): this {\n this.config.backLabel = label;\n return this;\n }\n\n /**\n * Hide the 'Back' button on this step.\n */\n hideBack(hide: boolean = 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 { FormLayoutBuilder, FieldValidatorBuilder } from './form-layout.builder';\nimport {\n BaseModalConfig,\n ModalSize,\n CloseMode,\n BackdropMode,\n KeyboardMode,\n ModalIntent,\n ModalFooterAction,\n ModalPollingConfig,\n ModalCancelHandler,\n ModalI18nLabels,\n Type,\n TemplateRef,\n ModalInputMap,\n FormFieldConfig,\n FormFieldGroup,\n AnimationOptions,\n} from '../mn-modal.types';\n\nexport abstract class BaseModalBuilder<TConfig extends BaseModalConfig<TResult>, TResult = unknown> {\n protected config: TConfig;\n protected layoutBuilder: FormLayoutBuilder<any, this>;\n\n protected constructor(initialConfig: TConfig) {\n this.config = initialConfig;\n // Base layout builder, we pass this.config directly if it supports it\n this.layoutBuilder = new FormLayoutBuilder(this.config as any, this);\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: boolean = true): this {\n this.config.readOnly = readOnly;\n return this;\n }\n\n disabled(disabled: boolean = 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 * Add a custom body/content to the modal.\n */\n body(body: any): this {\n return this.layoutBuilder.body(body);\n }\n\n /**\n * Add a field.\n */\n field(field: FormFieldConfig<any>): this {\n return this.layoutBuilder.field(field);\n }\n\n /**\n * Add a field with a fluent validation builder.\n */\n fieldWithValidators(field: FormFieldConfig<any>): FieldValidatorBuilder<any, this> {\n return this.layoutBuilder.fieldWithValidators(field);\n }\n\n /**\n * Start a new row.\n */\n row(columns: number = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n /**\n * Add a field to the current row.\n */\n addToRow(field: FormFieldConfig<any>, span: number = 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<any>, 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<any>): this;\n fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n fieldGroup(\n arg1: string | FormFieldGroup<any>,\n arg2?: string | ((group: FormLayoutBuilder<any, any>) => void),\n arg3?: (group: FormLayoutBuilder<any, any>) => void\n ): this {\n return this.layoutBuilder.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\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 { FormLayoutBuilder } from './form-layout.builder';\nimport {\n WizardModalConfig,\n ModalKind,\n WizardStepConfig,\n ModalStepId,\n WizardFlowMode,\n WizardStepChangeHandler,\n ModalResultHandler,\n WizardResult,\n WizardBeforeCompleteValidator,\n FormFieldConfig,\n FormFieldGroup,\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 any);\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 override body(body: any): this {\n return super.body(body);\n }\n\n override field(field: FormFieldConfig<any>): this {\n return super.field(field);\n }\n\n override row(columns: number = 2): this {\n return super.row(columns);\n }\n\n override addToRow(field: FormFieldConfig<any>, span: number = 1): this {\n return super.addToRow(field, span);\n }\n\n override addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<any>, span?: number) => void }) => void\n ): this {\n return super.addRow(columns, buildFn as any);\n }\n\n override fieldGroup(group: FormFieldGroup<any>): this;\n override fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n arg1: string | FormFieldGroup<any>,\n arg2?: string | ((group: FormLayoutBuilder<any, any>) => void),\n arg3?: (group: FormLayoutBuilder<any, any>) => void\n ): this {\n return super.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n step<TStepModel = any>(\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);\n } else {\n this.config.steps.push(step as WizardStepConfig);\n }\n return this;\n }\n\n addStep<TStepModel = any>(\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);\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 { FormLayoutBuilder, FieldValidatorBuilder } from './form-layout.builder';\nimport {\n FormModalConfig,\n ModalKind,\n FormFieldConfig,\n FormFieldGroup,\n FormLayoutMode,\n SubmitMode,\n ModalResultHandler,\n FormValidator,\n} from '../mn-modal.types';\n\nexport class FormModalBuilder<TModel = unknown, TResult = TModel> extends BaseModalBuilder<\n FormModalConfig<TModel, TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.FORM,\n fields: [],\n rows: [],\n });\n }\n\n override body(body: any): this {\n return super.body(body);\n }\n\n override field(field: FormFieldConfig<TModel>): this {\n return super.field(field);\n }\n\n override row(columns: number = 2): this {\n return super.row(columns);\n }\n\n override addToRow(field: FormFieldConfig<TModel>, span: number = 1): this {\n return super.addToRow(field, span);\n }\n\n override addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): this {\n return super.addRow(columns, buildFn as any);\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 groupValidators(validators: any[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n /**\n * Add a field group with a section header.\n * Groups visually separate fields with a title and optional description.\n */\n override fieldGroup(group: FormFieldGroup<TModel>): this;\n /**\n * Add a field group using a functional builder.\n */\n override fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<TModel, any>) => void\n ): this;\n /**\n * Add a field group with title, description, and a functional builder.\n */\n override fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<TModel, any>) => void\n ): this;\n override fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: FormLayoutBuilder<TModel, any>) => void),\n arg3?: (group: FormLayoutBuilder<TModel, any>) => void\n ): this {\n return super.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n override build(): Readonly<FormModalConfig<TModel, TResult>> {\n return super.build() as any;\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport { FormLayoutBuilder } from './form-layout.builder';\nimport {\n ConfirmationModalConfig,\n ModalKind,\n ConfirmationTone,\n ConfirmationActionConfig,\n CancellationActionConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormValidator,\n} from '../mn-modal.types';\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 override body(body: any): this {\n return super.body(body);\n }\n\n override field(field: FormFieldConfig<any>): this {\n return super.field(field);\n }\n\n override row(columns: number = 2): this {\n return super.row(columns);\n }\n\n override addToRow(field: FormFieldConfig<any>, span: number = 1): this {\n return super.addToRow(field, span);\n }\n\n override addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<any>, span?: number) => void }) => void\n ): this {\n return super.addRow(columns, buildFn as any);\n }\n\n override fieldGroup(group: FormFieldGroup<any>): this;\n override fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n arg1: string | FormFieldGroup<any>,\n arg2?: string | ((group: FormLayoutBuilder<any, any>) => void),\n arg3?: (group: FormLayoutBuilder<any, any>) => void\n ): this {\n return super.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n initialValue(value: Partial<any>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n formValidators(validators: FormValidator<any>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n groupValidators(validators: any[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n override build(): Readonly<ConfirmationModalConfig<TResult>> {\n return super.build() as any;\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';\n\nexport class ModalBuilder {\n static wizard<TResult = any>(): 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, ChangeDetectorRef } from '@angular/core';\nimport {\n ModalRef,\n ModalCloseEvent,\n ModalCloseReason,\n BaseModalConfig,\n} from './mn-modal.types';\n\n// Forward declaration of MnModalShellComponent to avoid circular dependency\n// or just use Type<any> for the component ref if we want to be loose\ninterface ShellComponent<T> {\n config: any;\n modalRef: any;\n}\n\nexport class MnModalRef<TResult = any> 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<any>,\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 any;\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(): any {\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} 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 @Input() component!: Type<unknown>;\n @Input() inputs?: ModalInputMap;\n\n private componentRef?: ComponentRef<unknown>;\n private onChange: (val: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(private vcr: ViewContainerRef) {}\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 any)[key] = value;\n });\n }\n\n // Wire up value accessor if the component supports it\n const instance = this.componentRef.instance as any;\n if (typeof instance.registerOnChange === 'function') {\n instance.registerOnChange((val: any) => 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: any): void {\n const instance = this.componentRef?.instance as any;\n if (instance && typeof instance.writeValue === 'function') {\n instance.writeValue(val);\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n const instance = this.componentRef?.instance as any;\n if (instance && typeof instance.setDisabledState === 'function') {\n instance.setDisabledState(isDisabled);\n }\n }\n}\n","import {TemplateRef} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\n\n// ── Pagination Strategy ──\nexport interface PaginationStrategy {\n hasMoreRows: boolean;\n loadMore: () => Promise<void>;\n reset?: () => void;\n}\n\nexport interface CursorPaginationStrategy extends PaginationStrategy {\n endCursor?: string;\n}\n\nexport interface OffsetPaginationStrategy extends PaginationStrategy {\n currentPage: number;\n pageSize: number;\n totalItems?: number;\n}\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 interface SortState {\n columnKey: string;\n direction: 'asc' | 'desc';\n}\n\n// ── Appearance ──\nexport interface 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 interface ColumnFilterOption {\n label: string;\n value: string;\n}\n\n// ── Column Definition ──\nexport interface ColumnDefinition<T> {\n key: string;\n header: string | TemplateRef<any>;\n cell: ((row: T) => string) | TemplateRef<any>;\n sortType?: ColumnSortType;\n getRawValueToSort?: (row: T) => any;\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 /** 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}\n\n// ── Table Data Source ──\nexport interface TableDataSource<T> {\n dataRows: BehaviorSubject<T[]>;\n columns: ColumnDefinition<T>[];\n getID: (row: T) => string;\n emptyMessage: string;\n emptyTemplate?: TemplateRef<any>;\n isDataLoading: boolean;\n\n // Search\n canSearch: boolean;\n searchPlaceholder?: string;\n isInSearch?: (row: T, searchValue: string) => boolean;\n searchForAdditionalItems?: (searchValue: string) => Promise<T[]>;\n\n // Pagination\n paginationMode?: 'none' | 'load-more' | 'paginated' | 'infinite-scroll';\n paginationStrategy?: PaginationStrategy;\n loadAdditionalRows?: () => Promise<T[]>;\n\n /** Number of rows 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 // Sorting\n defaultSort?: SortState;\n\n // Selection\n selectionMode?: 'none' | 'single' | 'multi';\n selectedRows?: BehaviorSubject<T[]>;\n /** IDs to pre-select when the table initializes. */\n initialSelectedIds?: string[];\n\n // Row interaction\n onRowClick?: (row: T) => void;\n\n // Appearance\n appearance?: TableAppearance;\n\n // Toolbar\n toolbarTemplate?: TemplateRef<any>;\n\n // Labels / i18n\n labels?: TableLabels;\n}\n\nexport interface TableLabels {\n loadMore?: string;\n rowsPerPage?: string;\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 {ChangeDetectionStrategy, ChangeDetectorRef, Component, DoCheck, EventEmitter, inject, Input, OnDestroy, OnInit, Output, TemplateRef} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {Subject, Subscription, debounceTime, skip} from 'rxjs';\nimport {ColumnDefinition, ColumnSortType, SortState, TableDataSource} from './mn-table.types';\nimport {MnButton} from '../mn-button';\nimport {MnHiddenBelowDirective} from './mn-hidden-below.directive';\nimport {MnInputField} from '../mn-input-field';\nimport {FormsModule} from '@angular/forms';\n\n/** Map of column key to its current filter value. */\nexport type ColumnFilterState = Record<string, string>;\n\n@Component({\n selector: 'mn-table',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, MnButton, MnHiddenBelowDirective, MnInputField, FormsModule],\n templateUrl: './mn-table.component.html',\n styleUrl: './mn-table.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnTable<T = any> implements OnInit, OnDestroy, DoCheck {\n @Input() dataSource!: TableDataSource<T>;\n\n @Output() sortChange = new EventEmitter<SortState | null>();\n @Output() selectionChange = new EventEmitter<T[]>();\n @Output() rowClick = new EventEmitter<T>();\n\n filteredItems: T[] = [];\n paginatedItems: T[] = [];\n searchValue = '';\n loadingMoreRows = false;\n currentSort: SortState | null = null;\n selectedIds = new Set<string>();\n\n currentPage = 1;\n pageSize = 10;\n\n /** Per-column filter values keyed by column key. */\n columnFilters: ColumnFilterState = {};\n\n private cdr = inject(ChangeDetectorRef);\n private dataSubscription?: Subscription;\n private searchSubject = new Subject<string>();\n private searchSubscription?: Subscription;\n\n /** Tracks the previous toolbar template reference for change detection. */\n private previousToolbarTemplate?: TemplateRef<any>;\n\n /**\n * Checks for changes to dataSource properties that are not covered\n * by Angular's default change detection (e.g. toolbarTemplate).\n */\n ngDoCheck(): void {\n const currentTemplate = this.dataSource?.toolbarTemplate;\n if (currentTemplate !== this.previousToolbarTemplate) {\n this.previousToolbarTemplate = currentTemplate;\n this.cdr.markForCheck();\n }\n }\n\n ngOnInit(): void {\n this.currentSort = this.dataSource.defaultSort ?? null;\n this.pageSize = this.dataSource.pageSize ?? 10;\n\n // Initialize all filterable columns with empty string to avoid undefined values.\n for (const col of this.dataSource.columns) {\n if (col.filterable) {\n this.columnFilters[col.key] = '';\n }\n }\n\n // Pre-select rows from initialSelectedIds if provided\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 this.applyFilterAndSort(false);\n\n // Skip the initial BehaviorSubject emission (already handled above)\n // to avoid triggering markForCheck during the first change detection cycle.\n this.dataSubscription = this.dataSource.dataRows.pipe(skip(1)).subscribe(() => {\n this.applyFilterAndSort(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.applyFilterAndSort(true);\n this.cdr.markForCheck();\n });\n }\n\n ngOnDestroy(): void {\n this.dataSubscription?.unsubscribe();\n this.searchSubscription?.unsubscribe();\n }\n\n // ── Search ──\n\n onSearch(searchString: string): void {\n this.currentPage = 1;\n this.searchSubject.next(searchString);\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 /** 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.applyFilterAndSort(false);\n this.cdr.markForCheck();\n }\n\n // ── Sorting ──\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.applyFilterAndSort(false);\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 // ── Selection ──\n\n isSelected(row: T): boolean {\n return this.selectedIds.has(this.dataSource.getID(row));\n }\n\n toggleRow(row: T): void {\n const id = this.dataSource.getID(row);\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(row => this.selectedIds.add(this.dataSource.getID(row)));\n }\n this.emitSelection();\n }\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 // ── Row interaction ──\n\n onRowClick(row: T): void {\n this.dataSource.onRowClick?.(row);\n this.rowClick.emit(row);\n }\n\n // ── Pagination ──\n\n loadMoreRows(): void {\n if (!this.dataSource.loadAdditionalRows || this.loadingMoreRows) return;\n\n this.loadingMoreRows = true;\n const promise = (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 get showLoadMore(): boolean {\n const mode = this.dataSource.paginationMode ?? 'load-more';\n const strategy = this.dataSource.paginationStrategy;\n const hasMore = strategy ? strategy.hasMoreRows : !!this.dataSource.loadAdditionalRows;\n return mode === 'load-more' && hasMore;\n }\n\n // ── Paginated Mode ──\n\n get isPaginated(): boolean {\n return this.dataSource.paginationMode === 'paginated';\n }\n\n get totalPages(): number {\n return Math.max(1, Math.ceil(this.filteredItems.length / this.pageSize));\n }\n\n get resolvedPageSizeOptions(): number[] {\n return this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n }\n\n goToPage(page: number): void {\n if (page < 1 || page > this.totalPages) return;\n this.currentPage = page;\n this.applyPagination();\n this.cdr.markForCheck();\n }\n\n onPageSizeChange(newSize: number): void {\n this.pageSize = newSize;\n this.currentPage = 1;\n this.applyPagination();\n this.cdr.markForCheck();\n this.dataSource.onPageSizeChange?.(newSize);\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 private applyPagination(): void {\n if (this.isPaginated) {\n if (this.currentPage > this.totalPages) {\n this.currentPage = this.totalPages;\n }\n const start = (this.currentPage - 1) * this.pageSize;\n this.paginatedItems = this.filteredItems.slice(start, start + this.pageSize);\n } else {\n this.paginatedItems = this.filteredItems;\n }\n }\n\n // ── Template helpers ──\n\n isTemplateRef(value: any): value is TemplateRef<any> {\n return value instanceof TemplateRef;\n }\n\n getCellValue(column: ColumnDefinition<T>, row: T): string {\n if (typeof column.cell === 'function') return column.cell(row);\n return '';\n }\n\n trackByID = (_index: number, row: T): string => {\n return this.dataSource.getID(row);\n };\n\n trackByKey = (_index: number, column: ColumnDefinition<T>): string => {\n return column.key;\n };\n\n // ── Table CSS classes ──\n\n get tableClasses(): string {\n return 'w-full border-collapse overflow-y-hidden';\n }\n\n get totalColumnCount(): number {\n let count = this.dataSource.columns.length;\n if (this.hasSelection) count++;\n return count;\n }\n\n // ── Skeleton rows for loading ──\n\n get skeletonRows(): number[] {\n return Array.from({length: 5});\n }\n\n // ── Private ──\n\n private applyFilterAndSort(searchForItems: boolean): void {\n let items = this.dataSource.dataRows.value;\n\n // Global search filter\n if (this.dataSource.isInSearch && this.dataSource.canSearch && this.searchValue.length > 0) {\n const term = this.searchValue.toLowerCase();\n items = items.filter(row => this.dataSource.isInSearch!(row, term));\n }\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).getTime() - new Date(vb).getTime()) * dir;\n default:\n return 0;\n }\n });\n }\n\n private 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.applyFilterAndSort(false);\n }\n\n private 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","<!-- Toolbar: search + custom toolbar template -->\n<div class=\"flex flex-row items-center justify-end gap-2 mb-3\">\n @if (dataSource.canSearch) {\n <mn-lib-input-field\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.toolbarTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarTemplate\"></ng-container>\n }\n</div>\n\n<!-- Table wrapper with horizontal scroll -->\n<div class=\"overflow-x-auto\" role=\"region\" aria-label=\"Data table\">\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 <label>\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"allSelected\"\n (change)=\"toggleAll()\"\n aria-label=\"Select all rows\"\n />\n </label>\n }\n </th>\n }\n\n <!-- Data columns -->\n @for (column of dataSource.columns; track column.key) {\n <th\n class=\"text-sm px-4 py-2\"\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 -->\n @if (hasColumnFilters) {\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 <select\n class=\"select select-xs rounded border border-base-300 bg-base-100 p-2 text-sm text-base-content focus:outline-none focus:border-primary w-full hover:bg-base-200 hover:cursor-pointer \"\n [value]=\"columnFilters[column.key]\"\n [disabled]=\"column.filterDisabled ?? false\"\n (change)=\"onColumnFilter(column.key, $any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n [attr.aria-label]=\"'Filter ' + column.key\"\n >\n <option value=\"\">{{ column.filterPlaceholder ?? 'All' }}</option>\n @for (opt of column.filterOptions ?? []; track opt.value) {\n <option [value]=\"opt.value\">{{ opt.label }}</option>\n }\n </select>\n }\n }\n </th>\n }\n </tr>\n }\n </thead>\n\n <tbody>\n <!-- Loading state -->\n @if (dataSource.isDataLoading) {\n @for (_ of skeletonRows; track $index) {\n <tr class=\"animate-pulse\">\n @if (hasSelection) {\n <td class=\"px-2 py-3\"><div class=\"h-4 w-4 rounded bg-base-300\"></div></td>\n }\n @for (column of dataSource.columns; track column.key) {\n <td class=\"px-4 py-3\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n >\n <div class=\"h-4 w-3/4 rounded bg-base-300\"></div>\n </td>\n }\n </tr>\n }\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 class=\"w-10 text-center px-2 py-2\">\n <label>\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n />\n </label>\n </td>\n }\n\n <!-- Data cells -->\n @for (column of dataSource.columns; track column.key) {\n <td\n class=\"text-xs px-4 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 (isTemplateRef(column.cell)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.cell)\" [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"></ng-container>\n } @else {\n {{ getCellValue(column, row) }}\n }\n </td>\n }\n\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n<!-- Load more button -->\n@if (showLoadMore) {\n <div class=\"flex justify-center py-4\">\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'primary' }\"\n class=\"px-4 py-1.5 text-sm rounded border border-brand-500 text-brand-500 hover:bg-brand-100 transition-colors disabled:opacity-50\"\n (click)=\"loadMoreRows()\"\n [disabled]=\"loadingMoreRows\"\n >\n @if (loadingMoreRows) {\n <span class=\"inline-block w-3 h-3 border-2 border-brand-500 border-t-transparent rounded-full animate-spin mr-2\"></span>\n }\n {{ dataSource.labels?.loadMore || 'Load more' }}\n </button>\n </div>\n}\n\n<!-- Pagination controls -->\n@if (isPaginated && totalPages > 1) {\n <div class=\"flex items-center justify-between px-2 py-3 text-sm text-base-content\">\n <div class=\"flex items-center gap-2\">\n <span>{{ dataSource.labels?.rowsPerPage || 'Rows per page:' }}</span>\n <select\n class=\"select select-xs rounded border border-base-300 bg-base-200 px-2 py-1 text-xs focus:outline-none focus:border-brand-500\"\n [value]=\"pageSize\"\n (change)=\"onPageSizeChange(+$any($event.target).value)\"\n aria-label=\"Rows per page\"\n >\n @for (opt of resolvedPageSizeOptions; track opt) {\n <option [value]=\"opt\" [selected]=\"opt === pageSize\">{{ opt }}</option>\n }\n </select>\n </div>\n\n <div class=\"flex items-center gap-1\">\n <span class=\"text-xs mr-2\">{{ (currentPage - 1) * pageSize + 1 }}–{{ currentPage * pageSize > filteredItems.length ? filteredItems.length : currentPage * pageSize }} of {{ filteredItems.length }}</span>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(1)\"\n aria-label=\"First page\"\n >«</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(currentPage - 1)\"\n aria-label=\"Previous page\"\n >‹</button>\n\n @for (page of visiblePages; track page) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n class=\"px-2.5 py-1 rounded underline underline-offset-2 transition-colors text-xs\"\n [class.border-secondary]=\"page === currentPage\"\n [class.text-accent]=\"page === currentPage\"\n [class.text-white]=\"page !== currentPage\"\n [class.border-base-300]=\"page !== currentPage\"\n [class.hover:bg-base-200]=\"page !== currentPage\"\n (click)=\"goToPage(page)\"\n [attr.aria-label]=\"'Page ' + page\"\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\n >{{ page }}</button>\n }\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(currentPage + 1)\"\n aria-label=\"Next page\"\n >›</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(totalPages)\"\n aria-label=\"Last page\"\n >»</button>\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n OnInit,\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: any): 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 any)[key] = value;\n });\n }\n\n // Pass modalRef if the component has a modalRef property\n const instance = this.componentRef.instance as any;\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 Component,\n Input,\n OnInit,\n OnDestroy,\n Output,\n EventEmitter,\n ViewChildren,\n QueryList,\n AfterViewInit,\n inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormBuilder, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { MnModalRef } from '../../mn-modal-ref';\nimport {\n FormModalConfig,\n FormLayoutMode,\n FormRow,\n FormRowField,\n FormFieldConfig,\n FormFieldGroup,\n FieldKind,\n SubmitMode,\n ModalCloseReason,\n SelectOption,\n FieldDataSource,\n FileFieldConfig,\n} from '../../mn-modal.types';\nimport { MnButton } from '../../../mn-button';\nimport { MnInputField } from '../../../mn-input-field';\nimport { MnCheckbox } from '../../../mn-checkbox/mn-checkbox';\nimport { MnDatetime } from '../../../mn-datetime/mn-datetime';\nimport { MnMultiSelect } from '../../../mn-multi-select/mn-multi-select';\nimport { MnTextarea } from '../../../mn-textarea/mn-textarea';\nimport { MnCustomFieldHostDirective } from './mn-custom-field-host.directive';\nimport { MnLanguageService } from '../../../../language/mn-language.service';\nimport { MnTable } from '../../../mn-table/mn-table.component';\nimport { MultiSelectTableFieldConfig, SingleSelectTableFieldConfig, RatingFieldConfig, SliderFieldConfig, ColorFieldConfig } from '../../mn-modal.types';\nimport { MnCustomBodyHostComponent } from '../mn-custom-body-host/mn-custom-body-host.component';\n\n@Component({\n selector: 'mn-form-body',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MnButton, MnInputField, MnCheckbox, MnDatetime, MnMultiSelect, MnTextarea, MnCustomFieldHostDirective, MnTable, MnCustomBodyHostComponent],\n templateUrl: './mn-form-body.component.html',\n styleUrls: ['./mn-form-body.component.css'],\n})\nexport class MnFormBodyComponent<TModel = any, TResult = TModel> implements OnInit, OnDestroy, AfterViewInit {\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 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 constructor(private fb: FormBuilder) {}\n\n asField(field: any): any {\n return field;\n }\n\n asKey(key: any): string {\n return key as string;\n }\n\n asAny(val: any): any {\n return val;\n }\n\n hasRequiredValidator(field: any): boolean {\n const validators = field.validators as any[] | undefined;\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, any> = {};\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 const i = this.config as any;\n const i18n = i.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 any).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 as any).props?.id === key);\n if (textarea && typeof (textarea as any).focus === 'function') {\n (textarea as any).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, any> = {};\n\n this.config.fields.forEach(field => {\n const fieldConfig = field as any;\n let initialValue = 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) as any;\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 fieldAny = field as any;\n const control = this.form.get(field.key as string);\n if (control && (fieldAny.disabled || fieldAny.readOnly)) {\n control.disable();\n }\n });\n }\n\n isFieldReadOnly(field: FormFieldConfig<TModel>): boolean {\n return this.config.readOnly === true || (field as any).readOnly === true;\n }\n\n isFieldDisabled(field: FormFieldConfig<TModel>): boolean {\n return this.config.disabled === true || (field as any).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 as any).fields) {\n (g as any).fields.forEach((f: any) => 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 fieldAny = field as any;\n const validators = fieldAny.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] !== false;\n }\n\n // =========================\n // Feature 1: Conditional/Dynamic Fields\n // =========================\n\n private initializeVisibility(): void {\n this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldAny = field as any;\n const isVisible = fieldAny.visible ? fieldAny.visible(this.form.value) : 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 }\n });\n }\n\n private updateVisibility(): void {\n const formValue = this.form.value;\n this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldAny = field as any;\n const wasVisible = this.fieldVisibility[key];\n const isVisible = fieldAny.visible ? fieldAny.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\n const validators = (fieldAny as any).validators || [];\n control.setValidators(validators);\n control.updateValueAndValidity({ emitEvent: false });\n }\n }\n });\n }\n\n isFieldVisible(field: FormFieldConfig<TModel>): boolean {\n return this.fieldVisibility[field.key as string] !== false;\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 fieldAny = field as any;\n if (fieldAny.dataSource) {\n this.loadFieldOptions(field.key as string, fieldAny.dataSource, this.form.value);\n }\n });\n }\n\n private async loadFieldOptions(key: string, dataSource: FieldDataSource, formValue: any): Promise<void> {\n this.fieldLoading[key] = true;\n try {\n const options = await dataSource.load(formValue);\n this.fieldOptions[key] = options;\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 /** 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 any).options || [];\n }\n\n isFieldLoading(key: string): boolean {\n return this.fieldLoading[key] === true;\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: any) => 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: any[]): 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: Record<string, any> = {};\n\n private reloadDependentDataSources(formValue: any): void {\n this.config.fields.forEach(field => {\n const fieldAny = field as any;\n const dataSource: FieldDataSource | undefined = fieldAny.dataSource;\n if (!dataSource?.dependsOn) return;\n\n // Check if any dependency changed\n const changed = dataSource.dependsOn.some((depKey: any) => {\n return formValue[depKey] !== this.previousFormValue[depKey];\n });\n\n if (changed) {\n this.loadFieldOptions(field.key as string, dataSource, formValue);\n }\n });\n this.previousFormValue = { ...formValue };\n }\n\n getGridColumns(row: FormRow<TModel>): string {\n const cols = row.columns || 1;\n return `repeat(${cols}, 1fr)`;\n }\n\n getGridSpan(rowField: FormRowField<TModel>): string {\n const span = rowField.span || 1;\n return span > 1 ? `span ${span}` : '';\n }\n\n // =========================\n // Feature: File Upload Fields\n // =========================\n\n /** Store selected files keyed by field key */\n fileSelections: Record<string, File[]> = {};\n\n onFileChange(field: FormFieldConfig<TModel>, event: Event): void {\n const input = event.target as HTMLInputElement;\n const fileField = field as FileFieldConfig<TModel>;\n const files = Array.from(input.files || []);\n const key = field.key as string;\n\n // Validate file size\n if (fileField.maxSize) {\n const oversized = files.filter(f => f.size > fileField.maxSize!);\n if (oversized.length > 0) {\n // Remove oversized files\n const valid = files.filter(f => f.size <= fileField.maxSize!);\n this.fileSelections[key] = fileField.multiple\n ? [...(this.fileSelections[key] || []), ...valid]\n : valid.slice(0, 1);\n } else {\n this.fileSelections[key] = fileField.multiple\n ? [...(this.fileSelections[key] || []), ...files]\n : files.slice(0, 1);\n }\n } else {\n this.fileSelections[key] = fileField.multiple\n ? [...(this.fileSelections[key] || []), ...files]\n : files.slice(0, 1);\n }\n\n // Enforce maxFiles\n if (fileField.maxFiles && this.fileSelections[key].length > fileField.maxFiles) {\n this.fileSelections[key] = this.fileSelections[key].slice(0, fileField.maxFiles);\n }\n\n const control = this.form.get(key);\n if (control) {\n control.setValue(this.fileSelections[key]);\n control.markAsTouched();\n }\n\n // Reset input so same file can be re-selected\n input.value = '';\n }\n\n removeFile(key: string, index: number): void {\n this.fileSelections[key] = (this.fileSelections[key] || []).filter((_, i) => i !== index);\n const control = this.form.get(key);\n if (control) {\n control.setValue(this.fileSelections[key].length > 0 ? this.fileSelections[key] : null);\n }\n }\n\n getSelectedFiles(key: string): File[] {\n return this.fileSelections[key] || [];\n }\n\n formatFileSize(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 getFileError(field: FormFieldConfig<TModel>): string {\n const control = this.form.get(field.key as string);\n if (!control?.errors) return 'This field is required';\n if (control.errors['required']) return 'Please select a file';\n return 'Invalid file';\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 [formGroup]=\"form\" (ngSubmit)=\"submit()\" class=\"flex flex-col gap-6\">\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 })\"\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 })\"\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 })\"\n ></mn-lib-input-field>\n </div>\n }\n\n @case (FieldKind.SELECT) {\n <div class=\"flex flex-col\">\n <label class=\"pl-2 pb-1 flex flex-row gap-0.5 text-base font-medium text-base-content\" [for]=\"asKey(rowField.field.key)\">\n {{ asField(rowField.field).label }}\n @if (hasRequiredValidator(rowField.field)) {\n <span class=\"text-red-500\">*</span>\n }\n </label>\n <div class=\"relative\">\n <select\n [id]=\"asKey(rowField.field.key)\"\n [formControlName]=\"asKey(rowField.field.key)\"\n class=\"w-full px-3 py-2 border border-base-300 rounded-xl text-base text-base-content bg-base-100 transition-all appearance-none pr-8 focus:outline-none focus:border-blue-500 focus:ring-[3px] focus:ring-blue-500/10 select-arrow\"\n [class.opacity-50]=\"isFieldLoading(asKey(rowField.field.key)) || isFieldDisabled(rowField.field)\"\n [attr.disabled]=\"isFieldDisabled(rowField.field) || isFieldReadOnly(rowField.field) ? '' : null\"\n >\n <option value=\"\" disabled selected hidden>\n {{ isFieldLoading(asKey(rowField.field.key)) ? labels.loading : labels.selectPlaceholder }}\n </option>\n @for (option of getFieldOptions(rowField.field); track option.value) {\n <option\n [value]=\"option.value\"\n [disabled]=\"option.state === 'disabled'\"\n >\n {{ option.label }}\n </option>\n }\n </select>\n @if (isFieldLoading(asKey(rowField.field.key))) {\n <div class=\"absolute right-8 top-1/2 -translate-y-1/2\">\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 </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 @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 })\"\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 })\"\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 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 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 ></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 <label 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-1\">\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 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 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 class=\"flex flex-col gap-1\">\n <label 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\n class=\"relative border-2 border-dashed border-base-300 rounded-xl p-6 text-center transition-colors hover:border-blue-400 hover:bg-blue-50/30\"\n [class.border-red-300]=\"form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched\"\n [class.opacity-50]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n >\n <input\n type=\"file\"\n class=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\n [attr.accept]=\"asField(rowField.field).accept || null\"\n [attr.multiple]=\"asField(rowField.field).multiple || null\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (change)=\"onFileChange(rowField.field, $event)\"\n />\n <div class=\"flex flex-col items-center gap-2\">\n <svg class=\"w-8 h-8 text-base-content/40\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5\" />\n </svg>\n <p class=\"text-sm text-base-content/50\">{{ labels.fileUploadPrompt }}</p>\n @if (asField(rowField.field).accept) {\n <p class=\"text-xs text-base-content/40\">{{ labels.accepted }} {{ asField(rowField.field).accept }}</p>\n }\n @if (asField(rowField.field).maxSize) {\n <p class=\"text-xs text-base-content/40\">{{ labels.maxSize }} {{ formatFileSize(asField(rowField.field).maxSize) }}</p>\n }\n </div>\n </div>\n <!-- Selected files list -->\n @if (getSelectedFiles(asKey(rowField.field.key)).length > 0) {\n <div class=\"flex flex-col gap-1 mt-2\">\n @for (file of getSelectedFiles(asKey(rowField.field.key)); track file.name; let i = $index) {\n <div class=\"flex items-center justify-between px-3 py-1.5 bg-base-200 rounded-lg text-sm\">\n <span class=\"text-base-content truncate\">{{ file.name }} ({{ formatFileSize(file.size) }})</span>\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" type=\"button\" class=\"text-base-content/40 hover:text-red-500 ml-2 cursor-pointer\" (click)=\"removeFile(asKey(rowField.field.key), i)\">×</button>\n </div>\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 {{ getFileError(rowField.field) }}\n </div>\n }\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 <label 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 <mn-table\n [dataSource]=\"tableDataSources[asKey(rowField.field.key)]\"\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 class=\"grid gap-4\" [style.grid-template-columns]=\"getGridColumns(row)\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div class=\"flex flex-col gap-2\" [style.grid-column]=\"getGridSpan(rowField)\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\">\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 class=\"grid gap-4\" [style.grid-template-columns]=\"getGridColumns(row)\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div class=\"flex flex-col gap-2\" [style.grid-column]=\"getGridSpan(rowField)\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\">\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 border-t border-base-300\">\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 { 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 = any> {\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>): any {\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 Component,\n Input,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ViewChildren,\n QueryList,\n AfterViewInit,\n inject,\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 WizardModalConfig,\n WizardStepConfig,\n ModalStepId,\n NavigationDirection,\n ModalCloseReason,\n WizardResult,\n WizardFlowMode,\n ModalKind,\n FormModalConfig,\n ModalFooterAction,\n ActionStyle,\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 { MnFooterActionsComponent } from '../mn-footer-actions/mn-footer-actions.component';\nimport { MnLanguageService } from '../../../../language/mn-language.service';\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 @Input() config!: WizardModalConfig;\n @Input() modalRef!: MnModalRef<WizardResult>;\n\n @ViewChildren(MnFormBodyComponent) formBodies!: QueryList<MnFormBodyComponent>;\n\n currentStepId!: ModalStepId;\n visitedStepIds: ModalStepId[] = [];\n isCurrentStepValid = true;\n isCompleting = false;\n wizardErrors: Record<string, string> = {};\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 any).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<any, any>> = {};\n\n private statusSubscription?: Subscription;\n private formBodiesSubscription?: Subscription;\n\n constructor(private cdr: ChangeDetectorRef) {}\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<any, any>;\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 });\n // Initial validity check\n this.trackCurrentStepValidity();\n }\n\n ngOnDestroy(): void {\n this.statusSubscription?.unsubscribe();\n this.formBodiesSubscription?.unsubscribe();\n }\n\n asAny(val: any): any {\n return val;\n }\n\n isTextBody(step: WizardStepConfig): boolean {\n return typeof step.body === 'string' || typeof step.body === 'number';\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 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 const stepIndex = this.currentStepIndex;\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 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, any>> {\n const aggregated: Record<ModalStepId, Record<string, any>> = {};\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<any>): any {\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: 'ghost', 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<any>): Promise<void> {\n if (action.handler) {\n await action.handler(this.modalRef as any);\n }\n if (action.closesModal) {\n this.modalRef.close((action.closeReason || ModalCloseReason.PROGRAMMATIC) as any);\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 gap-6\" [class.h-full]=\"config.sizeHeight\">\n @if (config.component || config.template) {\n <mn-custom-body-host\n [config]=\"asAny(config)\"\n [modalRef]=\"asAny(modalRef)\"\n class=\"block\"\n ></mn-custom-body-host>\n }\n\n <div class=\"flex gap-2 pb-4 border-b border-base-300\">\n @for (step of visibleSteps; track step.id; let i = $index) {\n <div\n class=\"flex items-center gap-2 flex-1\"\n [class.active]=\"step.id === currentStepId\"\n [class.complete]=\"visitedStepIds.includes(step.id) && step.id !== currentStepId\"\n [class.cursor-pointer]=\"isFreeFlow && canNavigateToStep(step)\"\n (click)=\"isFreeFlow ? goToStep(step) : null\"\n >\n <div\n class=\"w-8 h-8 rounded-full flex items-center justify-center font-semibold transition-all text-sm\"\n [ngClass]=\"{\n 'bg-blue-500 text-white': step.id === currentStepId,\n 'bg-green-500 text-white': visitedStepIds.includes(step.id) && step.id !== currentStepId,\n 'bg-base-200 text-base-content/50': !visitedStepIds.includes(step.id) && step.id !== currentStepId\n }\"\n >{{ i + 1 }}</div>\n <div\n class=\"text-sm\"\n [ngClass]=\"{\n 'text-base-content font-semibold': step.id === currentStepId,\n 'text-base-content/50': step.id !== currentStepId\n }\"\n >{{ step.title }}</div>\n </div>\n }\n </div>\n\n <div class=\"min-h-48 flex-1\">\n @for (step of config.steps; track step.id) {\n <div [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]=\"asAny(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\n <!-- Wizard-level errors (from onBeforeComplete) -->\n @if (wizardErrors && (wizardErrors | keyvalue).length > 0) {\n <div class=\"flex flex-col gap-1 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 <div class=\"flex gap-3 pt-4 border-t border-base-300\">\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($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, ViewContainerRef, 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 @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 constructor(private cdr: ChangeDetectorRef) {}\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 asAny(val: any): any {\n return val;\n }\n\n get isConfirmDisabled(): boolean {\n if (this.hasFormFields) {\n return this.confirmButtonStatus !== 'VALID';\n }\n return false;\n }\n\n asField(field: any): any {\n return field;\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]=\"asAny(config)\"\n [modalRef]=\"asAny(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]=\"asAny(config)\"\n [modalRef]=\"asAny(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\">\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 { Component, HostBinding, HostListener, Input, ElementRef, AfterViewInit, OnDestroy, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnModalRef } from '../../mn-modal-ref';\nimport {\n ModalConfig,\n ModalKind,\n ModalSize,\n BackdropMode,\n KeyboardMode,\n CloseMode,\n ModalCloseReason,\n ModalFooterAction,\n ActionStyle,\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';\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 ],\n templateUrl: './mn-modal-shell.component.html',\n styleUrls: ['./mn-modal-shell.component.css'],\n})\nexport class MnModalShellComponent<TResult = any> implements OnInit, AfterViewInit, OnDestroy {\n @Input() config!: ModalConfig<TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n\n isClosing = false;\n isStacked = false;\n readonly ModalKind = ModalKind;\n private previouslyFocusedElement: HTMLElement | null = null;\n private focusTrapListener: ((e: KeyboardEvent) => void) | null = null;\n private pollingTimer: any = null;\n private pollAttempts = 0;\n\n constructor(private el: ElementRef<HTMLElement>, private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.startPollingIfConfigured();\n }\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 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: any): any {\n return config;\n }\n\n asForm(config: any): any {\n return config;\n }\n\n asConfirmation(config: any): any {\n return config;\n }\n\n asCustom(config: any): any {\n return config;\n }\n\n asAny(val: any): any {\n return val;\n }\n\n @HostBinding('class') get hostClasses(): string {\n const size = this.config.sizeWidth || ModalSize.MD;\n const closing = this.isClosing ? ' closing' : '';\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 return `modal-shell modal-${size}${closing}${animation}${stacked}`;\n }\n\n /** Triggers the closing animation. Deferred to avoid NG0100 when called during a CD cycle. */\n startClosing(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(() => {\n this.isClosing = true;\n this.cdr.detectChanges();\n setTimeout(resolve, 150);\n });\n });\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: any): 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 if (this.config.backdrop === BackdropMode.CLOSABLE) {\n this.handleClose(ModalCloseReason.BACKDROP);\n }\n }\n\n onCloseButtonClick(): void {\n this.handleClose(ModalCloseReason.DISMISSED);\n }\n\n private async handleClose(reason: ModalCloseReason): Promise<void> {\n if (this.config.closeMode === CloseMode.DISABLED) {\n return;\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;\n }\n }\n\n this.modalRef.dismiss(reason);\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 get animationClass(): string {\n const animType = typeof this.config.animation === 'string'\n ? this.config.animation\n : this.config.animation?.type || 'slide';\n\n switch (animType) {\n case 'fade': return 'animate-[fadeIn_0.2s_ease-in-out]';\n case 'zoom': return 'animate-[zoomIn_0.2s_ease-in-out]';\n case 'slide':\n default: return 'animate-[slideIn_0.2s_ease-in-out]';\n }\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 <div class=\"modal-backdrop absolute inset-0 bg-black/50 animate-[fadeIn_0.2s_ease-in-out]\" (click)=\"onBackdropClick()\"></div>\n}\n\n<div\n class=\"modal-container relative bg-base-100 rounded-lg shadow-xl max-h-[90vh] overflow-hidden flex flex-col\"\n [ngClass]=\"[containerSizeClass, animationClass]\"\n [style.min-height]=\"containerHeightStyle\"\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 <div class=\"flex items-center justify-between p-6 border-b border-base-300\">\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 <button\n class=\"bg-transparent border-none text-2xl cursor-pointer text-base-content/50 p-0 w-8 h-8 flex items-center justify-center rounded transition-colors hover:bg-base-200 hover:text-base-content\"\n (click)=\"onCloseButtonClick()\"\n aria-label=\"Close modal\"\n >\n ×\n </button>\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 <div class=\"flex-1 overflow-y-auto p-6\">\n @if (config.kind === ModalKind.WIZARD) {\n <mn-wizard-body\n [config]=\"asWizard(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-wizard-body>\n }\n\n @if (config.kind === ModalKind.FORM) {\n <mn-form-body\n [config]=\"asForm(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-form-body>\n }\n\n @if (config.kind === ModalKind.CONFIRMATION) {\n <mn-confirmation-body\n [config]=\"asConfirmation(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-confirmation-body>\n }\n\n @if (config.kind === ModalKind.CUSTOM) {\n <mn-custom-body-host\n [config]=\"asCustom(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-custom-body-host>\n }\n </div>\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 {\n Injectable,\n ApplicationRef,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n inject,\n} 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<any>[] = [];\n\n open<TResult = any>(config: ModalConfig<TResult>): MnModalRef<TResult> {\n // Create the modal shell component\n const componentRef: ComponentRef<MnModalShellComponent<TResult>> = createComponent(MnModalShellComponent as any, {\n environmentInjector: this.injector,\n });\n\n // Set the config on the component\n componentRef.instance.config = config;\n\n // Create modal ref\n const modalRef = new MnModalRef<TResult>(componentRef, config);\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.isStacked = true;\n }\n this.modalStack.push(modalRef);\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);\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.isStacked = false;\n }\n }\n });\n\n return modalRef;\n }\n}\n","// Types\nexport * from './mn-modal.types';\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 {ChangeDetectionStrategy, ChangeDetectorRef, Component, DoCheck, EventEmitter, inject, Input, OnDestroy, OnInit, Output, TemplateRef} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {Subject, Subscription, debounceTime, skip} from 'rxjs';\nimport {ListDataSource} from './mn-list.types';\nimport {MnButton} from '../mn-button';\n\n@Component({\n selector: 'mn-list',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, MnButton],\n templateUrl: './mn-list.component.html',\n styleUrl: './mn-list.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnList<T = any> implements OnInit, OnDestroy, DoCheck {\n @Input() dataSource!: ListDataSource<T>;\n\n @Output() selectionChange = new EventEmitter<T[]>();\n @Output() itemClick = new EventEmitter<T>();\n\n filteredItems: T[] = [];\n paginatedItems: T[] = [];\n searchValue = '';\n loadingMoreRows = false;\n selectedIds = new Set<string>();\n\n currentPage = 1;\n pageSize = 10;\n\n private cdr = inject(ChangeDetectorRef);\n private dataSubscription?: Subscription;\n private searchSubject = new Subject<string>();\n private searchSubscription?: Subscription;\n\n /** Tracks the previous toolbar template reference for change detection. */\n private previousToolbarTemplate?: TemplateRef<any>;\n\n ngDoCheck(): void {\n const currentTemplate = this.dataSource?.toolbarTemplate;\n if (currentTemplate !== this.previousToolbarTemplate) {\n this.previousToolbarTemplate = currentTemplate;\n this.cdr.markForCheck();\n }\n }\n\n ngOnInit(): void {\n this.pageSize = this.dataSource.pageSize ?? 10;\n\n // Pre-select items from initialSelectedIds if provided\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 this.applyFilter(false);\n\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\n ngOnDestroy(): void {\n this.dataSubscription?.unsubscribe();\n this.searchSubscription?.unsubscribe();\n }\n\n // ── Search ──\n\n onSearch(searchString: string): void {\n this.currentPage = 1;\n this.searchSubject.next(searchString);\n }\n\n // ── Selection ──\n\n isSelected(item: T): boolean {\n return this.selectedIds.has(this.dataSource.getID(item));\n }\n\n toggleItem(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 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 // ── Item interaction ──\n\n onItemClick(item: T): void {\n this.dataSource.onItemClick?.(item);\n this.itemClick.emit(item);\n }\n\n // ── Pagination ──\n\n loadMoreRows(): void {\n if (!this.dataSource.loadAdditionalRows || this.loadingMoreRows) return;\n\n this.loadingMoreRows = true;\n const promise = (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 get showLoadMore(): boolean {\n const mode = this.dataSource.paginationMode ?? 'load-more';\n const strategy = this.dataSource.paginationStrategy;\n const hasMore = strategy ? strategy.hasMoreRows : !!this.dataSource.loadAdditionalRows;\n return mode === 'load-more' && hasMore;\n }\n\n // ── Paginated Mode ──\n\n get isPaginated(): boolean {\n return this.dataSource.paginationMode === 'paginated';\n }\n\n get totalPages(): number {\n return Math.max(1, Math.ceil(this.filteredItems.length / this.pageSize));\n }\n\n get resolvedPageSizeOptions(): number[] {\n return this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n }\n\n goToPage(page: number): void {\n if (page < 1 || page > this.totalPages) return;\n this.currentPage = page;\n this.applyPagination();\n this.cdr.markForCheck();\n }\n\n onPageSizeChange(newSize: number): void {\n this.pageSize = newSize;\n this.currentPage = 1;\n this.applyPagination();\n this.cdr.markForCheck();\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 trackByID = (_index: number, item: T): string => {\n return this.dataSource.getID(item);\n };\n\n // ── Skeleton rows for loading ──\n\n get skeletonRows(): number[] {\n return Array.from({length: 5});\n }\n\n // ── Private ──\n\n private applyPagination(): void {\n if (this.isPaginated) {\n if (this.currentPage > this.totalPages) {\n this.currentPage = this.totalPages;\n }\n const start = (this.currentPage - 1) * this.pageSize;\n this.paginatedItems = this.filteredItems.slice(start, start + this.pageSize);\n } else {\n this.paginatedItems = this.filteredItems;\n }\n }\n\n private applyFilter(searchForItems: boolean): void {\n let items = this.dataSource.dataRows.value;\n\n // Global search filter\n if (this.dataSource.isInSearch && this.dataSource.canSearch && this.searchValue.length > 0) {\n const term = this.searchValue.toLowerCase();\n items = items.filter(row => this.dataSource.isInSearch!(row, term));\n }\n\n this.filteredItems = items;\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n\n private 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 private 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","<!-- 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-brand-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 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 (dataSource.isDataLoading) {\n @for (_ of skeletonRows; track $index) {\n <div class=\"animate-pulse px-4 py-3\" [class.py-2]=\"dataSource.appearance?.compact\" role=\"listitem\">\n <div class=\"h-4 w-3/4 rounded bg-base-300 mb-1\"></div>\n <div class=\"h-3 w-1/2 rounded bg-base-300\"></div>\n </div>\n @if (!$last && (dataSource.appearance?.dividers !== false)) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\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 <label class=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"allSelected\"\n (change)=\"toggleAll()\"\n aria-label=\"Select all items\"\n />\n <span class=\"text-xs text-base-content/70\">Select all</span>\n </label>\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 (click)=\"onItemClick(item)\"\n >\n <!-- Selection checkbox -->\n @if (hasSelection) {\n <div class=\"flex-shrink-0\">\n <label>\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"isSelected(item)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleItem(item)\"\n />\n </label>\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 button -->\n@if (showLoadMore) {\n <div class=\"flex justify-center py-4\">\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'primary' }\"\n class=\"px-4 py-1.5 text-sm rounded border border-brand-500 text-brand-500 hover:bg-brand-100 transition-colors disabled:opacity-50\"\n (click)=\"loadMoreRows()\"\n [disabled]=\"loadingMoreRows\"\n >\n @if (loadingMoreRows) {\n <span class=\"inline-block w-3 h-3 border-2 border-brand-500 border-t-transparent rounded-full animate-spin mr-2\"></span>\n }\n {{ dataSource.labels?.loadMore || 'Load more' }}\n </button>\n </div>\n}\n\n<!-- Pagination controls -->\n@if (isPaginated && totalPages > 1) {\n <div class=\"flex items-center justify-between px-2 py-3 text-sm text-base-content\">\n <div class=\"flex items-center gap-2\">\n <span>{{ dataSource.labels?.rowsPerPage || 'Items per page:' }}</span>\n <select\n class=\"select select-xs rounded border border-base-300 bg-base-200 px-2 py-1 text-xs focus:outline-none focus:border-brand-500\"\n [value]=\"pageSize\"\n (change)=\"onPageSizeChange(+$any($event.target).value)\"\n aria-label=\"Items per page\"\n >\n @for (opt of resolvedPageSizeOptions; track opt) {\n <option [value]=\"opt\" [selected]=\"opt === pageSize\">{{ opt }}</option>\n }\n </select>\n </div>\n\n <div class=\"flex items-center gap-1\">\n <span class=\"text-xs mr-2\">{{ (currentPage - 1) * pageSize + 1 }}–{{ currentPage * pageSize > filteredItems.length ? filteredItems.length : currentPage * pageSize }} of {{ filteredItems.length }}</span>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(1)\"\n aria-label=\"First page\"\n >«</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(currentPage - 1)\"\n aria-label=\"Previous page\"\n >‹</button>\n\n @for (page of visiblePages; track page) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n class=\"px-2.5 py-1 rounded underline underline-offset-2 transition-colors text-xs\"\n [class.border-secondary]=\"page === currentPage\"\n [class.text-accent]=\"page === currentPage\"\n [class.text-white]=\"page !== currentPage\"\n [class.border-base-300]=\"page !== currentPage\"\n [class.hover:bg-base-200]=\"page !== currentPage\"\n (click)=\"goToPage(page)\"\n [attr.aria-label]=\"'Page ' + page\"\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\n >{{ page }}</button>\n }\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(currentPage + 1)\"\n aria-label=\"Next page\"\n >›</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(totalPages)\"\n aria-label=\"Last page\"\n >»</button>\n </div>\n </div>\n}\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 interface 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 * `<app-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 interface 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 interface 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 interface 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 interface 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 { Inject, Injectable, Optional } 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 @Optional() @Inject(CALENDAR_CONFIG) config?: CalendarConfig | null\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: 'app-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 (click)=\"onDayClick(item.date)\"\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, Inject, OnInit, Optional } 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: 'app-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 /** The event to render. Set by {@link CalendarEventComponent} after creation. */\n event!: CalendarEvent;\n formattedTime = '';\n\n private formatter: CalendarDateFormatter;\n\n constructor(\n @Optional() @Inject(CALENDAR_DATE_FORMATTER) formatter: CalendarDateFormatter | null,\n private cdr: ChangeDetectorRef,\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: 'app-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 class=\"calendar-event-wrapper\" (click)=\"onEventClick()\">\n <ng-template #eventContainer></ng-template>\n</div>\n","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, Output, EventEmitter, Type } 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. */\ninterface DisplayHourRow extends HourRow {\n hourLabel: string;\n}\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: 'app-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 /** 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 private layoutService: CalendarEventLayoutService,\n private cdr: ChangeDetectorRef,\n ) {\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 <app-calendar-event [event]=\"event\" [customComponent]=\"calendarEventComponent\"></app-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, Output, EventEmitter, Type } 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. */\ninterface DisplayHourRow extends HourRow {\n hourLabel: string;\n}\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: 'app-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 /** 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 private layoutService: CalendarEventLayoutService,\n private cdr: ChangeDetectorRef,\n ) {\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 <app-calendar-event [event]=\"event\" [customComponent]=\"calendarEventComponent\"></app-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import { Component, Inject, Input, OnInit, Optional, Output, EventEmitter } 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: 'app-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 @Optional() @Inject(CALENDAR_DATE_FORMATTER) formatter: CalendarDateFormatter | null\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 class=\"upcoming-event-row\" (click)=\"eventClicked.emit(event)\" [style.border-left-color]=\"event.color.primaryColor\">\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, 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, 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: 'app-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, 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 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 <app-upcoming-event-row\n [event]=\"event\"\n (eventClicked)=\"eventClicked.emit($event)\">\n </app-upcoming-event-row>\n }\n @if (upcomingEvents.length === 0) {\n <div class=\"no-events\">{{ noEventsMessage }}</div>\n }\n</div>\n","import { Component, DestroyRef, EventEmitter, HostListener, Inject, inject, Input, OnDestroy, OnInit, Optional, Output, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BehaviorSubject, Observable, Subject, skip, takeUntil } from 'rxjs';\nimport { CalendarButton, CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarView, CALENDAR_CONFIG, CalendarConfig, DEFAULT_CALENDAR_CONFIG, MN_CALENDAR_CONFIG, provideMnCalendarConfig, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { MnLanguageService } from '../../../../language/mn-language.service';\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/mn-button';\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 * <app-calendar-view\n * [showButton]=\"true\"\n * [buttonTitle]=\"'New Event'\"\n * [NewCalendarItemsEvent]=\"eventsEmitter\"\n * (RequestNewCalendarItemsEvent)=\"loadEvents($event)\"\n * (CalendarItemClickedEvent)=\"onEventClick($event)\"\n * (ButtonClickedEvent)=\"openModal()\">\n * </app-calendar-view>\n * ```\n */\n@Component({\n selector: 'app-calendar-view',\n standalone: true,\n imports: [\n CommonModule,\n CalendarMonthComponent,\n CalendarWeekComponent,\n CalendarDayComponent,\n UpcomingEventsComponent,\n MnButton\n ],\n templateUrl: './calendar-view.component.html',\n providers: [\n provideMnCalendarConfig(DEFAULT_CALENDAR_CONFIG),\n ],\n styles: [`\n :host { display: flex; flex-direction: column; width: 100%; height: 100%; }\n .calendar-view { width: 100%; height: 100%; font-family: inherit; display: flex; flex-direction: column; }\n .calendar-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n gap: 12px;\n flex-wrap: wrap;\n }\n .toolbar-left { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }\n .toolbar-right { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .view-switcher { display: flex; border: 1px solid var(--color-base-300); border-radius: 6px; overflow: hidden; }\n .view-btn {\n padding: 6px 14px;\n border: none;\n background: var(--color-base-100);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.15s;\n }\n .view-btn:hover { background: var(--color-base-200); }\n .view-btn.active { background: var(--color-primary); color: var(--color-primary-content, white); }\n .date-nav { display: flex; align-items: center; gap: 4px; }\n .nav-btn {\n width: 32px; height: 32px; border: 1px solid var(--color-base-300); border-radius: 6px;\n background: var(--color-base-100); cursor: pointer; font-size: 18px; display: flex;\n align-items: center; justify-content: center;\n }\n .nav-btn:hover { background: var(--color-base-200); }\n .date-input {\n padding: 4px 8px; border: 1px solid var(--color-base-300); border-radius: 6px; background: var(--color-base-100); color: var(--color-base-content);\n font-size: 13px;\n }\n .today-btn {\n padding: 6px 12px; border: 1px solid var(--color-base-300); border-radius: 6px;\n background: var(--color-base-100); cursor: pointer; font-size: 13px; color: var(--color-base-content);\n }\n .today-btn:hover { background: var(--color-base-200); }\n .action-btn {\n padding: 8px 16px; border: none; border-radius: 6px;\n background: var(--color-primary); color: var(--color-primary-content, white); cursor: pointer; font-size: 13px;\n }\n .action-btn:hover { opacity: 0.85; }\n .calendar-content { display: grid; grid-template-columns: 1fr 220px; gap: 12px; flex: 1; min-height: 0; }\n .calendar-main { min-width: 0; min-height: 0; overflow: hidden; }\n .calendar-sidebar { border-left: 1px solid var(--color-base-300); overflow: auto; }\n\n @media (max-width: 767px) {\n .calendar-toolbar { padding: 8px 0; }\n .toolbar-left { flex-direction: column; align-items: flex-start; gap: 8px; }\n .view-switcher { display: none; }\n .calendar-content { grid-template-columns: 1fr; }\n .calendar-sidebar { display: none; }\n .calendar-main { overflow-y: auto; }\n }\n `]\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\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 private readonly destroyRef = inject(DestroyRef);\n private readonly lang = inject(MnLanguageService);\n\n constructor(\n @Optional() @Inject(CALENDAR_DATE_FORMATTER) formatter: CalendarDateFormatter | null,\n @Optional() @Inject(MN_CALENDAR_CONFIG) mnConfig: CalendarConfig | null,\n @Optional() @Inject(CALENDAR_CONFIG) legacyConfig: CalendarConfig | null\n ) {\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\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 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 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 this.isMobileView = window.innerWidth < this.config.mobileBreakpoint;\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=\"calendar-view\" role=\"application\" aria-label=\"Calendar\">\n <div class=\"calendar-toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"view-switcher\" role=\"tablist\" aria-label=\"Calendar view\">\n @for (view of viewOptions; track view.value) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n class=\"view-btn\"\n role=\"tab\"\n [attr.aria-selected]=\"currentView === view.value\"\n [class.active]=\"currentView === view.value\"\n (click)=\"switchView(view.value)\">\n {{ view.label }}\n </button>\n }\n </div>\n <div class=\"date-nav\">\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" class=\"nav-btn\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <input type=\"date\" [value]=\"dateInputValue\" (change)=\"onDateInputChange($event)\" class=\"date-input\" aria-label=\"Select date\" />\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" class=\"nav-btn\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" class=\"today-btn\" (click)=\"goToToday()\">{{ config.todayLabel }}</button>\n </div>\n </div>\n <div class=\"toolbar-right\">\n @for (btn of buttons; track btn.label) {\n <button mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">\n {{ btn.label }}\n </button>\n }\n @if (showButton) {\n <button mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">\n {{ buttonTitle }}\n </button>\n }\n </div>\n </div>\n <div class=\"calendar-content\">\n <div class=\"calendar-main\">\n @if (currentView === CalendarView.MONTH) {\n <app-calendar-month\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n (dayClicked)=\"onMonthDayClick($event)\">\n </app-calendar-month>\n }\n @if (currentView === CalendarView.WEEK) {\n <app-calendar-week\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </app-calendar-week>\n }\n @if (currentView === CalendarView.DAY) {\n <app-calendar-day\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </app-calendar-day>\n }\n </div>\n <div class=\"calendar-sidebar\">\n <app-upcoming-events\n [eventsChanged]=\"internalEventsChanged\"\n [config]=\"config\"\n (eventClicked)=\"onEventClick($event)\">\n </app-upcoming-events>\n </div>\n </div>\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, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { MnTranslatePipe } from '../../language/mn-translate.pipe';\nimport { MnTabDataSource, MnTabItem } from './mn-tab.types';\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],\n templateUrl: './mn-tab.component.html',\n})\nexport class MnTabComponent implements OnInit {\n /** Data source containing tab items and default active index. */\n @Input() dataSource!: MnTabDataSource;\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 /** Initializes the default active tab based on the data source configuration. */\n ngOnInit(): void {\n if (\n this.dataSource &&\n this.dataSource.items.length > this.dataSource.defaultActive\n ) {\n this.currentActive = this.dataSource.items[this.dataSource.defaultActive];\n }\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 && this.currentActive !== item) {\n this.currentActive.onDeactivate?.();\n item.onClick?.();\n this.currentActive = item;\n this.activeChange.emit(item);\n }\n }\n}\n","<div class=\"w-full mb-10 flex justify-center\">\n <div class=\"inline-flex rounded-lg p-2 bg-base-100 shadow-md\">\n <div role=\"tablist\" class=\"tabs flex\">\n @for (item of dataSource.items; track item.label) {\n <div\n role=\"tab\"\n class=\"tab px-4 min-w-36 py-2 border-b-2 cursor-pointer select-none transition-colors\"\n [class.text-brand-500]=\"currentActive === item\"\n [class.font-bold]=\"currentActive === item\"\n [class.border-brand-500]=\"currentActive === item\"\n [class.border-base-300]=\"currentActive !== item\"\n [class.text-base-content]=\"currentActive !== item\"\n [attr.aria-selected]=\"currentActive === item\"\n (click)=\"setActive(item)\"\n >\n {{ item.label | mnTranslate }}\n </div>\n }\n </div>\n </div>\n</div>\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 interface 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 { MnConfigService } from '../config/mn-config.service';\nimport { MnLanguageService } from '../language/mn-language.service';\n\nexport interface MnPreviewMessage {\n type: 'mn-config-update' | 'mn-translations-update';\n config?: Record<string, any>;\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","i1.MnLanguageService","i2","i1.CalendarEventLayoutService"],"mappings":"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"}
|
|
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-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.service.ts","../../../projects/mn-angular-lib/src/lib/language/mn-language.types.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/language/mn-language.providers.ts","../../../projects/mn-angular-lib/src/lib/language/mn-translate.pipe.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-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/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-table/mn-hidden-below.directive.ts","../../../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-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/shared/crud/crud.tokens.ts","../../../projects/mn-angular-lib/src/lib/shared/crud/crud.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 interface 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 any).duration ?? (DEFAULT_MN_ALERT_CONFIG.durations as any)[(partial as any).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, Optional } 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 interface 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 cfg: Required<MnAlertConfig>;\n private readonly userDurations?: Partial<Record<MnAlertKind, number | null>>;\n private readonly hasUserDurations: boolean;\n\n constructor(\n private readonly store: MnAlertStore,\n @Optional() @Inject(MN_ALERT_CONFIG) cfg: MnAlertConfig | null\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',\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: '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 },\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 },\n\n compoundVariants: [\n // Fill\n { variant: 'fill', color: 'primary', class: 'bg-primary text-primary-content hover:brightness-60' },\n { variant: 'fill', color: 'secondary', class: 'bg-neutral text-neutral-content hover:brightness-60' },\n { variant: 'fill', color: 'danger', class: 'bg-error text-error-content hover:brightness-60' },\n { variant: 'fill', color: 'warning', class: 'bg-warning text-warning-content hover:brightness-60' },\n { variant: 'fill', color: 'success', class: 'bg-success text-success-content hover:brightness-60' },\n { variant: 'fill', color: 'accent', class: 'bg-accent text-accent-content hover:brightness-60' },\n // Outline\n { variant: 'outline', color: 'primary', class: 'border-primary text-primary hover:bg-primary/40' },\n { variant: 'outline', color: 'secondary', class: 'border-neutral text-neutral hover:bg-neutral/40' },\n { variant: 'outline', color: 'danger', class: 'border-error text-error hover:bg-error/40' },\n { variant: 'outline', color: 'warning', class: 'border-warning text-warning hover:bg-warning/40' },\n { variant: 'outline', color: 'success', class: 'border-success text-success hover:bg-success/40' },\n { variant: 'outline', color: 'accent', class: 'border-accent text-accent hover:bg-accent/40' },\n // Text\n { variant: 'text', color: 'primary', class: 'text-primary hover:bg-primary/10' },\n { variant: 'text', color: 'secondary', class: 'text-neutral hover:bg-neutral/10' },\n { variant: 'text', color: 'danger', class: 'text-error hover:bg-error/10' },\n { variant: 'text', color: 'warning', class: 'text-warning hover:bg-warning/10' },\n { variant: 'text', color: 'success', class: 'text-success hover:bg-success/10' },\n { variant: 'text', color: 'accent', class: 'text-accent hover:bg-accent/10' },\n // Text Underline\n { variant: 'textUnderline', color: 'primary', class: 'text-primary underline underline-offset-2 hover:bg-primary/10' },\n { variant: 'textUnderline', color: 'secondary', class: 'text-neutral underline underline-offset-2 hover:bg-neutral/10' },\n { variant: 'textUnderline', color: 'danger', class: 'text-error underline underline-offset-2 hover:bg-error/10' },\n { variant: 'textUnderline', color: 'warning', class: 'text-warning underline underline-offset-2 hover:bg-warning/10' },\n { variant: 'textUnderline', color: 'success', class: 'text-success underline underline-offset-2 hover:bg-success/10' },\n { variant: 'textUnderline', color: 'accent', class: 'text-accent underline underline-offset-2 hover:bg-accent/10' },\n ],\n\n defaultVariants: {\n size: 'md',\n variant: 'fill',\n color: 'primary',\n borderRadius: 'lg',\n disabled: false,\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 // 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 });\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.data.disabled ? '' : null;\n }\n\n // Make disabled anchors unfocusable + prevent activation\n @HostBinding('attr.tabindex')\n get tabIndex() {\n return this.data.disabled ? '-1' : null;\n }\n\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 interface 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 right-4 z-[9999] flex flex-col gap-3 w-full 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\">\n <div class=\"flex-1 min-w-0\">\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: 'sm', variant: 'text', color: 'secondary' }\"\n (click)=\"dismissAlert(a.id)\"\n class=\"shrink-0\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </div>\n }\n }\n </div>\n}\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 interface 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<any> {\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 },\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: 'lib-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 interface MnConfigSettings {\n /** Application or library version. */\n version?: string;\n /** Application or library name. */\n name?: string;\n}\n\nexport interface 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: unknown;\n}\n","import { Injectable } 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 _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 constructor(private readonly http: HttpClient) {}\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 }\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: any, key: string): string | undefined {\n if (map[key] !== undefined) return map[key];\n\n const parts = key.split('.');\n let current = map;\n\n for (const part of parts) {\n if (current === null || typeof current !== 'object') return undefined;\n current = current[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","/**\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 interface 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 interface 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 any).$translate === 'string'\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 { MnLanguageService } from '../language/mn-language.service';\nimport { isTranslatable, MnLanguageConfig } from '../language/mn-language.types';\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 _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 constructor(private readonly http: HttpClient) {}\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 any;\n const defaults = isPlainObject(cfg.defaults) ? cfg.defaults : {};\n const overrides = isPlainObject(cfg.overrides) ? 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 unknown 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, any>, 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 unknown 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 = any>(\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 any)[componentName])) {\n resolved = this.deepMerge(resolved, (leaf as any)[componentName] as Record<string, unknown>);\n }\n\n if (instanceId) {\n const instKey = `#${instanceId}`;\n if (leaf && isPlainObject((leaf as any)[instKey])) {\n resolved = this.deepMerge(resolved, (leaf as any)[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, any>, B extends Record<string, any>>(base: A, patch: B): A & B {\n const out: Record<string, any> = { ...base };\n for (const key of Object.keys(patch)) {\n const bVal = (base as any)[key];\n const pVal = (patch as any)[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';\nimport { skip } from 'rxjs';\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) as Array<keyof T>) {\n (cfg as any)[key] = (updated as any)[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 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 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 { 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 } 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 constructor(private readonly lang: MnLanguageService) {}\n\n transform(key: string, params?: Record<string, string | number>): string {\n return this.lang.translate(key, params);\n }\n}\n","import {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n InjectionToken,\n Input,\n OnInit,\n Optional,\n Self\n} from '@angular/core';\nimport {CommonModule, NgClass} from '@angular/common';\nimport {MnInputProps, MnErrorMessageData, MnInputFieldUIConfig} 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})\nexport class MnInputField implements OnInit {\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: any) => void = () => {};\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: any) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args: any) => `Maximum ${args.requiredLength} characters allowed`,\n mnMin: (args: any) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args: any) => `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 * @param ngControl - Angular's NgControl (injected via Dependency Injection)\n */\n constructor(@Optional() @Self() public ngControl: NgControl) {\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: any): 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: any): 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 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.props.hover,\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 (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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-mn-error-message>\n\n }\n }\n }\n</div>\n","import {Component, inject, InjectionToken, Input} from '@angular/core';\nimport {NgOptimizedImage} from '@angular/common';\nimport { MnDualHorizontalImageTypes } from './mn-dual-horizontal-imageTypes';\nimport {provideMnComponentConfig} from '../../config';\n\nexport interface 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-brand-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',\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 {\n Component,\n DestroyRef,\n ElementRef,\n inject,\n InjectionToken,\n Input,\n OnInit,\n Optional,\n Self\n} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnTextareaProps, MnTextareaErrorMessageData, 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/mn-config.service\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context/mn-context.tokens\";\nimport {MnLanguageService} from \"../../language/mn-language.service\";\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 /** 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: any) => void = () => {};\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: any) => `Minimum ${args.requiredLength} characters required`,\n maxlength: (args: any) => `Maximum ${args.requiredLength} characters allowed`,\n };\n\n /**\n * Constructor - Registers this component as the ControlValueAccessor\n * for the injected NgControl (FormControl).\n *\n * @param ngControl - Angular's NgControl (injected via Dependency Injection)\n */\n constructor(@Optional() @Self() public ngControl: NgControl) {\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: any): 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: any): 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 (typeof msgDef === 'string' && 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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-mn-error-message>\n }\n }\n }\n</div>\n","import { tv, type VariantProps } from 'tailwind-variants';\n\nexport const mnCheckboxVariants = tv({\n base: 'accent-brand-500 cursor-pointer',\n variants: {\n size: {\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\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 borderRadius: 'sm',\n },\n});\n\nexport type MnCheckboxVariants = VariantProps<typeof mnCheckboxVariants>;\n","import {Component, DestroyRef, inject, InjectionToken, Input, OnInit, Optional, Self} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnCheckboxProps, MnCheckboxErrorMessageData, MnCheckboxUIConfig} from './mn-checkboxTypes';\nimport {NgControl, ValidationErrors, Validators} from '@angular/forms';\nimport {mnCheckboxVariants} from './mn-checkboxVariants';\nimport {MnErrorMessage} from '../mn-error-message/mn-error-message';\nimport {MnConfigService} from \"../../config/mn-config.service\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context/mn-context.tokens\";\nimport {MnLanguageService} from \"../../language/mn-language.service\";\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})\nexport class MnCheckbox implements OnInit {\n protected uiConfig: MnCheckboxUIConfig = {};\n\n @Input({ required: true }) props!: MnCheckboxProps;\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: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnCheckboxErrorMessageData> = {\n required: 'This field is required',\n };\n\n constructor(@Optional() @Self() public ngControl: NgControl) {\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 registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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 }\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 borderRadius: this.props.borderRadius,\n });\n }\n}\n","<div class=\"flex flex-col\">\n <label class=\"flex flex-row items-center gap-x-2 cursor-pointer\" [attr.for]=\"resolvedId\">\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=\"text-sm text-base-content select-none\">{{ uiConfig.label || props.label }}</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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-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 text-base-content text-sm',\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 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, Optional, Self} from '@angular/core';\nimport {NgClass} from '@angular/common';\nimport {MnDatetimeProps, MnDatetimeErrorMessageData, MnDatetimeUIConfig, MnDatetimeMode} 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})\nexport class MnDatetime implements OnInit {\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: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n private readonly builtInErrorMessages: Record<string, MnDatetimeErrorMessageData> = {\n required: 'This field is required',\n mnMin: (args: any) => `Date/time must be from ${args.min} onwards`,\n mnMax: (args: any) => `Date/time must be up to ${args.max}`,\n };\n\n constructor(@Optional() @Self() public ngControl: NgControl) {\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: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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 // ========== 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 [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 (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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-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 {Component, DestroyRef, ElementRef, HostListener, inject, InjectionToken, Input, OnInit, Optional, Self, ViewChild} 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/mn-button';\nimport {MnConfigService} from \"../../config/mn-config.service\";\nimport {MN_INSTANCE_ID, MN_SECTION_PATH} from \"../../context/mn-context.tokens\";\nimport {MnLanguageService} from \"../../language/mn-language.service\";\nimport {skip} from \"rxjs\";\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],\n templateUrl: './mn-multi-select.html',\n})\nexport class MnMultiSelect implements OnInit {\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: any) => void = () => {};\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(@Optional() @Self() public ngControl: NgControl) {\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: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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 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-1 flex-wrap min-h-[1.5rem]\">\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 <span class=\"inline-flex items-center gap-x-1 bg-base-200 text-base-content text-xs px-2 py-0.5 rounded-md\">\n {{ opt.label }}\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n type=\"button\"\n class=\"text-base-content/50 hover:text-base-content cursor-pointer\"\n (click)=\"removeOption(opt, $event)\"\n [attr.aria-label]=\"'Remove ' + opt.label\"\n >×</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 <div\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-brand-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 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 >\n <input\n type=\"checkbox\"\n class=\"w-4 h-4 accent-brand-500 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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-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',\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, Optional, Self} 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})\nexport class MnSelect implements OnInit {\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(@Optional() @Self() public ngControl: NgControl) {\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 this.selectedValue = val ?? null;\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): 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: any) => 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 <lib-mn-error-message [errorMessage]=\"error\" [id]=\"resolvedId + '-' + $index\"></lib-mn-error-message>\n }\n </div>\n } @else {\n @if (errorMessage != null) {\n <lib-mn-error-message [errorMessage]=\"errorMessage\" [id]=\"resolvedId\"></lib-mn-error-message>\n }\n }\n }\n</div>\n","import { Type, TemplateRef } from '@angular/core';\nexport { Type, TemplateRef };\nimport { Observable } from 'rxjs';\nimport { TableDataSource } from '../mn-table/mn-table.types';\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 = any> = (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 = any> = (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 interface FieldDataSource<TValue = unknown, TModel = any> {\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 interface ValidationResult {\n status: ValidationStatus;\n code?: ValidationCode;\n message?: string;\n}\n\nexport interface StepValidator {\n validate(): Promise<ValidationResult> | ValidationResult;\n}\n\nexport interface FieldValidator {\n validate(value: unknown): Promise<ValidationResult> | ValidationResult;\n}\n\nexport interface StepGuard {\n canEnter(): Promise<boolean> | boolean;\n canExit(): Promise<boolean> | boolean;\n}\n\n// =========================\n// Modal Result & Events\n// =========================\n\nexport interface ModalCloseEvent<TResult = unknown> {\n reason: ModalCloseReason;\n result?: TResult;\n}\n\nexport interface 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 interface ModalResultHandler<TResult = unknown> {\n handle(result: TResult): Promise<void> | void;\n}\n\nexport interface WizardStepChangeEvent {\n previousStepId?: ModalStepId;\n currentStepId: ModalStepId;\n direction: NavigationDirection;\n}\n\nexport interface 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 interface WizardStepConfig<TModel = any> {\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?: any[];\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, any>>) => boolean;\n}\n\nexport interface WizardResult {\n status: ModalCloseReason;\n visitedStepIds: ModalStepId[];\n payload?: Record<ModalStepId, Record<string, any>>;\n}\n\n// =========================\n// Form Types\n// =========================\n\nexport interface SelectOption<TValue = unknown> {\n label: string;\n value: TValue;\n state?: OptionState;\n}\n\nexport interface TextFieldConfig<TModel = unknown> {\n kind: FieldKind.TEXT;\n key: keyof TModel;\n label: string;\n appearance?: FieldAppearance;\n validators?: any[];\n asyncValidators?: any[];\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 /** 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 interface NumberFieldConfig<TModel = unknown> {\n kind: FieldKind.NUMBER;\n key: keyof TModel;\n label: string;\n validators?: any[];\n asyncValidators?: any[];\n placeholder?: string;\n min?: number;\n max?: number;\n step?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<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 interface CheckboxFieldConfig<TModel = unknown> {\n kind: FieldKind.CHECKBOX;\n key: keyof TModel;\n label: string;\n defaultValue?: boolean;\n validators?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface DateFieldConfig<TModel = unknown> {\n kind: FieldKind.DATE;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\n minDate?: string;\n maxDate?: string;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface TextareaFieldConfig<TModel = unknown> {\n kind: FieldKind.TEXTAREA;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\n rows?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface DatetimeFieldConfig<TModel = unknown> {\n kind: FieldKind.DATETIME;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\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 autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface MultiSelectFieldConfig<TModel = unknown, TValue = unknown> {\n kind: FieldKind.MULTI_SELECT;\n key: keyof TModel;\n label: string;\n options: SelectOption<TValue>[];\n validators?: any[];\n asyncValidators?: any[];\n searchable?: boolean;\n searchPlaceholder?: string;\n maxSelections?: number;\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<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 interface PasswordFieldConfig<TModel = unknown> {\n kind: FieldKind.PASSWORD;\n key: keyof TModel;\n label: string;\n placeholder?: string;\n validators?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface MultiSelectTableFieldConfig<TModel = unknown, TRow = any> {\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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface SingleSelectTableFieldConfig<TModel = unknown, TRow = any> {\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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface 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 validators?: any[];\n asyncValidators?: any[];\n readOnly?: boolean;\n disabled?: boolean;\n visible?: FieldVisibilityCondition<TModel>;\n autoFocus?: boolean;\n updateOn?: 'change' | 'blur' | 'submit';\n}\n\nexport interface CustomFieldConfig<TModel = unknown> {\n kind: FieldKind.CUSTOM;\n key: keyof TModel;\n component: Type<unknown>;\n inputs?: ModalInputMap;\n label?: string;\n validators?: any[];\n asyncValidators?: any[];\n visible?: FieldVisibilityCondition<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>\n | SingleSelectTableFieldConfig<TModel>\n | PasswordFieldConfig<TModel>\n | FileFieldConfig<TModel>\n | ColorFieldConfig<TModel>\n | RatingFieldConfig<TModel>\n | SliderFieldConfig<TModel>\n | CustomFieldConfig<TModel>;\n\nexport interface AnimationOptions {\n type: 'slide' | 'fade' | 'zoom';\n duration?: number; // ms\n}\n\n// =========================\n// Form Layout Types\n// =========================\n\nexport interface FormRowField<TModel = unknown> {\n field: FormFieldConfig<TModel>;\n span?: number; // Number of columns this field spans (default: 1)\n}\n\nexport interface 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 interface 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 interface ConfirmationActionConfig<TResult = unknown> {\n label: string;\n style?: ActionStyle;\n handler?: ModalResultHandler<TResult>;\n}\n\nexport interface CancellationActionConfig {\n label: string;\n style?: ActionStyle;\n reason?: ModalCloseReason;\n}\n\n// =========================\n// Footer Action Types\n// =========================\n\nexport interface 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 interface 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 interface 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 interface 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 /** 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 = any> = (\n payload: Record<ModalStepId, Record<string, any>>\n) => Promise<Partial<Record<keyof TResult, string>> | null> | Partial<Record<keyof TResult, string>> | null;\n\nexport interface WizardModalConfig<TResult = WizardResult> extends BaseModalConfig<TResult> {\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}\n\nexport interface FormModalConfig<TModel = unknown, TResult = TModel> extends BaseModalConfig<TResult> {\n kind: ModalKind.FORM;\n body?: any;\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?: any[];\n /** Field groups with section headers */\n fieldGroups?: FormFieldGroup<TModel>[];\n}\n\nexport interface ConfirmationModalConfig<TResult = boolean> extends BaseModalConfig<TResult> {\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?: any;\n fields?: FormFieldConfig<any>[];\n rows?: FormRow<any>[];\n fieldGroups?: FormFieldGroup<any>[];\n formValidators?: FormValidator<any>[];\n groupValidators?: any[];\n initialValue?: Partial<any>;\n}\n\nexport interface CustomModalConfig<TResult = unknown> extends BaseModalConfig<TResult> {\n kind: ModalKind.CUSTOM;\n onComplete?: ModalResultHandler<TResult>;\n}\n\n// =========================\n// Union Root Config\n// =========================\n\nexport type ModalConfig<TResult = any> =\n | WizardModalConfig<TResult>\n | FormModalConfig<any, TResult>\n | ConfirmationModalConfig<TResult>\n | CustomModalConfig<TResult>;\n","import { Validators } from '@angular/forms';\nimport {\n FormFieldConfig,\n FormFieldGroup,\n FormRow,\n FormRowField,\n FormValidator,\n} from '../mn-modal.types';\n\n/**\n * Shared interface for configurations that support form layouts.\n */\nexport interface FormContainerConfig<TModel = any> {\n fields?: FormFieldConfig<TModel>[];\n rows?: FormRow<TModel>[];\n fieldGroups?: FormFieldGroup<TModel>[];\n formValidators?: FormValidator<TModel>[];\n groupValidators?: any[];\n initialValue?: Partial<TModel>;\n body?: any;\n}\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 = any, TParent = any> {\n private currentRow: FormRowField<TModel>[] = [];\n private currentRowColumns = 1;\n\n constructor(\n private readonly config: FormContainerConfig<TModel>,\n private readonly 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: any): 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: number = 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: number = 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: number = 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: FormLayoutBuilder<TModel, any>) => 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: FormLayoutBuilder<TModel, any>) => void\n ): TParent;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: FormLayoutBuilder<TModel, any>) => void),\n arg3?: (group: FormLayoutBuilder<TModel, any>) => 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: FormLayoutBuilder<TModel, any>) => 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, any>(groupConfig, {} as any);\n // Overwrite the groupBuilder's parent to itself for proper chaining within the group\n (groupBuilder as any).parent = groupBuilder;\n buildFn(groupBuilder);\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: any[]): 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 // Clear autoFocus from other fields first to ensure only one is focused\n this.config.fields?.forEach(f => {\n (f as any).autoFocus = false;\n });\n this.config.fieldGroups?.forEach(g => {\n g.fields.forEach(f => {\n (f as any).autoFocus = false;\n });\n });\n\n const field = this.config.fields?.find(f => f.key === key);\n if (field) {\n (field as any).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 fieldAny = field as any;\n fieldAny.validators = fieldAny.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 = any, TParent = any> {\n constructor(\n private field: FormFieldConfig<TModel>,\n private parent: TParent\n ) {\n this.field.validators = this.field.validators || [];\n }\n\n required(message?: string): this {\n this.field.validators!.push(Validators.required);\n return this;\n }\n\n minLength(length: number): this {\n this.field.validators!.push(Validators.minLength(length));\n return this;\n }\n\n maxLength(length: number): this {\n this.field.validators!.push(Validators.maxLength(length));\n return this;\n }\n\n pattern(pattern: string | RegExp): this {\n this.field.validators!.push(Validators.pattern(pattern));\n return this;\n }\n\n email(): this {\n this.field.validators!.push(Validators.email);\n return this;\n }\n\n min(value: number): this {\n this.field.validators!.push(Validators.min(value));\n return this;\n }\n\n max(value: number): this {\n this.field.validators!.push(Validators.max(value));\n return this;\n }\n\n /**\n * Add a custom validator.\n */\n custom(validator: any): this {\n this.field.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 // Allow continuing with other builder methods by proxying to parent if needed,\n // but usually .done() is clearer.\n // For convenience, we can add some common layout methods here too or just use .done()\n}\n","import {\n WizardStepConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormValidator,\n StepState,\n StepGuard,\n StepValidator,\n ModalStepId,\n} from '../mn-modal.types';\nimport { FormLayoutBuilder } from './form-layout.builder';\n\nexport class StepBuilder<TModel = any> {\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: any): 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 /**\n * Add a field to this step. This is the single API for all field types.\n *\n * @example\n * s.field({ kind: FieldKind.TEXT, key: 'email', label: 'Email', validators: [Validators.required] })\n * s.field({ kind: FieldKind.SELECT, key: 'role', label: 'Role', options: [...] })\n */\n field(field: FormFieldConfig<TModel>): this {\n return this.layoutBuilder.field(field);\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: number = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n /**\n * Add a field to the current row started by `row()`.\n */\n addToRow(field: FormFieldConfig<TModel>, span: number = 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 with a section header.\n */\n fieldGroup(group: FormFieldGroup<TModel>): this;\n /**\n * Add a field group using a functional builder.\n */\n fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<TModel, any>) => void\n ): this;\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: FormLayoutBuilder<TModel, any>) => void\n ): this;\n fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: FormLayoutBuilder<TModel, any>) => void),\n arg3?: (group: FormLayoutBuilder<TModel, any>) => void\n ): this {\n return this.layoutBuilder.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n /**\n * Add form-level validators for cross-field validation within this step.\n */\n formValidators(validators: FormValidator<TModel>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n /**\n * Add Angular FormGroup-level validators for this step.\n */\n groupValidators(validators: any[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n /**\n * Set initial values for fields in this step.\n */\n initialValue(value: Partial<TModel>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n /**\n * Set a visibility condition for this step based on aggregated wizard data.\n */\n visible(\n condition: (aggregatedData: Record<ModalStepId, Record<string, any>>) => boolean\n ): this {\n this.config.visible = condition;\n return this;\n }\n\n /**\n * Set a custom label for the 'Next' button on this step.\n */\n nextLabel(label: string): this {\n this.config.nextLabel = label;\n return this;\n }\n\n /**\n * Set a custom label for the 'Back' button on this step.\n */\n backLabel(label: string): this {\n this.config.backLabel = label;\n return this;\n }\n\n /**\n * Hide the 'Back' button on this step.\n */\n hideBack(hide: boolean = 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 { FormLayoutBuilder, FieldValidatorBuilder } from './form-layout.builder';\nimport {\n BaseModalConfig,\n ModalSize,\n CloseMode,\n BackdropMode,\n KeyboardMode,\n ModalIntent,\n ModalFooterAction,\n ModalPollingConfig,\n ModalCancelHandler,\n ModalI18nLabels,\n Type,\n TemplateRef,\n ModalInputMap,\n FormFieldConfig,\n FormFieldGroup,\n AnimationOptions,\n} from '../mn-modal.types';\n\nexport abstract class BaseModalBuilder<TConfig extends BaseModalConfig<TResult>, TResult = unknown> {\n protected config: TConfig;\n protected layoutBuilder: FormLayoutBuilder<any, this>;\n\n protected constructor(initialConfig: TConfig) {\n this.config = initialConfig;\n // Base layout builder, we pass this.config directly if it supports it\n this.layoutBuilder = new FormLayoutBuilder(this.config as any, this);\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: boolean = true): this {\n this.config.readOnly = readOnly;\n return this;\n }\n\n disabled(disabled: boolean = 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 * Add a custom body/content to the modal.\n */\n body(body: any): this {\n return this.layoutBuilder.body(body);\n }\n\n /**\n * Add a field.\n */\n field(field: FormFieldConfig<any>): this {\n return this.layoutBuilder.field(field);\n }\n\n /**\n * Add a field with a fluent validation builder.\n */\n fieldWithValidators(field: FormFieldConfig<any>): FieldValidatorBuilder<any, this> {\n return this.layoutBuilder.fieldWithValidators(field);\n }\n\n /**\n * Start a new row.\n */\n row(columns: number = 2): this {\n return this.layoutBuilder.row(columns);\n }\n\n /**\n * Add a field to the current row.\n */\n addToRow(field: FormFieldConfig<any>, span: number = 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<any>, 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<any>): this;\n fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n fieldGroup(\n arg1: string | FormFieldGroup<any>,\n arg2?: string | ((group: FormLayoutBuilder<any, any>) => void),\n arg3?: (group: FormLayoutBuilder<any, any>) => void\n ): this {\n return this.layoutBuilder.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\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 { FormLayoutBuilder } from './form-layout.builder';\nimport {\n WizardModalConfig,\n ModalKind,\n WizardStepConfig,\n ModalStepId,\n WizardFlowMode,\n WizardStepChangeHandler,\n ModalResultHandler,\n WizardResult,\n WizardBeforeCompleteValidator,\n FormFieldConfig,\n FormFieldGroup,\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 any);\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 override body(body: any): this {\n return super.body(body);\n }\n\n override field(field: FormFieldConfig<any>): this {\n return super.field(field);\n }\n\n override row(columns: number = 2): this {\n return super.row(columns);\n }\n\n override addToRow(field: FormFieldConfig<any>, span: number = 1): this {\n return super.addToRow(field, span);\n }\n\n override addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<any>, span?: number) => void }) => void\n ): this {\n return super.addRow(columns, buildFn as any);\n }\n\n override fieldGroup(group: FormFieldGroup<any>): this;\n override fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n arg1: string | FormFieldGroup<any>,\n arg2?: string | ((group: FormLayoutBuilder<any, any>) => void),\n arg3?: (group: FormLayoutBuilder<any, any>) => void\n ): this {\n return super.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n step<TStepModel = any>(\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);\n } else {\n this.config.steps.push(step as WizardStepConfig);\n }\n return this;\n }\n\n addStep<TStepModel = any>(\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);\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 { FormLayoutBuilder, FieldValidatorBuilder } from './form-layout.builder';\nimport {\n FormModalConfig,\n ModalKind,\n FormFieldConfig,\n FormFieldGroup,\n FormLayoutMode,\n SubmitMode,\n ModalResultHandler,\n FormValidator,\n} from '../mn-modal.types';\n\nexport class FormModalBuilder<TModel = unknown, TResult = TModel> extends BaseModalBuilder<\n FormModalConfig<TModel, TResult>,\n TResult\n> {\n constructor() {\n super({\n kind: ModalKind.FORM,\n fields: [],\n rows: [],\n });\n }\n\n override body(body: any): this {\n return super.body(body);\n }\n\n override field(field: FormFieldConfig<TModel>): this {\n return super.field(field);\n }\n\n override row(columns: number = 2): this {\n return super.row(columns);\n }\n\n override addToRow(field: FormFieldConfig<TModel>, span: number = 1): this {\n return super.addToRow(field, span);\n }\n\n override addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<TModel>, span?: number) => void }) => void\n ): this {\n return super.addRow(columns, buildFn as any);\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 groupValidators(validators: any[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n /**\n * Add a field group with a section header.\n * Groups visually separate fields with a title and optional description.\n */\n override fieldGroup(group: FormFieldGroup<TModel>): this;\n /**\n * Add a field group using a functional builder.\n */\n override fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<TModel, any>) => void\n ): this;\n /**\n * Add a field group with title, description, and a functional builder.\n */\n override fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<TModel, any>) => void\n ): this;\n override fieldGroup(\n arg1: string | FormFieldGroup<TModel>,\n arg2?: string | ((group: FormLayoutBuilder<TModel, any>) => void),\n arg3?: (group: FormLayoutBuilder<TModel, any>) => void\n ): this {\n return super.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n override build(): Readonly<FormModalConfig<TModel, TResult>> {\n return super.build() as any;\n }\n}\n","import { BaseModalBuilder } from './base-modal.builder';\nimport { FormLayoutBuilder } from './form-layout.builder';\nimport {\n ConfirmationModalConfig,\n ModalKind,\n ConfirmationTone,\n ConfirmationActionConfig,\n CancellationActionConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormValidator,\n} from '../mn-modal.types';\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 override body(body: any): this {\n return super.body(body);\n }\n\n override field(field: FormFieldConfig<any>): this {\n return super.field(field);\n }\n\n override row(columns: number = 2): this {\n return super.row(columns);\n }\n\n override addToRow(field: FormFieldConfig<any>, span: number = 1): this {\n return super.addToRow(field, span);\n }\n\n override addRow(\n columns: number,\n buildFn: (row: { add: (field: FormFieldConfig<any>, span?: number) => void }) => void\n ): this {\n return super.addRow(columns, buildFn as any);\n }\n\n override fieldGroup(group: FormFieldGroup<any>): this;\n override fieldGroup(\n title: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n title: string,\n description: string,\n buildFn: (group: FormLayoutBuilder<any, any>) => void\n ): this;\n override fieldGroup(\n arg1: string | FormFieldGroup<any>,\n arg2?: string | ((group: FormLayoutBuilder<any, any>) => void),\n arg3?: (group: FormLayoutBuilder<any, any>) => void\n ): this {\n return super.fieldGroup(arg1 as any, arg2 as any, arg3 as any);\n }\n\n initialValue(value: Partial<any>): this {\n return this.layoutBuilder.initialValue(value);\n }\n\n formValidators(validators: FormValidator<any>[]): this {\n return this.layoutBuilder.formValidators(validators);\n }\n\n groupValidators(validators: any[]): this {\n return this.layoutBuilder.groupValidators(validators);\n }\n\n override build(): Readonly<ConfirmationModalConfig<TResult>> {\n return super.build() as any;\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';\n\nexport class ModalBuilder {\n static wizard<TResult = any>(): 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, ChangeDetectorRef } from '@angular/core';\nimport {\n ModalRef,\n ModalCloseEvent,\n ModalCloseReason,\n BaseModalConfig,\n} from './mn-modal.types';\n\n// Forward declaration of MnModalShellComponent to avoid circular dependency\n// or just use Type<any> for the component ref if we want to be loose\ninterface ShellComponent<T> {\n config: any;\n modalRef: any;\n}\n\nexport class MnModalRef<TResult = any> 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<any>,\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 any;\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(): any {\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} 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 @Input() component!: Type<unknown>;\n @Input() inputs?: ModalInputMap;\n\n private componentRef?: ComponentRef<unknown>;\n private onChange: (val: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(private vcr: ViewContainerRef) {}\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 any)[key] = value;\n });\n }\n\n // Wire up value accessor if the component supports it\n const instance = this.componentRef.instance as any;\n if (typeof instance.registerOnChange === 'function') {\n instance.registerOnChange((val: any) => 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: any): void {\n const instance = this.componentRef?.instance as any;\n if (instance && typeof instance.writeValue === 'function') {\n instance.writeValue(val);\n }\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n const instance = this.componentRef?.instance as any;\n if (instance && typeof instance.setDisabledState === 'function') {\n instance.setDisabledState(isDisabled);\n }\n }\n}\n","import {TemplateRef} from '@angular/core';\nimport {BehaviorSubject} from 'rxjs';\n\n// ── Pagination Strategy ──\nexport interface PaginationStrategy {\n hasMoreRows: boolean;\n loadMore: () => Promise<void>;\n reset?: () => void;\n}\n\nexport interface CursorPaginationStrategy extends PaginationStrategy {\n endCursor?: string;\n}\n\nexport interface OffsetPaginationStrategy extends PaginationStrategy {\n currentPage: number;\n pageSize: number;\n totalItems?: number;\n}\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 interface SortState {\n columnKey: string;\n direction: 'asc' | 'desc';\n}\n\n// ── Appearance ──\nexport interface 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 interface ColumnFilterOption {\n label: string;\n value: string;\n}\n\n// ── Column Definition ──\nexport interface ColumnDefinition<T> {\n key: string;\n header: string | TemplateRef<any>;\n cell: ((row: T) => string) | TemplateRef<any>;\n sortType?: ColumnSortType;\n getRawValueToSort?: (row: T) => any;\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 /** 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}\n\n// ── Table Data Source ──\nexport interface TableDataSource<T> {\n dataRows: BehaviorSubject<T[]>;\n columns: ColumnDefinition<T>[];\n getID: (row: T) => string;\n emptyMessage: string;\n emptyTemplate?: TemplateRef<any>;\n isDataLoading: boolean;\n\n // Search\n canSearch: boolean;\n searchPlaceholder?: string;\n isInSearch?: (row: T, searchValue: string) => boolean;\n searchForAdditionalItems?: (searchValue: string) => Promise<T[]>;\n\n // Pagination\n paginationMode?: 'none' | 'load-more' | 'paginated' | 'client-side-pagination' | 'infinite-scroll';\n paginationStrategy?: PaginationStrategy;\n loadAdditionalRows?: () => Promise<T[]>;\n\n /** Number of rows 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 table delegates pagination to the consumer (server-side).\n * The consumer is responsible for fetching the new page data and updating dataRows.\n */\n onPageChange?: (page: number) => void;\n\n /**\n * Callback invoked when the user types in the search box (server-side search).\n * When provided, the table skips client-side filtering and delegates to the consumer.\n */\n onServerSearch?: (searchValue: string) => void;\n\n /**\n * Callback invoked when the user scrolls to the bottom in infinite-scroll mode.\n * When provided, the table delegates loading more rows to the consumer (server-side).\n * The consumer is responsible for appending new data to dataRows.\n */\n onLoadMore?: () => void;\n\n // Sorting\n defaultSort?: SortState;\n\n // Selection\n selectionMode?: 'none' | 'single' | 'multi';\n selectedRows?: BehaviorSubject<T[]>;\n /** IDs to pre-select when the table initializes. */\n initialSelectedIds?: string[];\n\n // Row interaction\n onRowClick?: (row: T) => void;\n\n // Appearance\n appearance?: TableAppearance;\n\n // Toolbar\n toolbarTemplate?: TemplateRef<any>;\n\n // Labels / i18n\n labels?: TableLabels;\n}\n\nexport interface TableLabels {\n loadMore?: string;\n rowsPerPage?: string;\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 {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DoCheck,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n TemplateRef\n} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {debounceTime, skip, Subject, Subscription} from 'rxjs';\nimport {ColumnDefinition, ColumnSortType, SortState, TableDataSource} from './mn-table.types';\nimport {MnSelect, MnSelectOption} from '../mn-select';\nimport {MnButton} from '../mn-button';\nimport {MnHiddenBelowDirective} from './mn-hidden-below.directive';\nimport {MnInputField} from '../mn-input-field';\nimport {FormsModule} from '@angular/forms';\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, MnButton, MnHiddenBelowDirective, MnInputField, MnSelect, FormsModule],\n templateUrl: './mn-table.component.html',\n styleUrl: './mn-table.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnTable<T = any> implements OnInit, OnDestroy, DoCheck {\n @Input() dataSource!: TableDataSource<T>;\n\n @Output() sortChange = new EventEmitter<SortState | null>();\n @Output() selectionChange = new EventEmitter<T[]>();\n @Output() rowClick = new EventEmitter<T>();\n\n filteredItems: T[] = [];\n paginatedItems: T[] = [];\n searchValue = '';\n loadingMoreRows = false;\n currentSort: SortState | null = null;\n selectedIds = new Set<string>();\n\n currentPage = 1;\n pageSize = 10;\n\n /** Per-column filter values keyed by column key. */\n columnFilters: ColumnFilterState = {};\n\n private cdr = inject(ChangeDetectorRef);\n private dataSubscription?: Subscription;\n private searchSubject = new Subject<string>();\n private searchSubscription?: Subscription;\n\n /** Tracks the previous toolbar template reference for change detection. */\n private previousToolbarTemplate?: TemplateRef<any>;\n\n /**\n * Checks for changes to dataSource properties that are not covered\n * by Angular's default change detection (e.g. toolbarTemplate).\n */\n ngDoCheck(): void {\n const currentTemplate = this.dataSource?.toolbarTemplate;\n if (currentTemplate !== this.previousToolbarTemplate) {\n this.previousToolbarTemplate = currentTemplate;\n this.cdr.markForCheck();\n }\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 ngOnDestroy(): void {\n this.dataSubscription?.unsubscribe();\n this.searchSubscription?.unsubscribe();\n }\n\n // ── Search ──\n\n get isPaginated(): boolean {\n const mode = this.dataSource.paginationMode;\n return mode === 'paginated' || mode === 'client-side-pagination';\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 /** 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.applyFilterAndSort(false);\n this.cdr.markForCheck();\n }\n\n // ── Sorting ──\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.applyFilterAndSort(false);\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 // ── Selection ──\n\n isSelected(row: T): boolean {\n return this.selectedIds.has(this.dataSource.getID(row));\n }\n\n toggleRow(row: T): void {\n const id = this.dataSource.getID(row);\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(row => this.selectedIds.add(this.dataSource.getID(row)));\n }\n this.emitSelection();\n }\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 // ── Row interaction ──\n\n onRowClick(row: T): void {\n this.dataSource.onRowClick?.(row);\n this.rowClick.emit(row);\n }\n\n // ── Pagination ──\n\n /** Whether the table 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 /** Whether the table delegates search to the consumer (server-side). */\n get isServerSearched(): boolean {\n return !!this.dataSource.onServerSearch;\n }\n\n // ── Paginated Mode ──\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 ngOnInit(): void {\n this.validateDataSource();\n this.currentSort = this.dataSource.defaultSort ?? null;\n this.pageSize = this.dataSource.pageSize ?? 10;\n\n // Initialize all filterable columns with empty string to avoid undefined values.\n for (const col of this.dataSource.columns) {\n if (col.filterable) {\n this.columnFilters[col.key] = '';\n }\n }\n\n // Pre-select rows from initialSelectedIds if provided\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 this.applyFilterAndSort(false);\n\n // Skip the initial BehaviorSubject emission (already handled above)\n // to avoid triggering markForCheck during the first change detection cycle.\n this.dataSubscription = this.dataSource.dataRows.pipe(skip(1)).subscribe(() => {\n this.applyFilterAndSort(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.applyFilterAndSort(true);\n this.cdr.markForCheck();\n });\n }\n\n onSearch(searchString: string): void {\n this.currentPage = 1;\n if (this.isServerSearched) {\n this.searchValue = searchString;\n this.dataSource.onServerSearch!(searchString);\n this.cdr.markForCheck();\n } else {\n this.searchSubject.next(searchString);\n }\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.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 get resolvedPageSizeOptions(): number[] {\n return this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n }\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 /** 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 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.dataSource.onPageChange?.(page);\n }\n this.cdr.markForCheck();\n }\n\n onPageSizeChange(newSize: number): void {\n this.pageSize = newSize;\n this.currentPage = 1;\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else {\n this.dataSource.onPageSizeChange?.(newSize);\n }\n this.cdr.markForCheck();\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 private 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 // ── Template helpers ──\n\n isTemplateRef(value: any): value is TemplateRef<any> {\n return value instanceof TemplateRef;\n }\n\n getCellValue(column: ColumnDefinition<T>, row: T): string {\n if (typeof column.cell === 'function') return column.cell(row);\n return '';\n }\n\n trackByID = (_index: number, row: T): string => {\n return this.dataSource.getID(row);\n };\n\n trackByKey = (_index: number, column: ColumnDefinition<T>): string => {\n return column.key;\n };\n\n // ── Table CSS classes ──\n\n get tableClasses(): string {\n return 'w-full border-collapse overflow-y-hidden';\n }\n\n get totalColumnCount(): number {\n let count = this.dataSource.columns.length;\n if (this.hasSelection) count++;\n return count;\n }\n\n // ── Skeleton rows for loading ──\n\n get skeletonRows(): number[] {\n return Array.from({length: 5});\n }\n\n // ── Private ──\n\n private applyFilterAndSort(searchForItems: boolean): void {\n let items = this.dataSource.dataRows.value;\n\n // Skip client-side search filtering when server handles it.\n if (!this.isServerSearched && this.dataSource.isInSearch && this.dataSource.canSearch && this.searchValue.length > 0) {\n const term = this.searchValue.toLowerCase();\n items = items.filter(row => this.dataSource.isInSearch!(row, term));\n }\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).getTime() - new Date(vb).getTime()) * dir;\n default:\n return 0;\n }\n });\n }\n\n private 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.applyFilterAndSort(false);\n }\n\n private validateDataSource(): void {\n const mode = this.dataSource.paginationMode;\n if (mode === 'paginated') {\n if (!this.dataSource.onPageChange) {\n throw new Error(`[MnTable] paginationMode is 'paginated' but 'onPageChange' callback is missing. Server-side pagination requires 'onPageChange'.`);\n }\n if (this.dataSource.totalItems == null) {\n throw new Error(`[MnTable] 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(`[MnTable] 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(`[MnTable] pageSize '${size}' is not one of the allowed pageSizeOptions [${options.join(', ')}]. pageSize must be one of pageSizeOptions.`);\n }\n }\n }\n\n private 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","<!-- Toolbar: search + custom toolbar template -->\n<div class=\"flex flex-row items-center justify-end gap-2 mb-3\">\n @if (dataSource.canSearch) {\n <mn-lib-input-field\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.toolbarTemplate) {\n <ng-container [ngTemplateOutlet]=\"dataSource.toolbarTemplate\"></ng-container>\n }\n</div>\n\n<!-- Table wrapper with horizontal scroll -->\n<div class=\"overflow-x-auto\" role=\"region\" aria-label=\"Data table\">\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 <label>\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"allSelected\"\n (change)=\"toggleAll()\"\n aria-label=\"Select all rows\"\n />\n </label>\n }\n </th>\n }\n\n <!-- Data columns -->\n @for (column of dataSource.columns; track column.key) {\n <th\n class=\"text-sm px-4 py-2\"\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 -->\n @if (hasColumnFilters) {\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 (dataSource.isDataLoading) {\n @for (_ of skeletonRows; track $index) {\n <tr class=\"animate-pulse\">\n @if (hasSelection) {\n <td class=\"px-2 py-3\"><div class=\"h-4 w-4 rounded bg-base-300\"></div></td>\n }\n @for (column of dataSource.columns; track column.key) {\n <td class=\"px-4 py-3\"\n [mnHiddenBelow]=\"column.hiddenBelow\"\n >\n <div class=\"h-4 w-3/4 rounded bg-base-300\"></div>\n </td>\n }\n </tr>\n }\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 class=\"w-10 text-center px-2 py-2\">\n <label>\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"isSelected(row)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(row)\"\n />\n </label>\n </td>\n }\n\n <!-- Data cells -->\n @for (column of dataSource.columns; track column.key) {\n <td\n class=\"text-xs px-4 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 (isTemplateRef(column.cell)) {\n <ng-container [ngTemplateOutlet]=\"$any(column.cell)\" [ngTemplateOutletContext]=\"{ $implicit: row, data: row }\"></ng-container>\n } @else {\n {{ getCellValue(column, row) }}\n }\n </td>\n }\n\n </tr>\n }\n }\n </tbody>\n </table>\n</div>\n\n<!-- Load more button -->\n@if (showLoadMore) {\n <div class=\"flex justify-center py-4\">\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'primary' }\"\n class=\"px-4 py-1.5 text-sm rounded border border-brand-500 text-brand-500 hover:bg-brand-100 transition-colors disabled:opacity-50\"\n (click)=\"loadMoreRows()\"\n [disabled]=\"loadingMoreRows\"\n >\n @if (loadingMoreRows) {\n <span class=\"inline-block w-3 h-3 border-2 border-brand-500 border-t-transparent rounded-full animate-spin mr-2\"></span>\n }\n {{ dataSource.labels?.loadMore || 'Load more' }}\n </button>\n </div>\n}\n\n<!-- Pagination controls -->\n@if (isPaginated && (totalPages > 1 || isServerPaginated)) {\n <div class=\"flex items-center justify-between px-2 py-3 text-sm text-base-content\">\n <div class=\"flex items-center gap-2\">\n <span>{{ dataSource.labels?.rowsPerPage || 'Rows:' }}</span>\n <mn-lib-select\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModel]=\"pageSize\"\n [props]=\"{\n id: 'mn-table-page-size',\n options: pageSizeSelectOptions,\n size: 'sm'\n }\"\n ></mn-lib-select>\n </div>\n\n <div class=\"flex items-center gap-1\">\n <span class=\"text-xs mr-2\">{{ (currentPage - 1) * pageSize + 1 }}\n –{{ currentPage * pageSize > totalItemCount ? totalItemCount : currentPage * pageSize }}\n of {{ totalItemCount }}</span>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(1)\"\n aria-label=\"First page\"\n >«</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(currentPage - 1)\"\n aria-label=\"Previous page\"\n >‹</button>\n\n @for (page of visiblePages; track page) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n class=\"px-2.5 py-1 rounded underline underline-offset-2 transition-colors text-xs\"\n [class.border-secondary]=\"page === currentPage\"\n [class.text-accent]=\"page === currentPage\"\n [class.text-white]=\"page !== currentPage\"\n [class.border-base-300]=\"page !== currentPage\"\n [class.hover:bg-base-200]=\"page !== currentPage\"\n (click)=\"goToPage(page)\"\n [attr.aria-label]=\"'Page ' + page\"\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\n >{{ page }}</button>\n }\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(currentPage + 1)\"\n aria-label=\"Next page\"\n >›</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(totalPages)\"\n aria-label=\"Last page\"\n >»</button>\n </div>\n </div>\n}\n","import {\n Component,\n Input,\n OnInit,\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: any): 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 any)[key] = value;\n });\n }\n\n // Pass modalRef if the component has a modalRef property\n const instance = this.componentRef.instance as any;\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 ViewChildren,\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormBuilder, FormGroup, ReactiveFormsModule} from '@angular/forms';\nimport {Subscription} from 'rxjs';\nimport {MnModalRef} from '../../mn-modal-ref';\nimport {\n FieldDataSource,\n FieldKind,\n FileFieldConfig,\n FormFieldConfig,\n FormFieldGroup,\n FormModalConfig,\n FormRow,\n FormRowField,\n ModalCloseReason,\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 {MnSelect, MnSelectOption} from '../../../mn-select';\nimport {MnCustomFieldHostDirective} from './mn-custom-field-host.directive';\nimport {MnLanguageService} from '../../../../language';\nimport {MnTable} from '../../../mn-table';\nimport {MnCustomBodyHostComponent} from '../mn-custom-body-host/mn-custom-body-host.component';\n\n@Component({\n selector: 'mn-form-body',\n standalone: true,\n imports: [CommonModule, ReactiveFormsModule, MnButton, MnInputField, MnCheckbox, MnDatetime, MnMultiSelect, MnTextarea, MnSelect, MnCustomFieldHostDirective, MnTable, MnCustomBodyHostComponent],\n templateUrl: './mn-form-body.component.html',\n styleUrls: ['./mn-form-body.component.css'],\n})\nexport class MnFormBodyComponent<TModel = any, TResult = TModel> implements OnInit, OnDestroy, AfterViewInit {\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 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 constructor(private fb: FormBuilder) {}\n\n asField(field: any): any {\n return field;\n }\n\n asKey(key: any): string {\n return key as string;\n }\n\n asAny(val: any): any {\n return val;\n }\n\n hasRequiredValidator(field: any): boolean {\n const validators = field.validators as any[] | undefined;\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, any> = {};\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 const i = this.config as any;\n const i18n = i.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 any).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 as any).props?.id === key);\n if (textarea && typeof (textarea as any).focus === 'function') {\n (textarea as any).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, any> = {};\n\n this.config.fields.forEach(field => {\n const fieldConfig = field as any;\n let initialValue = 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) as any;\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 fieldAny = field as any;\n const control = this.form.get(field.key as string);\n if (control && (fieldAny.disabled || fieldAny.readOnly)) {\n control.disable();\n }\n });\n }\n\n isFieldReadOnly(field: FormFieldConfig<TModel>): boolean {\n return this.config.readOnly === true || (field as any).readOnly === true;\n }\n\n isFieldDisabled(field: FormFieldConfig<TModel>): boolean {\n return this.config.disabled === true || (field as any).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 as any).fields) {\n (g as any).fields.forEach((f: any) => 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 fieldAny = field as any;\n const validators = fieldAny.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 this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldAny = field as any;\n const isVisible = fieldAny.visible ? fieldAny.visible(this.form.value) : 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 }\n });\n }\n\n private updateVisibility(): void {\n const formValue = this.form.value;\n this.config.fields.forEach(field => {\n const key = field.key as string;\n const fieldAny = field as any;\n const wasVisible = this.fieldVisibility[key];\n const isVisible = fieldAny.visible ? fieldAny.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\n const validators = (fieldAny as any).validators || [];\n control.setValidators(validators);\n control.updateValueAndValidity({ emitEvent: false });\n }\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 fieldAny = field as any;\n if (fieldAny.dataSource) {\n this.loadFieldOptions(field.key as string, fieldAny.dataSource, this.form.value);\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 any).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>): any {\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 };\n }\n\n private async loadFieldOptions(key: string, dataSource: FieldDataSource, formValue: any): 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: any) => 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: any[]): 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: Record<string, any> = {};\n\n private reloadDependentDataSources(formValue: any): void {\n this.config.fields.forEach(field => {\n const fieldAny = field as any;\n const dataSource: FieldDataSource | undefined = fieldAny.dataSource;\n if (!dataSource?.dependsOn) return;\n\n // Check if any dependency changed\n const changed = dataSource.dependsOn.some((depKey: any) => {\n return formValue[depKey] !== this.previousFormValue[depKey];\n });\n\n if (changed) {\n this.loadFieldOptions(field.key as string, dataSource, formValue);\n }\n });\n this.previousFormValue = { ...formValue };\n }\n\n getGridColumns(row: FormRow<TModel>): string {\n const cols = row.columns || 1;\n return `repeat(${cols}, 1fr)`;\n }\n\n getGridSpan(rowField: FormRowField<TModel>): string {\n const span = rowField.span || 1;\n return span > 1 ? `span ${span}` : '';\n }\n\n // =========================\n // Feature: File Upload Fields\n // =========================\n\n /** Store selected files keyed by field key */\n fileSelections: Record<string, File[]> = {};\n\n onFileChange(field: FormFieldConfig<TModel>, event: Event): void {\n const input = event.target as HTMLInputElement;\n const fileField = field as FileFieldConfig<TModel>;\n const files = Array.from(input.files || []);\n const key = field.key as string;\n\n // Validate file size\n if (fileField.maxSize) {\n const oversized = files.filter(f => f.size > fileField.maxSize!);\n if (oversized.length > 0) {\n // Remove oversized files\n const valid = files.filter(f => f.size <= fileField.maxSize!);\n this.fileSelections[key] = fileField.multiple\n ? [...(this.fileSelections[key] || []), ...valid]\n : valid.slice(0, 1);\n } else {\n this.fileSelections[key] = fileField.multiple\n ? [...(this.fileSelections[key] || []), ...files]\n : files.slice(0, 1);\n }\n } else {\n this.fileSelections[key] = fileField.multiple\n ? [...(this.fileSelections[key] || []), ...files]\n : files.slice(0, 1);\n }\n\n // Enforce maxFiles\n if (fileField.maxFiles && this.fileSelections[key].length > fileField.maxFiles) {\n this.fileSelections[key] = this.fileSelections[key].slice(0, fileField.maxFiles);\n }\n\n const control = this.form.get(key);\n if (control) {\n control.setValue(this.fileSelections[key]);\n control.markAsTouched();\n }\n\n // Reset input so same file can be re-selected\n input.value = '';\n }\n\n removeFile(key: string, index: number): void {\n this.fileSelections[key] = (this.fileSelections[key] || []).filter((_, i) => i !== index);\n const control = this.form.get(key);\n if (control) {\n control.setValue(this.fileSelections[key].length > 0 ? this.fileSelections[key] : null);\n }\n }\n\n getSelectedFiles(key: string): File[] {\n return this.fileSelections[key] || [];\n }\n\n formatFileSize(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 getFileError(field: FormFieldConfig<TModel>): string {\n const control = this.form.get(field.key as string);\n if (!control?.errors) return 'This field is required';\n if (control.errors['required']) return 'Please select a file';\n return 'Invalid file';\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 [formGroup]=\"form\" (ngSubmit)=\"submit()\" class=\"flex flex-col gap-6\">\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 })\"\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 })\"\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 })\"\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 })\"\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 })\"\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 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 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 ></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 <label 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-1\">\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 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 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 class=\"flex flex-col gap-1\">\n <label 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\n class=\"relative border-2 border-dashed border-base-300 rounded-xl p-6 text-center transition-colors hover:border-blue-400 hover:bg-blue-50/30\"\n [class.border-red-300]=\"form.get(asKey(rowField.field.key))?.invalid && form.get(asKey(rowField.field.key))?.touched\"\n [class.opacity-50]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n >\n <input\n type=\"file\"\n class=\"absolute inset-0 w-full h-full opacity-0 cursor-pointer\"\n [attr.accept]=\"asField(rowField.field).accept || null\"\n [attr.multiple]=\"asField(rowField.field).multiple || null\"\n [disabled]=\"isFieldReadOnly(rowField.field) || isFieldDisabled(rowField.field)\"\n (change)=\"onFileChange(rowField.field, $event)\"\n />\n <div class=\"flex flex-col items-center gap-2\">\n <svg class=\"w-8 h-8 text-base-content/40\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5\" />\n </svg>\n <p class=\"text-sm text-base-content/50\">{{ labels.fileUploadPrompt }}</p>\n @if (asField(rowField.field).accept) {\n <p class=\"text-xs text-base-content/40\">{{ labels.accepted }} {{ asField(rowField.field).accept }}</p>\n }\n @if (asField(rowField.field).maxSize) {\n <p class=\"text-xs text-base-content/40\">{{ labels.maxSize }} {{ formatFileSize(asField(rowField.field).maxSize) }}</p>\n }\n </div>\n </div>\n <!-- Selected files list -->\n @if (getSelectedFiles(asKey(rowField.field.key)).length > 0) {\n <div class=\"flex flex-col gap-1 mt-2\">\n @for (file of getSelectedFiles(asKey(rowField.field.key)); track file.name; let i = $index) {\n <div class=\"flex items-center justify-between px-3 py-1.5 bg-base-200 rounded-lg text-sm\">\n <span class=\"text-base-content truncate\">{{ file.name }} ({{ formatFileSize(file.size) }})</span>\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" type=\"button\" class=\"text-base-content/40 hover:text-red-500 ml-2 cursor-pointer\" (click)=\"removeFile(asKey(rowField.field.key), i)\">×</button>\n </div>\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 {{ getFileError(rowField.field) }}\n </div>\n }\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 <label 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 <mn-table\n [dataSource]=\"tableDataSources[asKey(rowField.field.key)]\"\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 class=\"grid gap-4\" [style.grid-template-columns]=\"getGridColumns(row)\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div class=\"flex flex-col gap-2\" [style.grid-column]=\"getGridSpan(rowField)\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\">\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 class=\"grid gap-4\" [style.grid-template-columns]=\"getGridColumns(row)\">\n @for (rowField of row.fields; track rowField.field.key) {\n <div class=\"flex flex-col gap-2\" [style.grid-column]=\"getGridSpan(rowField)\" [style.display]=\"isFieldVisible(rowField.field) ? '' : 'none'\">\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 border-t border-base-300\">\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 { 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 = any> {\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>): any {\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 Component,\n Input,\n OnInit,\n OnDestroy,\n ChangeDetectorRef,\n ViewChildren,\n QueryList,\n AfterViewInit,\n inject,\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 WizardModalConfig,\n WizardStepConfig,\n ModalStepId,\n NavigationDirection,\n ModalCloseReason,\n WizardResult,\n WizardFlowMode,\n ModalKind,\n FormModalConfig,\n ModalFooterAction,\n ActionStyle,\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 { MnFooterActionsComponent } from '../mn-footer-actions/mn-footer-actions.component';\nimport { MnLanguageService } from '../../../../language/mn-language.service';\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 @Input() config!: WizardModalConfig;\n @Input() modalRef!: MnModalRef<WizardResult>;\n\n @ViewChildren(MnFormBodyComponent) formBodies!: QueryList<MnFormBodyComponent>;\n\n currentStepId!: ModalStepId;\n visitedStepIds: ModalStepId[] = [];\n isCurrentStepValid = true;\n isCompleting = false;\n wizardErrors: Record<string, string> = {};\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 any).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<any, any>> = {};\n\n private statusSubscription?: Subscription;\n private formBodiesSubscription?: Subscription;\n\n constructor(private cdr: ChangeDetectorRef) {}\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<any, any>;\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 });\n // Initial validity check\n this.trackCurrentStepValidity();\n }\n\n ngOnDestroy(): void {\n this.statusSubscription?.unsubscribe();\n this.formBodiesSubscription?.unsubscribe();\n }\n\n asAny(val: any): any {\n return val;\n }\n\n isTextBody(step: WizardStepConfig): boolean {\n return typeof step.body === 'string' || typeof step.body === 'number';\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 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 const stepIndex = this.currentStepIndex;\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 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, any>> {\n const aggregated: Record<ModalStepId, Record<string, any>> = {};\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<any>): any {\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: 'ghost', 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<any>): Promise<void> {\n if (action.handler) {\n await action.handler(this.modalRef as any);\n }\n if (action.closesModal) {\n this.modalRef.close((action.closeReason || ModalCloseReason.PROGRAMMATIC) as any);\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 gap-6\" [class.h-full]=\"config.sizeHeight\">\n @if (config.component || config.template) {\n <mn-custom-body-host\n [config]=\"asAny(config)\"\n [modalRef]=\"asAny(modalRef)\"\n class=\"block\"\n ></mn-custom-body-host>\n }\n\n <div class=\"flex gap-2 pb-4 border-b border-base-300\">\n @for (step of visibleSteps; track step.id; let i = $index) {\n <div\n class=\"flex items-center gap-2 flex-1\"\n [class.active]=\"step.id === currentStepId\"\n [class.complete]=\"visitedStepIds.includes(step.id) && step.id !== currentStepId\"\n [class.cursor-pointer]=\"isFreeFlow && canNavigateToStep(step)\"\n (click)=\"isFreeFlow ? goToStep(step) : null\"\n >\n <div\n class=\"w-8 h-8 rounded-full flex items-center justify-center font-semibold transition-all text-sm\"\n [ngClass]=\"{\n 'bg-blue-500 text-white': step.id === currentStepId,\n 'bg-green-500 text-white': visitedStepIds.includes(step.id) && step.id !== currentStepId,\n 'bg-base-200 text-base-content/50': !visitedStepIds.includes(step.id) && step.id !== currentStepId\n }\"\n >{{ i + 1 }}</div>\n <div\n class=\"text-sm\"\n [ngClass]=\"{\n 'text-base-content font-semibold': step.id === currentStepId,\n 'text-base-content/50': step.id !== currentStepId\n }\"\n >{{ step.title }}</div>\n </div>\n }\n </div>\n\n <div class=\"min-h-48 flex-1\">\n @for (step of config.steps; track step.id) {\n <div [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]=\"asAny(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\n <!-- Wizard-level errors (from onBeforeComplete) -->\n @if (wizardErrors && (wizardErrors | keyvalue).length > 0) {\n <div class=\"flex flex-col gap-1 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 <div class=\"flex gap-3 pt-4 border-t border-base-300\">\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($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, ViewContainerRef, 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 @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 constructor(private cdr: ChangeDetectorRef) {}\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 asAny(val: any): any {\n return val;\n }\n\n get isConfirmDisabled(): boolean {\n if (this.hasFormFields) {\n return this.confirmButtonStatus !== 'VALID';\n }\n return false;\n }\n\n asField(field: any): any {\n return field;\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]=\"asAny(config)\"\n [modalRef]=\"asAny(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]=\"asAny(config)\"\n [modalRef]=\"asAny(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\">\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 { Component, HostBinding, HostListener, Input, ElementRef, AfterViewInit, OnDestroy, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MnModalRef } from '../../mn-modal-ref';\nimport {\n ModalConfig,\n ModalKind,\n ModalSize,\n BackdropMode,\n KeyboardMode,\n CloseMode,\n ModalCloseReason,\n ModalFooterAction,\n ActionStyle,\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';\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 ],\n templateUrl: './mn-modal-shell.component.html',\n styleUrls: ['./mn-modal-shell.component.css'],\n})\nexport class MnModalShellComponent<TResult = any> implements OnInit, AfterViewInit, OnDestroy {\n @Input() config!: ModalConfig<TResult>;\n @Input() modalRef!: MnModalRef<TResult>;\n\n isClosing = false;\n isStacked = false;\n readonly ModalKind = ModalKind;\n private previouslyFocusedElement: HTMLElement | null = null;\n private focusTrapListener: ((e: KeyboardEvent) => void) | null = null;\n private pollingTimer: any = null;\n private pollAttempts = 0;\n\n constructor(private el: ElementRef<HTMLElement>, private cdr: ChangeDetectorRef) {}\n\n ngOnInit(): void {\n this.startPollingIfConfigured();\n }\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 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: any): any {\n return config;\n }\n\n asForm(config: any): any {\n return config;\n }\n\n asConfirmation(config: any): any {\n return config;\n }\n\n asCustom(config: any): any {\n return config;\n }\n\n asAny(val: any): any {\n return val;\n }\n\n @HostBinding('class') get hostClasses(): string {\n const size = this.config.sizeWidth || ModalSize.MD;\n const closing = this.isClosing ? ' closing' : '';\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 return `modal-shell modal-${size}${closing}${animation}${stacked}`;\n }\n\n /** Triggers the closing animation. Deferred to avoid NG0100 when called during a CD cycle. */\n startClosing(): Promise<void> {\n return new Promise(resolve => {\n setTimeout(() => {\n this.isClosing = true;\n this.cdr.detectChanges();\n setTimeout(resolve, 150);\n });\n });\n }\n\n @HostListener('document:keydown.escape', ['$event'])\n onEscapeKey(event: any): 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 if (this.config.backdrop === BackdropMode.CLOSABLE) {\n this.handleClose(ModalCloseReason.BACKDROP);\n }\n }\n\n onCloseButtonClick(): void {\n this.handleClose(ModalCloseReason.DISMISSED);\n }\n\n private async handleClose(reason: ModalCloseReason): Promise<void> {\n if (this.config.closeMode === CloseMode.DISABLED) {\n return;\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;\n }\n }\n\n this.modalRef.dismiss(reason);\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 get animationClass(): string {\n const animType = typeof this.config.animation === 'string'\n ? this.config.animation\n : this.config.animation?.type || 'slide';\n\n switch (animType) {\n case 'fade': return 'animate-[fadeIn_0.2s_ease-in-out]';\n case 'zoom': return 'animate-[zoomIn_0.2s_ease-in-out]';\n case 'slide':\n default: return 'animate-[slideIn_0.2s_ease-in-out]';\n }\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 <div class=\"modal-backdrop absolute inset-0 bg-black/50 animate-[fadeIn_0.2s_ease-in-out]\" (click)=\"onBackdropClick()\"></div>\n}\n\n<div\n class=\"modal-container relative bg-base-100 rounded-lg shadow-xl max-h-[90vh] overflow-hidden flex flex-col\"\n [ngClass]=\"[containerSizeClass, animationClass]\"\n [style.min-height]=\"containerHeightStyle\"\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 <div class=\"flex items-center justify-between p-6 border-b border-base-300\">\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 <button\n class=\"bg-transparent border-none text-2xl cursor-pointer text-base-content/50 p-0 w-8 h-8 flex items-center justify-center rounded transition-colors hover:bg-base-200 hover:text-base-content\"\n (click)=\"onCloseButtonClick()\"\n aria-label=\"Close modal\"\n >\n ×\n </button>\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 <div class=\"flex-1 overflow-y-auto p-6\">\n @if (config.kind === ModalKind.WIZARD) {\n <mn-wizard-body\n [config]=\"asWizard(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-wizard-body>\n }\n\n @if (config.kind === ModalKind.FORM) {\n <mn-form-body\n [config]=\"asForm(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-form-body>\n }\n\n @if (config.kind === ModalKind.CONFIRMATION) {\n <mn-confirmation-body\n [config]=\"asConfirmation(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-confirmation-body>\n }\n\n @if (config.kind === ModalKind.CUSTOM) {\n <mn-custom-body-host\n [config]=\"asCustom(config)\"\n [modalRef]=\"asAny(modalRef)\"\n ></mn-custom-body-host>\n }\n </div>\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 {\n Injectable,\n ApplicationRef,\n ComponentRef,\n createComponent,\n EnvironmentInjector,\n inject,\n} 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<any>[] = [];\n\n open<TResult = any>(config: ModalConfig<TResult>): MnModalRef<TResult> {\n // Create the modal shell component\n const componentRef: ComponentRef<MnModalShellComponent<TResult>> = createComponent(MnModalShellComponent as any, {\n environmentInjector: this.injector,\n });\n\n // Set the config on the component\n componentRef.instance.config = config;\n\n // Create modal ref\n const modalRef = new MnModalRef<TResult>(componentRef, config);\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.isStacked = true;\n }\n this.modalStack.push(modalRef);\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);\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.isStacked = false;\n }\n }\n });\n\n return modalRef;\n }\n}\n","// Types\nexport * from './mn-modal.types';\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 ChangeDetectorRef,\n Component,\n DoCheck,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n TemplateRef\n} from '@angular/core';\nimport {NgClass, NgTemplateOutlet} from '@angular/common';\nimport {debounceTime, skip, Subject, Subscription} from 'rxjs';\nimport {ListDataSource} from './mn-list.types';\nimport {MnButton} from '../mn-button';\nimport {MnSelect, MnSelectOption} from '../mn-select';\nimport {FormsModule} from '@angular/forms';\n\n@Component({\n selector: 'mn-list',\n standalone: true,\n imports: [NgClass, NgTemplateOutlet, MnButton, MnSelect, FormsModule],\n templateUrl: './mn-list.component.html',\n styleUrl: './mn-list.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MnList<T = any> implements OnInit, OnDestroy, DoCheck {\n @Input() dataSource!: ListDataSource<T>;\n\n @Output() selectionChange = new EventEmitter<T[]>();\n @Output() itemClick = new EventEmitter<T>();\n\n filteredItems: T[] = [];\n paginatedItems: T[] = [];\n searchValue = '';\n loadingMoreRows = false;\n selectedIds = new Set<string>();\n\n currentPage = 1;\n pageSize = 10;\n\n private cdr = inject(ChangeDetectorRef);\n private dataSubscription?: Subscription;\n private searchSubject = new Subject<string>();\n private searchSubscription?: Subscription;\n\n /** Tracks the previous toolbar template reference for change detection. */\n private previousToolbarTemplate?: TemplateRef<any>;\n\n ngDoCheck(): void {\n const currentTemplate = this.dataSource?.toolbarTemplate;\n if (currentTemplate !== this.previousToolbarTemplate) {\n this.previousToolbarTemplate = currentTemplate;\n this.cdr.markForCheck();\n }\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 ngOnDestroy(): void {\n this.dataSubscription?.unsubscribe();\n this.searchSubscription?.unsubscribe();\n }\n\n // ── Search ──\n\n get isPaginated(): boolean {\n const mode = this.dataSource.paginationMode;\n return mode === 'paginated' || mode === 'client-side-pagination';\n }\n\n // ── Selection ──\n\n isSelected(item: T): boolean {\n return this.selectedIds.has(this.dataSource.getID(item));\n }\n\n toggleItem(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 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 // ── Item interaction ──\n\n onItemClick(item: T): void {\n this.dataSource.onItemClick?.(item);\n this.itemClick.emit(item);\n }\n\n // ── Pagination ──\n\n /** Whether the list is in server-side paginated mode (always true when paginated or load-more). */\n get isServerPaginated(): boolean {\n const mode = this.dataSource.paginationMode ?? 'load-more';\n return mode === 'paginated' || mode === 'load-more';\n }\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 // ── Paginated Mode ──\n\n get totalPages(): number {\n return Math.max(1, Math.ceil(this.totalItemCount / this.pageSize));\n }\n\n ngOnInit(): void {\n this.validateDataSource();\n this.pageSize = this.dataSource.pageSize ?? 10;\n\n // Pre-select items from initialSelectedIds if provided\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 this.applyFilter(false);\n\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\n onSearch(searchString: string): void {\n this.currentPage = 1;\n if (this.isServerPaginated) {\n this.searchValue = searchString;\n this.dataSource.onServerSearch?.(searchString);\n this.cdr.markForCheck();\n } else {\n this.searchSubject.next(searchString);\n }\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.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 get resolvedPageSizeOptions(): number[] {\n return this.dataSource.pageSizeOptions ?? [5, 10, 25, 50];\n }\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 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.dataSource.onPageChange?.(page);\n }\n this.cdr.markForCheck();\n }\n\n onPageSizeChange(newSize: number): void {\n this.pageSize = newSize;\n this.currentPage = 1;\n if (this.dataSource.paginationMode === 'client-side-pagination') {\n this.applyPagination();\n } else {\n this.dataSource.onPageSizeChange?.(newSize);\n }\n this.cdr.markForCheck();\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 trackByID = (_index: number, item: T): string => {\n return this.dataSource.getID(item);\n };\n\n // ── Skeleton rows for loading ──\n\n get skeletonRows(): number[] {\n return Array.from({length: 5});\n }\n\n // ── Private ──\n\n private 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 private applyFilter(searchForItems: boolean): void {\n let items = this.dataSource.dataRows.value;\n\n // Skip client-side search filtering when server handles it.\n if (!this.isServerPaginated && this.dataSource.isInSearch && this.dataSource.canSearch && this.searchValue.length > 0) {\n const term = this.searchValue.toLowerCase();\n items = items.filter(row => this.dataSource.isInSearch!(row, term));\n }\n\n this.filteredItems = items;\n this.applyPagination();\n\n if (searchForItems) {\n this.loadMoreRows();\n }\n }\n\n private 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 private validateDataSource(): void {\n const mode = this.dataSource.paginationMode;\n if (mode === 'paginated') {\n if (!this.dataSource.onPageChange) {\n throw new Error(`[MnList] paginationMode is 'paginated' but 'onPageChange' callback is missing. Server-side pagination requires 'onPageChange'.`);\n }\n if (this.dataSource.totalItems == null) {\n throw new Error(`[MnList] 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(`[MnList] 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(`[MnList] pageSize '${size}' is not one of the allowed pageSizeOptions [${options.join(', ')}]. pageSize must be one of pageSizeOptions.`);\n }\n }\n }\n\n private 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","<!-- 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-brand-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 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 (dataSource.isDataLoading) {\n @for (_ of skeletonRows; track $index) {\n <div class=\"animate-pulse px-4 py-3\" [class.py-2]=\"dataSource.appearance?.compact\" role=\"listitem\">\n <div class=\"h-4 w-3/4 rounded bg-base-300 mb-1\"></div>\n <div class=\"h-3 w-1/2 rounded bg-base-300\"></div>\n </div>\n @if (!$last && (dataSource.appearance?.dividers !== false)) {\n <div class=\"border-b border-base-300\"></div>\n }\n }\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 <label class=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"allSelected\"\n (change)=\"toggleAll()\"\n aria-label=\"Select all items\"\n />\n <span class=\"text-xs text-base-content/70\">Select all</span>\n </label>\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 (click)=\"onItemClick(item)\"\n >\n <!-- Selection checkbox -->\n @if (hasSelection) {\n <div class=\"shrink-0\">\n <label>\n <input\n type=\"checkbox\"\n class=\"checkbox checkbox-sm checkbox-primary\"\n [checked]=\"isSelected(item)\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleItem(item)\"\n />\n </label>\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 button -->\n@if (showLoadMore) {\n <div class=\"flex justify-center py-4\">\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'primary' }\"\n class=\"px-4 py-1.5 text-sm rounded border border-brand-500 text-brand-500 hover:bg-brand-100 transition-colors disabled:opacity-50\"\n (click)=\"loadMoreRows()\"\n [disabled]=\"loadingMoreRows\"\n >\n @if (loadingMoreRows) {\n <span class=\"inline-block w-3 h-3 border-2 border-brand-500 border-t-transparent rounded-full animate-spin mr-2\"></span>\n }\n {{ dataSource.labels?.loadMore || 'Load more' }}\n </button>\n </div>\n}\n\n<!-- Pagination controls -->\n@if (isPaginated && (totalPages > 1 || isServerPaginated)) {\n <div class=\"flex items-center justify-between px-2 py-3 text-sm text-base-content\">\n <div class=\"flex items-center gap-2\">\n <span>{{ dataSource.labels?.rowsPerPage || 'Items per page:' }}</span>\n <mn-lib-select\n (ngModelChange)=\"onPageSizeChange($event)\"\n [ngModel]=\"pageSize\"\n [props]=\"{\n id: 'mn-list-page-size',\n options: pageSizeSelectOptions,\n size: 'sm'\n }\"\n ></mn-lib-select>\n </div>\n\n <div class=\"flex items-center gap-1\">\n <span class=\"text-xs mr-2\">{{ (currentPage - 1) * pageSize + 1 }}\n –{{ currentPage * pageSize > totalItemCount ? totalItemCount : currentPage * pageSize }}\n of {{ totalItemCount }}</span>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(1)\"\n aria-label=\"First page\"\n >«</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === 1 }\"\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 [disabled]=\"currentPage === 1\"\n (click)=\"goToPage(currentPage - 1)\"\n aria-label=\"Previous page\"\n >‹</button>\n\n @for (page of visiblePages; track page) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n class=\"px-2.5 py-1 rounded underline underline-offset-2 transition-colors text-xs\"\n [class.border-secondary]=\"page === currentPage\"\n [class.text-accent]=\"page === currentPage\"\n [class.text-white]=\"page !== currentPage\"\n [class.border-base-300]=\"page !== currentPage\"\n [class.hover:bg-base-200]=\"page !== currentPage\"\n (click)=\"goToPage(page)\"\n [attr.aria-label]=\"'Page ' + page\"\n [attr.aria-current]=\"page === currentPage ? 'page' : null\"\n >{{ page }}</button>\n }\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(currentPage + 1)\"\n aria-label=\"Next page\"\n >›</button>\n\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'outline', color: 'secondary', disabled: currentPage === totalPages }\"\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 [disabled]=\"currentPage === totalPages\"\n (click)=\"goToPage(totalPages)\"\n aria-label=\"Last page\"\n >»</button>\n </div>\n </div>\n}\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 interface 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 * `<app-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 interface 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 interface 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 interface 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 interface 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 { Inject, Injectable, Optional } 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 @Optional() @Inject(CALENDAR_CONFIG) config?: CalendarConfig | null\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: 'app-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 (click)=\"onDayClick(item.date)\"\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, Inject, OnInit, Optional } 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: 'app-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 /** The event to render. Set by {@link CalendarEventComponent} after creation. */\n event!: CalendarEvent;\n formattedTime = '';\n\n private formatter: CalendarDateFormatter;\n\n constructor(\n @Optional() @Inject(CALENDAR_DATE_FORMATTER) formatter: CalendarDateFormatter | null,\n private cdr: ChangeDetectorRef,\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: 'app-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 class=\"calendar-event-wrapper\" (click)=\"onEventClick()\">\n <ng-template #eventContainer></ng-template>\n</div>\n","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, Output, EventEmitter, Type } 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. */\ninterface DisplayHourRow extends HourRow {\n hourLabel: string;\n}\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: 'app-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 /** 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 private layoutService: CalendarEventLayoutService,\n private cdr: ChangeDetectorRef,\n ) {\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 <app-calendar-event [event]=\"event\" [customComponent]=\"calendarEventComponent\"></app-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import { ChangeDetectorRef, Component, Input, OnDestroy, OnInit, Output, EventEmitter, Type } 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. */\ninterface DisplayHourRow extends HourRow {\n hourLabel: string;\n}\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: 'app-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 /** 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 private layoutService: CalendarEventLayoutService,\n private cdr: ChangeDetectorRef,\n ) {\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 <app-calendar-event [event]=\"event\" [customComponent]=\"calendarEventComponent\"></app-calendar-event>\n </div>\n }\n </div>\n </div>\n</div>\n","import { Component, Inject, Input, OnInit, Optional, Output, EventEmitter } 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: 'app-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 @Optional() @Inject(CALENDAR_DATE_FORMATTER) formatter: CalendarDateFormatter | null\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 class=\"upcoming-event-row\" (click)=\"eventClicked.emit(event)\" [style.border-left-color]=\"event.color.primaryColor\">\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, 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, 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: 'app-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, 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 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 <app-upcoming-event-row\n [event]=\"event\"\n (eventClicked)=\"eventClicked.emit($event)\">\n </app-upcoming-event-row>\n }\n @if (upcomingEvents.length === 0) {\n <div class=\"no-events\">{{ noEventsMessage }}</div>\n }\n</div>\n","import { Component, DestroyRef, EventEmitter, HostListener, Inject, inject, Input, OnDestroy, OnInit, Optional, Output, Type } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { BehaviorSubject, Observable, Subject, skip, takeUntil } from 'rxjs';\nimport { CalendarButton, CalendarEvent } from '../../models/calendar-event.model';\nimport { CalendarEventData } from '../../models/calendar-event-data.model';\nimport { CalendarView, CALENDAR_CONFIG, CalendarConfig, DEFAULT_CALENDAR_CONFIG, MN_CALENDAR_CONFIG, provideMnCalendarConfig, resolveCalendarConfig } from '../../models/calendar-config.model';\nimport { MnLanguageService } from '../../../../language/mn-language.service';\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/mn-button';\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 * <app-calendar-view\n * [showButton]=\"true\"\n * [buttonTitle]=\"'New Event'\"\n * [NewCalendarItemsEvent]=\"eventsEmitter\"\n * (RequestNewCalendarItemsEvent)=\"loadEvents($event)\"\n * (CalendarItemClickedEvent)=\"onEventClick($event)\"\n * (ButtonClickedEvent)=\"openModal()\">\n * </app-calendar-view>\n * ```\n */\n@Component({\n selector: 'app-calendar-view',\n standalone: true,\n imports: [\n CommonModule,\n CalendarMonthComponent,\n CalendarWeekComponent,\n CalendarDayComponent,\n UpcomingEventsComponent,\n MnButton\n ],\n templateUrl: './calendar-view.component.html',\n providers: [\n provideMnCalendarConfig(DEFAULT_CALENDAR_CONFIG),\n ],\n styles: [`\n :host { display: flex; flex-direction: column; width: 100%; height: 100%; }\n .calendar-view { width: 100%; height: 100%; font-family: inherit; display: flex; flex-direction: column; }\n .calendar-toolbar {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: 12px 0;\n gap: 12px;\n flex-wrap: wrap;\n }\n .toolbar-left { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }\n .toolbar-right { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }\n .view-switcher { display: flex; border: 1px solid var(--color-base-300); border-radius: 6px; overflow: hidden; }\n .view-btn {\n padding: 6px 14px;\n border: none;\n background: var(--color-base-100);\n cursor: pointer;\n font-size: 13px;\n transition: background 0.15s;\n }\n .view-btn:hover { background: var(--color-base-200); }\n .view-btn.active { background: var(--color-primary); color: var(--color-primary-content, white); }\n .date-nav { display: flex; align-items: center; gap: 4px; }\n .nav-btn {\n width: 32px; height: 32px; border: 1px solid var(--color-base-300); border-radius: 6px;\n background: var(--color-base-100); cursor: pointer; font-size: 18px; display: flex;\n align-items: center; justify-content: center;\n }\n .nav-btn:hover { background: var(--color-base-200); }\n .date-input {\n padding: 4px 8px; border: 1px solid var(--color-base-300); border-radius: 6px; background: var(--color-base-100); color: var(--color-base-content);\n font-size: 13px;\n }\n .today-btn {\n padding: 6px 12px; border: 1px solid var(--color-base-300); border-radius: 6px;\n background: var(--color-base-100); cursor: pointer; font-size: 13px; color: var(--color-base-content);\n }\n .today-btn:hover { background: var(--color-base-200); }\n .action-btn {\n padding: 8px 16px; border: none; border-radius: 6px;\n background: var(--color-primary); color: var(--color-primary-content, white); cursor: pointer; font-size: 13px;\n }\n .action-btn:hover { opacity: 0.85; }\n .calendar-content { display: grid; grid-template-columns: 1fr 220px; gap: 12px; flex: 1; min-height: 0; }\n .calendar-main { min-width: 0; min-height: 0; overflow: hidden; }\n .calendar-sidebar { border-left: 1px solid var(--color-base-300); overflow: auto; }\n\n @media (max-width: 767px) {\n .calendar-toolbar { padding: 8px 0; }\n .toolbar-left { flex-direction: column; align-items: flex-start; gap: 8px; }\n .view-switcher { display: none; }\n .calendar-content { grid-template-columns: 1fr; }\n .calendar-sidebar { display: none; }\n .calendar-main { overflow-y: auto; }\n }\n `]\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\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 private readonly destroyRef = inject(DestroyRef);\n private readonly lang = inject(MnLanguageService);\n\n constructor(\n @Optional() @Inject(CALENDAR_DATE_FORMATTER) formatter: CalendarDateFormatter | null,\n @Optional() @Inject(MN_CALENDAR_CONFIG) mnConfig: CalendarConfig | null,\n @Optional() @Inject(CALENDAR_CONFIG) legacyConfig: CalendarConfig | null\n ) {\n this.formatter = formatter ?? new DefaultCalendarDateFormatter();\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 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 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 this.isMobileView = window.innerWidth < this.config.mobileBreakpoint;\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=\"calendar-view\" role=\"application\" aria-label=\"Calendar\">\n <div class=\"calendar-toolbar\">\n <div class=\"toolbar-left\">\n <div class=\"view-switcher\" role=\"tablist\" aria-label=\"Calendar view\">\n @for (view of viewOptions; track view.value) {\n <button\n mnButton\n [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\"\n class=\"view-btn\"\n role=\"tab\"\n [attr.aria-selected]=\"currentView === view.value\"\n [class.active]=\"currentView === view.value\"\n (click)=\"switchView(view.value)\">\n {{ view.label }}\n </button>\n }\n </div>\n <div class=\"date-nav\">\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" class=\"nav-btn\" (click)=\"navigatePrevious()\" aria-label=\"Previous\">‹</button>\n <input type=\"date\" [value]=\"dateInputValue\" (change)=\"onDateInputChange($event)\" class=\"date-input\" aria-label=\"Select date\" />\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" class=\"nav-btn\" (click)=\"navigateNext()\" aria-label=\"Next\">›</button>\n <button mnButton [data]=\"{ size: 'sm', variant: 'text', color: 'secondary' }\" class=\"today-btn\" (click)=\"goToToday()\">{{ config.todayLabel }}</button>\n </div>\n </div>\n <div class=\"toolbar-right\">\n @for (btn of buttons; track btn.label) {\n <button mnButton [data]=\"btn.buttonData || {}\" (click)=\"btn.onClick()\">\n {{ btn.label }}\n </button>\n }\n @if (showButton) {\n <button mnButton [data]=\"{}\" (click)=\"ButtonClickedEvent.emit()\">\n {{ buttonTitle }}\n </button>\n }\n </div>\n </div>\n <div class=\"calendar-content\">\n <div class=\"calendar-main\">\n @if (currentView === CalendarView.MONTH) {\n <app-calendar-month\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n (dayClicked)=\"onMonthDayClick($event)\">\n </app-calendar-month>\n }\n @if (currentView === CalendarView.WEEK) {\n <app-calendar-week\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </app-calendar-week>\n }\n @if (currentView === CalendarView.DAY) {\n <app-calendar-day\n [focusDay]=\"focusDay\"\n [eventsChanged]=\"internalEventsChanged\"\n [focusDayChanged]=\"internalFocusDayChanged\"\n [config]=\"config\"\n [calendarEventComponent]=\"CalendarEventComponent\"\n (eventClicked)=\"onEventClick($event)\">\n </app-calendar-day>\n }\n </div>\n <div class=\"calendar-sidebar\">\n <app-upcoming-events\n [eventsChanged]=\"internalEventsChanged\"\n [config]=\"config\"\n (eventClicked)=\"onEventClick($event)\">\n </app-upcoming-events>\n </div>\n </div>\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, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { MnTranslatePipe } from '../../language/mn-translate.pipe';\nimport { MnTabDataSource, MnTabItem } from './mn-tab.types';\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],\n templateUrl: './mn-tab.component.html',\n})\nexport class MnTabComponent implements OnInit {\n /** Data source containing tab items and default active index. */\n @Input() dataSource!: MnTabDataSource;\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 /** Initializes the default active tab based on the data source configuration. */\n ngOnInit(): void {\n if (\n this.dataSource &&\n this.dataSource.items.length > this.dataSource.defaultActive\n ) {\n this.currentActive = this.dataSource.items[this.dataSource.defaultActive];\n }\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 && this.currentActive !== item) {\n this.currentActive.onDeactivate?.();\n item.onClick?.();\n this.currentActive = item;\n this.activeChange.emit(item);\n }\n }\n}\n","<div class=\"w-full mb-10 flex justify-center\">\n <div class=\"inline-flex rounded-lg p-2 bg-base-100 shadow-md\">\n <div role=\"tablist\" class=\"tabs flex\">\n @for (item of dataSource.items; track item.label) {\n <div\n role=\"tab\"\n class=\"tab px-4 min-w-36 py-2 border-b-2 cursor-pointer select-none transition-colors\"\n [class.text-brand-500]=\"currentActive === item\"\n [class.font-bold]=\"currentActive === item\"\n [class.border-brand-500]=\"currentActive === item\"\n [class.border-base-300]=\"currentActive !== item\"\n [class.text-base-content]=\"currentActive !== item\"\n [attr.aria-selected]=\"currentActive === item\"\n (click)=\"setActive(item)\"\n >\n {{ item.label | mnTranslate }}\n </div>\n }\n </div>\n </div>\n</div>\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 interface 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 { MnConfigService } from '../config/mn-config.service';\nimport { MnLanguageService } from '../language/mn-language.service';\n\nexport interface MnPreviewMessage {\n type: 'mn-config-update' | 'mn-translations-update';\n config?: Record<string, any>;\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","i1.MnLanguageService","i2","i1.CalendarEventLayoutService"],"mappings":"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"}
|