@nexterajs/ui 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/fesm2022/nexterajs-ui-core.mjs +189 -5
  2. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  3. package/fesm2022/nexterajs-ui-dropdowns.mjs +314 -50
  4. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  5. package/fesm2022/nexterajs-ui-file-uploader.mjs +6 -3
  6. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  7. package/fesm2022/nexterajs-ui-forms.mjs +729 -370
  8. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  9. package/fesm2022/nexterajs-ui-grid.mjs +1188 -208
  10. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  11. package/fesm2022/nexterajs-ui-intl.mjs +15 -5
  12. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  13. package/fesm2022/nexterajs-ui-notify.mjs +351 -0
  14. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -0
  15. package/fesm2022/nexterajs-ui-pivot.mjs +146 -116
  16. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  17. package/fesm2022/nexterajs-ui-styling.mjs +568 -3
  18. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -1
  19. package/fesm2022/nexterajs-ui-tree-view.mjs +147 -18
  20. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  21. package/fesm2022/nexterajs-ui-validation.mjs +247 -92
  22. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  23. package/fesm2022/nexterajs-ui.mjs +1 -0
  24. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  25. package/package.json +5 -1
  26. package/styles/_dropdown.scss +149 -0
  27. package/styles/_editor.scss +23 -4
  28. package/styles/_icons.scss +92 -0
  29. package/styles/_mixins.scss +104 -1
  30. package/styles/_scrollbar.scss +134 -0
  31. package/styles/_toast.scss +243 -0
  32. package/styles/_tokens.scss +48 -0
  33. package/styles/index.scss +4 -0
  34. package/types/nexterajs-ui-core.d.ts +142 -22
  35. package/types/nexterajs-ui-dropdowns.d.ts +145 -27
  36. package/types/nexterajs-ui-file-uploader.d.ts +4 -1
  37. package/types/nexterajs-ui-forms.d.ts +103 -19
  38. package/types/nexterajs-ui-grid.d.ts +445 -57
  39. package/types/nexterajs-ui-notify.d.ts +147 -0
  40. package/types/nexterajs-ui-pivot.d.ts +35 -22
  41. package/types/nexterajs-ui-styling.d.ts +163 -3
  42. package/types/nexterajs-ui-tree-view.d.ts +50 -1
  43. package/types/nexterajs-ui-validation.d.ts +94 -15
  44. package/types/nexterajs-ui.d.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"nexterajs-ui-forms.mjs","sources":["../../../projects/nextera-ui/forms/src/lib/button/nxe-button.component.ts","../../../projects/nextera-ui/forms/src/lib/text-box/nxe-text-box.component.ts","../../../projects/nextera-ui/forms/src/lib/text-area/nxe-text-area.component.ts","../../../projects/nextera-ui/forms/src/lib/check-box/nxe-check-box.component.ts","../../../projects/nextera-ui/forms/src/lib/number-box/nxe-number-box.component.ts","../../../projects/nextera-ui/forms/src/lib/date-box/nxe-date-box.component.ts","../../../projects/nextera-ui/forms/src/lib/scroll-view/nxe-scroll-view.component.ts","../../../projects/nextera-ui/forms/src/public-api.ts","../../../projects/nextera-ui/forms/src/nexterajs-ui-forms.ts"],"sourcesContent":["import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeValidationGroupRegistry } from '@nexterajs/ui/core';\r\nimport { NxeValidationResult } from '@nexterajs/ui/core';\r\n\r\n/** DevExtreme button `type` (style intent), as used in this codebase. */\r\nexport type NxeButtonType = 'normal' | 'default' | 'success' | 'danger';\r\n\r\n/**\r\n * dx size coercion: `height=\"35\"` and `[height]=\"35\"` both mean 35px, while `'100%'` or `'3rem'`\r\n * pass through untouched. Templates write the attribute form, so the string case is the common one.\r\n */\r\nfunction cssSize(value: number | string | undefined): string | null {\r\n if (value === undefined || value === null || value === '') {\r\n return null;\r\n }\r\n return /^-?\\d+(\\.\\d+)?$/.test(String(value)) ? `${value}px` : String(value);\r\n}\r\n\r\n/**\r\n * The `validationGroup` object carried on a {@link NxeButtonClickEvent}, mirroring the\r\n * DevExtreme button-click `event.validationGroup`. Its `validate()` runs every member of the\r\n * button's named group through the {@link NxeValidationGroupRegistry} and returns the\r\n * DevExtreme-shaped result — so `const r = event.validationGroup.validate(); if (r.isValid) {...}`\r\n * keeps working after the tag rename.\r\n */\r\nexport interface NxeButtonValidationGroup {\r\n validate(): NxeValidationResult;\r\n}\r\n\r\n/**\r\n * Payload emitted from `nxe-button`'s `onClick`, mirroring DevExtreme's button click event.\r\n * Only `validationGroup` is read by existing handlers; `event`/`component`/`element` are\r\n * provided for parity.\r\n */\r\nexport interface NxeButtonClickEvent {\r\n event: Event;\r\n validationGroup: NxeButtonValidationGroup;\r\n component: NxeButtonComponent;\r\n element: HTMLElement;\r\n}\r\n\r\n/**\r\n * `nxe-button` — drop-in replacement for DevExtreme `dx-button`.\r\n *\r\n * The host element IS the button (mirrors DevExtreme's `dx-button` DOM: the host carries the\r\n * styling classes and contains a single `.dx-button-content` child). This keeps every existing\r\n * `.nxe-btn*` / `.dx-button-content` global rule matching verbatim, and — critically — keeps the\r\n * shared `buttonLoading` directive working, which swaps `.dx-button-content` innerHTML for a\r\n * spinner (`getElementsByClassName('dx-button-content')[0]`).\r\n *\r\n * Content is projected (`<nxe-icon> + <span>`, the dominant pattern). The legacy `text`/`type`\r\n * inputs render a `.dx-button-text` label for the ~25 attribute-styled buttons.\r\n *\r\n * `onClick` emits {@link NxeButtonClickEvent}; native `(click)` also fires (27 sites bind it).\r\n */\r\n@Component({\r\n selector: 'nxe-button',\r\n standalone: true,\r\n template: `\r\n <span class=\"dx-button-content\">\r\n @if (icon()) {\r\n <i class=\"dx-icon dx-icon-{{ icon() }}\"></i>\r\n }\r\n <ng-content />\r\n @if (text()) {\r\n <span class=\"dx-button-text\">{{ text() }}</span>\r\n }\r\n </span>\r\n `,\r\n styleUrl: './nxe-button.component.scss',\r\n host: {\r\n class: 'nxe-widget',\r\n role: 'button',\r\n '[attr.tabindex]': 'disabled() || !focusStateEnabled() ? null : 0',\r\n '[attr.aria-disabled]': 'disabled() ? true : null',\r\n '[class.nxe-button-default]': \"type() === 'default'\",\r\n '[class.nxe-button-success]': \"type() === 'success'\",\r\n '[class.nxe-button-danger]': \"type() === 'danger'\",\r\n '[class.nxe-button-has-text]': '!!text()',\r\n '[class.dx-button-has-text]': '!!text()',\r\n '[class.dx-button-has-icon]': '!!icon()',\r\n '[style.height]': 'heightStyle()',\r\n '[style.width]': 'widthStyle()',\r\n '[class.nxe-disabled]': 'disabled()',\r\n '(click)': 'handleClick($event)',\r\n '(keydown.enter)': 'handleKeydown($event)',\r\n '(keydown.space)': 'handleKeydown($event)',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeButtonComponent {\r\n private readonly registry = inject(NxeValidationGroupRegistry);\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n /** Legacy `text` label (rendered as `.dx-button-text` when set, no projected content). */\r\n readonly text = input<string>();\r\n /** Style intent (`default`=blue, `success`=green, `danger`=red, `normal`=white). */\r\n readonly type = input<NxeButtonType>('normal');\r\n /** Disabled state (`[disabled]`); blocks `onClick` and dims the button. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Named validation group resolved via {@link NxeValidationGroupRegistry} on click. */\r\n readonly validationGroup = input<string>('');\r\n /** DevExtreme parity input; only ever `false` in this codebase (suppresses tab focus). */\r\n readonly focusStateEnabled = input(true, { transform: booleanAttribute });\r\n /**\r\n * dx `icon` — renders `<i class=\"dx-icon dx-icon-NAME\">` as the first child of\r\n * `.dx-button-content`, before any projected content. Projection is the dominant pattern\r\n * here (a `mat-icon` plus a `span`), so the two must coexist rather than compete.\r\n */\r\n readonly icon = input<string | undefined>(undefined);\r\n /** dx `height` — a bare number (or numeric string) means px; anything else passes through. */\r\n readonly height = input<number | string | undefined>(undefined);\r\n /** dx `width` — same coercion as {@link height}. */\r\n readonly width = input<number | string | undefined>(undefined);\r\n\r\n protected readonly heightStyle = computed(() => cssSize(this.height()));\r\n protected readonly widthStyle = computed(() => cssSize(this.width()));\r\n\r\n /** DevExtreme-compatible click event. */\r\n readonly onClick = output<NxeButtonClickEvent>();\r\n\r\n protected handleKeydown(event: KeyboardEvent): void {\r\n // Non-button host: Enter/Space don't synthesize a click, so activate explicitly.\r\n event.preventDefault();\r\n this.handleClick(event);\r\n }\r\n\r\n protected handleClick(event: Event): void {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n return;\r\n }\r\n const group = this.validationGroup() ?? '';\r\n this.onClick.emit({\r\n event,\r\n validationGroup: { validate: () => this.registry.validate(group) },\r\n component: this,\r\n element: this.elementRef.nativeElement,\r\n });\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase, nxeOptionalBoolean } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/** Text-box input mode (only `text`/`password` are used in this codebase). */\r\nexport type NxeTextBoxMode = 'text' | 'password' | 'email' | 'tel' | 'search';\r\n\r\n/**\r\n * `nxe-text-box` — drop-in replacement for DevExtreme `dx-text-box`.\r\n *\r\n * A signal-CVA editor (extends {@link NxeFormControlBase}) supporting `formControlName`,\r\n * `[(ngModel)]`, one-way `[value]`, and `[readOnly]`. Like DevExtreme's default\r\n * (`valueChangeEvent='change'`), the value commits on **blur** — not on every keystroke.\r\n *\r\n * It provides {@link NXE_VALIDATION_TARGET} so a projected `nxe-validator` can read its value\r\n * and push back the invalid message, which renders as the red `.nxe-invalid-message` bubble.\r\n */\r\n@Component({\r\n selector: 'nxe-text-box',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <input\r\n class=\"nxe-editor-input nxe-textbox-input\"\r\n [type]=\"mode()\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.placeholder]=\"placeholder() || null\"\r\n autocomplete=\"off\"\r\n (blur)=\"onBlur($event)\"\r\n (focus)=\"focused.set(true)\" />\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n `,\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-textbox',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeTextBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeTextBoxComponent extends NxeFormControlBase<string> {\r\n readonly mode = input<NxeTextBoxMode>('text');\r\n readonly placeholderInput = input<string | undefined>(undefined, { alias: 'placeholder' });\r\n readonly placeholder = computed(\r\n () => this.placeholderInput() ?? this.nxeDefaults.textBox?.placeholder ?? '',\r\n );\r\n /** DevExtreme parity input; cosmetic, unused in behaviour. */\r\n readonly hoverStateEnabledInput = input<boolean | undefined>(undefined, { alias: 'hoverStateEnabled', transform: nxeOptionalBoolean });\r\n readonly hoverStateEnabled = computed(\r\n () => this.hoverStateEnabledInput() ?? this.nxeDefaults.textBox?.hoverStateEnabled ?? false,\r\n );\r\n\r\n readonly focused = signal(false);\r\n readonly displayValue = computed(() => this.value() ?? '');\r\n\r\n protected onBlur(event: Event): void {\r\n this.commitValue((event.target as HTMLInputElement).value, event);\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-text-area` — drop-in replacement for DevExtreme `dx-text-area`.\r\n *\r\n * Identical to {@link NxeTextBoxComponent} but renders a `<textarea>`. Supports an optional fixed\r\n * `[height]` (px) and `placeholder`; commits on blur. Hosts a projected `nxe-validator` via\r\n * {@link NXE_VALIDATION_TARGET}.\r\n */\r\n@Component({\r\n selector: 'nxe-text-area',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <textarea\r\n class=\"nxe-editor-input nxe-textarea-input\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.placeholder]=\"placeholder() || null\"\r\n [style.height.px]=\"height() || null\"\r\n (blur)=\"onBlur($event)\"\r\n (focus)=\"focused.set(true)\"></textarea>\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n `,\r\n styleUrl: './nxe-text-area.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-textarea',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextAreaComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeTextAreaComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeTextAreaComponent extends NxeFormControlBase<string> {\r\n readonly placeholderInput = input<string | undefined>(undefined, { alias: 'placeholder' });\r\n readonly placeholder = computed(\r\n () => this.placeholderInput() ?? this.nxeDefaults.textArea?.placeholder ?? '',\r\n );\r\n /** Fixed height in px (DevExtreme `[height]`); unset = auto. */\r\n readonly heightInput = input<number | undefined>(undefined, { alias: 'height' });\r\n readonly height = computed(() => this.heightInput() ?? this.nxeDefaults.textArea?.height ?? 80);\r\n\r\n readonly focused = signal(false);\r\n readonly displayValue = computed(() => this.value() ?? '');\r\n\r\n protected onBlur(event: Event): void {\r\n this.commitValue((event.target as HTMLTextAreaElement).value, event);\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n forwardRef,\r\n input,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-check-box` — drop-in replacement for DevExtreme `dx-check-box`.\r\n *\r\n * A boolean signal-CVA editor (extends {@link NxeFormControlBase}) — no tri-state, matching all\r\n * usage. Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`,\r\n * `[disabled]`, an inline `text` label, `(onValueChanged)` (`{value}`) and `(valueChange)` (raw\r\n * boolean). Provides {@link NXE_VALIDATION_TARGET} for a projected `nxe-validator` (a `required`\r\n * rule is invalid while unchecked, matching DevExtreme's RequiredRule treating `false` as empty).\r\n */\r\n@Component({\r\n selector: 'nxe-check-box',\r\n standalone: true,\r\n template: `\r\n <span class=\"nxe-checkbox-container\">\r\n <span class=\"nxe-checkbox-icon\" aria-hidden=\"true\"></span>\r\n @if (text()) {\r\n <span class=\"nxe-checkbox-text\">{{ text() }}</span>\r\n }\r\n </span>\r\n <ng-content />\r\n `,\r\n styleUrl: './nxe-check-box.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-checkbox',\r\n role: 'checkbox',\r\n '[attr.aria-checked]': '!!value()',\r\n '[attr.aria-disabled]': 'disabled() ? true : null',\r\n '[attr.aria-readonly]': 'readOnly() ? true : null',\r\n '[attr.tabindex]': 'disabled() || readOnly() ? null : 0',\r\n '[class.nxe-checkbox-checked]': '!!value()',\r\n '[class.nxe-disabled]': 'disabled()',\r\n '[class.nxe-readonly]': 'readOnly()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n '(click)': 'toggle($event)',\r\n '(keydown.space)': 'onSpace($event)',\r\n '(blur)': 'markAsTouched()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeCheckBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeCheckBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeCheckBoxComponent extends NxeFormControlBase<boolean> {\r\n /** Inline label rendered next to the box. */\r\n readonly text = input<string>();\r\n\r\n protected toggle(event: Event): void {\r\n if (this.disabled() || this.readOnly()) {\r\n return;\r\n }\r\n this.commitValue(!this.value(), event);\r\n this.markAsTouched();\r\n }\r\n\r\n protected onSpace(event: Event): void {\r\n event.preventDefault();\r\n this.toggle(event);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n inject,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\nimport {\r\n formatNumber,\r\n NXE_NUMBER_SEPARATORS,\r\n parseNumber,\r\n parseNumberFormat,\r\n roundHalfAwayFromZero,\r\n} from '@nexterajs/ui/intl';\r\n\r\n/** Coerce a static (`min=\"1\"`) or bound (`[min]=\"0\"`) attribute to a number, or undefined. */\r\nfunction toNumber(value: unknown): number | undefined {\r\n if (value == null || value === '') {\r\n return undefined;\r\n }\r\n const num = Number(value);\r\n return isNaN(num) ? undefined : num;\r\n}\r\n\r\n/**\r\n * `nxe-number-box` — drop-in replacement for DevExtreme `dx-number-box`.\r\n *\r\n * A numeric signal-CVA editor (extends {@link NxeFormControlBase}) storing/emitting `number | null`.\r\n * Implements the DevExtreme number-format engine ({@link parseNumberFormat}/{@link formatNumber}):\r\n * displays the masked, grouped string when blurred and a raw editable number while focused;\r\n * commits (clamped to `[min,max]`, rounded to the format precision) on blur — never per keystroke.\r\n *\r\n * Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`, `[min]`/`[max]`,\r\n * `format` (string LDML pattern), `(valueChange)` (numeric), and a projected `nxe-validator`.\r\n */\r\n@Component({\r\n selector: 'nxe-number-box',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <input\r\n class=\"nxe-editor-input nxe-numberbox-input\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n autocomplete=\"off\"\r\n (focus)=\"focused.set(true)\"\r\n (blur)=\"onBlur($event)\" />\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n `,\r\n styleUrl: './nxe-number-box.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-numberbox',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeNumberBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeNumberBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeNumberBoxComponent extends NxeFormControlBase<number> {\r\n /** LDML format pattern (e.g. `#,##0.00`); empty = raw number. */\r\n readonly formatInput = input<string | undefined>(undefined, { alias: 'format' });\r\n readonly format = computed(\r\n () => this.formatInput() ?? this.nxeDefaults.numberBox?.format ?? '',\r\n );\r\n readonly min = input<number | undefined, unknown>(undefined, { transform: toNumber });\r\n readonly max = input<number | undefined, unknown>(undefined, { transform: toNumber });\r\n\r\n readonly focused = signal(false);\r\n private readonly parsedFormat = computed(() => parseNumberFormat(this.format()));\r\n\r\n /** Locale characters, configured once by the application. Defaults to en-US. */\r\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\r\n\r\n readonly displayValue = computed(() => {\r\n const value = this.value();\r\n if (this.focused()) {\r\n // Raw editable text, but with this locale's decimal character: `String(0.125)` gives\r\n // a JS-style dot, and parseNumber would read that as a group separator and commit 125.\r\n return value == null ? '' : String(value).replace('.', this.separators.decimal);\r\n }\r\n return formatNumber(value, this.parsedFormat(), this.separators);\r\n });\r\n\r\n protected onBlur(event: Event): void {\r\n let num = parseNumber((event.target as HTMLInputElement).value, this.separators);\r\n if (num != null) {\r\n const min = this.min();\r\n const max = this.max();\r\n if (min != null && num < min) {\r\n num = min;\r\n }\r\n if (max != null && num > max) {\r\n num = max;\r\n }\r\n const fmt = this.parsedFormat();\r\n if (fmt) {\r\n num = roundHalfAwayFromZero(num, fmt.maxFrac);\r\n }\r\n }\r\n this.commitValue(num, event);\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n }\r\n}\r\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n forwardRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n signal,\r\n TemplateRef,\r\n viewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTime } from 'luxon';\r\nimport { filter, merge, Subscription } from 'rxjs';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\nimport { nxePane, trackPaneFlip } from '@nexterajs/ui/styling';\r\nimport {\r\n buildCalendarWeeks,\r\n buildPeriodCells,\r\n formatDisplay,\r\n NXE_DEFAULT_DATETIME_DISPLAY_FORMAT,\r\n NXE_DEFAULT_DISPLAY_FORMAT,\r\n NXE_DEFAULT_TIME_DISPLAY_FORMAT,\r\n NxeCalendarZoom,\r\n NxePeriodCell,\r\n parseDateValue,\r\n parseDisplay,\r\n serializeDate,\r\n} from '@nexterajs/ui/intl';\r\n\r\n/** DevExtreme date-box `type`. */\r\nexport type NxeDateBoxType = 'date' | 'datetime' | 'time';\r\n\r\n/** Normalize a `[min]`/`[max]` binding (Date object or serialized string) to a DateTime. */\r\nfunction toBoundDate(bound: Date | string | null): DateTime | null {\r\n if (!bound) {\r\n return null;\r\n }\r\n if (bound instanceof Date) {\r\n const dt = DateTime.fromJSDate(bound);\r\n return dt.isValid ? dt : null;\r\n }\r\n return parseDateValue(bound);\r\n}\r\n\r\n/**\r\n * `nxe-date-box` — drop-in replacement for DevExtreme `dx-date-box`.\r\n *\r\n * A signal-CVA editor (extends {@link NxeFormControlBase}) whose value is the app-wide\r\n * `\"yyyy-MM-ddTHH:mm:ss\"` string (preserving the global `dateSerializationFormat`). The field is\r\n * typeable (parsed on blur per `displayFormat`) and opens a CDK-overlay calendar from the icon\r\n * button. Built on Luxon. Default `displayFormat` is `dd-MMM-yyyy`. Hosts a projected\r\n * `nxe-validator` via {@link NXE_VALIDATION_TARGET}.\r\n */\r\n@Component({\r\n selector: 'nxe-date-box',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <input\r\n #field\r\n class=\"nxe-editor-input nxe-datebox-input\"\r\n type=\"text\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.placeholder]=\"effectivePlaceholder() || null\"\r\n autocomplete=\"off\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\" />\r\n @if (!readOnly()) {\r\n <span\r\n class=\"nxe-datebox-button\"\r\n [class.nxe-datebox-open]=\"opened()\"\r\n (mousedown)=\"onButtonMousedown($event)\"\r\n aria-hidden=\"true\">\r\n @if (type() === 'datetime' || type() === 'time') {\r\n <svg class=\"nxe-datebox-icon\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M12 2a10 10 0 100 20 10 10 0 000-20zm0 18a8 8 0 110-16 8 8 0 010 16zm.5-13H11v6l5.2 3.1.8-1.3-4.5-2.7V7z\" />\r\n </svg>\r\n } @else {\r\n <svg class=\"nxe-datebox-icon\" viewBox=\"0 0 24 24\">\r\n <path\r\n d=\"M19 3h-1V1h-2v2H8V1H6v2H5a2 2 0 00-2 2v14a2 2 0 002 2h14a2 2 0 002-2V5a2 2 0 00-2-2zm0 16H5V8h14v11z\" />\r\n </svg>\r\n }\r\n </span>\r\n }\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n\r\n <ng-template #calendarTemplate>\r\n <div class=\"nxe-calendar\" (mousedown)=\"$event.preventDefault()\">\r\n @if (type() !== 'time') {\r\n <div class=\"nxe-calendar-navigator\">\r\n <button type=\"button\" class=\"nxe-calendar-nav\" (click)=\"navigate(-1)\">\r\n <svg class=\"nxe-calendar-chevron\" viewBox=\"0 0 24 24\">\r\n <path d=\"M15.4 7.4 14 6l-6 6 6 6 1.4-1.4L10.8 12z\" />\r\n </svg>\r\n </button>\r\n <button type=\"button\" class=\"nxe-calendar-caption\" (click)=\"zoomOut()\">\r\n {{ caption() }}\r\n </button>\r\n <button type=\"button\" class=\"nxe-calendar-nav\" (click)=\"navigate(1)\">\r\n <svg class=\"nxe-calendar-chevron\" viewBox=\"0 0 24 24\">\r\n <path d=\"M8.6 16.6 10 18l6-6-6-6-1.4 1.4 4.6 4.6z\" />\r\n </svg>\r\n </button>\r\n </div>\r\n @if (zoomLevel() === 'month') {\r\n <div class=\"nxe-calendar-weekdays\">\r\n @for (wd of weekdays; track wd) {\r\n <span>{{ wd }}</span>\r\n }\r\n </div>\r\n <div class=\"nxe-calendar-grid\">\r\n @for (week of weeks(); track $index) {\r\n @for (day of week; track day.toMillis()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-calendar-day\"\r\n [class.nxe-calendar-other]=\"day.month !== viewMonth().month\"\r\n [class.nxe-calendar-selected]=\"isSelected(day)\"\r\n [class.nxe-calendar-today]=\"isToday(day)\"\r\n [disabled]=\"isDisabledDay(day)\"\r\n (click)=\"selectDay(day)\">\r\n <span>{{ day.day }}</span>\r\n </button>\r\n }\r\n }\r\n </div>\r\n } @else {\r\n <div\r\n class=\"nxe-calendar-periods\"\r\n [class.nxe-calendar-periods-century]=\"zoomLevel() === 'century'\">\r\n @for (cell of periodCells(); track cell.anchor.toMillis()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-calendar-period\"\r\n [class.nxe-calendar-other]=\"cell.other\"\r\n [class.nxe-calendar-today]=\"cell.isNow\"\r\n [disabled]=\"cell.disabled\"\r\n (click)=\"selectPeriod(cell)\">\r\n <span>{{ cell.label }}</span>\r\n </button>\r\n }\r\n </div>\r\n }\r\n }\r\n @if (type() !== 'date') {\r\n <div class=\"nxe-calendar-time\">\r\n <input\r\n class=\"nxe-calendar-time-part\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n aria-label=\"Hour\"\r\n [value]=\"hourText()\"\r\n (change)=\"setTimePart('hour', $event)\" />\r\n <span class=\"nxe-calendar-time-sep\" aria-hidden=\"true\">:</span>\r\n <input\r\n class=\"nxe-calendar-time-part\"\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n maxlength=\"2\"\r\n aria-label=\"Minute\"\r\n [value]=\"minuteText()\"\r\n (change)=\"setTimePart('minute', $event)\" />\r\n <button type=\"button\" class=\"nxe-calendar-time-btn\" (click)=\"setNow()\">Now</button>\r\n <button type=\"button\" class=\"nxe-calendar-time-btn nxe-calendar-time-done\" (click)=\"close()\">\r\n Done\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n </ng-template>\r\n `,\r\n styleUrl: './nxe-date-box.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-datebox',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeDateBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeDateBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeDateBoxComponent extends NxeFormControlBase<string> implements OnDestroy {\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly calendarTemplate = viewChild.required<TemplateRef<unknown>>('calendarTemplate');\r\n private readonly fieldRef = viewChild.required<ElementRef<HTMLInputElement>>('field');\r\n\r\n readonly type = input<NxeDateBoxType>('date');\r\n /* Undefined rather than a literal default, so the default can follow `type`. Additive: no call\r\n site passes either input, and one that does still wins. */\r\n readonly displayFormat = input<string | undefined>(undefined);\r\n readonly placeholder = input<string | undefined>(undefined);\r\n /** DevExtreme `[min]`/`[max]` bounds: calendar days outside are disabled, typed values clamp. */\r\n readonly min = input<Date | string | null>(null);\r\n readonly max = input<Date | string | null>(null);\r\n\r\n readonly focused = signal(false);\r\n readonly opened = signal(false);\r\n readonly viewMonth = signal<DateTime>(DateTime.now().startOf('month'));\r\n /** Calendar zoom level; caption clicks zoom out, cell picks zoom back in (dx-calendar parity). */\r\n readonly zoomLevel = signal<NxeCalendarZoom>('month');\r\n readonly weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const;\r\n\r\n /** The format actually used, from `displayFormat` or the default for this `type`. */\r\n readonly effectiveDisplayFormat = computed(() => {\r\n const stated = this.displayFormat() ?? this.nxeDefaults.dateBox?.displayFormat;\r\n if (stated) {\r\n return stated;\r\n }\r\n switch (this.type()) {\r\n case 'time':\r\n return NXE_DEFAULT_TIME_DISPLAY_FORMAT;\r\n case 'datetime':\r\n return NXE_DEFAULT_DATETIME_DISPLAY_FORMAT;\r\n default:\r\n return NXE_DEFAULT_DISPLAY_FORMAT;\r\n }\r\n });\r\n /** dx's default placeholder is '', but orbit's global default is the format itself. */\r\n readonly effectivePlaceholder = computed(\r\n () =>\r\n this.placeholder() ?? this.nxeDefaults.dateBox?.placeholder ?? this.effectiveDisplayFormat(),\r\n );\r\n\r\n private readonly selected = computed(() => parseDateValue(this.value()));\r\n readonly displayValue = computed(() => formatDisplay(this.selected(), this.effectiveDisplayFormat()));\r\n readonly weeks = computed(() => buildCalendarWeeks(this.viewMonth()));\r\n\r\n /** Two-digit hour/minute for the popup's time strip; blank when nothing is selected. */\r\n readonly hourText = computed(() => this.selected()?.toFormat('HH') ?? '');\r\n readonly minuteText = computed(() => this.selected()?.toFormat('mm') ?? '');\r\n\r\n /**\r\n * The field's text as it stood when focus arrived. `onBlur` compares against it and commits\r\n * nothing when the user only tabbed through — see the comment there.\r\n */\r\n private textAtFocus = '';\r\n\r\n readonly caption = computed(() => {\r\n const view = this.viewMonth();\r\n switch (this.zoomLevel()) {\r\n case 'month':\r\n return view.toFormat('MMMM yyyy');\r\n case 'year':\r\n return view.toFormat('yyyy');\r\n case 'decade': {\r\n const start = view.year - (view.year % 10);\r\n return `${start}-${start + 9}`;\r\n }\r\n case 'century': {\r\n const start = view.year - (view.year % 100);\r\n return `${start}-${start + 99}`;\r\n }\r\n }\r\n });\r\n\r\n readonly periodCells = computed(() => {\r\n const zoom = this.zoomLevel();\r\n if (zoom === 'month') {\r\n return [];\r\n }\r\n const now = DateTime.now();\r\n const min = this.minDate();\r\n const max = this.maxDate();\r\n const span = zoom === 'year' ? { months: 1 } : zoom === 'decade' ? { years: 1 } : { years: 10 };\r\n return buildPeriodCells(zoom, this.viewMonth()).map((cell) => {\r\n const end = cell.anchor.plus(span).minus({ days: 1 }).endOf('day');\r\n return {\r\n ...cell,\r\n isNow: now >= cell.anchor && now <= end,\r\n disabled: (!!min && end < min.startOf('day')) || (!!max && cell.anchor > max.endOf('day')),\r\n };\r\n });\r\n });\r\n\r\n private readonly minDate = computed(() => toBoundDate(this.min()));\r\n private readonly maxDate = computed(() => toBoundDate(this.max()));\r\n\r\n protected isDisabledDay(day: DateTime): boolean {\r\n const min = this.minDate();\r\n const max = this.maxDate();\r\n return (!!min && day.startOf('day') < min.startOf('day')) || (!!max && day.startOf('day') > max.startOf('day'));\r\n }\r\n\r\n private clampToBounds(dt: DateTime): DateTime {\r\n const min = this.minDate();\r\n const max = this.maxDate();\r\n if (min && dt < min.startOf('day')) return min.startOf('day');\r\n /* Land on the bound's DAY but keep the value's own time. Returning max.startOf('day') would\r\n silently zero an 18:00 whenever the entry ran past the bound — invisible for a date-only\r\n field, and a wiped time for a datetime one. */\r\n if (max && dt > max.endOf('day')) {\r\n return max.startOf('day').set({ hour: dt.hour, minute: dt.minute, second: dt.second });\r\n }\r\n return dt;\r\n }\r\n\r\n private overlayRef?: OverlayRef;\r\n private closeSub?: Subscription;\r\n private flipSub?: Subscription;\r\n\r\n protected isSelected(day: DateTime): boolean {\r\n const sel = this.selected();\r\n return !!sel && day.hasSame(sel, 'day');\r\n }\r\n\r\n protected isToday(day: DateTime): boolean {\r\n return day.hasSame(DateTime.now(), 'day');\r\n }\r\n\r\n protected navigate(delta: number): void {\r\n const months = { month: 1, year: 12, decade: 120, century: 1200 }[this.zoomLevel()];\r\n this.viewMonth.update((m) => m.plus({ months: months * delta }));\r\n }\r\n\r\n protected zoomOut(): void {\r\n const next = { month: 'year', year: 'decade', decade: 'century' } as const;\r\n const zoom = this.zoomLevel();\r\n if (zoom !== 'century') {\r\n this.zoomLevel.set(next[zoom]);\r\n }\r\n }\r\n\r\n protected selectPeriod(cell: NxePeriodCell & { disabled: boolean }): void {\r\n if (cell.disabled) {\r\n return;\r\n }\r\n const previous = { year: 'month', decade: 'year', century: 'decade' } as const;\r\n this.viewMonth.set(cell.anchor.startOf('month'));\r\n this.zoomLevel.set(previous[this.zoomLevel() as Exclude<NxeCalendarZoom, 'month'>]);\r\n }\r\n\r\n protected onButtonMousedown(event: Event): void {\r\n // Keep field focus (avoid a blur-driven re-commit) and toggle the calendar.\r\n event.preventDefault();\r\n if (this.disabled() || this.readOnly()) {\r\n return;\r\n }\r\n this.opened() ? this.close() : this.open();\r\n }\r\n\r\n protected onFocus(event: Event): void {\r\n this.textAtFocus = (event.target as HTMLInputElement).value;\r\n this.focused.set(true);\r\n }\r\n\r\n /**\r\n * Commit what the user TYPED — and nothing when they typed nothing.\r\n *\r\n * The unchanged-text guard is load-bearing, not an optimization. `displayFormat` renders a\r\n * strict subset of the stored value: `dd-MMM-yyyy` shows `2026-08-12T09:00:00` as `12-Aug-2026`,\r\n * and re-parsing that yields midnight. This method used to commit unconditionally, so simply\r\n * focusing and tabbing past a field rewrote 09:00 to 00:00 and 09:30:45 to 09:30:00 — silently,\r\n * because `commitValue` only no-ops on an identical string and these differ. Latent while\r\n * nothing rendered a time; straight data loss the moment `type=\"datetime\"` exists.\r\n *\r\n * A rejected entry keeps the previous value and repaints the field. The repaint is required:\r\n * `[value]` is still bound to the same `displayValue()` Angular last wrote, so it will not\r\n * re-render on its own and the unparseable text would sit there looking accepted.\r\n */\r\n protected onBlur(event: Event): void {\r\n const element = event.target as HTMLInputElement;\r\n /* Read before clearing: it doubles as \"we captured a baseline this focus cycle\". A blur with\r\n no preceding focus cannot happen to a real user — browsers always fire focus first — so\r\n the only sequence that reaches the fall-through is a synthetic one, where the old\r\n parse-everything behaviour is both harmless and what the existing specs assert. */\r\n const hadBaseline = this.focused();\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n\r\n if (hadBaseline && element.value === this.textAtFocus) {\r\n return;\r\n }\r\n if (!element.value.trim()) {\r\n this.commitValue(null, event);\r\n this.syncField();\r\n return;\r\n }\r\n\r\n const dt = parseDisplay(element.value, this.effectiveDisplayFormat(), this.selected());\r\n if (dt) {\r\n this.commitValue(serializeDate(this.clampToBounds(dt)), event);\r\n }\r\n this.syncField();\r\n }\r\n\r\n /**\r\n * Repaint the field from the committed value and re-baseline {@link textAtFocus}.\r\n *\r\n * Called after every non-typed commit as well, so a later blur cannot replay stale typed text\r\n * over a value the popup has since changed.\r\n */\r\n private syncField(): void {\r\n const element = this.fieldRef().nativeElement;\r\n element.value = this.displayValue();\r\n this.textAtFocus = element.value;\r\n }\r\n\r\n protected selectDay(day: DateTime): void {\r\n if (this.isDisabledDay(day)) {\r\n return;\r\n }\r\n let dt = day.startOf('day');\r\n if (this.type() === 'datetime') {\r\n const base = this.selected();\r\n if (base) {\r\n dt = dt.set({ hour: base.hour, minute: base.minute, second: base.second });\r\n }\r\n }\r\n this.commitValue(serializeDate(dt), null);\r\n this.syncField();\r\n /* Only a plain date picker is finished at this point. In datetime mode the time strip is\r\n the other half of the job, and closing here would put it out of reach. */\r\n if (this.type() === 'date') {\r\n this.close();\r\n }\r\n }\r\n\r\n /**\r\n * Commit one part of the time from the popup strip.\r\n *\r\n * Writes straight through to the value rather than holding a draft: `selectDay` already commits\r\n * immediately, the component keeps no other pending state, and a stray backdrop click must not\r\n * discard a time the user has just set. dx buffers behind OK/Cancel; this is the divergence.\r\n */\r\n protected setTimePart(part: 'hour' | 'minute', event: Event): void {\r\n const element = event.target as HTMLInputElement;\r\n const typed = Number.parseInt(element.value, 10);\r\n const base = this.selected() ?? DateTime.now().startOf('day');\r\n const ceiling = part === 'hour' ? 23 : 59;\r\n const next = Number.isNaN(typed) ? base[part] : Math.min(Math.max(typed, 0), ceiling);\r\n\r\n this.commitValue(serializeDate(base.set({ [part]: next })), event);\r\n this.syncField();\r\n /* Same non-repaint hazard as onBlur: when the clamp lands back on the value already held,\r\n the [value] binding is unchanged and `7` would stay on screen instead of `07`. */\r\n element.value = part === 'hour' ? this.hourText() : this.minuteText();\r\n }\r\n\r\n protected setNow(): void {\r\n const now = DateTime.now();\r\n const base = this.selected() ?? now;\r\n this.commitValue(serializeDate(base.set({ hour: now.hour, minute: now.minute, second: 0 })), null);\r\n this.syncField();\r\n }\r\n\r\n private open(): void {\r\n this.viewMonth.set((this.selected() ?? DateTime.now()).startOf('month'));\r\n this.zoomLevel.set('month');\r\n if (!this.overlayRef) {\r\n this.overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay\r\n .position()\r\n .flexibleConnectedTo(this.elementRef)\r\n .withPositions([\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\r\n ]),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n panelClass: nxePane('nxe-datebox-pane'),\r\n });\r\n this.flipSub = trackPaneFlip(this.overlayRef);\r\n }\r\n if (this.overlayRef.hasAttached()) {\r\n return;\r\n }\r\n this.overlayRef.attach(new TemplatePortal(this.calendarTemplate(), this.viewContainerRef));\r\n this.closeSub = merge(\r\n this.overlayRef.backdropClick(),\r\n this.overlayRef.keydownEvents().pipe(filter((e) => e.key === 'Escape')),\r\n ).subscribe(() => this.close());\r\n this.opened.set(true);\r\n }\r\n\r\n /** Protected, not private: the time strip's Done button closes the popup from the template. */\r\n protected close(): void {\r\n if (!this.overlayRef?.hasAttached()) {\r\n return;\r\n }\r\n this.overlayRef.detach();\r\n this.closeSub?.unsubscribe();\r\n this.flipSub?.unsubscribe();\r\n this.opened.set(false);\r\n this.markAsTouched();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.closeSub?.unsubscribe();\r\n this.flipSub?.unsubscribe();\r\n this.overlayRef?.dispose();\r\n }\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-scroll-view` — drop-in replacement for DevExtreme `dx-scroll-view`.\r\n *\r\n * In this app `dx-scroll-view` is used purely as a dumb scroll container: no `@ViewChild`, no\r\n * `.instance` methods, no events (see survey). Every live tag is the same literal triple\r\n * `[scrollByContent]=\"true\" [scrollByThumb]=\"true\" [showScrollbar]=\"'onScroll'\"`. So this is a\r\n * styled `overflow:auto` wrapper that projects its content inside a `.nxe-scrollview-content`\r\n * flex-column box (matching dx's content layout, which some consumers' inner grids rely on for\r\n * height) and renders a thin grey dx-style scrollbar. The three inputs are accepted for binding\r\n * parity only — behaviour is native scrolling.\r\n */\r\n@Component({\r\n selector: 'nxe-scroll-view',\r\n standalone: true,\r\n template: '<div class=\"nxe-scrollview-content\"><ng-content /></div>',\r\n styleUrl: './nxe-scroll-view.component.scss',\r\n host: { class: 'nxe-widget nxe-scroll-view' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeScrollViewComponent {\r\n /** Accepted for parity with dx-scroll-view; behaviour is native overflow scrolling. */\r\n readonly scrollByContent = input(true);\r\n readonly scrollByThumb = input(true);\r\n readonly showScrollbar = input<'onScroll' | 'onHover' | 'always' | 'never'>('onScroll');\r\n}\r\n","// @nexterajs/ui/forms — public API.\r\nexport * from './lib/button/nxe-button.component';\r\nexport * from './lib/text-box/nxe-text-box.component';\r\nexport * from './lib/text-area/nxe-text-area.component';\r\nexport * from './lib/check-box/nxe-check-box.component';\r\nexport * from './lib/number-box/nxe-number-box.component';\r\nexport * from './lib/date-box/nxe-date-box.component';\r\nexport * from './lib/scroll-view/nxe-scroll-view.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nexterajs-ui-forms.mjs","sources":["../../../projects/nextera-ui/forms/src/lib/button/nxe-button.component.ts","../../../projects/nextera-ui/forms/src/lib/text-box/nxe-text-box.component.ts","../../../projects/nextera-ui/forms/src/lib/text-area/nxe-text-area.component.ts","../../../projects/nextera-ui/forms/src/lib/check-box/nxe-check-box.component.ts","../../../projects/nextera-ui/forms/src/lib/number-box/nxe-number-box.component.ts","../../../projects/nextera-ui/forms/src/lib/date-box/nxe-date-box.component.ts","../../../projects/nextera-ui/forms/src/lib/scroll-view/nxe-scroll-view.component.ts","../../../projects/nextera-ui/forms/src/public-api.ts","../../../projects/nextera-ui/forms/src/nexterajs-ui-forms.ts"],"sourcesContent":["import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NXE_VALIDATION_GROUP, NxeValidationGroupRegistry } from '@nexterajs/ui/core';\r\nimport { NxeValidationResult } from '@nexterajs/ui/core';\r\n\r\n/** DevExtreme button `type` (style intent), as used in this codebase. */\r\nexport type NxeButtonType = 'normal' | 'default' | 'success' | 'danger';\r\n\r\n/**\r\n * dx size coercion: `height=\"35\"` and `[height]=\"35\"` both mean 35px, while `'100%'` or `'3rem'`\r\n * pass through untouched. Templates write the attribute form, so the string case is the common one.\r\n */\r\nfunction cssSize(value: number | string | undefined): string | null {\r\n if (value === undefined || value === null || value === '') {\r\n return null;\r\n }\r\n return /^-?\\d+(\\.\\d+)?$/.test(String(value)) ? `${value}px` : String(value);\r\n}\r\n\r\n/**\r\n * The `validationGroup` object carried on a {@link NxeButtonClickEvent}, mirroring the\r\n * DevExtreme button-click `event.validationGroup`. Its `validate()` runs every member of the\r\n * button's named group through the {@link NxeValidationGroupRegistry} and returns the\r\n * DevExtreme-shaped result — so `const r = event.validationGroup.validate(); if (r.isValid) {...}`\r\n * keeps working after the tag rename.\r\n */\r\nexport interface NxeButtonValidationGroup {\r\n validate(): NxeValidationResult;\r\n}\r\n\r\n/**\r\n * Payload emitted from `nxe-button`'s `onClick`, mirroring DevExtreme's button click event.\r\n * Only `validationGroup` is read by existing handlers; `event`/`component`/`element` are\r\n * provided for parity.\r\n */\r\nexport interface NxeButtonClickEvent {\r\n event: Event;\r\n validationGroup: NxeButtonValidationGroup;\r\n component: NxeButtonComponent;\r\n element: HTMLElement;\r\n}\r\n\r\n/**\r\n * `nxe-button` — drop-in replacement for DevExtreme `dx-button`.\r\n *\r\n * The host element IS the button (mirrors DevExtreme's `nxe-button` DOM: the host carries the\r\n * styling classes and contains a single `.nxe-button-content` child). This keeps every existing\r\n * `.nxe-btn*` / `.nxe-button-content` global rule matching verbatim, and — critically — keeps the\r\n * shared `buttonLoading` directive working, which swaps `.nxe-button-content` innerHTML for a\r\n * spinner (`getElementsByClassName('nxe-button-content')[0]`).\r\n *\r\n * Content is projected (`<nxe-icon> + <span>`, the dominant pattern). The legacy `text`/`type`\r\n * inputs render a `.nxe-button-text` label for the ~25 attribute-styled buttons.\r\n *\r\n * `onClick` emits {@link NxeButtonClickEvent}; native `(click)` also fires (27 sites bind it).\r\n */\r\n@Component({\r\n selector: 'nxe-button',\r\n standalone: true,\r\n template: `\r\n <span class=\"nxe-button-content\">\r\n @if (icon()) {\r\n <i class=\"nxe-icon nxe-icon-{{ icon() }}\"></i>\r\n }\r\n <ng-content />\r\n @if (text()) {\r\n <span class=\"nxe-button-text\">{{ text() }}</span>\r\n }\r\n </span>\r\n `,\r\n styleUrl: './nxe-button.component.scss',\r\n host: {\r\n class: 'nxe-widget',\r\n role: 'button',\r\n '[attr.tabindex]': 'disabled() || !focusStateEnabled() ? null : 0',\r\n '[attr.aria-disabled]': 'disabled() ? true : null',\r\n '[class.nxe-button-default]': \"type() === 'default'\",\r\n '[class.nxe-button-success]': \"type() === 'success'\",\r\n '[class.nxe-button-danger]': \"type() === 'danger'\",\r\n '[class.nxe-button-has-text]': '!!text()',\r\n '[class.nxe-button-has-icon]': '!!icon()',\r\n '[style.height]': 'heightStyle()',\r\n '[style.width]': 'widthStyle()',\r\n '[class.nxe-disabled]': 'disabled()',\r\n '(click)': 'handleClick($event)',\r\n '(keydown.enter)': 'handleKeydown($event)',\r\n '(keydown.space)': 'handleKeydown($event)',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeButtonComponent {\r\n private readonly registry = inject(NxeValidationGroupRegistry);\r\n private readonly groupScope = inject(NXE_VALIDATION_GROUP, { optional: true });\r\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\r\n\r\n /** Legacy `text` label (rendered as `.nxe-button-text` when set, no projected content). */\r\n readonly text = input<string>();\r\n /** Style intent (`default`=blue, `success`=green, `danger`=red, `normal`=white). */\r\n readonly type = input<NxeButtonType>('normal');\r\n /** Disabled state (`[disabled]`); blocks `onClick` and dims the button. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** Named validation group resolved via {@link NxeValidationGroupRegistry} on click. */\r\n readonly validationGroup = input<string>('');\r\n /** DevExtreme parity input; only ever `false` in this codebase (suppresses tab focus). */\r\n readonly focusStateEnabled = input(true, { transform: booleanAttribute });\r\n /**\r\n * dx `icon` — renders `<i class=\"nxe-icon nxe-icon-NAME\">` as the first child of\r\n * `.nxe-button-content`, before any projected content. Projection is the dominant pattern\r\n * here (a `mat-icon` plus a `span`), so the two must coexist rather than compete.\r\n */\r\n readonly icon = input<string | undefined>(undefined);\r\n /** dx `height` — a bare number (or numeric string) means px; anything else passes through. */\r\n readonly height = input<number | string | undefined>(undefined);\r\n /** dx `width` — same coercion as {@link height}. */\r\n readonly width = input<number | string | undefined>(undefined);\r\n\r\n protected readonly heightStyle = computed(() => cssSize(this.height()));\r\n protected readonly widthStyle = computed(() => cssSize(this.width()));\r\n\r\n /** DevExtreme-compatible click event. */\r\n readonly onClick = output<NxeButtonClickEvent>();\r\n\r\n protected handleKeydown(event: KeyboardEvent): void {\r\n // Non-button host: Enter/Space don't synthesize a click, so activate explicitly.\r\n event.preventDefault();\r\n this.handleClick(event);\r\n }\r\n\r\n protected handleClick(event: Event): void {\r\n if (this.disabled()) {\r\n event.preventDefault();\r\n event.stopImmediatePropagation();\r\n return;\r\n }\r\n // A named group wins; otherwise a surrounding nxe-validation-group; otherwise dx's\r\n // implicit global group. Same precedence the validator applies, so a button and the\r\n // fields beside it always resolve to the same group.\r\n const group = this.validationGroup() || this.groupScope?.groupKey || '';\r\n this.onClick.emit({\r\n event,\r\n validationGroup: { validate: () => this.registry.validate(group) },\r\n component: this,\r\n element: this.elementRef.nativeElement,\r\n });\r\n }\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n input,\n linkedSignal,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NxeFormControlBase, nxeOptionalBoolean } from '@nexterajs/ui/core';\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\n\n/** Text-box input mode (only `text`/`password` are used in this codebase). */\nexport type NxeTextBoxMode = 'text' | 'password' | 'email' | 'tel' | 'search';\n\n/**\n * `nxe-text-box` — drop-in replacement for DevExtreme `dx-text-box`.\n *\n * A signal-CVA editor (extends {@link NxeFormControlBase}) supporting `formControlName`,\n * `[(ngModel)]`, one-way `[value]`, and `[readOnly]`. Like DevExtreme's default\n * (`valueChangeEvent='change'`), the value commits on **blur** — not on every keystroke.\n *\n * `showClearButton` (dx default `false`) adds dx's clear area after the input while the field\n * holds text and is neither read-only nor disabled; it sets the value to `''`, dx's own empty\n * value for a text box, and focuses the input.\n *\n * It provides {@link NXE_VALIDATION_TARGET} so a projected `nxe-validator` can read its value\n * and push back the invalid message, which renders as the red `.nxe-invalid-message` bubble.\n */\n@Component({\n selector: 'nxe-text-box',\n standalone: true,\n template: `\n <div class=\"nxe-editor-container\">\n <input\n #field\n class=\"nxe-editor-input nxe-textbox-input\"\n [attr.tabindex]=\"tabIndex()\"\n [id]=\"controlId()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n [attr.aria-invalid]=\"validationError() ? true : null\"\n [attr.aria-required]=\"required() ? true : null\"\n [type]=\"mode()\"\n [value]=\"displayValue()\"\n [readOnly]=\"readOnly()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"placeholder() || null\"\n autocomplete=\"off\"\n (input)=\"onTypedInput($event)\"\n (keyup)=\"onTypedKeyup($event)\"\n (blur)=\"onBlur($event)\"\n (focus)=\"focused.set(true)\" />\n @if (clearButtonVisible()) {\n <span\n class=\"nxe-clear-button-area\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onClear($event)\"\n aria-hidden=\"true\">\n <!-- A Ø16 disc with a 2px × cut out (the dropdown editors' clear glyph). -->\n <svg viewBox=\"0 0 18 18\" focusable=\"false\">\n <path fill-rule=\"evenodd\" transform=\"rotate(45 9 9)\"\n d=\"M9 1a8 8 0 1 1 0 16A8 8 0 1 1 9 1ZM8 3.343h2V8h4.657v2H10v4.657H8V10H3.343V8H8Z\" />\n </svg>\n </span>\n }\n </div>\n <ng-content />\n @if (validationError(); as error) {\n @if (focused()) {\n <div class=\"nxe-invalid-message\">{{ error }}</div>\n }\n }\n `,\n host: {\n class: 'nxe-widget nxe-editor nxe-textbox',\n '[class.nxe-focused]': 'focused()',\n '[class.nxe-invalid]': '!!validationError()',\n },\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextBoxComponent), multi: true },\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeTextBoxComponent) },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeTextBoxComponent extends NxeFormControlBase<string> {\n readonly mode = input<NxeTextBoxMode>('text');\n readonly placeholderInput = input<string | undefined>(undefined, { alias: 'placeholder' });\n readonly placeholder = computed(\n () => this.placeholderInput() ?? this.nxeDefaults.textBox?.placeholder ?? '',\n );\n /** DevExtreme parity input; cosmetic, unused in behaviour. */\n readonly hoverStateEnabledInput = input<boolean | undefined>(undefined, { alias: 'hoverStateEnabled', transform: nxeOptionalBoolean });\n readonly hoverStateEnabled = computed(\n () => this.hoverStateEnabledInput() ?? this.nxeDefaults.textBox?.hoverStateEnabled ?? false,\n );\n\n /** dx `showClearButton` — off by default, as in dx; `NXE_DEFAULT_OPTIONS.textBox` can turn it on app-wide. */\n readonly showClearButtonInput = input<boolean | undefined>(undefined, { alias: 'showClearButton', transform: nxeOptionalBoolean });\n readonly showClearButton = computed(\n () => this.showClearButtonInput() ?? this.nxeDefaults.textBox?.showClearButton ?? false,\n );\n\n readonly focused = signal(false);\n readonly displayValue = computed(() => this.value() ?? '');\n\n private readonly fieldRef = viewChild.required<ElementRef<HTMLInputElement>>('field');\n\n /**\n * The text in the field right now, typed or not. dx shows the clear button by the field's\n * emptiness (`.dx-texteditor-empty`), which follows every keystroke, not the committed value.\n */\n private readonly fieldText = linkedSignal(() => this.displayValue());\n\n protected readonly clearButtonVisible = computed(\n () => this.showClearButton() && !this.readOnly() && !this.disabled() && this.fieldText() !== '',\n );\n\n /** dx `valueChangeEvent: 'input'` — the search-as-you-type case. */\n protected onTypedInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.fieldText.set(text);\n this.commitOn('input', text, event);\n }\n\n /**\n * dx `_clearValueHandler`: value back to `''`, then focus on the input. The field is emptied by\n * hand as well — typed-but-uncommitted text over an already-empty value would otherwise survive,\n * because the `[value]` binding has not changed.\n */\n protected onClear(event: Event): void {\n const field = this.fieldRef().nativeElement;\n this.commitValue('', event);\n field.value = '';\n this.fieldText.set('');\n if (!this.focused()) {\n field.focus();\n }\n }\n\n protected onTypedKeyup(event: Event): void {\n this.commitOn('keyup', (event.target as HTMLInputElement).value, event);\n }\n\n protected onBlur(event: Event): void {\n // Blur commits whatever the mode: a value typed and left must not be discarded because\n // the configured event never fired.\n this.commitValue((event.target as HTMLInputElement).value, event);\n this.focused.set(false);\n this.markAsTouched();\n }\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-text-area` — drop-in replacement for DevExtreme `dx-text-area`.\r\n *\r\n * Identical to {@link NxeTextBoxComponent} but renders a `<textarea>`. Supports an optional fixed\r\n * `[height]` (px) and `placeholder`; commits on blur. Hosts a projected `nxe-validator` via\r\n * {@link NXE_VALIDATION_TARGET}.\r\n */\r\n@Component({\r\n selector: 'nxe-text-area',\r\n standalone: true,\r\n template: `\r\n <div class=\"nxe-editor-container\">\r\n <textarea\r\n class=\"nxe-editor-input nxe-textarea-input\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n [id]=\"controlId()\"\r\n [attr.aria-label]=\"ariaLabel() || null\"\r\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\r\n [attr.aria-invalid]=\"validationError() ? true : null\"\r\n [attr.aria-required]=\"required() ? true : null\"\r\n [value]=\"displayValue()\"\r\n [readOnly]=\"readOnly()\"\r\n [disabled]=\"disabled()\"\r\n [attr.placeholder]=\"placeholder() || null\"\r\n [style.height.px]=\"height() || null\"\r\n (input)=\"onTypedInput($event)\"\r\n (keyup)=\"onTypedKeyup($event)\"\r\n (blur)=\"onBlur($event)\"\r\n (focus)=\"focused.set(true)\"></textarea>\r\n </div>\r\n <ng-content />\r\n @if (validationError(); as error) {\r\n @if (focused()) {\r\n <div class=\"nxe-invalid-message\">{{ error }}</div>\r\n }\r\n }\r\n `,\r\n styleUrl: './nxe-text-area.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-editor nxe-textarea',\r\n '[class.nxe-focused]': 'focused()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeTextAreaComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeTextAreaComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeTextAreaComponent extends NxeFormControlBase<string> {\r\n readonly placeholderInput = input<string | undefined>(undefined, { alias: 'placeholder' });\r\n readonly placeholder = computed(\r\n () => this.placeholderInput() ?? this.nxeDefaults.textArea?.placeholder ?? '',\r\n );\r\n /** Fixed height in px (DevExtreme `[height]`); unset = auto. */\r\n readonly heightInput = input<number | undefined>(undefined, { alias: 'height' });\r\n readonly height = computed(() => this.heightInput() ?? this.nxeDefaults.textArea?.height ?? 80);\r\n\r\n readonly focused = signal(false);\r\n readonly displayValue = computed(() => this.value() ?? '');\r\n\r\n /** dx `valueChangeEvent: 'input'` — the search-as-you-type case. */\r\n protected onTypedInput(event: Event): void {\r\n this.commitOn('input', (event.target as HTMLTextAreaElement).value, event);\r\n }\r\n\r\n protected onTypedKeyup(event: Event): void {\r\n this.commitOn('keyup', (event.target as HTMLTextAreaElement).value, event);\r\n }\r\n\r\n protected onBlur(event: Event): void {\r\n // Blur commits whatever the mode: a value typed and left must not be discarded because\r\n // the configured event never fired.\r\n this.commitValue((event.target as HTMLTextAreaElement).value, event);\r\n this.focused.set(false);\r\n this.markAsTouched();\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n forwardRef,\r\n input,\r\n OnChanges,\r\n signal,\r\n SimpleChanges,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { NxeFormControlBase } from '@nexterajs/ui/core';\r\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\r\n\r\n/**\r\n * `nxe-check-box` — drop-in replacement for DevExtreme `dx-check-box`.\r\n *\r\n * A signal-CVA editor (extends {@link NxeFormControlBase}) over `true` / `false` / `null`. As in\r\n * dx, a `null` value is the indeterminate state: the box shows a 12px square and reports\r\n * `aria-checked=\"mixed\"`. That is what a `new FormControl()` (or a `reset()`) looks like, and what\r\n * `[value]=\"null\"` looks like; an unbound box starts unchecked, like dx's default `false`. A click\r\n * or Space always lands on `true` or `false` — there is no `enableThreeStateBehavior` cycling back\r\n * to `null`.\r\n *\r\n * Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`, `[disabled]`, an\r\n * inline `text` label, `(onValueChanged)` (`{value}`) and `(valueChange)` (raw value). A read-only\r\n * box stays focusable (tabindex 0) and still shows hover and focus, as in dx; it just never\r\n * toggles. Provides {@link NXE_VALIDATION_TARGET} for a projected `nxe-validator` (a `required`\r\n * rule is invalid while unchecked, matching DevExtreme's RequiredRule treating `false` as empty).\r\n */\r\n@Component({\r\n selector: 'nxe-check-box',\r\n standalone: true,\r\n template: `\r\n <span class=\"nxe-checkbox-container\">\r\n <span class=\"nxe-checkbox-icon\" aria-hidden=\"true\"></span>\r\n @if (text()) {\r\n <span class=\"nxe-checkbox-text\">{{ text() }}</span>\r\n }\r\n </span>\r\n <ng-content />\r\n `,\r\n styleUrl: './nxe-check-box.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-checkbox',\r\n role: 'checkbox',\r\n '[attr.aria-checked]': \"indeterminate() ? 'mixed' : !!value()\",\r\n '[attr.aria-disabled]': 'disabled() ? true : null',\r\n '[attr.aria-readonly]': 'readOnly() ? true : null',\r\n '[attr.aria-invalid]': 'validationError() ? true : null',\r\n '[attr.aria-required]': 'required() ? true : null',\r\n // The host IS the control here, so the id and name belong on it rather than on a child.\r\n '[attr.id]': 'inputId() ? controlId() : null',\r\n '[attr.aria-label]': 'ariaLabel() || null',\r\n '[attr.aria-labelledby]': 'ariaLabelledBy() || null',\r\n // dx keeps a read-only box in the tab order (tabindex 0); only disabled takes it out.\r\n '[attr.tabindex]': 'disabled() ? null : 0',\r\n '[class.nxe-checkbox-checked]': '!!value()',\r\n '[class.nxe-checkbox-indeterminate]': 'indeterminate()',\r\n '[class.nxe-disabled]': 'disabled()',\r\n '[class.nxe-readonly]': 'readOnly()',\r\n '[class.nxe-invalid]': '!!validationError()',\r\n '(click)': 'toggle($event)',\r\n '(keydown.space)': 'onSpace($event)',\r\n '(blur)': 'markAsTouched()',\r\n },\r\n providers: [\r\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeCheckBoxComponent), multi: true },\r\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeCheckBoxComponent) },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeCheckBoxComponent extends NxeFormControlBase<boolean> implements OnChanges {\r\n /** Inline label rendered next to the box. */\r\n readonly text = input<string>();\r\n\r\n /**\r\n * Whether a value has been handed in at all — by the forms API or a `[value]` binding.\r\n *\r\n * The base class starts `value` at `null`, which is also the indeterminate value, so `null`\r\n * alone cannot tell \"given null\" from \"given nothing\". dx can: its unset value is `false`.\r\n */\r\n private readonly valueProvided = signal(false);\r\n\r\n /** dx `.dx-checkbox-indeterminate`: the value was given, and it is `null`. */\r\n readonly indeterminate = computed(() => this.valueProvided() && this.value() === null);\r\n\r\n override writeValue(value: boolean | null): void {\r\n super.writeValue(value);\r\n this.valueProvided.set(true);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['value']) {\r\n this.valueProvided.set(true);\r\n }\r\n }\r\n\r\n protected toggle(event: Event): void {\r\n if (this.disabled() || this.readOnly()) {\r\n return;\r\n }\r\n this.commitValue(!this.value(), event);\r\n this.markAsTouched();\r\n }\r\n\r\n protected onSpace(event: Event): void {\r\n event.preventDefault();\r\n this.toggle(event);\r\n }\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n linkedSignal,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { NxeFormControlBase, nxeOptionalBoolean } from '@nexterajs/ui/core';\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\nimport {\n formatNumber,\n NXE_NUMBER_SEPARATORS,\n parseNumber,\n parseNumberFormat,\n roundHalfAwayFromZero,\n} from '@nexterajs/ui/intl';\n\n/** Coerce a static (`min=\"1\"`) or bound (`[min]=\"0\"`) attribute to a number, or undefined. */\nfunction toNumber(value: unknown): number | undefined {\n if (value == null || value === '') {\n return undefined;\n }\n const num = Number(value);\n return isNaN(num) ? undefined : num;\n}\n\n/**\n * `nxe-number-box` — drop-in replacement for DevExtreme `dx-number-box`.\n *\n * A numeric signal-CVA editor (extends {@link NxeFormControlBase}) storing/emitting `number | null`.\n * Implements the DevExtreme number-format engine ({@link parseNumberFormat}/{@link formatNumber}):\n * displays the masked, grouped string when blurred and a raw editable number while focused;\n * commits (clamped to `[min,max]`, rounded to the format precision) on blur — never per keystroke.\n *\n * Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`, `[min]`/`[max]`,\n * `format` (string LDML pattern), `(valueChange)` (numeric), and a projected `nxe-validator`.\n *\n * `showClearButton` (dx default `false`) adds dx's clear area after the input while the field\n * holds text and is neither read-only nor disabled; it sets the value to `null`, as dx's\n * `clear()` does for a number box, and focuses the input.\n */\n@Component({\n selector: 'nxe-number-box',\n standalone: true,\n template: `\n <div class=\"nxe-editor-container\">\n <input\n #field\n class=\"nxe-editor-input nxe-numberbox-input\"\n [attr.tabindex]=\"tabIndex()\"\n [id]=\"controlId()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n [attr.aria-invalid]=\"validationError() ? true : null\"\n [attr.aria-required]=\"required() ? true : null\"\n type=\"text\"\n inputmode=\"decimal\"\n [value]=\"displayValue()\"\n [readOnly]=\"readOnly()\"\n [disabled]=\"disabled()\"\n autocomplete=\"off\"\n (input)=\"onFieldInput($event)\"\n (focus)=\"focused.set(true)\"\n (blur)=\"onBlur($event)\" />\n @if (clearButtonVisible()) {\n <span\n class=\"nxe-clear-button-area\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onClear($event)\"\n aria-hidden=\"true\">\n <!-- A Ø16 disc with a 2px × cut out (the dropdown editors' clear glyph). -->\n <svg viewBox=\"0 0 18 18\" focusable=\"false\">\n <path fill-rule=\"evenodd\" transform=\"rotate(45 9 9)\"\n d=\"M9 1a8 8 0 1 1 0 16A8 8 0 1 1 9 1ZM8 3.343h2V8h4.657v2H10v4.657H8V10H3.343V8H8Z\" />\n </svg>\n </span>\n }\n </div>\n <ng-content />\n @if (validationError(); as error) {\n @if (focused()) {\n <div class=\"nxe-invalid-message\">{{ error }}</div>\n }\n }\n `,\n styleUrl: './nxe-number-box.component.scss',\n host: {\n class: 'nxe-widget nxe-editor nxe-numberbox',\n '[class.nxe-focused]': 'focused()',\n '[class.nxe-invalid]': '!!validationError()',\n },\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeNumberBoxComponent), multi: true },\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeNumberBoxComponent) },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeNumberBoxComponent extends NxeFormControlBase<number> {\n /** LDML format pattern (e.g. `#,##0.00`); empty = raw number. */\n readonly formatInput = input<string | undefined>(undefined, { alias: 'format' });\n readonly format = computed(\n () => this.formatInput() ?? this.nxeDefaults.numberBox?.format ?? '',\n );\n readonly min = input<number | undefined, unknown>(undefined, { transform: toNumber });\n readonly max = input<number | undefined, unknown>(undefined, { transform: toNumber });\n\n /** dx `showClearButton` — off by default, as in dx; `NXE_DEFAULT_OPTIONS.numberBox` can turn it on app-wide. */\n readonly showClearButtonInput = input<boolean | undefined>(undefined, { alias: 'showClearButton', transform: nxeOptionalBoolean });\n readonly showClearButton = computed(\n () => this.showClearButtonInput() ?? this.nxeDefaults.numberBox?.showClearButton ?? false,\n );\n\n readonly focused = signal(false);\n private readonly parsedFormat = computed(() => parseNumberFormat(this.format()));\n private readonly fieldRef = viewChild.required<ElementRef<HTMLInputElement>>('field');\n\n /** Locale characters, configured once by the application. Defaults to en-US. */\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\n\n readonly displayValue = computed(() => {\n const value = this.value();\n if (this.focused()) {\n // Raw editable text, but with this locale's decimal character: `String(0.125)` gives\n // a JS-style dot, and parseNumber would read that as a group separator and commit 125.\n return value == null ? '' : String(value).replace('.', this.separators.decimal);\n }\n return formatNumber(value, this.parsedFormat(), this.separators);\n });\n\n /** The text in the field right now; dx shows the clear button by the field's emptiness. */\n private readonly fieldText = linkedSignal(() => this.displayValue());\n\n protected readonly clearButtonVisible = computed(\n () => this.showClearButton() && !this.readOnly() && !this.disabled() && this.fieldText() !== '',\n );\n\n protected onFieldInput(event: Event): void {\n this.fieldText.set((event.target as HTMLInputElement).value);\n }\n\n /**\n * dx `_clearValueHandler`: value to `null`, then focus on the input. The field is emptied by hand\n * too, for typed-but-uncommitted text over a value that was already `null`.\n */\n protected onClear(event: Event): void {\n const field = this.fieldRef().nativeElement;\n this.commitValue(null, event);\n field.value = '';\n this.fieldText.set('');\n if (!this.focused()) {\n field.focus();\n }\n }\n\n protected onBlur(event: Event): void {\n let num = parseNumber((event.target as HTMLInputElement).value, this.separators);\n if (num != null) {\n const min = this.min();\n const max = this.max();\n if (min != null && num < min) {\n num = min;\n }\n if (max != null && num > max) {\n num = max;\n }\n const fmt = this.parsedFormat();\n if (fmt) {\n num = roundHalfAwayFromZero(num, fmt.maxFrac);\n }\n }\n this.commitValue(num, event);\n this.focused.set(false);\n this.markAsTouched();\n }\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n forwardRef,\n inject,\n input,\n linkedSignal,\n OnDestroy,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { DateTime } from 'luxon';\nimport { filter, merge, Subscription } from 'rxjs';\nimport { NxeFormControlBase, nxeOptionalBoolean } from '@nexterajs/ui/core';\nimport { NXE_VALIDATION_TARGET } from '@nexterajs/ui/core';\nimport { nxePane, trackPaneFlip } from '@nexterajs/ui/styling';\nimport {\n buildCalendarWeeks,\n buildPeriodCells,\n formatDisplay,\n NXE_DEFAULT_DATETIME_DISPLAY_FORMAT,\n NXE_DEFAULT_DISPLAY_FORMAT,\n NXE_DEFAULT_TIME_DISPLAY_FORMAT,\n NxeCalendarZoom,\n NxePeriodCell,\n parseDateValue,\n parseDisplay,\n serializeDate,\n} from '@nexterajs/ui/intl';\n\n/** DevExtreme date-box `type`. */\nexport type NxeDateBoxType = 'date' | 'datetime' | 'time';\n\n/** Normalize a `[min]`/`[max]` binding (Date object or serialized string) to a DateTime. */\nfunction toBoundDate(bound: Date | string | null): DateTime | null {\n if (!bound) {\n return null;\n }\n if (bound instanceof Date) {\n const dt = DateTime.fromJSDate(bound);\n return dt.isValid ? dt : null;\n }\n return parseDateValue(bound);\n}\n\n/**\n * `nxe-date-box` — drop-in replacement for DevExtreme `dx-date-box`.\n *\n * A signal-CVA editor (extends {@link NxeFormControlBase}) whose value is the app-wide\n * `\"yyyy-MM-ddTHH:mm:ss\"` string (preserving the global `dateSerializationFormat`). The field is\n * typeable (parsed on blur per `displayFormat`) and opens a CDK-overlay calendar from the icon\n * button. Built on Luxon. Default `displayFormat` is `dd-MMM-yyyy`. Hosts a projected\n * `nxe-validator` via {@link NXE_VALIDATION_TARGET}.\n *\n * `showClearButton` (dx default `false`) adds dx's clear area between the input and the calendar\n * button while the field holds text and is neither read-only nor disabled; it sets the value to\n * `null` and focuses the input.\n *\n * The button and calendar glyphs are drawn in an 18-unit viewBox (1 unit = 1px) to the ink measured\n * off dx's `event` (`date`), `eventall` (`datetime`) and `clock` (`time`) glyphs and its chevrons,\n * each laid out from those metrics in rects, stroked rects and circles, and straight-edged polygons;\n * the templates state each construction.\n */\n@Component({\n selector: 'nxe-date-box',\n standalone: true,\n template: `\n <div class=\"nxe-editor-container\">\n <input\n #field\n class=\"nxe-editor-input nxe-datebox-input\"\n [attr.tabindex]=\"tabIndex()\"\n [id]=\"controlId()\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"ariaLabelledBy() || null\"\n [attr.aria-invalid]=\"validationError() ? true : null\"\n [attr.aria-required]=\"required() ? true : null\"\n type=\"text\"\n [value]=\"displayValue()\"\n [readOnly]=\"readOnly()\"\n [disabled]=\"disabled()\"\n [attr.placeholder]=\"effectivePlaceholder() || null\"\n autocomplete=\"off\"\n (input)=\"onFieldInput($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\" />\n @if (clearButtonVisible()) {\n <span\n class=\"nxe-clear-button-area\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"onClear($event)\"\n aria-hidden=\"true\">\n <!-- A Ø16 disc with a 2px × cut out (the dropdown editors' clear glyph). -->\n <svg viewBox=\"0 0 18 18\" focusable=\"false\">\n <path fill-rule=\"evenodd\" transform=\"rotate(45 9 9)\"\n d=\"M9 1a8 8 0 1 1 0 16A8 8 0 1 1 9 1ZM8 3.343h2V8h4.657v2H10v4.657H8V10H3.343V8H8Z\" />\n </svg>\n </span>\n }\n @if (!readOnly()) {\n <span\n class=\"nxe-datebox-button\"\n [class.nxe-datebox-open]=\"opened()\"\n (mousedown)=\"onButtonMousedown($event)\"\n aria-hidden=\"true\">\n @switch (type()) {\n @case ('time') {\n <!-- dx clock, a 16x16 ink box round the box centre: a 2px ring (an r 7\n circle stroked 2px), a 2x4 hand straight up from the centre, a 1.5x4\n hand turned 45° down-right, and a Ø2 hub where they meet. -->\n <svg class=\"nxe-datebox-icon nxe-datebox-icon-time\" viewBox=\"0 0 18 18\" focusable=\"false\">\n <circle cx=\"9\" cy=\"9\" r=\"7\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <rect x=\"8\" y=\"5\" width=\"2\" height=\"4\" />\n <rect x=\"9\" y=\"8.25\" width=\"4\" height=\"1.5\" transform=\"rotate(45 9 9)\" />\n <circle cx=\"9\" cy=\"9\" r=\"1\" />\n </svg>\n }\n @case ('datetime') {\n <!-- dx eventall: the calendar page below, without its day marker. -->\n <svg class=\"nxe-datebox-icon nxe-datebox-icon-datetime\" viewBox=\"0 0 18 18\" focusable=\"false\">\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"3\" />\n <rect x=\"4\" y=\"1\" width=\"2\" height=\"1.5\" />\n <rect x=\"12\" y=\"1\" width=\"2\" height=\"1.5\" />\n </svg>\n }\n @default {\n <!-- dx event, a 14x15 ink box from 1px below the top of the 18px box\n (where dx's glyph renders): the page is a 12x12 rect with 1px corners\n stroked 2px, so 14x14 with 2px corners outside and square inside; a\n 12x3 bar under its top wall makes the 4px header band; two 2x1.5\n binder tabs stand 1px proud of it; a 4x4 day marker at (9, 9). -->\n <svg class=\"nxe-datebox-icon nxe-datebox-icon-date\" viewBox=\"0 0 18 18\" focusable=\"false\">\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"12\" rx=\"1\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <rect x=\"3\" y=\"3\" width=\"12\" height=\"3\" />\n <rect x=\"4\" y=\"1\" width=\"2\" height=\"1.5\" />\n <rect x=\"12\" y=\"1\" width=\"2\" height=\"1.5\" />\n <rect x=\"9\" y=\"9\" width=\"4\" height=\"4\" />\n </svg>\n }\n }\n </span>\n }\n </div>\n <ng-content />\n @if (validationError(); as error) {\n @if (focused()) {\n <div class=\"nxe-invalid-message\">{{ error }}</div>\n }\n }\n\n <ng-template #calendarTemplate>\n <div class=\"nxe-calendar\" (mousedown)=\"$event.preventDefault()\">\n @if (type() !== 'time') {\n <div class=\"nxe-calendar-navigator\">\n <button type=\"button\" class=\"nxe-calendar-nav\" (click)=\"navigate(-1)\">\n <!-- dx chevronleft (8x14 ink, centred in its 18px box): two 45° arms\n whose outer edges run 7px out and 7px up and down from the point,\n their ends cut square 1.25px across and down (a 1.77px stroke),\n meeting 2.5px behind it. That draws 8.25x14, centred by putting the\n point at x 4.875, and rasterises to dx's 8x14. -->\n <svg class=\"nxe-calendar-chevron\" viewBox=\"0 0 18 18\" focusable=\"false\">\n <polygon points=\"4.875 9 11.875 2 13.125 3.25 7.375 9 13.125 14.75 11.875 16\" />\n </svg>\n </button>\n <button type=\"button\" class=\"nxe-calendar-caption\" (click)=\"zoomOut()\">\n {{ caption() }}\n </button>\n <button type=\"button\" class=\"nxe-calendar-nav\" (click)=\"navigate(1)\">\n <!-- dx chevronright: the same chevron mirrored about x 9. -->\n <svg class=\"nxe-calendar-chevron\" viewBox=\"0 0 18 18\" focusable=\"false\">\n <polygon points=\"13.125 9 6.125 2 4.875 3.25 10.625 9 4.875 14.75 6.125 16\" />\n </svg>\n </button>\n </div>\n @if (zoomLevel() === 'month') {\n <div class=\"nxe-calendar-weekdays\">\n @for (wd of weekdays; track wd) {\n <span>{{ wd }}</span>\n }\n </div>\n <div class=\"nxe-calendar-grid\">\n @for (week of weeks(); track $index) {\n @for (day of week; track day.toMillis()) {\n <button\n type=\"button\"\n class=\"nxe-calendar-day\"\n [class.nxe-calendar-other]=\"day.month !== viewMonth().month\"\n [class.nxe-calendar-selected]=\"isSelected(day)\"\n [class.nxe-calendar-today]=\"isToday(day)\"\n [disabled]=\"isDisabledDay(day)\"\n (click)=\"selectDay(day)\">\n <span>{{ day.day }}</span>\n </button>\n }\n }\n </div>\n } @else {\n <div\n class=\"nxe-calendar-periods\"\n [class.nxe-calendar-periods-century]=\"zoomLevel() === 'century'\">\n @for (cell of periodCells(); track cell.anchor.toMillis()) {\n <button\n type=\"button\"\n class=\"nxe-calendar-period\"\n [class.nxe-calendar-other]=\"cell.other\"\n [class.nxe-calendar-today]=\"cell.isNow\"\n [disabled]=\"cell.disabled\"\n (click)=\"selectPeriod(cell)\">\n <span>{{ cell.label }}</span>\n </button>\n }\n </div>\n }\n }\n @if (type() !== 'date') {\n <div class=\"nxe-calendar-time\">\n <input\n class=\"nxe-calendar-time-part\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n aria-label=\"Hour\"\n [value]=\"hourText()\"\n (change)=\"setTimePart('hour', $event)\" />\n <span class=\"nxe-calendar-time-sep\" aria-hidden=\"true\">:</span>\n <input\n class=\"nxe-calendar-time-part\"\n type=\"text\"\n inputmode=\"numeric\"\n maxlength=\"2\"\n aria-label=\"Minute\"\n [value]=\"minuteText()\"\n (change)=\"setTimePart('minute', $event)\" />\n <button type=\"button\" class=\"nxe-calendar-time-btn\" (click)=\"setNow()\">Now</button>\n <button type=\"button\" class=\"nxe-calendar-time-btn nxe-calendar-time-done\" (click)=\"close()\">\n Done\n </button>\n </div>\n }\n </div>\n </ng-template>\n `,\n styleUrl: './nxe-date-box.component.scss',\n host: {\n class: 'nxe-widget nxe-editor nxe-datebox',\n '[class.nxe-focused]': 'focused()',\n '[class.nxe-invalid]': '!!validationError()',\n },\n providers: [\n { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NxeDateBoxComponent), multi: true },\n { provide: NXE_VALIDATION_TARGET, useExisting: forwardRef(() => NxeDateBoxComponent) },\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeDateBoxComponent extends NxeFormControlBase<string> implements OnDestroy {\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly calendarTemplate = viewChild.required<TemplateRef<unknown>>('calendarTemplate');\n private readonly fieldRef = viewChild.required<ElementRef<HTMLInputElement>>('field');\n\n readonly type = input<NxeDateBoxType>('date');\n /* Undefined rather than a literal default, so the default can follow `type`. Additive: no call\n site passes either input, and one that does still wins. */\n readonly displayFormat = input<string | undefined>(undefined);\n readonly placeholder = input<string | undefined>(undefined);\n /** DevExtreme `[min]`/`[max]` bounds: calendar days outside are disabled, typed values clamp. */\n readonly min = input<Date | string | null>(null);\n readonly max = input<Date | string | null>(null);\n /** dx `showClearButton` — off by default, as in dx; `NXE_DEFAULT_OPTIONS.dateBox` can turn it on app-wide. */\n readonly showClearButtonInput = input<boolean | undefined>(undefined, { alias: 'showClearButton', transform: nxeOptionalBoolean });\n readonly showClearButton = computed(\n () => this.showClearButtonInput() ?? this.nxeDefaults.dateBox?.showClearButton ?? false,\n );\n\n readonly focused = signal(false);\n readonly opened = signal(false);\n readonly viewMonth = signal<DateTime>(DateTime.now().startOf('month'));\n /** Calendar zoom level; caption clicks zoom out, cell picks zoom back in (dx-calendar parity). */\n readonly zoomLevel = signal<NxeCalendarZoom>('month');\n readonly weekdays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] as const;\n\n /** The format actually used, from `displayFormat` or the default for this `type`. */\n readonly effectiveDisplayFormat = computed(() => {\n const stated = this.displayFormat() ?? this.nxeDefaults.dateBox?.displayFormat;\n if (stated) {\n return stated;\n }\n switch (this.type()) {\n case 'time':\n return NXE_DEFAULT_TIME_DISPLAY_FORMAT;\n case 'datetime':\n return NXE_DEFAULT_DATETIME_DISPLAY_FORMAT;\n default:\n return NXE_DEFAULT_DISPLAY_FORMAT;\n }\n });\n /** dx's default placeholder is '', but orbit's global default is the format itself. */\n readonly effectivePlaceholder = computed(\n () =>\n this.placeholder() ?? this.nxeDefaults.dateBox?.placeholder ?? this.effectiveDisplayFormat(),\n );\n\n private readonly selected = computed(() => parseDateValue(this.value()));\n readonly displayValue = computed(() => formatDisplay(this.selected(), this.effectiveDisplayFormat()));\n\n /** The text in the field right now; dx shows the clear button by the field's emptiness. */\n private readonly fieldText = linkedSignal(() => this.displayValue());\n\n protected readonly clearButtonVisible = computed(\n () => this.showClearButton() && !this.readOnly() && !this.disabled() && this.fieldText() !== '',\n );\n readonly weeks = computed(() => buildCalendarWeeks(this.viewMonth()));\n\n /** Two-digit hour/minute for the popup's time strip; blank when nothing is selected. */\n readonly hourText = computed(() => this.selected()?.toFormat('HH') ?? '');\n readonly minuteText = computed(() => this.selected()?.toFormat('mm') ?? '');\n\n /**\n * The field's text as it stood when focus arrived. `onBlur` compares against it and commits\n * nothing when the user only tabbed through — see the comment there.\n */\n private textAtFocus = '';\n\n readonly caption = computed(() => {\n const view = this.viewMonth();\n switch (this.zoomLevel()) {\n case 'month':\n return view.toFormat('MMMM yyyy');\n case 'year':\n return view.toFormat('yyyy');\n case 'decade': {\n const start = view.year - (view.year % 10);\n return `${start}-${start + 9}`;\n }\n case 'century': {\n const start = view.year - (view.year % 100);\n return `${start}-${start + 99}`;\n }\n }\n });\n\n readonly periodCells = computed(() => {\n const zoom = this.zoomLevel();\n if (zoom === 'month') {\n return [];\n }\n const now = DateTime.now();\n const min = this.minDate();\n const max = this.maxDate();\n const span = zoom === 'year' ? { months: 1 } : zoom === 'decade' ? { years: 1 } : { years: 10 };\n return buildPeriodCells(zoom, this.viewMonth()).map((cell) => {\n const end = cell.anchor.plus(span).minus({ days: 1 }).endOf('day');\n return {\n ...cell,\n isNow: now >= cell.anchor && now <= end,\n disabled: (!!min && end < min.startOf('day')) || (!!max && cell.anchor > max.endOf('day')),\n };\n });\n });\n\n private readonly minDate = computed(() => toBoundDate(this.min()));\n private readonly maxDate = computed(() => toBoundDate(this.max()));\n\n protected isDisabledDay(day: DateTime): boolean {\n const min = this.minDate();\n const max = this.maxDate();\n return (!!min && day.startOf('day') < min.startOf('day')) || (!!max && day.startOf('day') > max.startOf('day'));\n }\n\n private clampToBounds(dt: DateTime): DateTime {\n const min = this.minDate();\n const max = this.maxDate();\n if (min && dt < min.startOf('day')) return min.startOf('day');\n /* Land on the bound's DAY but keep the value's own time. Returning max.startOf('day') would\n silently zero an 18:00 whenever the entry ran past the bound — invisible for a date-only\n field, and a wiped time for a datetime one. */\n if (max && dt > max.endOf('day')) {\n return max.startOf('day').set({ hour: dt.hour, minute: dt.minute, second: dt.second });\n }\n return dt;\n }\n\n private overlayRef?: OverlayRef;\n private closeSub?: Subscription;\n private flipSub?: Subscription;\n\n protected isSelected(day: DateTime): boolean {\n const sel = this.selected();\n return !!sel && day.hasSame(sel, 'day');\n }\n\n protected isToday(day: DateTime): boolean {\n return day.hasSame(DateTime.now(), 'day');\n }\n\n protected navigate(delta: number): void {\n const months = { month: 1, year: 12, decade: 120, century: 1200 }[this.zoomLevel()];\n this.viewMonth.update((m) => m.plus({ months: months * delta }));\n }\n\n protected zoomOut(): void {\n const next = { month: 'year', year: 'decade', decade: 'century' } as const;\n const zoom = this.zoomLevel();\n if (zoom !== 'century') {\n this.zoomLevel.set(next[zoom]);\n }\n }\n\n protected selectPeriod(cell: NxePeriodCell & { disabled: boolean }): void {\n if (cell.disabled) {\n return;\n }\n const previous = { year: 'month', decade: 'year', century: 'decade' } as const;\n this.viewMonth.set(cell.anchor.startOf('month'));\n this.zoomLevel.set(previous[this.zoomLevel() as Exclude<NxeCalendarZoom, 'month'>]);\n }\n\n protected onButtonMousedown(event: Event): void {\n // Keep field focus (avoid a blur-driven re-commit) and toggle the calendar.\n event.preventDefault();\n if (this.disabled() || this.readOnly()) {\n return;\n }\n this.opened() ? this.close() : this.open();\n }\n\n protected onFieldInput(event: Event): void {\n this.fieldText.set((event.target as HTMLInputElement).value);\n }\n\n /**\n * dx `_clearValueHandler`: value to `null` (dx's `clear()` for a date box), then focus on the\n * input. `syncField` repaints the field, so typed-but-uncommitted text over a value that was\n * already `null` goes too.\n */\n protected onClear(event: Event): void {\n this.commitValue(null, event);\n this.syncField();\n if (!this.focused()) {\n this.fieldRef().nativeElement.focus();\n }\n }\n\n protected onFocus(event: Event): void {\n this.textAtFocus = (event.target as HTMLInputElement).value;\n this.focused.set(true);\n }\n\n /**\n * Commit what the user TYPED — and nothing when they typed nothing.\n *\n * The unchanged-text guard is load-bearing, not an optimization. `displayFormat` renders a\n * strict subset of the stored value: `dd-MMM-yyyy` shows `2026-08-12T09:00:00` as `12-Aug-2026`,\n * and re-parsing that yields midnight. This method used to commit unconditionally, so simply\n * focusing and tabbing past a field rewrote 09:00 to 00:00 and 09:30:45 to 09:30:00 — silently,\n * because `commitValue` only no-ops on an identical string and these differ. Latent while\n * nothing rendered a time; straight data loss the moment `type=\"datetime\"` exists.\n *\n * A rejected entry keeps the previous value and repaints the field. The repaint is required:\n * `[value]` is still bound to the same `displayValue()` Angular last wrote, so it will not\n * re-render on its own and the unparseable text would sit there looking accepted.\n */\n protected onBlur(event: Event): void {\n const element = event.target as HTMLInputElement;\n /* Read before clearing: it doubles as \"we captured a baseline this focus cycle\". A blur with\n no preceding focus cannot happen to a real user — browsers always fire focus first — so\n the only sequence that reaches the fall-through is a synthetic one, where the old\n parse-everything behaviour is both harmless and what the existing specs assert. */\n const hadBaseline = this.focused();\n this.focused.set(false);\n this.markAsTouched();\n\n if (hadBaseline && element.value === this.textAtFocus) {\n return;\n }\n if (!element.value.trim()) {\n this.commitValue(null, event);\n this.syncField();\n return;\n }\n\n const dt = parseDisplay(element.value, this.effectiveDisplayFormat(), this.selected());\n if (dt) {\n this.commitValue(serializeDate(this.clampToBounds(dt)), event);\n }\n this.syncField();\n }\n\n /**\n * Repaint the field from the committed value and re-baseline {@link textAtFocus}.\n *\n * Called after every non-typed commit as well, so a later blur cannot replay stale typed text\n * over a value the popup has since changed.\n */\n private syncField(): void {\n const element = this.fieldRef().nativeElement;\n element.value = this.displayValue();\n this.textAtFocus = element.value;\n this.fieldText.set(element.value);\n }\n\n protected selectDay(day: DateTime): void {\n if (this.isDisabledDay(day)) {\n return;\n }\n let dt = day.startOf('day');\n if (this.type() === 'datetime') {\n const base = this.selected();\n if (base) {\n dt = dt.set({ hour: base.hour, minute: base.minute, second: base.second });\n }\n }\n this.commitValue(serializeDate(dt), null);\n this.syncField();\n /* Only a plain date picker is finished at this point. In datetime mode the time strip is\n the other half of the job, and closing here would put it out of reach. */\n if (this.type() === 'date') {\n this.close();\n }\n }\n\n /**\n * Commit one part of the time from the popup strip.\n *\n * Writes straight through to the value rather than holding a draft: `selectDay` already commits\n * immediately, the component keeps no other pending state, and a stray backdrop click must not\n * discard a time the user has just set. dx buffers behind OK/Cancel; this is the divergence.\n */\n protected setTimePart(part: 'hour' | 'minute', event: Event): void {\n const element = event.target as HTMLInputElement;\n const typed = Number.parseInt(element.value, 10);\n const base = this.selected() ?? DateTime.now().startOf('day');\n const ceiling = part === 'hour' ? 23 : 59;\n const next = Number.isNaN(typed) ? base[part] : Math.min(Math.max(typed, 0), ceiling);\n\n this.commitValue(serializeDate(base.set({ [part]: next })), event);\n this.syncField();\n /* Same non-repaint hazard as onBlur: when the clamp lands back on the value already held,\n the [value] binding is unchanged and `7` would stay on screen instead of `07`. */\n element.value = part === 'hour' ? this.hourText() : this.minuteText();\n }\n\n protected setNow(): void {\n const now = DateTime.now();\n const base = this.selected() ?? now;\n this.commitValue(serializeDate(base.set({ hour: now.hour, minute: now.minute, second: 0 })), null);\n this.syncField();\n }\n\n private open(): void {\n this.viewMonth.set((this.selected() ?? DateTime.now()).startOf('month'));\n this.zoomLevel.set('month');\n if (!this.overlayRef) {\n this.overlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(this.elementRef)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n panelClass: nxePane('nxe-datebox-pane'),\n });\n this.flipSub = trackPaneFlip(this.overlayRef);\n }\n if (this.overlayRef.hasAttached()) {\n return;\n }\n this.overlayRef.attach(new TemplatePortal(this.calendarTemplate(), this.viewContainerRef));\n this.closeSub = merge(\n this.overlayRef.backdropClick(),\n this.overlayRef.keydownEvents().pipe(filter((e) => e.key === 'Escape')),\n ).subscribe(() => this.close());\n this.opened.set(true);\n }\n\n /** Protected, not private: the time strip's Done button closes the popup from the template. */\n protected close(): void {\n if (!this.overlayRef?.hasAttached()) {\n return;\n }\n this.overlayRef.detach();\n this.closeSub?.unsubscribe();\n this.flipSub?.unsubscribe();\n this.opened.set(false);\n this.markAsTouched();\n }\n\n ngOnDestroy(): void {\n this.closeSub?.unsubscribe();\n this.flipSub?.unsubscribe();\n this.overlayRef?.dispose();\n }\n}\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-scroll-view` — drop-in replacement for DevExtreme `dx-scroll-view`.\r\n *\r\n * In this app `nxe-scroll-view` is used purely as a dumb scroll container: no `@ViewChild`, no\r\n * `.instance` methods, no events (see survey). Every live tag is the same literal triple\r\n * `[scrollByContent]=\"true\" [scrollByThumb]=\"true\" [showScrollbar]=\"'onScroll'\"`. So this is a\r\n * styled `overflow:auto` wrapper that projects its content inside a `.nxe-scrollview-content`\r\n * flex-column box (matching dx's content layout, which some consumers' inner grids rely on for\r\n * height) and renders a thin grey dx-style scrollbar. The three inputs are accepted for binding\r\n * parity only — behaviour is native scrolling.\r\n */\r\n@Component({\r\n selector: 'nxe-scroll-view',\r\n standalone: true,\r\n template: '<div class=\"nxe-scrollview-content\"><ng-content /></div>',\r\n styleUrl: './nxe-scroll-view.component.scss',\r\n host: { class: 'nxe-widget nxe-scroll-view' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeScrollViewComponent {\r\n /** Accepted for parity with dx-scroll-view; behaviour is native overflow scrolling. */\r\n readonly scrollByContent = input(true);\r\n readonly scrollByThumb = input(true);\r\n readonly showScrollbar = input<'onScroll' | 'onHover' | 'always' | 'never'>('onScroll');\r\n}\r\n","// @nexterajs/ui/forms — public API.\r\nexport * from './lib/button/nxe-button.component';\r\nexport * from './lib/text-box/nxe-text-box.component';\r\nexport * from './lib/text-area/nxe-text-area.component';\r\nexport * from './lib/check-box/nxe-check-box.component';\r\nexport * from './lib/number-box/nxe-number-box.component';\r\nexport * from './lib/date-box/nxe-date-box.component';\r\nexport * from './lib/scroll-view/nxe-scroll-view.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}