@acorex/components 22.0.0-next.3 → 22.0.0-next.31

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 (46) hide show
  1. package/combo-box/README.md +26 -0
  2. package/fesm2022/acorex-components-calendar.mjs +10 -12
  3. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  4. package/fesm2022/acorex-components-combo-box.mjs +237 -0
  5. package/fesm2022/acorex-components-combo-box.mjs.map +1 -0
  6. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs +50 -0
  7. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs.map +1 -0
  8. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-Hh5Oyp3p.mjs → acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs} +2 -2
  9. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-Hh5Oyp3p.mjs.map → acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs.map} +1 -1
  10. package/fesm2022/acorex-components-conversation.mjs +1104 -6411
  11. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  12. package/fesm2022/acorex-components-data-table.mjs +42 -36
  13. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  14. package/fesm2022/acorex-components-datetime-box.mjs +42 -12
  15. package/fesm2022/acorex-components-datetime-box.mjs.map +1 -1
  16. package/fesm2022/acorex-components-datetime-input.mjs +358 -319
  17. package/fesm2022/acorex-components-datetime-input.mjs.map +1 -1
  18. package/fesm2022/acorex-components-datetime-picker.mjs +11 -1
  19. package/fesm2022/acorex-components-datetime-picker.mjs.map +1 -1
  20. package/fesm2022/acorex-components-decorators.mjs +2 -2
  21. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  22. package/fesm2022/acorex-components-dialog.mjs +3 -2
  23. package/fesm2022/acorex-components-dialog.mjs.map +1 -1
  24. package/fesm2022/acorex-components-file-viewer.mjs +346 -125
  25. package/fesm2022/acorex-components-file-viewer.mjs.map +1 -1
  26. package/fesm2022/acorex-components-grid-layout-builder.mjs +178 -36
  27. package/fesm2022/acorex-components-grid-layout-builder.mjs.map +1 -1
  28. package/fesm2022/acorex-components-list.mjs +2 -2
  29. package/fesm2022/acorex-components-list.mjs.map +1 -1
  30. package/fesm2022/acorex-components-menu.mjs +211 -74
  31. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  32. package/fesm2022/acorex-components-number-box.mjs +30 -29
  33. package/fesm2022/acorex-components-number-box.mjs.map +1 -1
  34. package/fesm2022/acorex-components-select-box.mjs +2 -2
  35. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  36. package/package.json +7 -3
  37. package/types/acorex-components-combo-box.d.ts +114 -0
  38. package/types/acorex-components-conversation.d.ts +136 -56
  39. package/types/acorex-components-datetime-box.d.ts +16 -4
  40. package/types/acorex-components-datetime-input.d.ts +74 -71
  41. package/types/acorex-components-file-viewer.d.ts +109 -17
  42. package/types/acorex-components-grid-layout-builder.d.ts +29 -2
  43. package/types/acorex-components-menu.d.ts +26 -4
  44. package/types/acorex-components-number-box.d.ts +3 -1
  45. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CNHiM1Sp.mjs +0 -106
  46. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-CNHiM1Sp.mjs.map +0 -1
@@ -37,6 +37,7 @@ declare const AXDateTimeBoxComponent_base: polytype.Polytype.ClusteredConstructo
37
37
  * @category Components
38
38
  */
