@elasticias/ui 1.0.22 → 1.0.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elasticias/ui",
3
- "version": "1.0.22",
3
+ "version": "1.0.24",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -90,6 +90,11 @@
90
90
  --paper: var(--ink-50);
91
91
  --paper-alt: #fff;
92
92
  --rule: var(--ink-200);
93
+ /* The border a bordered control moves to on hover. One token, because the
94
+ two conventions that grew here — near-black on ghost buttons and pills,
95
+ mid-grey on selects, triggers and row actions — meant a button and a
96
+ select sitting in the same row hovered to different colours. */
97
+ --rule-hover: var(--ink-400);
93
98
  --rule-soft: rgba(15, 17, 21, 0.05);
94
99
  --text: var(--ink-900);
95
100
  --text-mute: var(--ink-500);
@@ -123,6 +128,7 @@
123
128
  --paper: var(--ink-900);
124
129
  --paper-alt: var(--ink-800);
125
130
  --rule: rgba(248, 249, 251, 0.08);
131
+ --rule-hover: rgba(248, 249, 251, 0.28);
126
132
  --rule-soft: rgba(248, 249, 251, 0.04);
127
133
  --text: var(--ink-50);
128
134
  --text-mute: var(--ink-400);
@@ -139,7 +139,7 @@
139
139
  }
140
140
 
141
141
  .btn-ghost:hover {
142
- border-color: var(--text);
142
+ border-color: var(--rule-hover);
143
143
  }
144
144
 
145
145
  /* Brand-tinted action buttons (e.g. ef-pdf-preview footer). */
@@ -172,10 +172,13 @@
172
172
  padding: 10px 12px;
173
173
  }
174
174
 
175
+ /* Dense rows and toolbars. `--hit` rather than a bare 32: the number was
176
+ hardcoded here while `.btn` above reads `--hit-base`, so the two ends of the
177
+ button scale were tuned in different places. */
175
178
  .btn-sm {
176
179
  font-size: 12px;
177
180
  padding: 7px 14px;
178
- min-height: 32px;
181
+ min-height: var(--hit);
179
182
  }
180
183
 
181
184
  /* ──────────── PILL GROUP (status filters) ───────────────────────── */
@@ -514,7 +517,7 @@
514
517
  }
515
518
 
516
519
  .f-pill:hover {
517
- border-color: var(--text);
520
+ border-color: var(--rule-hover);
518
521
  }
