@acorex/components 22.1.0-next.9 → 22.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/fesm2022/acorex-components-alert.mjs +2 -2
  2. package/fesm2022/acorex-components-alert.mjs.map +1 -1
  3. package/fesm2022/acorex-components-audio-wave.mjs +15 -0
  4. package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
  5. package/fesm2022/acorex-components-calendar.mjs +321 -118
  6. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  7. package/fesm2022/acorex-components-combo-box.mjs +259 -37
  8. package/fesm2022/acorex-components-combo-box.mjs.map +1 -1
  9. package/fesm2022/acorex-components-conversation-acorex-components-conversation-BtkyQUlh.mjs +16548 -0
  10. package/fesm2022/acorex-components-conversation-acorex-components-conversation-BtkyQUlh.mjs.map +1 -0
  11. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-D4ca9Mvt.mjs +51 -0
  12. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-D4ca9Mvt.mjs.map +1 -0
  13. package/fesm2022/acorex-components-conversation-image-picker-editor-dialog.component-QVs1XWYf.mjs +85 -0
  14. package/fesm2022/acorex-components-conversation-image-picker-editor-dialog.component-QVs1XWYf.mjs.map +1 -0
  15. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs → acorex-components-conversation-open-composer-picker-for-files-BKKO_8x6.mjs} +7 -20
  16. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-BKKO_8x6.mjs.map +1 -0
  17. package/fesm2022/acorex-components-conversation-picker-rename-file-dialog.component-BNKFb5yO.mjs +65 -0
  18. package/fesm2022/acorex-components-conversation-picker-rename-file-dialog.component-BNKFb5yO.mjs.map +1 -0
  19. package/fesm2022/acorex-components-conversation.mjs +1 -17608
  20. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  21. package/fesm2022/acorex-components-data-table.mjs +57 -23
  22. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  23. package/fesm2022/acorex-components-decorators.mjs +2 -2
  24. package/fesm2022/acorex-components-decorators.mjs.map +1 -1
  25. package/fesm2022/acorex-components-dropdown.mjs +2 -2
  26. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  27. package/fesm2022/acorex-components-fab.mjs +5 -5
  28. package/fesm2022/acorex-components-fab.mjs.map +1 -1
  29. package/fesm2022/acorex-components-image-editor.mjs +600 -409
  30. package/fesm2022/acorex-components-image-editor.mjs.map +1 -1
  31. package/fesm2022/acorex-components-lookup.mjs +1259 -169
  32. package/fesm2022/acorex-components-lookup.mjs.map +1 -1
  33. package/fesm2022/acorex-components-menu.mjs +11 -5
  34. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  35. package/fesm2022/acorex-components-notification.mjs +6 -6
  36. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  37. package/fesm2022/acorex-components-popover.mjs +33 -0
  38. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  39. package/fesm2022/acorex-components-rail-navigation.mjs +2 -2
  40. package/fesm2022/acorex-components-rail-navigation.mjs.map +1 -1
  41. package/fesm2022/acorex-components-range-slider.mjs +2 -2
  42. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  43. package/fesm2022/acorex-components-select-box.mjs +38 -11
  44. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  45. package/fesm2022/acorex-components-tabs.mjs +2 -2
  46. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  47. package/fesm2022/acorex-components-tree-view.mjs +45 -3
  48. package/fesm2022/acorex-components-tree-view.mjs.map +1 -1
  49. package/lookup/README.md +19 -8
  50. package/package.json +4 -3
  51. package/types/acorex-components-audio-wave.d.ts +3 -0
  52. package/types/acorex-components-calendar.d.ts +41 -9
  53. package/types/acorex-components-combo-box.d.ts +50 -10
  54. package/types/acorex-components-conversation.d.ts +1232 -1782
  55. package/types/acorex-components-data-table.d.ts +12 -2
  56. package/types/acorex-components-image-editor.d.ts +54 -49
  57. package/types/acorex-components-lookup.d.ts +286 -71
  58. package/types/acorex-components-popover.d.ts +8 -0
  59. package/types/acorex-components-select-box.d.ts +11 -0
  60. package/types/acorex-components-tree-view.d.ts +11 -1
  61. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs +0 -50
  62. package/fesm2022/acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs.map +0 -1
  63. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs.map +0 -1