39
39
  declare class AXDateTimeBoxComponent extends AXDateTimeBoxComponent_base {
40
+ private readonly defaultConfig;
40
41
  /**
41
42
  * @ignore
42
43
  */
@@ -56,7 +57,10 @@ declare class AXDateTimeBoxComponent extends AXDateTimeBoxComponent_base {
56
57
  */
57
58
  formatChange: EventEmitter<string>;
58
59
  /**
59
- * Indicates whether typing is allowed in the component.
60
+ * Indicates whether typing is allowed in the input.
61
+ * When false, clicking the input (or the calendar icon) opens the picker.
62
+ * When true, the input is for typing and the picker opens from the calendar button.
63
+ * Defaults to `AX_DATETIME_INPUT_CONFIG.allowTyping` when not set on the instance.
60
64
  *
61
65
  * @defaultValue false
62
66
  */
@@ -91,7 +95,7 @@ declare class AXDateTimeBoxComponent extends AXDateTimeBoxComponent_base {
91
95
  protected _editingDateObj: _angular_core.WritableSignal<Date>;
92
96
  protected readonly _calendarSystem: _angular_core.Signal<string>;
93
97
  protected readonly _resolvedFormat: _angular_core.Signal<string>;
94
- protected readonly _classicDateFields: _acorex_components_datetime_box.AXDateTimeBoxClassicField[];
98
+ protected readonly _classicDateFields: _angular_core.Signal<_acorex_components_datetime_box.AXDateTimeBoxClassicField[]>;
95
99
  protected readonly _classicTimeFields: _acorex_components_datetime_box.AXDateTimeBoxClassicField[];
96
100
  private readonly _classicTimeOptions;
97
101
  protected _classicDate: _angular_core.Signal<dist_packages_core_types_acorex_core_date_time.AXDateTime>;
@@ -125,7 +129,13 @@ declare class AXDateTimeBoxComponent extends AXDateTimeBoxComponent_base {
125
129
  text: string;
126
130
  }[];
127
131
  /**
128
- * @ignore
132
+ * Syncs typed input values into the box (and the picker via `_editingDateObj`).
133
+ * @ignore
134
+ */
135
+ protected _handleInputModelChange(value: Date | null): void;
136
+ /**
137
+ * Syncs picker selection into the box (and the input via `_editingDateObj`).
138
+ * @ignore
129
139
  */
130
140
  protected _handlePickerModelChange(value: Date | null): void;
131
141
  /**
@@ -163,7 +173,9 @@ declare class AXDateTimeBoxComponent extends AXDateTimeBoxComponent_base {
163
173
  */
164
174
  private _readSelectValue;
165
175
  /**
166
- * @ignore
176
+ * When typing is disabled, open the picker on input click.
177
+ * When typing is enabled, keep the picker closed so the user can type.
178
+ * @ignore
167
179
  */
168
180
  protected _handleInputOnClick(): void;
169
181
  private get __hostName();
@@ -1,32 +1,32 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
2
3
  import { MXInputBaseValueComponent, AXClickEvent } from '@acorex/cdk/common';
3
4
  import { AXDateTimePickerType } from '@acorex/components/calendar';
5
+ import { AXLocaleProfile } from '@acorex/core/locale';
4
6
 
5
7
  /**
6
- * A component for date and time input with various custom features.
8
+ * A component for date and time input with segment-based typing, keyboard navigation,
9
+ * and calendar-aware formatting (gregorian and solar-hijri).
7
10
  *
8
11
  * @category Components
9
12
  */
10
13
  declare class AXDateTimeInputComponent extends MXInputBaseValueComponent<Date> {
11
14
  #private;
12
- private platformService;
13
- private formatService;
14
15
  private localeService;
15
16
  private calendarService;
16
- /**
17
- * @ignore
18
- */
17
+ private readonly defaultConfig;
18
+ /** @ignore */
19
19
  private readonly _editingParts;
20
- /**
21
- * @ignore
22
- */
20
+ /** @ignore */
23
21
  protected _editingText: _angular_core.WritableSignal<string>;
22
+ /** @ignore */
23
+ private _inputChars;
24
+ /** @ignore */
25
+ private _activePart;
24
26
  /**
25
- * @ignore
26
- */
27
- protected _inputChars: string[];
28
- /**
29
- * Indicates whether typing is allowed in the input field.
27
+ * When true, the user can type digits and navigate segments with the keyboard.
28
+ * When false, keyboard input is blocked (used by datetime-box picker mode).
29
+ * Defaults to `AX_DATETIME_INPUT_CONFIG.allowTyping` when not set on the instance.
30
30
  * @defaultValue false
31
31
  */
32
32
  allowTyping: _angular_core.InputSignal<boolean>;
@@ -34,95 +34,97 @@ declare class AXDateTimeInputComponent extends MXInputBaseValueComponent<Date> {
34
34
  * @description The calendar type to use for the datetime input.
35
35
  */
36
36
  calendar: _angular_core.InputSignal<string>;
37
- protected readonly _calendarSystem: _angular_core.Signal<string>;
38
- private _activePart;
39
- private _editingDate;
40
- /**
41
- * @ignore
42
- */
43
- private input;
44
37
  minValue: _angular_core.InputSignal<Date>;
45
38
  maxValue: _angular_core.InputSignal<Date>;
46
39
  /**
47
- * Emitted when a click event occurs on the datetime box.
40
+ * Emitted when a click event occurs on the datetime input.
48
41
  * @event
49
42
  */
50
43
  onClick: _angular_core.OutputEmitterRef<AXClickEvent>;
51
44
  picker: _angular_core.InputSignal<AXDateTimePickerType>;
52
- protected readonly _resolvedFormat: _angular_core.Signal<string>;
53
45
  /**
54
46
  * @deprecated use locale & mode instead
55
47
  */
56
48
  format: _angular_core.InputSignal<string>;
57
- private _detectParts;
49
+ protected readonly _calendarSystem: _angular_core.Signal<string>;
50
+ protected readonly _resolvedFormat: _angular_core.Signal<string>;
51
+ /** @ignore */
52
+ protected readonly _isHijriRtl: _angular_core.Signal<boolean>;
53
+ /** @ignore */
54
+ private _editingDate;
55
+ /** @ignore */
56
+ private inputRef;
57
+ /** @ignore */
58
+ private get inputElement();
58
59
  /**
59
60
  * @description check if page is in rtl or ltr
60
61
  */
61
- protected isRtl: _angular_core.WritableSignal<boolean>;
62
+ protected readonly isRtl: _angular_core.Signal<boolean>;
62
63
  /**
63
- * @description listen to direction change to react to it.
64
- */
65
- protected ngOnInit(): void;
66
- /**
67
- * @ignore
64
+ * Formats a part using the calendar already attached to the AXDateTime.
65
+ * @ignore
68
66
  */
67
+ private _formatPart;
68
+ /** @ignore */
69
+ private _detectParts;
70
+ /** @ignore */
69
71
  private _getOrderedParts;
70
- /**
71
- * @ignore
72
- */
72
+ /** @ignore */
73
+ private _getNavigationParts;
74
+ /** @ignore */
73
75
  private _clearInputBuffer;
74
- /**
75
- * @ignore
76
- */
76
+ /** @ignore */
77
77
  private _updateText;
78
- /**
79
- * Sets the internal date value, adjusting it based on editing parts.
80
- * @param value - The date to set. Returns `undefined` if no value is provided.
81
- * @ignore
82
- */
83
78
  /**
84
79
  * Handles changes to the internal date value, updating editing parts and text representation.
85
- *
86
- * @param value - The new date value. If not provided, resets editing parts.
87
80
  * @ignore
88
81
  */
89
82
  internalValueChanged(value?: Date): void;
90
83
  /**
91
- * @ignore
92
- */
93
- _handleOnKeydownEvent(e: KeyboardEvent): void;
94
- /**
95
- * @ignore
96
- */
97
- _handleKeyUpEvent(): void;
98
- /**
99
- * @ignore
84
+ * Normalizes Persian (U+06F0-U+06F9) and Arabic-Indic (U+0660-U+0669) digits to ASCII.
85
+ * @ignore
100
86
  */
87
+ private _normalizeDigit;
88
+ /** @ignore */
89
+ protected _handleOnKeydownEvent(e: KeyboardEvent): void;
90
+ /** @ignore */
91
+ private _handleDigitInput;
92
+ /** @ignore */
93
+ private _applyEditingDate;
94
+ /** @ignore */
95
+ protected _handleKeyUpEvent(): void;
96
+ /** @ignore */
101
97
  protected _handleFocusEvent(e: FocusEvent): void;
102
- /**
103
- * @ignore
104
- */
98
+ /** @ignore */
105
99
  protected _handleBlurEvent(e: FocusEvent): void;
106
- /**
107
- * @ignore
108
- */
100
+ /** @ignore */
101
+ private _clampToRange;
102
+ /** @ignore */
109
103
  protected _handleOnInputClickEvent(e: MouseEvent): void;
110
- /**
111
- * @ignore
112
- */
113
- private _detectPartAtPosition;
114
- /**
115
- * @ignore
116
- */
104
+ /** @ignore */
105
+ private _selectFirstPart;
106
+ /** @ignore */
107
+ private _ensureEditableText;
108
+ /** @ignore */
117
109
  private _highlightActivePart;
118
- /**
119
- * @ignore
120
- */
110
+ /** @ignore */
121
111
  private _detectValueChanges;
122
- private get __hostName();
123
112
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXDateTimeInputComponent, never>;
124
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXDateTimeInputComponent, "ax-datetime-input", never, { "disabled": { "alias": "disabled"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "value": { "alias": "value"; "required": false; }; "state": { "alias": "state"; "required": false; }; "name": { "alias": "name"; "required": false; }; "id": { "alias": "id"; "required": false; }; "allowTyping": { "alias": "allowTyping"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "minValue": { "alias": "minValue"; "required": false; "isSignal": true; }; "maxValue": { "alias": "maxValue"; "required": false; "isSignal": true; }; "picker": { "alias": "picker"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "stateChange": "stateChange"; "onValueChanged": "onValueChanged"; "onBlur": "onBlur"; "onFocus": "onFocus"; "readonlyChange": "readonlyChange"; "disabledChange": "disabledChange"; "onClick": "onClick"; }, never, ["ax-validation-rule"], true, never>;
113
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXDateTimeInputComponent, "ax-datetime-input", never, { "disabled": { "alias": "disabled"; "required": false; }; "readonly": { "alias": "readonly"; "required": false; }; "tabIndex": { "alias": "tabIndex"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "value": { "alias": "value"; "required": false; }; "state": { "alias": "state"; "required": false; }; "name": { "alias": "name"; "required": false; }; "id": { "alias": "id"; "required": false; }; "allowTyping": { "alias": "allowTyping"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "minValue": { "alias": "minValue"; "required": false; "isSignal": true; }; "maxValue": { "alias": "maxValue"; "required": false; "isSignal": true; }; "picker": { "alias": "picker"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "stateChange": "stateChange"; "onValueChanged": "onValueChanged"; "onBlur": "onBlur"; "onFocus": "onFocus"; "readonlyChange": "readonlyChange"; "disabledChange": "disabledChange"; "onKeyDown": "onKeyDown"; "onKeyUp": "onKeyUp"; "onKeyPress": "onKeyPress"; "onClick": "onClick"; }, never, ["ax-validation-rule"], true, never>;
114
+ }
115
+
116
+ interface AXDateTimeInputConfig {
117
+ allowTyping: boolean;
125
118
  }
119
+ declare const AXDateTimeInputDefaultConfig: AXDateTimeInputConfig;
120
+ declare const AX_DATETIME_INPUT_CONFIG: InjectionToken<AXDateTimeInputConfig>;
121
+ declare function resolveDateTimeInputFormat(options: {
122
+ customFormat: string | null | undefined;
123
+ calendarSystem: string;
124
+ picker: AXDateTimePickerType;
125
+ isRtl: boolean;
126
+ localeFormats: AXLocaleProfile['formats'];
127
+ }): string;
126
128
 
127
129
  declare class AXDateTimeInputModule {
128
130
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXDateTimeInputModule, never>;
@@ -130,4 +132,5 @@ declare class AXDateTimeInputModule {
130
132
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<AXDateTimeInputModule>;
131
133
  }
132
134
 
133
- export { AXDateTimeInputComponent, AXDateTimeInputModule };
135
+ export { AXDateTimeInputComponent, AXDateTimeInputDefaultConfig, AXDateTimeInputModule, AX_DATETIME_INPUT_CONFIG, resolveDateTimeInputFormat };
136
+ export type { AXDateTimeInputConfig };
@@ -1,8 +1,10 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Provider, OnDestroy } from '@angular/core';
2
+ import { OnDestroy, TemplateRef, Type, Provider } from '@angular/core';
3
+ import { AXComponentContent, AXComponentInputs } from '@acorex/core/components';
4
+ import { Subject } from 'rxjs';
5
+ import { AXStyleColorType, AXComponentClosedPromise } from '@acorex/cdk/common';
3
6
  import * as _acorex_core_file from '@acorex/core/file';
4
7
  import { AXFileTypeExtensionHint, AXFileType, AXFileTypeViewComponent } from '@acorex/core/file';
5
- import { AXStyleColorType } from '@acorex/cdk/common';
6
8
  import { SafeResourceUrl } from '@angular/platform-browser';
7
9
 
8
10
  /** Single item displayed in a file-viewer carousel. */
@@ -36,34 +38,35 @@ declare class AXFileViewerService {
36
38
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFileViewerService>;
37
39
  }
38
40
 
39
- /** Registers file-viewer components on standard file-type catalog entries. */
40
- declare function provideFileViewer(): Provider[];
41
-
42
41
  /** Infers a file-type catalog name from the item. */
43
42
  declare function resolveFileViewerFileType(item: AXFileViewerItem): string;
44
43
  /** Builds an extension hint from item metadata. */
45
44
  declare function buildFileViewerExtensionHint(item: AXFileViewerItem): AXFileTypeExtensionHint | undefined;
46
45
 
47
- declare function createFileViewerFileTypes(): AXFileType[];
48
-
49
46
  declare class AXFileViewerContainerComponent implements OnDestroy {
50
47
  #private;
51
48
  readonly items: _angular_core.InputSignal<AXFileViewerItem[]>;
49
+ readonly startIndex: _angular_core.InputSignal<number>;
52
50
  readonly thumbnail: _angular_core.InputSignal<boolean>;
53
51
  readonly pagination: _angular_core.InputSignal<boolean>;
54
52
  readonly download: _angular_core.InputSignal<boolean>;
55
53
  readonly fullscreen: _angular_core.InputSignal<boolean>;
54
+ /** When true, opens in a gallery overlay and closes when fullscreen exits. */
55
+ readonly galleryMode: _angular_core.InputSignal<boolean>;
56
+ readonly headerContent: _angular_core.InputSignal<AXComponentContent>;
57
+ readonly headerContentInputs: _angular_core.InputSignal<AXComponentInputs>;
58
+ readonly fallbackContent: _angular_core.InputSignal<AXComponentContent>;
59
+ readonly fallbackContentInputs: _angular_core.InputSignal<AXComponentInputs>;
56
60
  /** External loading flag — show overlay while parent data is being fetched. */
57
61
  readonly loading: _angular_core.InputSignal<boolean>;
62
+ readonly fullscreenClosed: _angular_core.OutputEmitterRef<void>;
58
63
  readonly service: AXFileViewerService;
59
64
  private readonly host;
60
- private readonly zIndexService;
61
65
  private readonly fullScreenService;
62
66
  private readonly mainCarouselRef;
63
67
  private readonly thumbCarouselRef;
64
- readonly fullscreenActive: _angular_core.WritableSignal<boolean>;
65
- private zToken;
66
68
  private initToken;
69
+ readonly isFullscreenActive: _angular_core.WritableSignal<boolean>;
67
70
  /** True while carousels are being (re)initialized. */
68
71
  readonly initializing: _angular_core.WritableSignal<boolean>;
69
72
  readonly isBusy: _angular_core.Signal<boolean>;
@@ -74,34 +77,123 @@ declare class AXFileViewerContainerComponent implements OnDestroy {
74
77
  readonly currentTypeLabel: _angular_core.Signal<string>;
75
78
  readonly currentTypeColor: _angular_core.Signal<AXStyleColorType>;
76
79
  readonly slideCounter: _angular_core.Signal<string>;
80
+ readonly headerTemplateContent: _angular_core.Signal<TemplateRef<any>>;
81
+ readonly headerComponentContent: _angular_core.Signal<Type<unknown>>;
82
+ readonly hasHeaderCenterContent: _angular_core.Signal<boolean>;
83
+ readonly headerContentContext: _angular_core.Signal<{
84
+ item: AXFileViewerItem;
85
+ items: AXFileViewerItem[];
86
+ selectedIndex: number;
87
+ slideCounter: string;
88
+ }>;
77
89
  readonly resolveFileType: typeof resolveFileViewerFileType;
78
90
  resolveTypeLabel(item: AXFileViewerItem): string;
79
91
  formatSize(size?: number): string;
80
92
  private readonly mainCarouselOptions;
81
93
  private readonly thumbnailCarouselOptions;
82
- private acquireFullscreenZIndex;
83
- private releaseFullscreenZIndex;
94
+ toggleFullscreen(): void;
95
+ enterFullscreen(): void;
96
+ /** @param emitGalleryClose When false, skips gallery close notification (used during service teardown). */
97
+ exitFullscreen(emitGalleryClose?: boolean): void;
98
+ closeGallery(): void;
84
99
  private initCarousels;
85
100
  private readonly onSlideChange;
86
101
  next(): void;
87
102
  prev(): void;
88
103
  goToIndex(index: number, speed?: number): void;
89
- toggleFullscreen(): void;
90
104
  downloadCurrent(): Promise<void>;
91
105
  ngOnDestroy(): void;
92
106
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileViewerContainerComponent, never>;
93
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileViewerContainerComponent, "ax-file-viewer-container", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "thumbnail": { "alias": "thumbnail"; "required": false; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": false; "isSignal": true; }; "download": { "alias": "download"; "required": false; "isSignal": true; }; "fullscreen": { "alias": "fullscreen"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, {}, never, ["ax-header"], true, never>;
107
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileViewerContainerComponent, "ax-file-viewer-container", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "startIndex": { "alias": "startIndex"; "required": false; "isSignal": true; }; "thumbnail": { "alias": "thumbnail"; "required": false; "isSignal": true; }; "pagination": { "alias": "pagination"; "required": false; "isSignal": true; }; "download": { "alias": "download"; "required": false; "isSignal": true; }; "fullscreen": { "alias": "fullscreen"; "required": false; "isSignal": true; }; "galleryMode": { "alias": "galleryMode"; "required": false; "isSignal": true; }; "headerContent": { "alias": "headerContent"; "required": false; "isSignal": true; }; "headerContentInputs": { "alias": "headerContentInputs"; "required": false; "isSignal": true; }; "fallbackContent": { "alias": "fallbackContent"; "required": false; "isSignal": true; }; "fallbackContentInputs": { "alias": "fallbackContentInputs"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "fullscreenClosed": "fullscreenClosed"; }, never, never, true, never>;
108
+ }
109
+
110
+ interface AXFileViewerGalleryConfig {
111
+ items: AXFileViewerItem[];
112
+ startIndex?: number;
113
+ thumbnail?: boolean;
114
+ download?: boolean;
115
+ loading?: boolean;
116
+ panelClass?: string[];
117
+ headerContent?: AXComponentContent | null;
118
+ headerContentInputs?: AXComponentInputs | null;
119
+ fallbackContent?: AXComponentContent | null;
120
+ fallbackContentInputs?: AXComponentInputs | null;
121
+ }
122
+ interface AXFileViewerGalleryRef<TResult = any> {
123
+ close: (data?: TResult) => void;
124
+ setInputs: (values: AXComponentInputs) => void;
125
+ bringToFront: () => void;
126
+ onClose: Subject<TResult>;
127
+ componentInstance?: AXFileViewerContainerComponent;
128
+ }
129
+
130
+ /** Opens {@link AXFileViewerContainerComponent} in fullscreen gallery mode. */
131
+ declare class AXFileViewerGalleryService {
132
+ private readonly galleryList;
133
+ private readonly overlayService;
134
+ /**
135
+ * Opens a file viewer gallery in fullscreen.
136
+ * @param config - Gallery configuration
137
+ * @returns Promise that resolves when the gallery is closed
138
+ */
139
+ open(config: AXFileViewerGalleryConfig): AXComponentClosedPromise;
140
+ /**
141
+ * Closes a gallery by its ID.
142
+ * @param id - The gallery ID to close
143
+ * @param data - Optional data to pass to the close event
144
+ */
145
+ close<TResult = unknown>(id: number, data?: TResult): void;
146
+ /**
147
+ * Sets input values for a gallery by its ID.
148
+ * @param id - The gallery ID
149
+ * @param values - Object containing input values to set
150
+ */
151
+ setInputs(id: number, values: AXComponentInputs): void;
152
+ /**
153
+ * Brings a gallery to the front of all other overlays.
154
+ * @param id - The gallery ID to bring to front
155
+ */
156
+ bringToFront(id: number): void;
157
+ private openInternal;
158
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileViewerGalleryService, never>;
159
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFileViewerGalleryService>;
160
+ }
161
+
162
+ /** Registers file-viewer components on standard file-type catalog entries. */
163
+ declare function provideFileViewer(): Provider[];
164
+
165
+ declare function createFileViewerFileTypes(): AXFileType[];
166
+
167
+ /** Optional center header slot component for use with {@link headerContent}. */
168
+ declare class AXFileViewerHeaderPlaceholderComponent {
169
+ readonly slideCounter: _angular_core.InputSignal<string>;
170
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileViewerHeaderPlaceholderComponent, never>;
171
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileViewerHeaderPlaceholderComponent, "ax-file-viewer-header-placeholder", never, { "slideCounter": { "alias": "slideCounter"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
94
172
  }
95
173
 
96
174
  declare class AXFileViewerSlideComponent {
97
175
  readonly item: _angular_core.InputSignal<AXFileViewerItem>;
98
176
  readonly index: _angular_core.InputSignal<number>;
177
+ readonly fallbackContent: _angular_core.InputSignal<AXComponentContent>;
178
+ readonly fallbackContentInputs: _angular_core.InputSignal<AXComponentInputs>;
99
179
  private readonly service;
100
180
  readonly fileTypeName: _angular_core.Signal<string>;
101
181
  readonly extensionHint: _angular_core.Signal<_acorex_core_file.AXFileTypeExtensionHint>;
102
182
  readonly viewPayload: _angular_core.Signal<AXFileViewerViewPayload>;
183
+ readonly fallbackTemplateContent: _angular_core.Signal<TemplateRef<any>>;
184
+ readonly fallbackComponentContent: _angular_core.Signal<Type<unknown>>;
185
+ readonly useCustomFallback: _angular_core.Signal<boolean>;
186
+ readonly fallbackContentContext: _angular_core.Signal<{
187
+ payload: AXFileViewerViewPayload;
188
+ item: AXFileViewerItem;
189
+ index: number;
190
+ active: boolean;
191
+ }>;
192
+ readonly fallbackComponentInputs: _angular_core.Signal<{
193
+ payload: AXFileViewerViewPayload;
194
+ }>;
103
195
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFileViewerSlideComponent, never>;
104
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileViewerSlideComponent, "ax-file-viewer-slide", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
196
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileViewerSlideComponent, "ax-file-viewer-slide", never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "index": { "alias": "index"; "required": true; "isSignal": true; }; "fallbackContent": { "alias": "fallbackContent"; "required": false; "isSignal": true; }; "fallbackContentInputs": { "alias": "fallbackContentInputs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
105
197
  }
106
198
 
107
199
  declare class AXFileViewerThumbPreviewComponent {
@@ -176,5 +268,5 @@ declare class AXFileViewerFileFallbackComponent implements AXFileTypeViewCompone
176
268
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXFileViewerFileFallbackComponent, "ax-file-viewer-fallback", never, { "payload": { "alias": "payload"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
177
269
  }
178
270
 
179
- export { AXFileViewerAudioComponent, AXFileViewerContainerComponent, AXFileViewerFileFallbackComponent, AXFileViewerImageComponent, AXFileViewerPdfComponent, AXFileViewerService, AXFileViewerSlideComponent, AXFileViewerThumbPreviewComponent, AXFileViewerThumbnailsComponent, AXFileViewerVideoComponent, buildFileViewerExtensionHint, createFileViewerFileTypes, provideFileViewer, resolveFileViewerFileType };
180
- export type { AXFileViewerItem, AXFileViewerViewPayload };
271
+ export { AXFileViewerAudioComponent, AXFileViewerContainerComponent, AXFileViewerFileFallbackComponent, AXFileViewerGalleryService, AXFileViewerHeaderPlaceholderComponent, AXFileViewerImageComponent, AXFileViewerPdfComponent, AXFileViewerService, AXFileViewerSlideComponent, AXFileViewerThumbPreviewComponent, AXFileViewerThumbnailsComponent, AXFileViewerVideoComponent, buildFileViewerExtensionHint, createFileViewerFileTypes, provideFileViewer, resolveFileViewerFileType };
272
+ export type { AXFileViewerGalleryConfig, AXFileViewerGalleryRef, AXFileViewerItem, AXFileViewerViewPayload };
@@ -5,6 +5,8 @@ import { NXEvent, NXComponent } from '@acorex/cdk/common';
5
5
  import { Subscription } from 'rxjs';
6
6
  import * as gridstack from 'gridstack';
7
7
 
8
+ /** Grid size preset as `[width, height]` in column/row units. */
9
+ type AXGridLayoutSize = readonly [width: number, height: number];
8
10
  interface AXGridLayoutPosition {
9
11
  /** widget position x (default?: 0) */
10
12
  x?: number;
@@ -22,6 +24,11 @@ interface AXGridLayoutPosition {
22
24
  minWidth?: number;
23
25
  /** minimum height of widget in rows (default?: undefined = un-constrained) */
24
26
  minHeight?: number;
27
+ /**
28
+ * When set, resize snaps to one of these `[width, height]` presets.
29
+ * Min/max bounds are derived from this list during grid conversion.
30
+ */
31
+ allowedSizes?: readonly AXGridLayoutSize[];
25
32
  }
26
33
  interface AXGridLayoutWidget extends AXGridLayoutPosition {
27
34
  id?: string;
@@ -318,5 +325,25 @@ declare class AXGridLayoutBuilderModule {
318
325
  static ɵinj: _angular_core.ɵɵInjectorDeclaration<AXGridLayoutBuilderModule>;
319
326
  }
320
327
 
321
- export { AXGridLayoutBuilderModule, AXGridLayoutContainerComponent, AXGridLayoutWidgetComponent };
322
- export type { AXGridLayout, AXGridLayoutContainerElement, AXGridLayoutEvent, AXGridLayoutNode, AXGridLayoutOptions, AXGridLayoutPosition, AXGridLayoutWidget, AXGridLayoutWidgetElement };
328
+ declare const AX_GRID_LAYOUT_ALLOWED_SIZES_ATTR = "data-ax-allowed-sizes";
329
+ declare function convertAXGridLayoutWidgetToGridStackWidget(widget: AXGridLayoutWidget): gridstack.GridStackWidget;
330
+ declare function convertGridStackWidgetToAXGridLayoutWidget(widget: gridstack.GridStackWidget): AXGridLayoutWidget;
331
+ declare function convertAXGridLayoutNodeToGridStackNode(node: AXGridLayoutNode): gridstack.GridStackNode;
332
+ declare function convertGridStackNodeToAXGridLayoutNode(node: gridstack.GridStackNode): AXGridLayoutNode;
333
+ declare function convertAXGridLayoutOptionsToGridStackOptions(options: AXGridLayoutOptions): gridstack.GridStackOptions;
334
+ declare function convertGridStackOptionsToAXGridLayoutOptions(options: gridstack.GridStackOptions): AXGridLayoutOptions;
335
+ /** remove keys which are undefined */
336
+ declare function removeUndefinedKeys<T extends object>(obj: T): T;
337
+ declare function writeAllowedSizesToElement(element: HTMLElement | undefined, allowedSizes: readonly AXGridLayoutSize[] | undefined): void;
338
+ declare function readAllowedSizesFromElement(element: HTMLElement): readonly AXGridLayoutSize[] | undefined;
339
+ declare const AX_GRID_LAYOUT_RESIZE_INVALID_CLASS = "ax-grid-layout-resize-invalid";
340
+ declare function isExactAllowedSize(width: number, height: number, allowedSizes: readonly AXGridLayoutSize[]): boolean;
341
+ declare function updateResizeValidityMarkers(gridEl: HTMLElement, element: gridstack.GridItemHTMLElement): void;
342
+ declare function clearResizeValidityMarkers(gridEl: HTMLElement): void;
343
+ declare function snapToAllowedSize(width: number, height: number, allowedSizes: readonly AXGridLayoutSize[]): AXGridLayoutSize;
344
+ declare function deriveMinMaxFromAllowedSizes(allowedSizes: readonly AXGridLayoutSize[]): Pick<AXGridLayoutWidget, 'minWidth' | 'maxWidth' | 'minHeight' | 'maxHeight'>;
345
+ declare function normalizeLayoutNodeWithAllowedSizes<T extends AXGridLayoutWidget>(node: T): T;
346
+ declare function snapElementToAllowedSize(grid: gridstack.GridStack, element: gridstack.GridItemHTMLElement): boolean;
347
+
348
+ export { AXGridLayoutBuilderModule, AXGridLayoutContainerComponent, AXGridLayoutWidgetComponent, AX_GRID_LAYOUT_ALLOWED_SIZES_ATTR, AX_GRID_LAYOUT_RESIZE_INVALID_CLASS, clearResizeValidityMarkers, convertAXGridLayoutNodeToGridStackNode, convertAXGridLayoutOptionsToGridStackOptions, convertAXGridLayoutWidgetToGridStackWidget, convertGridStackNodeToAXGridLayoutNode, convertGridStackOptionsToAXGridLayoutOptions, convertGridStackWidgetToAXGridLayoutWidget, deriveMinMaxFromAllowedSizes, isExactAllowedSize, normalizeLayoutNodeWithAllowedSizes, readAllowedSizesFromElement, removeUndefinedKeys, snapElementToAllowedSize, snapToAllowedSize, updateResizeValidityMarkers, writeAllowedSizesToElement };
349
+ export type { AXGridLayout, AXGridLayoutContainerElement, AXGridLayoutEvent, AXGridLayoutNode, AXGridLayoutOptions, AXGridLayoutPosition, AXGridLayoutSize, AXGridLayoutWidget, AXGridLayoutWidgetElement };
@@ -175,8 +175,16 @@ declare class AXMenuItemComponent extends NXComponent implements OnDestroy {
175
175
  private unsuscriber;
176
176
  private renderer;
177
177
  private injector;
178
+ private document;
178
179
  private zIndexService;
179
180
  private zToken;
181
+ private submenuPortalParent;
182
+ private submenuPortalNextSibling;
183
+ /** Survives submenu portaling when the DOM parent chain is broken. */
184
+ private linkedParent;
185
+ private mouseLeaveTimeout;
186
+ private submenuUnlistenEnter;
187
+ private submenuUnlistenLeave;
180
188
  protected arrowIcon: _angular_core.Signal<string>;
181
189
  onClick: _angular_core.OutputEmitterRef<AXMenuItemClickEvent>;
182
190
  name: _angular_core.InputSignal<string>;
@@ -186,8 +194,8 @@ declare class AXMenuItemComponent extends NXComponent implements OnDestroy {
186
194
  constructor();
187
195
  private getText;
188
196
  /**
189
- * Resolves the parent menu item. Items rendered via recursive `ngTemplateOutlet` do not
190
- * receive a DI parent, so we fall back to the DOM tree after reparenting.
197
+ * Resolves the parent menu item. Prefers an explicit link (survives submenu portaling),
198
+ * then DI, then the DOM tree.
191
199
  */
192
200
  getParentMenuItem(): AXMenuItemComponent | null;
193
201
  /**
@@ -204,10 +212,20 @@ declare class AXMenuItemComponent extends NXComponent implements OnDestroy {
204
212
  private schedulePositionCalculation;
205
213
  /**
206
214
  * Calculate the position of the submenu to avoid it going out of the viewport.
215
+ * Tall panels are height-clamped; the panel is portaled so parent overflow cannot clip it.
207
216
  */
208
217
  private calculatePosition;
209
218
  /** Measures submenu size using the same flex layout as the rendered menu. */
210
219
  private measureSubmenuRect;
220
+ /** Moves the submenu under the context-menu backdrop (or body) to escape ancestor overflow. */
221
+ private portalSubmenu;
222
+ private restoreSubmenuPortal;
223
+ /** Keep this item open while the pointer is over its portaled submenu panel. */
224
+ private bindSubmenuPointerListeners;
225
+ private unbindSubmenuPointerListeners;
226
+ /** Links direct children so parent resolution still works after the panel is portaled. */
227
+ private linkChildItems;
228
+ private getInstanceFromElement;
211
229
  /**
212
230
  * Moves nested `ax-menu-item` nodes rendered by recursive `ngTemplateOutlet` templates
213
231
  * into the submenu slot. Angular content queries do not traverse those embedded views.
@@ -225,10 +243,14 @@ declare class AXMenuItemComponent extends NXComponent implements OnDestroy {
225
243
  private clampVerticalPosition;
226
244
  handleClick(e: MouseEvent): void;
227
245
  handleMouseEnter(event: MouseEvent): void;
228
- private mouseLeaveTimeout;
229
246
  handleMouseLeave(event: MouseEvent): void;
230
- /** True when the pointer moved into this item's submenu panel or a nested open submenu. */
247
+ private handlePointerLeave;
248
+ private scheduleClose;
249
+ private clearCloseTimeout;
250
+ private clearAncestorCloseTimeouts;
251
+ /** True when the pointer is still inside this item's submenu tree (including portaled panels). */
231
252
  private containsSubmenuPointer;
253
+ private isSelfOrAncestorOf;
232
254
  ngOnDestroy(): void;
233
255
  /** @ignore */
234
256
  get __hostClass(): string[];
@@ -27,6 +27,7 @@ declare class AXNumberBoxComponent extends AXNumberBoxComponent_base {
27
27
  changeOnScroll: _angular_core.InputSignal<boolean>;
28
28
  step: _angular_core.InputSignal<number>;
29
29
  protected mode: _angular_core.WritableSignal<"digits" | "thousandsSeparator" | "decimal">;
30
+ protected decimalPlaces: _angular_core.Signal<number>;
30
31
  private input;
31
32
  protected stringValue: _angular_core.WritableSignal<string>;
32
33
  private translationService;
@@ -37,11 +38,12 @@ declare class AXNumberBoxComponent extends AXNumberBoxComponent_base {
37
38
  result: boolean;
38
39
  message?: undefined;
39
40
  }>;
40
- protected internalValueChanged(value: number | undefined): void;
41
+ protected internalValueChanged(value: number | undefined | null): void;
41
42
  private plusValue;
42
43
  private minusValue;
43
44
  private getNumericValue;
44
45
  private getSteppedValue;
46
+ private formatDisplayValue;
45
47
  private clampToRange;
46
48
  private getFractionDigits;
47
49
  protected handleOnKeydownEvent(e: KeyboardEvent): void;