519
522
  .f-pill .ico {
520
523
  width: 14px;
@@ -602,7 +605,7 @@
602
605
 
603
606
  .f-more:hover {
604
607
  color: var(--text);
605
- border-color: var(--text);
608
+ border-color: var(--rule-hover);
606
609
  }
607
610
 
608
611
  .f-more.open {
@@ -981,7 +984,7 @@
981
984
  .ef-app-top__logout:hover,
982
985
  .ef-app-top__action:hover {
983
986
  color: var(--text);
984
- border-color: var(--ink-400);
987
+ border-color: var(--rule-hover);
985
988
  }
986
989
 
987
990
  .ef-theme-toggle:focus-visible,
@@ -1480,7 +1483,7 @@
1480
1483
 
1481
1484
  .row-actions__trigger:hover {
1482
1485
  color: var(--text);
1483
- border-color: var(--ink-400);
1486
+ border-color: var(--rule-hover);
1484
1487
  background: var(--paper);
1485
1488
  }
1486
1489
 
@@ -1819,7 +1822,7 @@
1819
1822
  }
1820
1823
 
1821
1824
  .dp__trigger:hover {
1822
- border-color: var(--ink-400);
1825
+ border-color: var(--rule-hover);
1823
1826
  }
1824
1827
 
1825
1828
  .dp__trigger:focus-visible {
@@ -1893,7 +1896,7 @@
1893
1896
  }
1894
1897
 
1895
1898
  .dp__field-trigger:hover:not(:disabled) {
1896
- border-color: var(--ink-400);
1899
+ border-color: var(--rule-hover);
1897
1900
  }
1898
1901
 
1899
1902
  .dp__field-trigger:focus-visible,
@@ -3515,7 +3518,7 @@ input.ef-input[type='number'] {
3515
3518
 
3516
3519
  .es.p-select:not(.p-disabled):hover,
3517
3520
  .es.p-multiselect:not(.p-disabled):hover {
3518
- border-color: var(--ink-400);
3521
+ border-color: var(--rule-hover);
3519
3522
  }
3520
3523
 
3521
3524
  .es.p-select.p-focus,
@@ -4260,7 +4263,7 @@ input.ef-input[type='number'] {
4260
4263
 
4261
4264
  .es-confirm .p-dialog-footer .p-confirmdialog-reject-button:hover {
4262
4265
  background: var(--paper-alt);
4263
- border-color: var(--text);
4266
+ border-color: var(--rule-hover);
4264
4267
  }
4265
4268
 
4266
4269
  .es-confirm .p-confirmdialog-accept-button:focus-visible,
@@ -53,6 +53,14 @@ declare class EfPriceDisplayComponent {
53
53
  }
54
54
 
55
55
  declare class EfQuantitySelectorComponent {
56
+ /**
57
+ * PrimeNG's Button reads `autofocus || buttonProps?.autofocus`, so a bare
58
+ * `false` collapses to `undefined` and its AutoFocus directive writes the
59
+ * attribute anyway. Passing the flag here too makes it resolve to `false`.
60
+ */
61
+ protected readonly noAutofocus: {
62
+ autofocus: boolean;
63
+ };
56
64
  readonly quantity: _angular_core.InputSignal<number>;
57
65
  readonly quantityChange: _angular_core.OutputEmitterRef<number>;
58
66
  increment(): void;
@@ -592,6 +600,14 @@ interface SelectedFilter {
592
600
  label: string;
593
601
  }
594
602
  declare class EfProductCatalogueFilterComponent {
603
+ /**
604
+ * PrimeNG's Button reads `autofocus || buttonProps?.autofocus`, so a bare
605
+ * `false` collapses to `undefined` and its AutoFocus directive writes the
606
+ * attribute anyway. Passing the flag here too makes it resolve to `false`.
607
+ */
608
+ protected readonly noAutofocus: {
609
+ autofocus: boolean;
610
+ };
595
611
  /** Category groups from reference_data (product_categories items with children) */
596
612
  categoryGroups: _angular_core.InputSignal<CategoryGroup[]>;
597
613
  /** Products to calculate counts */
@@ -1221,7 +1237,18 @@ declare class EfButtonComponent {
1221
1237
  */
1222
1238
  variant: 'primeng' | 'comptoir';
1223
1239
  severity: EfButtonSeverity;
1224
- size: 'small' | 'large';
1240
+ /**
1241
+ * Control height.
1242
+ *
1243
+ * - `'small'` — `--hit` (32px). Dense rows, toolbars, row actions. Default,
1244
+ * because that is what every call site in the product already renders.
1245
+ * - `'base'` — `--hit-base` (40px). The height a comptoir input, select and
1246
+ * datepicker render at, so this is the one to use for a button sitting in
1247
+ * a form row: at `'small'` it is 8px shorter than the field beside it and
1248
+ * the row reads as misaligned.
1249
+ * - `'large'` — retained alias for `'base'`; nothing in the product uses it.
1250
+ */
1251
+ size: 'small' | 'base' | 'large';
1225
1252
  disabled: boolean;
1226
1253
  rounded: boolean;
1227
1254
  outlined: boolean;
@@ -1241,6 +1268,28 @@ declare class EfButtonComponent {
1241
1268
  * long-press once the label is hidden by responsive CSS. */
1242
1269
  tooltipKey?: string;
1243
1270
  tooltipPosition: 'top' | 'bottom' | 'left' | 'right';
1271
+ /**
1272
+ * Take focus on load. Bound explicitly rather than left unset: PrimeNG's
1273
+ * AutoFocus directive tests `autofocus === false`, and the control declares
1274
+ * it with no initialiser, so an unbound instance arrives as `undefined`,
1275
+ * misses that check and has a real `autofocus` attribute written onto it.
1276
+ * Every such control on a page then becomes an autofocus candidate, and the
1277
+ * browser scrolls its container to whichever one it picks on load.
1278
+ */
1279
+ set autofocus(v: boolean);
1280
+ get autofocus(): boolean;
1281
+ private _autofocus;
1282
+ /**
1283
+ * PrimeNG's Button resolves its focus flag as
1284
+ * `autofocus || buttonProps?.autofocus`. Passing `false` alone is therefore
1285
+ * not enough: `false || undefined` is `undefined`, which misses the
1286
+ * AutoFocus directive's `=== false` test and writes the attribute anyway.
1287
+ * Supplying the flag through `buttonProps` as well makes the expression
1288
+ * resolve to a real `false`.
1289
+ */
1290
+ protected pnButtonProps: {
1291
+ autofocus: boolean;
1292
+ };
1244
1293
  /** Resolved tooltip translation key — `tooltipKey` if provided,
1245
1294
  * otherwise `labelKey`. Lets responsive icon-only buttons reuse
1246
1295
  * their label as the tooltip without restating it at every call
@@ -1251,6 +1300,12 @@ declare class EfButtonComponent {
1251
1300
  * set. */
1252
1301
  get effectiveTooltip(): string | undefined;
1253
1302
  clickEvent: EventEmitter<Event>;
1303
+ /**
1304
+ * Size as PrimeNG's Button understands it. Its own scale is only
1305
+ * `'small' | 'large'`, with the default (unset) being the normal height, so
1306
+ * `'base'` maps to `null` rather than being forwarded verbatim.
1307
+ */
1308
+ get pnSize(): 'small' | 'large' | null;
1254
1309
  /** Composed class string for the Comptoir variant —
1255
1310
  * `btn btn-{severity} btn-sm` plus any caller-supplied `styleClass`. */
1256
1311
  get comptoirClass(): string;
@@ -1258,13 +1313,14 @@ declare class EfButtonComponent {
1258
1313
  get comptoirInlineColor(): string | null;
1259
1314
  handleClick(event: Event): void;
1260
1315
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfButtonComponent, never>;
1261
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfButtonComponent, "ef-button", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "severity": { "alias": "severity"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; "outlined": { "alias": "outlined"; "required": false; }; "raised": { "alias": "raised"; "required": false; }; "text": { "alias": "text"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "type": { "alias": "type"; "required": false; }; "badge": { "alias": "badge"; "required": false; }; "badgeSeverity": { "alias": "badgeSeverity"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "tooltipKey": { "alias": "tooltipKey"; "required": false; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; }; }, { "clickEvent": "clickEvent"; }, never, never, true, never>;
1316
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfButtonComponent, "ef-button", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "icon": { "alias": "icon"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "severity": { "alias": "severity"; "required": false; }; "size": { "alias": "size"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "rounded": { "alias": "rounded"; "required": false; }; "outlined": { "alias": "outlined"; "required": false; }; "raised": { "alias": "raised"; "required": false; }; "text": { "alias": "text"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "type": { "alias": "type"; "required": false; }; "badge": { "alias": "badge"; "required": false; }; "badgeSeverity": { "alias": "badgeSeverity"; "required": false; }; "tooltip": { "alias": "tooltip"; "required": false; }; "tooltipKey": { "alias": "tooltipKey"; "required": false; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; }, { "clickEvent": "clickEvent"; }, never, never, true, never>;
1262
1317
  static ngAcceptInputType_disabled: unknown;
1263
1318
  static ngAcceptInputType_rounded: unknown;
1264
1319
  static ngAcceptInputType_outlined: unknown;
1265
1320
  static ngAcceptInputType_raised: unknown;
1266
1321
  static ngAcceptInputType_text: unknown;
1267
1322
  static ngAcceptInputType_loading: unknown;
1323
+ static ngAcceptInputType_autofocus: unknown;
1268
1324
  }
1269
1325
 
1270
1326
  declare class EfButtonGroupComponent {
@@ -3271,6 +3327,19 @@ declare class EfSelectComponent extends AbstractEfFormControl implements Control
3271
3327
  filterPlaceholderKey?: string;
3272
3328
  /** Auto-focus the filter input when the panel opens (default: true). */
3273
3329
  autofocusFilter: boolean;
3330
+ /**
3331
+ * Take focus on load. Off by default, and bound explicitly rather than left
3332
+ * unset, which matters more than it looks: PrimeNG's AutoFocus directive
3333
+ * decides with `if (this.autofocus === false)`, and `Select` declares
3334
+ * `autofocus` with no initialiser. An unbound control therefore arrives as
3335
+ * `undefined`, misses that strict check, and gets a real `autofocus="true"`
3336
+ * attribute written onto its label. Every select on a page became an
3337
+ * autofocus candidate, so on load the browser focused one of them and
3338
+ * scrolled its container to it — which is why a dashboard opened partway
3339
+ * down the page. Binding `false` puts the directive back on its intended
3340
+ * branch and removes the attribute.
3341
+ */
3342
+ autofocus: boolean;
3274
3343
  editable: boolean;
3275
3344
  loading: boolean;
3276
3345
  /** Virtual-scroll for long lists (>100 items). Pair with
@@ -3373,13 +3442,14 @@ declare class EfSelectComponent extends AbstractEfFormControl implements Control
3373
3442
  handleNativeSelectChange(rawValue: string): void;
3374
3443
  private applyFilters;
3375
3444
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfSelectComponent, never>;
3376
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfSelectComponent, "ef-select", never, { "options": { "alias": "options"; "required": false; }; "optionLabel": { "alias": "optionLabel"; "required": false; }; "optionValue": { "alias": "optionValue"; "required": false; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; }; "dataKey": { "alias": "dataKey"; "required": false; }; "group": { "alias": "group"; "required": false; }; "optionGroupLabel": { "alias": "optionGroupLabel"; "required": false; }; "optionGroupChildren": { "alias": "optionGroupChildren"; "required": false; }; "size": { "alias": "size"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "filterBy": { "alias": "filterBy"; "required": false; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; }; "filterPlaceholderKey": { "alias": "filterPlaceholderKey"; "required": false; }; "autofocusFilter": { "alias": "autofocusFilter"; "required": false; }; "editable": { "alias": "editable"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; }; "multiDisplay": { "alias": "multiDisplay"; "required": false; }; "showToggleAll": { "alias": "showToggleAll"; "required": false; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; }; "emptyMessageKey": { "alias": "emptyMessageKey"; "required": false; }; "emptyFilterMessage": { "alias": "emptyFilterMessage"; "required": false; }; "emptyFilterMessageKey": { "alias": "emptyFilterMessageKey"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "panelStyleClass": { "alias": "panelStyleClass"; "required": false; }; "filterByKeys": { "alias": "filterByKeys"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "selectionChangeEvent": "selectionChangeEvent"; "filterChangeEvent": "filterChangeEvent"; "panelShowEvent": "panelShowEvent"; "panelHideEvent": "panelHideEvent"; }, ["itemTemplate", "selectedItemTemplate", "groupTemplate", "headerTemplate", "footerTemplate", "emptyTemplate", "emptyFilterTemplate", "filterTemplate", "loaderTemplate"], never, true, never>;
3445
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfSelectComponent, "ef-select", never, { "options": { "alias": "options"; "required": false; }; "optionLabel": { "alias": "optionLabel"; "required": false; }; "optionValue": { "alias": "optionValue"; "required": false; }; "optionDisabled": { "alias": "optionDisabled"; "required": false; }; "dataKey": { "alias": "dataKey"; "required": false; }; "group": { "alias": "group"; "required": false; }; "optionGroupLabel": { "alias": "optionGroupLabel"; "required": false; }; "optionGroupChildren": { "alias": "optionGroupChildren"; "required": false; }; "size": { "alias": "size"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "multiple": { "alias": "multiple"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "filterBy": { "alias": "filterBy"; "required": false; }; "filterPlaceholder": { "alias": "filterPlaceholder"; "required": false; }; "filterPlaceholderKey": { "alias": "filterPlaceholderKey"; "required": false; }; "autofocusFilter": { "alias": "autofocusFilter"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; "editable": { "alias": "editable"; "required": false; }; "loading": { "alias": "loading"; "required": false; }; "virtualScroll": { "alias": "virtualScroll"; "required": false; }; "virtualScrollItemSize": { "alias": "virtualScrollItemSize"; "required": false; }; "scrollHeight": { "alias": "scrollHeight"; "required": false; }; "multiDisplay": { "alias": "multiDisplay"; "required": false; }; "showToggleAll": { "alias": "showToggleAll"; "required": false; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; }; "emptyMessageKey": { "alias": "emptyMessageKey"; "required": false; }; "emptyFilterMessage": { "alias": "emptyFilterMessage"; "required": false; }; "emptyFilterMessageKey": { "alias": "emptyFilterMessageKey"; "required": false; }; "styleClass": { "alias": "styleClass"; "required": false; }; "panelStyleClass": { "alias": "panelStyleClass"; "required": false; }; "filterByKeys": { "alias": "filterByKeys"; "required": false; }; "variant": { "alias": "variant"; "required": false; }; "value": { "alias": "value"; "required": false; }; }, { "selectionChangeEvent": "selectionChangeEvent"; "filterChangeEvent": "filterChangeEvent"; "panelShowEvent": "panelShowEvent"; "panelHideEvent": "panelHideEvent"; }, ["itemTemplate", "selectedItemTemplate", "groupTemplate", "headerTemplate", "footerTemplate", "emptyTemplate", "emptyFilterTemplate", "filterTemplate", "loaderTemplate"], never, true, never>;
3377
3446
  static ngAcceptInputType_group: unknown;
3378
3447
  static ngAcceptInputType_fluid: unknown;
3379
3448
  static ngAcceptInputType_inline: unknown;
3380
3449
  static ngAcceptInputType_multiple: unknown;
3381
3450
  static ngAcceptInputType_filter: unknown;
3382
3451
  static ngAcceptInputType_autofocusFilter: unknown;
3452
+ static ngAcceptInputType_autofocus: unknown;
3383
3453
  static ngAcceptInputType_editable: unknown;
3384
3454
  static ngAcceptInputType_loading: unknown;
3385
3455
  static ngAcceptInputType_virtualScroll: unknown;
@@ -3462,6 +3532,14 @@ declare class EfCheckboxComponent extends AbstractEfFormControl implements Contr
3462
3532
  * ```
3463
3533
  */
3464
3534
  declare class EfToggleSwitchComponent extends AbstractEfFormControl implements ControlValueAccessor {
3535
+ /**
3536
+ * Take focus on load. Bound explicitly rather than left unset: PrimeNG's
3537
+ * AutoFocus directive tests `autofocus === false`, and the control declares
3538
+ * it with no initialiser, so an unbound instance arrives as `undefined`,
3539
+ * misses that check and gets a real `autofocus` attribute written onto it.
3540
+ * A table of these then puts one autofocus candidate per row on the page.
3541
+ */
3542
+ autofocus: boolean;
3465
3543
  /** Two-way bindable `[(checked)]` — boolean only. */
3466
3544
  checked: boolean;
3467
3545
  checkedChange: EventEmitter<boolean>;
@@ -3477,7 +3555,8 @@ declare class EfToggleSwitchComponent extends AbstractEfFormControl implements C
3477
3555
  checked: boolean;
3478
3556
  }): void;
3479
3557
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfToggleSwitchComponent, never>;
3480
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfToggleSwitchComponent, "ef-toggleswitch", never, { "checked": { "alias": "checked"; "required": false; }; }, { "checkedChange": "checkedChange"; }, never, never, true, never>;
3558
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfToggleSwitchComponent, "ef-toggleswitch", never, { "autofocus": { "alias": "autofocus"; "required": false; }; "checked": { "alias": "checked"; "required": false; }; }, { "checkedChange": "checkedChange"; }, never, never, true, never>;
3559
+ static ngAcceptInputType_autofocus: unknown;
3481
3560
  }
3482
3561
 
3483
3562
  /**
@@ -3510,6 +3589,15 @@ declare class EfDatepickerComponent implements ControlValueAccessor {
3510
3589
  showButtonBar: boolean;
3511
3590
  minDate?: Date;
3512
3591
  maxDate?: Date;
3592
+ /**
3593
+ * Take focus on load. Bound explicitly rather than left unset: PrimeNG's
3594
+ * AutoFocus directive tests `autofocus === false`, and the control declares
3595
+ * it with no initialiser, so an unbound instance arrives as `undefined`,
3596
+ * misses that check and has a real `autofocus` attribute written onto it.
3597
+ * Every such control on a page then becomes an autofocus candidate, and the
3598
+ * browser scrolls its container to whichever one it picks on load.
3599
+ */
3600
+ autofocus: boolean;
3513
3601
  get isInline(): boolean;
3514
3602
  dateSelectEvent: EventEmitter<any>;
3515
3603
  value: any;
@@ -3530,7 +3618,7 @@ declare class EfDatepickerComponent implements ControlValueAccessor {
3530
3618
  handleChange(value: any): void;
3531
3619
  handleBlur(): void;
3532
3620
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDatepickerComponent, never>;
3533
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDatepickerComponent, "ef-datepicker", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "size": { "alias": "size"; "required": false; }; "required": { "alias": "required"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showIcon": { "alias": "showIcon"; "required": false; }; "iconDisplay": { "alias": "iconDisplay"; "required": false; }; "selectionMode": { "alias": "selectionMode"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "showButtonBar": { "alias": "showButtonBar"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; }, { "dateSelectEvent": "dateSelectEvent"; }, never, never, true, never>;
3621
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDatepickerComponent, "ef-datepicker", never, { "label": { "alias": "label"; "required": false; }; "labelKey": { "alias": "labelKey"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "name": { "alias": "name"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; }; "size": { "alias": "size"; "required": false; }; "required": { "alias": "required"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "showIcon": { "alias": "showIcon"; "required": false; }; "iconDisplay": { "alias": "iconDisplay"; "required": false; }; "selectionMode": { "alias": "selectionMode"; "required": false; }; "dateFormat": { "alias": "dateFormat"; "required": false; }; "appendTo": { "alias": "appendTo"; "required": false; }; "showTime": { "alias": "showTime"; "required": false; }; "showButtonBar": { "alias": "showButtonBar"; "required": false; }; "minDate": { "alias": "minDate"; "required": false; }; "maxDate": { "alias": "maxDate"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; }, { "dateSelectEvent": "dateSelectEvent"; }, never, never, true, never>;
3534
3622
  static ngAcceptInputType_required: unknown;
3535
3623
  static ngAcceptInputType_fluid: unknown;
3536
3624
  static ngAcceptInputType_inline: unknown;
@@ -3538,6 +3626,7 @@ declare class EfDatepickerComponent implements ControlValueAccessor {
3538
3626
  static ngAcceptInputType_showIcon: unknown;
3539
3627
  static ngAcceptInputType_showTime: unknown;
3540
3628
  static ngAcceptInputType_showButtonBar: unknown;
3629
+ static ngAcceptInputType_autofocus: unknown;
3541
3630
  }
3542
3631
 
3543
3632
  /**
@@ -3698,6 +3787,15 @@ declare class EfPasswordComponent extends AbstractEfFormControl implements Contr
3698
3787
  toggleMask: boolean;
3699
3788
  feedback: boolean;
3700
3789
  autocomplete?: string;
3790
+ /**
3791
+ * Take focus on load. Bound explicitly rather than left unset: PrimeNG's
3792
+ * AutoFocus directive tests `autofocus === false`, and the control declares
3793
+ * it with no initialiser, so an unbound instance arrives as `undefined`,
3794
+ * misses that check and has a real `autofocus` attribute written onto it.
3795
+ * Every such control on a page then becomes an autofocus candidate, and the
3796
+ * browser scrolls its container to whichever one it picks on load.
3797
+ */
3798
+ autofocus: boolean;
3701
3799
  get isInline(): boolean;
3702
3800
  valueChangeEvent: EventEmitter<string>;
3703
3801
  value: string;
@@ -3718,11 +3816,12 @@ declare class EfPasswordComponent extends AbstractEfFormControl implements Contr
3718
3816
  handleChange(value: string): void;
3719
3817
  handleBlur(): void;
3720
3818
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfPasswordComponent, never>;
3721
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfPasswordComponent, "ef-password", never, { "size": { "alias": "size"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "toggleMask": { "alias": "toggleMask"; "required": false; }; "feedback": { "alias": "feedback"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; }, { "valueChangeEvent": "valueChangeEvent"; }, never, never, true, never>;
3819
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfPasswordComponent, "ef-password", never, { "size": { "alias": "size"; "required": false; }; "fluid": { "alias": "fluid"; "required": false; }; "inline": { "alias": "inline"; "required": false; }; "toggleMask": { "alias": "toggleMask"; "required": false; }; "feedback": { "alias": "feedback"; "required": false; }; "autocomplete": { "alias": "autocomplete"; "required": false; }; "autofocus": { "alias": "autofocus"; "required": false; }; }, { "valueChangeEvent": "valueChangeEvent"; }, never, never, true, never>;
3722
3820
  static ngAcceptInputType_fluid: unknown;
3723
3821
  static ngAcceptInputType_inline: unknown;
3724
3822
  static ngAcceptInputType_toggleMask: unknown;
3725
3823
  static ngAcceptInputType_feedback: unknown;
3824
+ static ngAcceptInputType_autofocus: unknown;
3726
3825
  }
3727
3826
 
3728
3827
  declare class EfMultiSelectComponent extends AbstractEfFormControl implements ControlValueAccessor, OnChanges {
@@ -4553,6 +4652,21 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4553
4652
  * move is on the arrow keys while the handle has focus.
4554
4653
  */
4555
4654
  onDragKeydown(index: number, ev: KeyboardEvent): void;
4655
+ /**
4656
+ * Honour the declared column widths exactly instead of treating them as
4657
+ * hints.
4658
+ *
4659
+ * The default `table-layout: auto` sizes a column to its content, so a
4660
+ * cell whose content is wider than the declared width simply wins. On the
4661
+ * order builder that meant clicking into a 116px discount cell swapped in
4662
+ * an editor whose input carries an intrinsic 200px, the column jumped to
4663
+ * 271px, and the article column lost the difference — every row re-flowed
4664
+ * mid-edit. With fixed layout the declared widths hold and the columns
4665
+ * that declare none share what is left.
4666
+ *
4667
+ * Opt-in: a table whose columns are all content-sized still wants `auto`.
4668
+ */
4669
+ readonly fixedLayout: _angular_core.InputSignalWithTransform<boolean, unknown>;
4556
4670
  /** Row density. Applied as a class on `.tbl-wrap`. */
4557
4671
  readonly density: _angular_core.WritableSignal<EfTableDensity>;
4558
4672
  /** Column ids the viewer has hidden. */
@@ -4625,7 +4739,7 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4625
4739
  trackByRow: (_: number, row: TRow) => unknown;
4626
4740
  trackByColumn: (_: number, col: EfDataCardColumn) => string;
4627
4741
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDataCardComponent<any>, never>;
4628
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDataCardComponent<any>, "ef-data-card", never, { "mobileLayout": { "alias": "mobileLayout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "trackByField": { "alias": "trackByField"; "required": false; "isSignal": true; }; "pageNumber": { "alias": "pageNumber"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "hidePager": { "alias": "hidePager"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "loadingKey": { "alias": "loadingKey"; "required": false; "isSignal": true; }; "rowDoubleClickable": { "alias": "rowDoubleClickable"; "required": false; "isSignal": true; }; "hasActionsColumn": { "alias": "hasActionsColumn"; "required": false; "isSignal": true; }; "rowActionsContext": { "alias": "rowActionsContext"; "required": false; "isSignal": true; }; "showViewAction": { "alias": "showViewAction"; "required": false; "isSignal": true; }; "showEditAction": { "alias": "showEditAction"; "required": false; "isSignal": true; }; "showDuplicateAction": { "alias": "showDuplicateAction"; "required": false; "isSignal": true; }; "showDeleteAction": { "alias": "showDeleteAction"; "required": false; "isSignal": true; }; "showDensityControl": { "alias": "showDensityControl"; "required": false; "isSignal": true; }; "showColumnPicker": { "alias": "showColumnPicker"; "required": false; "isSignal": true; }; "showExportControl": { "alias": "showExportControl"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "screenContext": { "alias": "screenContext"; "required": false; "isSignal": true; }; "searchTerm": { "alias": "searchTerm"; "required": false; "isSignal": true; }; "tableKey": { "alias": "tableKey"; "required": false; "isSignal": true; }; "defaultDensity": { "alias": "defaultDensity"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; "sortChange": "sortChange"; "rowDoubleClick": "rowDoubleClick"; "rowAction": "rowAction"; "exportRequest": "exportRequest"; "clearSearch": "clearSearch"; "rowReorder": "rowReorder"; }, ["bodyTemplates", "headerTemplates"], ["[tbl-head-info]", "[tbl-head-actions]", "[empty-state-mobile]", "[empty-state]"], true, never>;
4742
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDataCardComponent<any>, "ef-data-card", never, { "mobileLayout": { "alias": "mobileLayout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "trackByField": { "alias": "trackByField"; "required": false; "isSignal": true; }; "pageNumber": { "alias": "pageNumber"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "hidePager": { "alias": "hidePager"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "loadingKey": { "alias": "loadingKey"; "required": false; "isSignal": true; }; "rowDoubleClickable": { "alias": "rowDoubleClickable"; "required": false; "isSignal": true; }; "hasActionsColumn": { "alias": "hasActionsColumn"; "required": false; "isSignal": true; }; "rowActionsContext": { "alias": "rowActionsContext"; "required": false; "isSignal": true; }; "showViewAction": { "alias": "showViewAction"; "required": false; "isSignal": true; }; "showEditAction": { "alias": "showEditAction"; "required": false; "isSignal": true; }; "showDuplicateAction": { "alias": "showDuplicateAction"; "required": false; "isSignal": true; }; "showDeleteAction": { "alias": "showDeleteAction"; "required": false; "isSignal": true; }; "showDensityControl": { "alias": "showDensityControl"; "required": false; "isSignal": true; }; "showColumnPicker": { "alias": "showColumnPicker"; "required": false; "isSignal": true; }; "showExportControl": { "alias": "showExportControl"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "screenContext": { "alias": "screenContext"; "required": false; "isSignal": true; }; "searchTerm": { "alias": "searchTerm"; "required": false; "isSignal": true; }; "tableKey": { "alias": "tableKey"; "required": false; "isSignal": true; }; "defaultDensity": { "alias": "defaultDensity"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; "fixedLayout": { "alias": "fixedLayout"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; "sortChange": "sortChange"; "rowDoubleClick": "rowDoubleClick"; "rowAction": "rowAction"; "exportRequest": "exportRequest"; "clearSearch": "clearSearch"; "rowReorder": "rowReorder"; }, ["bodyTemplates", "headerTemplates"], ["[tbl-head-info]", "[tbl-head-actions]", "[empty-state-mobile]", "[empty-state]"], true, never>;
4629
4743
  }
4630
4744
 
4631
4745
  /**
@@ -5741,6 +5855,14 @@ type RangeKey = '7d' | '30d' | '90d';
5741
5855
  * />
5742
5856
  */
5743
5857
  declare class EfEmailMetricsCardComponent {
5858
+ /**
5859
+ * PrimeNG's Button reads `autofocus || buttonProps?.autofocus`, so a bare
5860
+ * `false` collapses to `undefined` and its AutoFocus directive writes the
5861
+ * attribute anyway. Passing the flag here too makes it resolve to `false`.
5862
+ */
5863
+ protected readonly noAutofocus: {
5864
+ autofocus: boolean;
5865
+ };
5744
5866
  metrics: _angular_core.InputSignal<EmailMetrics>;
5745
5867
  recentEvents: _angular_core.InputSignal<EmailEventRecord[]>;
5746
5868
  loading: _angular_core.InputSignal<boolean>;