@@ -186,6 +186,14 @@ declare class AXPopoverComponent extends MXBaseComponent implements OnDestroy {
186
186
  private setupScrollListener;
187
187
  /** @ignore */
188
188
  private removeScrollListener;
189
+ /**
190
+ * True when document-level scroll is a side-effect of focusing an editable control
191
+ * inside the overlay (soft keyboard / visual viewport adjustment), mainly on iOS Safari.
192
+ * @ignore
193
+ */
194
+ private isKeyboardInducedDocumentScroll;
195
+ /** @ignore */
196
+ private isDocumentScrollTarget;
189
197
  /**
190
198
  * Checks whether the given element lives inside a child overlay
191
199
  * (an overlay stacked on top of this popover, e.g. a selectbox dropdown).
@@ -58,6 +58,13 @@ declare class AXSelectBoxComponent extends AXSelectBoxComponent_base implements
58
58
  protected _dropdownWidth: _angular_core.WritableSignal<string>;
59
59
  /** @ignore */
60
60
  protected _dropdownHeight: _angular_core.WritableSignal<string>;
61
+ /**
62
+ * Pixel height for the popover list and CDK viewport. Uses the sized height
63
+ * when known, otherwise the standard `maxVisibleItems × itemHeight` viewport.
64
+ * Always a pixel value so virtual scroll has a definite size on first open.
65
+ * @ignore
66
+ */
67
+ protected _panelMinHeight: _angular_core.Signal<string>;
61
68
  /** @ignore */
62
69
  protected _listDataSource: AXDataSource<any>;
63
70
  /** @ignore */
@@ -161,6 +168,10 @@ declare class AXSelectBoxComponent extends AXSelectBoxComponent_base implements
161
168
  /** @ignore */
162
169
  protected _handleItemSelected(e: AXItemSelectedEvent): void;
163
170
  private resetSearchAfterSelection;
171
+ private _getListItemPx;
172
+ private _getMaxVisibleItems;
173
+ /** Standard popover list height: `maxVisibleItems` rows (default 5). */
174
+ private _getStandardListHeightPx;
164
175
  /** @ignore */
165
176
  private setDropdownSize;
166
177
  /**
@@ -236,12 +236,19 @@ declare class AXTreeViewComponent {
236
236
  readonly indentSize: _angular_core.InputSignal<number>;
237
237
  /** Visual style variant. Default: `'default'` */
238
238
  readonly look: _angular_core.InputSignal<AXTreeViewViewLook>;
239
+ /**
240
+ * When `true`, visible nodes use alternating background colors (flattened visual order,
241
+ * including expanded children). Default: `false`.
242
+ */
243
+ readonly alternate: _angular_core.InputSignal<boolean>;
239
244
  /** Custom template for tree items. Default: `undefined` */
240
245
  readonly nodeTemplate: _angular_core.InputSignal<TemplateRef<AXTreeViewItemTemplateContext>>;
241
246
  /** Field name for node ID. Default: `'id'` */
242
247
  readonly idField: _angular_core.InputSignal<string>;
243
248
  /** Field name for node title. Default: `'title'` */
244
249
  readonly titleField: _angular_core.InputSignal<string>;
250
+ /** When set, matching characters in the default node label are highlighted. */
251
+ readonly highlightText: _angular_core.InputSignal<string>;
245
252
  /** Field name for node tooltip. Default: `'tooltip'` */
246
253
  readonly tooltipField: _angular_core.InputSignal<string>;
247
254
  /** Field name for node icon. Default: `'icon'` */
@@ -312,6 +319,9 @@ declare class AXTreeViewComponent {
312
319
  /** Computed chevron icons that flip for RTL */
313
320
  protected readonly directionExpandedIcon: _angular_core.Signal<string>;
314
321
  protected readonly directionCollapsedIcon: _angular_core.Signal<string>;
322
+ /** Visible-row index (DFS of expanded, non-hidden nodes) used for alternate striping. */
323
+ protected readonly alternateRowIndexById: _angular_core.Signal<Map<string, number>>;
324
+ protected isAlternateNode(node: AXTreeViewNode): boolean;
315
325
  /** Flag to prevent infinite loops when syncing datasource */
316
326
  private isUpdatingFromDatasource;
317
327
  /** Bumped when controlled selection changes so stale async sync is ignored. */
@@ -838,7 +848,7 @@ declare class AXTreeViewComponent {
838
848
  */
839
849
  private handleError;
840
850
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXTreeViewComponent, never>;
841
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXTreeViewComponent, "ax-tree-view", never, { "datasource": { "alias": "datasource"; "required": true; "isSignal": true; }; "selectMode": { "alias": "selectMode"; "required": false; "isSignal": true; }; "selectionBehavior": { "alias": "selectionBehavior"; "required": false; "isSignal": true; }; "dragArea": { "alias": "dragArea"; "required": false; "isSignal": true; }; "dragBehavior": { "alias": "dragBehavior"; "required": false; "isSignal": true; }; "showIcons": { "alias": "showIcons"; "required": false; "isSignal": true; }; "showChildrenBadge": { "alias": "showChildrenBadge"; "required": false; "isSignal": true; }; "expandedIcon": { "alias": "expandedIcon"; "required": false; "isSignal": true; }; "collapsedIcon": { "alias": "collapsedIcon"; "required": false; "isSignal": true; }; "indentSize": { "alias": "indentSize"; "required": false; "isSignal": true; }; "look": { "alias": "look"; "required": false; "isSignal": true; }; "nodeTemplate": { "alias": "nodeTemplate"; "required": false; "isSignal": true; }; "idField": { "alias": "idField"; "required": false; "isSignal": true; }; "titleField": { "alias": "titleField"; "required": false; "isSignal": true; }; "tooltipField": { "alias": "tooltipField"; "required": false; "isSignal": true; }; "iconField": { "alias": "iconField"; "required": false; "isSignal": true; }; "expandedField": { "alias": "expandedField"; "required": false; "isSignal": true; }; "selectedField": { "alias": "selectedField"; "required": false; "isSignal": true; }; "indeterminateField": { "alias": "indeterminateField"; "required": false; "isSignal": true; }; "disabledField": { "alias": "disabledField"; "required": false; "isSignal": true; }; "hiddenField": { "alias": "hiddenField"; "required": false; "isSignal": true; }; "childrenField": { "alias": "childrenField"; "required": false; "isSignal": true; }; "childrenCountField": { "alias": "childrenCountField"; "required": false; "isSignal": true; }; "dataField": { "alias": "dataField"; "required": false; "isSignal": true; }; "inheritDisabled": { "alias": "inheritDisabled"; "required": false; "isSignal": true; }; "expandOnDoubleClick": { "alias": "expandOnDoubleClick"; "required": false; "isSignal": true; }; "doubleClickDuration": { "alias": "doubleClickDuration"; "required": false; "isSignal": true; }; "tooltipDelay": { "alias": "tooltipDelay"; "required": false; "isSignal": true; }; "controlledSelection": { "alias": "controlledSelection"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; }, { "datasource": "datasourceChange"; "selectedIds": "selectedIdsChange"; "onBeforeDrop": "onBeforeDrop"; "onNodeToggle": "onNodeToggle"; "onNodeSelect": "onNodeSelect"; "onNodeDoubleClick": "onNodeDoubleClick"; "onNodeClick": "onNodeClick"; "onSelectionChange": "onSelectionChange"; "onOrderChange": "onOrderChange"; "onMoveChange": "onMoveChange"; "onItemsChange": "onItemsChange"; }, never, never, true, never>;
851
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXTreeViewComponent, "ax-tree-view", never, { "datasource": { "alias": "datasource"; "required": true; "isSignal": true; }; "selectMode": { "alias": "selectMode"; "required": false; "isSignal": true; }; "selectionBehavior": { "alias": "selectionBehavior"; "required": false; "isSignal": true; }; "dragArea": { "alias": "dragArea"; "required": false; "isSignal": true; }; "dragBehavior": { "alias": "dragBehavior"; "required": false; "isSignal": true; }; "showIcons": { "alias": "showIcons"; "required": false; "isSignal": true; }; "showChildrenBadge": { "alias": "showChildrenBadge"; "required": false; "isSignal": true; }; "expandedIcon": { "alias": "expandedIcon"; "required": false; "isSignal": true; }; "collapsedIcon": { "alias": "collapsedIcon"; "required": false; "isSignal": true; }; "indentSize": { "alias": "indentSize"; "required": false; "isSignal": true; }; "look": { "alias": "look"; "required": false; "isSignal": true; }; "alternate": { "alias": "alternate"; "required": false; "isSignal": true; }; "nodeTemplate": { "alias": "nodeTemplate"; "required": false; "isSignal": true; }; "idField": { "alias": "idField"; "required": false; "isSignal": true; }; "titleField": { "alias": "titleField"; "required": false; "isSignal": true; }; "highlightText": { "alias": "highlightText"; "required": false; "isSignal": true; }; "tooltipField": { "alias": "tooltipField"; "required": false; "isSignal": true; }; "iconField": { "alias": "iconField"; "required": false; "isSignal": true; }; "expandedField": { "alias": "expandedField"; "required": false; "isSignal": true; }; "selectedField": { "alias": "selectedField"; "required": false; "isSignal": true; }; "indeterminateField": { "alias": "indeterminateField"; "required": false; "isSignal": true; }; "disabledField": { "alias": "disabledField"; "required": false; "isSignal": true; }; "hiddenField": { "alias": "hiddenField"; "required": false; "isSignal": true; }; "childrenField": { "alias": "childrenField"; "required": false; "isSignal": true; }; "childrenCountField": { "alias": "childrenCountField"; "required": false; "isSignal": true; }; "dataField": { "alias": "dataField"; "required": false; "isSignal": true; }; "inheritDisabled": { "alias": "inheritDisabled"; "required": false; "isSignal": true; }; "expandOnDoubleClick": { "alias": "expandOnDoubleClick"; "required": false; "isSignal": true; }; "doubleClickDuration": { "alias": "doubleClickDuration"; "required": false; "isSignal": true; }; "tooltipDelay": { "alias": "tooltipDelay"; "required": false; "isSignal": true; }; "controlledSelection": { "alias": "controlledSelection"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; }, { "datasource": "datasourceChange"; "selectedIds": "selectedIdsChange"; "onBeforeDrop": "onBeforeDrop"; "onNodeToggle": "onNodeToggle"; "onNodeSelect": "onNodeSelect"; "onNodeDoubleClick": "onNodeDoubleClick"; "onNodeClick": "onNodeClick"; "onSelectionChange": "onSelectionChange"; "onOrderChange": "onOrderChange"; "onMoveChange": "onMoveChange"; "onItemsChange": "onItemsChange"; }, never, never, true, never>;
842
852
  }
843
853
 
844
854
  declare class AXTreeViewModule {
@@ -1,50 +0,0 @@
1
- import { AXComponentCloseEvent, AXClosableComponent } from '@acorex/cdk/common';
2
- import { AXTranslationService } from '@acorex/core/translation';
3
- import * as i0 from '@angular/core';
4
- import { inject, input, computed, EventEmitter, ViewEncapsulation, Component } from '@angular/core';
5
-
6
- class AXConversationComposerActionChoiceDialogComponent {
7
- constructor() {
8
- this.translation = inject(AXTranslationService);
9
- this.actions = input.required(/* @ts-ignore */
10
- ...(ngDevMode ? [{ debugName: "actions" }] : /* istanbul ignore next */ []));
11
- this.fileCount = input(1, /* @ts-ignore */
12
- ...(ngDevMode ? [{ debugName: "fileCount" }] : /* istanbul ignore next */ []));
13
- this.composerActionRegistry = input.required(/* @ts-ignore */
14
- ...(ngDevMode ? [{ debugName: "composerActionRegistry" }] : /* istanbul ignore next */ []));
15
- this.__popup__ = input(/* @ts-ignore */
16
- ...(ngDevMode ? [undefined, { debugName: "__popup__" }] : /* istanbul ignore next */ []));
17
- this.hintText = computed(() => {
18
- const count = this.fileCount();
19
- if (count === 1) {
20
- return this.translation.translateSync('@acorex:chat.dialog.choose-send-option.hint-single');
21
- }
22
- return this.translation.translateSync('@acorex:chat.dialog.choose-send-option.hint-multiple', {
23
- params: { count },
24
- });
25
- }, /* @ts-ignore */
26
- ...(ngDevMode ? [{ debugName: "hintText" }] : /* istanbul ignore next */ []));
27
- this.onClosed = new EventEmitter();
28
- }
29
- getActionLabel(action) {
30
- return this.composerActionRegistry().getActionLabel(action);
31
- }
32
- getActionTooltip(action) {
33
- return this.composerActionRegistry().getActionTooltip(action);
34
- }
35
- choose(action) {
36
- const event = new AXComponentCloseEvent();
37
- event.component = this;
38
- event.data = action;
39
- this.onClosed.emit(event);
40
- }
41
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerActionChoiceDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: AXConversationComposerActionChoiceDialogComponent, isStandalone: true, selector: "ax-conversation-composer-action-choice-dialog", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: true, transformFunction: null }, fileCount: { classPropertyName: "fileCount", publicName: "fileCount", isSignal: true, isRequired: false, transformFunction: null }, composerActionRegistry: { classPropertyName: "composerActionRegistry", publicName: "composerActionRegistry", isSignal: true, isRequired: true, transformFunction: null }, __popup__: { classPropertyName: "__popup__", publicName: "__popup__", isSignal: true, isRequired: false, transformFunction: null } }, providers: [{ provide: AXClosableComponent, useExisting: AXConversationComposerActionChoiceDialogComponent }], ngImport: i0, template: " <div class=\"composer-action-choice\" role=\"dialog\" aria-modal=\"true\">\n <p class=\"composer-action-choice__hint\">{{ hintText() }}</p>\n <ul class=\"composer-action-choice__list\" role=\"listbox\">\n @for (action of actions(); track action.id) {\n <li role=\"presentation\">\n <button\n type=\"button\"\n class=\"composer-action-choice__option\"\n role=\"option\"\n (click)=\"choose(action)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n >\n <span class=\"composer-action-choice__icon\" aria-hidden=\"true\">\n <i [class]=\"action.icon\"></i>\n </span>\n <span class=\"composer-action-choice__text\">\n <span class=\"composer-action-choice__title\">{{ getActionLabel(action) }}</span>\n @if (getActionTooltip(action); as tip) {\n <span class=\"composer-action-choice__subtitle\">{{ tip }}</span>\n }\n </span>\n <i class=\"fa-light fa-chevron-right composer-action-choice__chevron\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-composer-action-choice-dialog{display:block}ax-conversation-composer-action-choice-dialog .composer-action-choice{display:flex;min-width:calc(var(--spacing, .25rem) * 64);flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer-action-choice-dialog .composer-action-choice__hint{margin:calc(var(--spacing, .25rem) * 0);font-size:.8125rem;--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);color:rgba(var(--ax-sys-color-on-surface),.7)}ax-conversation-composer-action-choice-dialog .composer-action-choice__list{margin:calc(var(--spacing, .25rem) * 0);display:flex;list-style-type:none;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 0)}ax-conversation-composer-action-choice-dialog .composer-action-choice__option{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2.5);text-align:start;transition:border-color .15s ease,background-color .15s ease,box-shadow .15s ease}ax-conversation-composer-action-choice-dialog .composer-action-choice__option:hover,ax-conversation-composer-action-choice-dialog .composer-action-choice__option:focus-visible{border-color:rgba(var(--ax-sys-color-primary-surface));--tw-outline-style: none;outline-style:none;background:rgba(var(--ax-sys-color-primary-500),.06);box-shadow:0 0 0 1px rgba(var(--ax-sys-color-primary-500),.25)}ax-conversation-composer-action-choice-dialog .composer-action-choice__icon{display:flex;height:calc(var(--spacing, .25rem) * 10);width:calc(var(--spacing, .25rem) * 10);flex-shrink:0;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));color:rgba(var(--ax-sys-color-primary-600));background:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-composer-action-choice-dialog .composer-action-choice__text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-composer-action-choice-dialog .composer-action-choice__title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-composer-action-choice-dialog .composer-action-choice__subtitle{overflow:hidden;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface),.6)}ax-conversation-composer-action-choice-dialog .composer-action-choice__chevron{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgba(var(--ax-sys-color-on-surface),.45)}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"], encapsulation: i0.ViewEncapsulation.None }); }
43
- }
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: AXConversationComposerActionChoiceDialogComponent, decorators: [{
45
- type: Component,
46
- args: [{ selector: 'ax-conversation-composer-action-choice-dialog', encapsulation: ViewEncapsulation.None, providers: [{ provide: AXClosableComponent, useExisting: AXConversationComposerActionChoiceDialogComponent }], template: " <div class=\"composer-action-choice\" role=\"dialog\" aria-modal=\"true\">\n <p class=\"composer-action-choice__hint\">{{ hintText() }}</p>\n <ul class=\"composer-action-choice__list\" role=\"listbox\">\n @for (action of actions(); track action.id) {\n <li role=\"presentation\">\n <button\n type=\"button\"\n class=\"composer-action-choice__option\"\n role=\"option\"\n (click)=\"choose(action)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n >\n <span class=\"composer-action-choice__icon\" aria-hidden=\"true\">\n <i [class]=\"action.icon\"></i>\n </span>\n <span class=\"composer-action-choice__text\">\n <span class=\"composer-action-choice__title\">{{ getActionLabel(action) }}</span>\n @if (getActionTooltip(action); as tip) {\n <span class=\"composer-action-choice__subtitle\">{{ tip }}</span>\n }\n </span>\n <i class=\"fa-light fa-chevron-right composer-action-choice__chevron\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n </div>\n", styles: ["@layer properties;@layer components{ax-conversation-composer-action-choice-dialog{display:block}ax-conversation-composer-action-choice-dialog .composer-action-choice{display:flex;min-width:calc(var(--spacing, .25rem) * 64);flex-direction:column;gap:calc(var(--spacing, .25rem) * 3);padding:calc(var(--spacing, .25rem) * 2)}ax-conversation-composer-action-choice-dialog .composer-action-choice__hint{margin:calc(var(--spacing, .25rem) * 0);font-size:.8125rem;--tw-leading: var(--leading-snug, 1.375);line-height:var(--leading-snug, 1.375);color:rgba(var(--ax-sys-color-on-surface),.7)}ax-conversation-composer-action-choice-dialog .composer-action-choice__list{margin:calc(var(--spacing, .25rem) * 0);display:flex;list-style-type:none;flex-direction:column;gap:calc(var(--spacing, .25rem) * 2);padding:calc(var(--spacing, .25rem) * 0)}ax-conversation-composer-action-choice-dialog .composer-action-choice__option{display:flex;width:100%;cursor:pointer;align-items:center;gap:calc(var(--spacing, .25rem) * 3);border-radius:var(--ax-sys-border-radius);border-style:var(--tw-border-style);border-width:1px;border-color:rgba(var(--ax-sys-color-border-light-surface));background-color:rgba(var(--ax-sys-color-surface));padding-inline:calc(var(--spacing, .25rem) * 3);padding-block:calc(var(--spacing, .25rem) * 2.5);text-align:start;transition:border-color .15s ease,background-color .15s ease,box-shadow .15s ease}ax-conversation-composer-action-choice-dialog .composer-action-choice__option:hover,ax-conversation-composer-action-choice-dialog .composer-action-choice__option:focus-visible{border-color:rgba(var(--ax-sys-color-primary-surface));--tw-outline-style: none;outline-style:none;background:rgba(var(--ax-sys-color-primary-500),.06);box-shadow:0 0 0 1px rgba(var(--ax-sys-color-primary-500),.25)}ax-conversation-composer-action-choice-dialog .composer-action-choice__icon{display:flex;height:calc(var(--spacing, .25rem) * 10);width:calc(var(--spacing, .25rem) * 10);flex-shrink:0;align-items:center;justify-content:center;border-radius:var(--ax-sys-border-radius);font-size:var(--text-lg, 1.125rem);line-height:var(--tw-leading, var(--text-lg--line-height, calc(1.75 / 1.125)));color:rgba(var(--ax-sys-color-primary-600));background:rgba(var(--ax-sys-color-primary-500),.1)}ax-conversation-composer-action-choice-dialog .composer-action-choice__text{display:flex;min-width:calc(var(--spacing, .25rem) * 0);flex:1;flex-direction:column;gap:calc(var(--spacing, .25rem) * .5)}ax-conversation-composer-action-choice-dialog .composer-action-choice__title{font-size:var(--text-sm, .875rem);line-height:var(--tw-leading, var(--text-sm--line-height, calc(1.25 / .875)));--tw-font-weight: var(--font-weight-semibold, 600);font-weight:var(--font-weight-semibold, 600);color:rgba(var(--ax-sys-color-on-surface))}ax-conversation-composer-action-choice-dialog .composer-action-choice__subtitle{overflow:hidden;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));text-overflow:ellipsis;white-space:nowrap;color:rgba(var(--ax-sys-color-on-surface),.6)}ax-conversation-composer-action-choice-dialog .composer-action-choice__chevron{flex-shrink:0;font-size:var(--text-xs, .75rem);line-height:var(--tw-leading, var(--text-xs--line-height, calc(1 / .75)));color:rgba(var(--ax-sys-color-on-surface),.45)}}@property --tw-leading{syntax: \"*\"; inherits: false;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-font-weight{syntax: \"*\"; inherits: false;}@layer properties{@supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-leading: initial;--tw-border-style: solid;--tw-font-weight: initial}}}\n/*! tailwindcss v4.1.16 | MIT License | https://tailwindcss.com */\n"] }]
47
- }], propDecorators: { actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: true }] }], fileCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "fileCount", required: false }] }], composerActionRegistry: [{ type: i0.Input, args: [{ isSignal: true, alias: "composerActionRegistry", required: true }] }], __popup__: [{ type: i0.Input, args: [{ isSignal: true, alias: "__popup__", required: false }] }] } });
48
-
49
- export { AXConversationComposerActionChoiceDialogComponent };
50
- //# sourceMappingURL=acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"acorex-components-conversation-composer-action-choice-dialog.component-DCcRJYfF.mjs","sources":["../../../../packages/components/conversation/src/lib/components/message-list/composer-action-choice-dialog.component.ts","../../../../packages/components/conversation/src/lib/components/message-list/composer-action-choice-dialog.component.html"],"sourcesContent":["import { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Component, EventEmitter, ViewEncapsulation, computed, inject, input } from '@angular/core';\nimport type {\n AXConversationComposerAction,\n AXConversationComposerActionRegistry,\n} from '../../registries/composer-action.registry';\n\n@Component({\n selector: 'ax-conversation-composer-action-choice-dialog',\n encapsulation: ViewEncapsulation.None,\n\n templateUrl: './composer-action-choice-dialog.component.html',\n styleUrl: './composer-action-choice-dialog.component.css',\n providers: [{ provide: AXClosableComponent, useExisting: AXConversationComposerActionChoiceDialogComponent }],\n})\nexport class AXConversationComposerActionChoiceDialogComponent {\n private readonly translation = inject(AXTranslationService);\n\n readonly actions = input.required<AXConversationComposerAction[]>();\n readonly fileCount = input(1);\n readonly composerActionRegistry = input.required<AXConversationComposerActionRegistry>();\n readonly __popup__ = input<AXPopupRef | undefined>();\n\n readonly hintText = computed(() => {\n const count = this.fileCount();\n if (count === 1) {\n return this.translation.translateSync('@acorex:chat.dialog.choose-send-option.hint-single');\n }\n return this.translation.translateSync('@acorex:chat.dialog.choose-send-option.hint-multiple', {\n params: { count },\n });\n });\n\n readonly onClosed = new EventEmitter<AXComponentCloseEvent>();\n\n getActionLabel(action: AXConversationComposerAction): string {\n return this.composerActionRegistry().getActionLabel(action);\n }\n\n getActionTooltip(action: AXConversationComposerAction): string | undefined {\n return this.composerActionRegistry().getActionTooltip(action);\n }\n\n choose(action: AXConversationComposerAction): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = action;\n this.onClosed.emit(event);\n }\n}\n"," <div class=\"composer-action-choice\" role=\"dialog\" aria-modal=\"true\">\n <p class=\"composer-action-choice__hint\">{{ hintText() }}</p>\n <ul class=\"composer-action-choice__list\" role=\"listbox\">\n @for (action of actions(); track action.id) {\n <li role=\"presentation\">\n <button\n type=\"button\"\n class=\"composer-action-choice__option\"\n role=\"option\"\n (click)=\"choose(action)\"\n [attr.aria-label]=\"getActionLabel(action)\"\n >\n <span class=\"composer-action-choice__icon\" aria-hidden=\"true\">\n <i [class]=\"action.icon\"></i>\n </span>\n <span class=\"composer-action-choice__text\">\n <span class=\"composer-action-choice__title\">{{ getActionLabel(action) }}</span>\n @if (getActionTooltip(action); as tip) {\n <span class=\"composer-action-choice__subtitle\">{{ tip }}</span>\n }\n </span>\n <i class=\"fa-light fa-chevron-right composer-action-choice__chevron\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n </div>\n"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs","sources":["../../../../packages/components/conversation/src/lib/components/message-list/open-composer-picker-popup.ts","../../../../packages/components/conversation/src/lib/components/message-list/open-composer-picker-for-files.ts"],"sourcesContent":["import type { AXPopupService } from '@acorex/components/popup';\nimport type { AXConversationComposerService } from '../composer/composer.service';\nimport type { AXConversationComposerAction, AXConversationComposerActionRegistry } from '../../registries/composer-action.registry';\nimport type { AXConversation } from '../../models';\nimport { resolveComposerMaxFiles } from '../../plugins/composer/composer-upload.config';\nimport type { AXConversationConfig } from '../../tokens/conversation-config.interface';\n\nexport async function openComposerPickerPopup(\n popupService: AXPopupService,\n composerService: AXConversationComposerService,\n registry: AXConversationComposerActionRegistry,\n action: AXConversationComposerAction,\n conversation: AXConversation,\n files: File[],\n config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>,\n): Promise<void> {\n const component = action.component ?? (action.componentLoader ? await action.componentLoader() : undefined);\n if (!component || files.length === 0) {\n return;\n }\n\n await popupService.open(component, {\n title: registry.getActionLabel(action),\n size: 'md',\n closeButton: true,\n header: false,\n panelClass: ['ax-conversation-composer-picker-popup'],\n inputs: {\n conversation,\n maxFiles: resolveComposerMaxFiles(action, config),\n initialFiles: files,\n service: composerService,\n },\n });\n}\n","import type { AXPopupService } from '@acorex/components/popup';\nimport type { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXFileService } from '@acorex/core/file';\nimport type { AXValidationRuleResult } from '@acorex/core/validation';\nimport type { AXConversationComposerService } from '../composer/composer.service';\nimport type { AXConversation } from '../../models';\nimport type { AXConversationComposerAction, AXConversationComposerActionRegistry } from '../../registries/composer-action.registry';\nimport { notifyPickerValidationErrors } from '../../plugins/composer/components/shared/picker-upload';\nimport type { AXConversationConfig } from '../../tokens/conversation-config.interface';\nimport { openComposerPickerPopup } from './open-composer-picker-popup';\n\nexport interface AXConversationOpenComposerPickerForFilesDeps {\n fileService: AXFileService;\n composerService: AXConversationComposerService;\n composerActionRegistry: AXConversationComposerActionRegistry;\n popupService: AXPopupService;\n toast: AXToastService;\n translation: AXTranslationService;\n conversation: AXConversation | null | undefined;\n config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>;\n}\n\n/** Catalogs registered on picker actions (conversation-image, conversation-file, …). */\nfunction pickerCatalogNames(registry: AXConversationComposerActionRegistry): string[] {\n const names = new Set<string>();\n for (const action of registry.actions()) {\n if ((action.component || action.componentLoader) && action.fileType) {\n names.add(action.fileType);\n }\n }\n return [...names];\n}\n\ninterface AXConversationInboundFilesAnalysis {\n matchingCatalogs: string[];\n actions: AXConversationComposerAction[];\n supportedFiles: File[];\n unsupportedFiles: { file: File; errors: AXValidationRuleResult[] }[];\n}\n\n/** Files that are not accepted by any registered picker catalog. */\nasync function collectUnsupportedInboundFiles(\n deps: Pick<AXConversationOpenComposerPickerForFilesDeps, 'fileService' | 'composerActionRegistry'>,\n files: File[],\n catalogs: string[],\n): Promise<{ file: File; errors: AXValidationRuleResult[] }[]> {\n const unsupported: { file: File; errors: AXValidationRuleResult[] }[] = [];\n\n for (const file of files) {\n let acceptedByAny = false;\n let lastErrors: AXValidationRuleResult[] = [];\n\n for (const catalog of catalogs) {\n const errors = await deps.fileService.validate(file, catalog);\n if (errors.length === 0) {\n acceptedByAny = true;\n break;\n }\n lastErrors = errors;\n }\n\n if (!acceptedByAny) {\n unsupported.push({ file, errors: lastErrors });\n }\n }\n\n return unsupported;\n}\n\nasync function analyzeInboundFiles(\n deps: Pick<\n AXConversationOpenComposerPickerForFilesDeps,\n 'fileService' | 'composerService' | 'composerActionRegistry'\n >,\n files: File[],\n): Promise<AXConversationInboundFilesAnalysis> {\n if (!files.length) {\n return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles: [] };\n }\n\n const catalogs = pickerCatalogNames(deps.composerActionRegistry);\n const unsupportedFiles = await collectUnsupportedInboundFiles(deps, files, catalogs);\n const unsupportedSet = new Set(unsupportedFiles.map((entry) => entry.file));\n const supportedFiles = files.filter((file) => !unsupportedSet.has(file));\n\n if (supportedFiles.length === 0) {\n return { matchingCatalogs: [], actions: [], supportedFiles: [], unsupportedFiles };\n }\n\n const context = deps.composerService.actionContext();\n const matchingCatalogs: string[] = [];\n\n for (const catalog of catalogs) {\n const { rejected } = await deps.fileService.validateMany(supportedFiles, catalog);\n if (rejected.length === 0) {\n matchingCatalogs.push(catalog);\n }\n }\n\n const seen = new Set<string>();\n const actions: AXConversationComposerAction[] = [];\n\n for (const catalog of matchingCatalogs) {\n for (const action of deps.composerActionRegistry.findPickerActionsForFileType(catalog, context)) {\n if (!seen.has(action.id)) {\n seen.add(action.id);\n actions.push(action);\n }\n }\n }\n\n return {\n matchingCatalogs,\n actions: actions.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0)),\n supportedFiles,\n unsupportedFiles,\n };\n}\n\nfunction notifyInboundFilesValidationFailures(\n deps: Pick<AXConversationOpenComposerPickerForFilesDeps, 'toast' | 'translation'>,\n analysis: AXConversationInboundFilesAnalysis,\n): void {\n if (analysis.supportedFiles.length === 0) {\n if (analysis.unsupportedFiles.length === 0) {\n deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));\n }\n return;\n }\n\n if (analysis.actions.length === 0) {\n const key =\n analysis.matchingCatalogs.length === 0\n ? '@acorex:chat.errors.inbound-files-none-supported'\n : '@acorex:chat.errors.inbound-files-no-send-option';\n deps.toast.warning(deps.translation.translateSync(key));\n }\n}\n\n/**\n * File catalogs that accept every supported file in the batch, then matching visible picker actions.\n */\nexport async function resolvePickerActionsForAllFiles(\n deps: Pick<AXConversationOpenComposerPickerForFilesDeps, 'fileService' | 'composerService' | 'composerActionRegistry'>,\n files: File[],\n): Promise<AXConversationComposerAction[]> {\n const analysis = await analyzeInboundFiles(deps, files);\n return analysis.actions;\n}\n\nasync function promptComposerActionChoice(\n deps: AXConversationOpenComposerPickerForFilesDeps,\n actions: AXConversationComposerAction[],\n fileCount: number,\n): Promise<AXConversationComposerAction | undefined> {\n const { AXConversationComposerActionChoiceDialogComponent } = await import('./composer-action-choice-dialog.component');\n const result = await deps.popupService.open(AXConversationComposerActionChoiceDialogComponent, {\n title: deps.translation.translateSync('@acorex:chat.dialog.choose-send-option.title'),\n size: 'sm',\n closeButton: true,\n header: true,\n inputs: {\n actions,\n fileCount,\n composerActionRegistry: deps.composerActionRegistry,\n },\n });\n\n const action = result?.data as AXConversationComposerAction | undefined;\n if (!action?.component && !action?.componentLoader) {\n return undefined;\n }\n return action;\n}\n\n/**\n * Match dropped/pasted files to composer picker action(s) and open the popup.\n * Unsupported files are skipped after a warning toast; supported files continue.\n * @returns true when a picker popup was opened\n */\nexport async function openComposerPickerForFiles(\n deps: AXConversationOpenComposerPickerForFilesDeps,\n files: File[],\n): Promise<boolean> {\n if (!files.length) {\n return false;\n }\n\n const conversation = deps.conversation;\n if (!conversation) {\n return false;\n }\n\n const analysis = await analyzeInboundFiles(deps, files);\n\n if (analysis.unsupportedFiles.length > 0) {\n notifyPickerValidationErrors(deps.toast, deps.translation, analysis.unsupportedFiles);\n }\n\n if (!analysis.supportedFiles.length || !analysis.actions.length) {\n notifyInboundFilesValidationFailures(deps, analysis);\n return false;\n }\n\n let action = analysis.actions[0];\n if (analysis.actions.length > 1) {\n const chosen = await promptComposerActionChoice(deps, analysis.actions, analysis.supportedFiles.length);\n if (!chosen) {\n return false;\n }\n action = chosen;\n }\n\n const catalog = action.fileType;\n if (!catalog) {\n deps.toast.warning(deps.translation.translateSync('@acorex:chat.errors.inbound-files-none-supported'));\n return false;\n }\n\n const { accepted, rejected } = await deps.fileService.validateMany(analysis.supportedFiles, catalog);\n if (rejected.length > 0) {\n notifyPickerValidationErrors(deps.toast, deps.translation, rejected);\n }\n if (accepted.length === 0) {\n return false;\n }\n\n await openComposerPickerPopup(\n deps.popupService,\n deps.composerService,\n deps.composerActionRegistry,\n action,\n conversation,\n accepted,\n deps.config,\n );\n return true;\n}\n\n/** Extract OS-copied files from a paste event (e.g. Ctrl+V after copying a file in Explorer). */\nexport function filesFromClipboardEvent(event: ClipboardEvent): File[] {\n const items = event.clipboardData?.items;\n if (!items?.length) {\n return [];\n }\n\n const files: File[] = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n return files;\n}\n\n/** Whether a paste event target lies in the chat panel (not sidebar). */\nexport function isPasteTargetInChatPanel(host: HTMLElement, target: EventTarget | null): boolean {\n if (!(target instanceof Node) || !host.contains(target)) {\n return false;\n }\n\n const excluded = host.querySelector('.conversation-sidebar-container, .sidebar-container');\n if (excluded?.contains(target)) {\n return false;\n }\n\n const chatMain = host.querySelector('.conversation-main-container, .main-area, .conversation-view');\n if (chatMain) {\n return chatMain.contains(target);\n }\n\n return true;\n}\n\n/** Handle Ctrl+V / paste when the clipboard holds files copied from the OS. */\nexport async function handleConversationFilePaste(\n event: ClipboardEvent,\n host: HTMLElement,\n deps: AXConversationOpenComposerPickerForFilesDeps,\n): Promise<void> {\n if (!isPasteTargetInChatPanel(host, event.target)) {\n return;\n }\n\n const files = filesFromClipboardEvent(event);\n if (!files.length) {\n return;\n }\n\n const handled = await openComposerPickerForFiles(deps, files);\n if (handled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n}\n"],"names":[],"mappings":"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"}