@elasticias/ui 1.0.54 → 1.0.55

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.54",
3
+ "version": "1.0.55",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -2263,6 +2263,10 @@ interface EfTabItem<T = string> {
2263
2263
  /** Translation key of a short note after the label (`'missing'`). It is
2264
2264
  * part of the tab's accessible name, so it says what the dot cannot. */
2265
2265
  noteKey?: string;
2266
+ /** Translation key of a small chip after the note (`'customized'`): a
2267
+ * state of the panel worth seeing from the tab row. Part of the tab's
2268
+ * accessible name, like the note. */
2269
+ badgeKey?: string;
2266
2270
  /** `'danger'` draws the tab in the error status colour: a required panel
2267
2271
  * left empty, or a panel holding server errors. */
2268
2272
  tone?: 'danger';
@@ -3380,12 +3384,45 @@ declare class EfTimelineComponent {
3380
3384
  interface OpMeta {
3381
3385
  cls: string;
3382
3386
  }
3387
+ /**
3388
+ * The i18n key segment of a backend entity type: PascalCase to snake_case,
3389
+ * an acronym kept as one word. `Product` gives `product`, `EmailTemplate`
3390
+ * gives `email_template`, `POSSession` gives `pos_session`; a segment
3391
+ * already in snake_case is kept.
3392
+ */
3393
+ declare function auditEntityKeySegment(entityType: string): string;
3383
3394
  /**
3384
3395
  * Standardized change-history box. Drop it on any detail screen and feed it the
3385
3396
  * record's audit entries (from `GET /api/audit/{entityType}/{id}` via the NSwag
3386
3397
  * `AuditClient`). Renders a vertical timeline inside an {@link EfCardComponent},
3387
3398
  * resolving operation labels through `audit_op_*` i18n keys and field labels
3388
- * through `audit_field_*` (falling back to the raw field key when unmapped).
3399
+ * through `audit_field_*` (falling back to the humanized field path when
3400
+ * unmapped).
3401
+ *
3402
+ * **Field labels.** For a field path (dots become `_` in the key) the box
3403
+ * tries, in order:
3404
+ *
3405
+ * 1. `audit_field_<entity>_<field>`, when `entityType` is set, with the type
3406
+ * converted by {@link auditEntityKeySegment} (`EmailTemplate` gives
3407
+ * `email_template`); the field keeps its camelCase (`htmlBody`), as
3408
+ * `ChangeDiff` records it;
3409
+ * 2. `audit_field_<field>`;
3410
+ * 3. when the last segment (`notes.ar`, as ChangeDiff writes a
3411
+ * LocalizedText) or, for older entries, the first segment (`fr.subject`)
3412
+ * is a known culture: the label of the rest of the path, found by steps 1
3413
+ * and 2 or humanized, then the culture's name in brackets: "Notes
3414
+ * olfactives (Arabe)". A culture is known when the app's bundle has
3415
+ * `ef_localized_input_culture_<xx>`, the key that also names it. The
3416
+ * bundle, not `EF_CONTENT_CULTURES`, decides, because a history outlives
3417
+ * the tenant's current culture list: a language the tenant dropped still
3418
+ * labels its old entries. Any other two-letter segment (`dimensions.cm`)
3419
+ * is part of the path;
3420
+ * 4. the humanized path (`clientCode` gives "Client code").
3421
+ *
3422
+ * So one `audit_field_product_notes` key labels every language of
3423
+ * `Product.Notes`, and an entity can name a field differently from the
3424
+ * global key used by others. On a V2 detail screen bind
3425
+ * `[entityType]="auditEntityType()"`.
3389
3426
  *
3390
3427
  * ```html
3391
3428
  * <ef-change-history [entries]="auditEntries()" />
@@ -3426,6 +3463,10 @@ declare class EfChangeHistoryComponent {
3426
3463
  * or null to keep the raw note. Rendered as plain text (never HTML). A
3427
3464
  * screen uses it to translate coded notes such as `order_email_resent:order_confirmed`. */
3428
3465
  readonly noteFormatter: _angular_core.InputSignal<((note: string) => string | null) | null>;
3466
+ /** The backend entity type (`ScreenConfig.AUDIT_ENTITY_TYPE`, e.g.
3467
+ * `EmailTemplate`), for the entity's own `audit_field_<entity>_<field>`
3468
+ * labels. Unset uses the global keys only. */
3469
+ readonly entityType: _angular_core.InputSignal<string | null | undefined>;
3429
3470
  /** "Show more" dialog visibility. */
3430
3471
  readonly dialogVisible: _angular_core.WritableSignal<boolean>;
3431
3472
  /** First `previewLimit` rows shown inline in the card. */
@@ -3442,11 +3483,15 @@ declare class EfChangeHistoryComponent {
3442
3483
  meta: OpMeta;
3443
3484
  operationLabel: string;
3444
3485
  }[]>;
3445
- /** Resolve a field key to its label. Adding an `audit_field_<field>` key is
3446
- * OPTIONAL — when it's missing the raw field name is humanized
3447
- * (`clientCode` → "Client code"), so new entities/fields work with zero
3448
- * i18n maintenance. Add a key only for a properly localized (fr/ar) term. */
3486
+ /** Resolve a field path to its label (order in the class docs). Keys are
3487
+ * OPTIONAL: without one the path is humanized (`clientCode` gives
3488
+ * "Client code"), so new fields work with zero i18n maintenance. Add a
3489
+ * key only for a properly localized (fr/ar) term. */
3449
3490
  fieldLabel(field: string | undefined): string;
3491
+ /** The culture's name from `ef_localized_input_culture_<code>`, or null when the bundle does not know it. */
3492
+ private cultureName;
3493
+ /** The entity key, then the global key, for a path; null when neither exists. */
3494
+ private lookupField;
3450
3495
  /** The note as shown: the formatter's text, else the raw note. */
3451
3496
  noteText(note: string | null | undefined): string;
3452
3497
  /** Display value for a field's raw value: the matching list item's label
@@ -3461,7 +3506,7 @@ declare class EfChangeHistoryComponent {
3461
3506
  * registration (the app's default locale is fr-MA). */
3462
3507
  formatWhen(value: string | Date | null | undefined): string;
3463
3508
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfChangeHistoryComponent, never>;
3464
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfChangeHistoryComponent, "ef-change-history", never, { "entries": { "alias": "entries"; "required": false; "isSignal": true; }; "titleKey": { "alias": "titleKey"; "required": false; "isSignal": true; }; "emptyKey": { "alias": "emptyKey"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "previewLimit": { "alias": "previewLimit"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "startCollapsed": { "alias": "startCollapsed"; "required": false; "isSignal": true; }; "valueLists": { "alias": "valueLists"; "required": false; "isSignal": true; }; "noteFormatter": { "alias": "noteFormatter"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3509
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfChangeHistoryComponent, "ef-change-history", never, { "entries": { "alias": "entries"; "required": false; "isSignal": true; }; "titleKey": { "alias": "titleKey"; "required": false; "isSignal": true; }; "emptyKey": { "alias": "emptyKey"; "required": false; "isSignal": true; }; "limit": { "alias": "limit"; "required": false; "isSignal": true; }; "previewLimit": { "alias": "previewLimit"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "startCollapsed": { "alias": "startCollapsed"; "required": false; "isSignal": true; }; "valueLists": { "alias": "valueLists"; "required": false; "isSignal": true; }; "noteFormatter": { "alias": "noteFormatter"; "required": false; "isSignal": true; }; "entityType": { "alias": "entityType"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3465
3510
  }
3466
3511
 
3467
3512
  /**
@@ -6516,6 +6561,15 @@ declare class EfSeoFieldsComponent {
6516
6561
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfSeoFieldsComponent, "ef-seo-fields", never, { "seoTitle": { "alias": "seoTitle"; "required": false; "isSignal": true; }; "seoDescription": { "alias": "seoDescription"; "required": false; "isSignal": true; }; "fallbackTitle": { "alias": "fallbackTitle"; "required": false; "isSignal": true; }; "fallbackDescription": { "alias": "fallbackDescription"; "required": false; "isSignal": true; }; "previewUrl": { "alias": "previewUrl"; "required": false; "isSignal": true; }; "titleMax": { "alias": "titleMax"; "required": false; "isSignal": true; }; "descriptionMax": { "alias": "descriptionMax"; "required": false; "isSignal": true; }; "titleAdvised": { "alias": "titleAdvised"; "required": false; "isSignal": true; }; "descriptionAdvised": { "alias": "descriptionAdvised"; "required": false; "isSignal": true; }; "cultures": { "alias": "cultures"; "required": false; "isSignal": true; }; }, { "seoChange": "seoChange"; }, never, never, true, never>;
6517
6562
  }
6518
6563
 
6564
+ /** What one input's tab for a culture would show; read by the input that draws a shared row. */
6565
+ interface EfLocalizedCultureFlags {
6566
+ /** Danger tone: a server error, or the required default culture left empty once touched. */
6567
+ readonly error: boolean;
6568
+ /** A server error under `<name>.<culture>` (what moves the shared culture). */
6569
+ readonly serverError: boolean;
6570
+ /** Edited since the value arrived. */
6571
+ readonly dirty: boolean;
6572
+ }
6519
6573
  /**
6520
6574
  * One owner-written text (a title, a description, an HTML body) in every
6521
6575
  * content language: a pill tab per culture, the active culture's field below
@@ -6523,10 +6577,16 @@ declare class EfSeoFieldsComponent {
6523
6577
  * (ADR-050 section 7).
6524
6578
  *
6525
6579
  * - **Cultures** come from `EF_CONTENT_CULTURES` (the ERP provides them from
6526
- * the tenant profile) unless `cultures` is set. The active tab is local and
6527
- * starts on the default culture.
6528
- * - **Tabs** carry the `ef_localized_input_missing` note on every culture with
6529
- * no text, the error tone on the default culture of a `required` field left
6580
+ * the tenant profile) unless `cultures` is set. The active culture starts
6581
+ * on the default and is two-way through `[(activeCulture)]`.
6582
+ * - **One tab row for several texts** (an email's subject and body): bind the
6583
+ * same signal to `[(activeCulture)]` on each and set `[showTabs]="false"`
6584
+ * on all but one, and list those in the row owner's `[linkedInputs]` so
6585
+ * the row also shows their error tone, required tone and dirty dot. A new
6586
+ * set of server errors moves the shared culture to the first culture in
6587
+ * error in the row's order.
6588
+ * - **Tabs** show the language name only (no "missing" note: an empty culture
6589
+ * is visible from its empty field), the error tone on the default culture of a `required` field left
6530
6590
  * empty once the field is touched, changed or its form submitted, and the
6531
6591
  * dirty dot on cultures edited since the value arrived. Dirty detection
6532
6592
  * relies on the parent storing the emitted object by reference (the V2
@@ -6553,17 +6613,27 @@ declare class EfSeoFieldsComponent {
6553
6613
  * - **Forms.** A ControlValueAccessor (`[formControl]`, `formControlName`,
6554
6614
  * `[(ngModel)]`) as well as `[value]` + `(valueChangeEvent)`. With
6555
6615
  * `required`, the form control reports `required` while the default culture
6556
- * is empty.
6616
+ * is empty, and once the field is touched, changed or submitted the default
6617
+ * culture's field shows `validation.required` and is `aria-invalid`.
6557
6618
  * - **Server errors** (ADR-010) come from the enclosing `[efServerErrors]`
6558
6619
  * scope. `<name>.<culture>` errors tint that culture's tab, show under its
6559
6620
  * field while it is active (the field links itself by name) and, from another
6560
6621
  * tab, show as a hint naming the languages in error; a new set of errors
6561
6622
  * moves to the first of them. `<name>` errors, or an explicit `[errors]`,
6562
6623
  * show under the field on every tab, as do errors for a language the field
6563
- * does not list (`title.xx`). Messages are translated as keys. Keys: `ef_localized_input_errors_in_other`.
6624
+ * does not list (`title.xx`), prefixed with that language's name (or its
6625
+ * code) through `ef_localized_input_error_in_culture`. Messages are
6626
+ * translated as keys. Keys: `ef_localized_input_errors_in_other`,
6627
+ * `ef_localized_input_error_in_culture`.
6628
+ * - **Counter.** With `advisedLength` it reads as advice through
6629
+ * `ef_localized_input_counter_advised` (`{{count}}`, `{{max}}`), so 5123 of
6630
+ * 5000 does not look like a cap; with `maxLength` alone it stays `n / max`.
6564
6631
  * - **Spoken limit.** `counterHintKey` is read with the counter (through
6565
6632
  * `aria-describedby`) and `counterOverKey` is announced politely when the
6566
- * text passes the limit; both take `{{max}}`.
6633
+ * text passes the limit; both take `{{max}}`. On a field with several
6634
+ * cultures the announcement is prefixed with the culture's name through
6635
+ * `ef_localized_input_error_in_culture`, so `counterOverKey` should not
6636
+ * name it.
6567
6637
  * - **Names.** Each culture's field is named `<name>.<culture>` (`title.ar`),
6568
6638
  * the key the backend reports a per-culture error under.
6569
6639
  *
@@ -6574,9 +6644,10 @@ declare class EfSeoFieldsComponent {
6574
6644
  * | `ef_localized_input_culture_fr` | Français | الفرنسية | French |
6575
6645
  * | `ef_localized_input_culture_ar` | Arabe | العربية | Arabic |
6576
6646
  * | `ef_localized_input_culture_en` | Anglais | الإنجليزية | English |
6577
- * | `ef_localized_input_missing` | manquant | غير مكتوب | missing |
6578
6647
  * | `ef_localized_input_cultures` | Langues du texte | لغات النص | Text languages |
6579
6648
  * | `ef_localized_input_errors_in_other` | Erreur dans : | خطأ في: | Error in: |
6649
+ * | `ef_localized_input_counter_advised` | {{count}} / {{max}} conseillés | {{count}} / {{max}} موصى بها | {{count}} / {{max}} advised |
6650
+ * | `ef_localized_input_error_in_culture` | {{culture}} : {{message}} | {{culture}}: {{message}} | {{culture}}: {{message}} |
6580
6651
  * | `ef_localized_input_read_only_hint` | Ce texte se modifie ailleurs. | يُعدَّل هذا النص في مكان آخر. | This text is edited elsewhere. |
6581
6652
  *
6582
6653
  * ```html
@@ -6584,6 +6655,9 @@ declare class EfSeoFieldsComponent {
6584
6655
  * [value]="product().title" (valueChangeEvent)="patch({ title: $event })"
6585
6656
  * [advisedLength]="60" [maxLength]="256" />
6586
6657
  *
6658
+ * <ef-localized-input name="subject" labelKey="email_subject" [maxLength]="200" [linkedInputs]="[body]" [(activeCulture)]="culture" ... />
6659
+ * <ef-localized-input #body name="htmlBody" labelKey="email_body" mode="html" [showTabs]="false" [(activeCulture)]="culture" ... />
6660
+ *
6587
6661
  * <ef-localized-input name="title" [readOnlyCultures]="['fr']" ...>
6588
6662
  * <a read-only-link [routerLink]="catalogLink()">{{ 'store_open_catalog' | translate }}</a>
6589
6663
  * </ef-localized-input>
@@ -6625,6 +6699,42 @@ declare class EfLocalizedInputComponent implements ControlValueAccessor, DoCheck
6625
6699
  readonly errors: _angular_core.InputSignal<string[] | null | undefined>;
6626
6700
  /** Overrides the `EF_CONTENT_CULTURES` list for this field. */
6627
6701
  readonly cultures: _angular_core.InputSignal<readonly EfCulture[] | undefined>;
6702
+ /**
6703
+ * The culture on show, two-way (`[(activeCulture)]`). `null` or a culture
6704
+ * the field does not list means the default; the field then writes back
6705
+ * the culture it settled on, so the parent always reads a listed code.
6706
+ * Bind one signal to several inputs to give them one tab row.
6707
+ */
6708
+ readonly activeCulture: _angular_core.ModelSignal<string | null>;
6709
+ /**
6710
+ * Draws the culture tab row. Off for a field that follows another
6711
+ * field's row through a shared `activeCulture`: its culture is then
6712
+ * named to assistive tech through `aria-describedby` and the hint still
6713
+ * names the cultures in error. List it in the row owner's
6714
+ * `linkedInputs` so the row draws its error tone, required tone and
6715
+ * dirty dot too. Without tabs it never rewrites `activeCulture` to fit
6716
+ * its own culture list (it shows its own fallback instead), and it moves
6717
+ * the shared culture to its first culture in error only when no row
6718
+ * owner links it.
6719
+ */
6720
+ readonly showTabs: _angular_core.InputSignalWithTransform<boolean, unknown>;
6721
+ /**
6722
+ * On the input that draws the shared tab row: the inputs that follow it
6723
+ * (`[showTabs]="false"`), whose `cultureFlags` the row merges into its
6724
+ * tones and dots. A new set of server errors on any of them moves the
6725
+ * shared culture to the first culture in error in this row's order.
6726
+ * Badges stay this input's own. A template reference works forward:
6727
+ * `<ef-localized-input [linkedInputs]="[body]" ... /> <ef-localized-input #body [showTabs]="false" ... />`.
6728
+ */
6729
+ readonly linkedInputs: _angular_core.InputSignal<readonly EfLocalizedInputComponent[]>;
6730
+ /** `html` mode only: the sanitised preview under the source. Off when
6731
+ * the screen renders its own preview (an email rendered by the server,
6732
+ * with its tokens filled in). */
6733
+ readonly preview: _angular_core.InputSignalWithTransform<boolean, unknown>;
6734
+ /** A badge per culture tab, culture code to i18n key (`{ ar:
6735
+ * 'email_templates_customized' }`): a state of that language worth
6736
+ * seeing from the tab row. Drawn by the input that shows the tabs. */
6737
+ readonly tabBadges: _angular_core.InputSignal<Readonly<Record<string, string>>>;
6628
6738
  /** The whole new object, trimmed, with blank cultures removed. */
6629
6739
  readonly valueChangeEvent: _angular_core.OutputEmitterRef<Partial<Record<string, string>>>;
6630
6740
  private readonly contentCultures;
@@ -6636,6 +6746,9 @@ declare class EfLocalizedInputComponent implements ControlValueAccessor, DoCheck
6636
6746
  /** The editor's chunk failed to load (offline, a stale deploy). */
6637
6747
  private readonly richFailed;
6638
6748
  private readonly richHost;
6749
+ private richRef;
6750
+ private readonly textField;
6751
+ private readonly areaField;
6639
6752
  /** `rich` without a provided editor renders the html source instead. */
6640
6753
  protected readonly effectiveMode: _angular_core.Signal<"html" | "textarea" | "text" | "rich">;
6641
6754
  private readonly parentForm;
@@ -6657,21 +6770,28 @@ declare class EfLocalizedInputComponent implements ControlValueAccessor, DoCheck
6657
6770
  private readonly cleaned;
6658
6771
  protected readonly list: _angular_core.Signal<readonly EfCulture[]>;
6659
6772
  protected readonly defaultCode: _angular_core.Signal<string>;
6660
- private readonly selected;
6661
6773
  protected readonly active: _angular_core.Signal<EfCulture | undefined>;
6662
6774
  /** The active culture's code: unlike active(), equal when an equal culture list arrives. */
6663
6775
  private readonly activeCode;
6664
- /** Server messages for the whole field (`title`). */
6665
- protected readonly fieldErrors: _angular_core.Signal<string[] | null>;
6776
+ /** Server messages for the whole field (`title`), and those of unlisted
6777
+ * cultures, translated here (never through the pipe a second time). */
6778
+ protected readonly fieldErrors: _angular_core.Signal<any[] | null>;
6666
6779
  /** Every `<name>.<culture>` message the scope holds. */
6667
6780
  private readonly allCultureErrors;
6668
6781
  /** Server messages per language (`title.ar` gives `ar`), only for listed cultures. */
6669
6782
  private readonly cultureErrors;
6670
- /** Messages for a language this field does not list (`title.xx`): shown with the whole field, never dropped. */
6783
+ /** Messages for a language this field does not list (`title.xx`): shown
6784
+ * with the whole field, never dropped, prefixed with the culture
6785
+ * (`xx : message`) since no tab says which language they concern. */
6671
6786
  private readonly unlistedErrors;
6672
6787
  /** Bumps when texts change, so translated messages follow the language. */
6673
6788
  private readonly textsVersion;
6674
- /** The active language's messages, translated once here for the field below. */
6789
+ /**
6790
+ * The active language's messages, translated once here for the field
6791
+ * below. Without one, a required default culture left empty says so
6792
+ * once the field is touched, changed or submitted (`validation.required`,
6793
+ * the family's message), which also sets `aria-invalid` on it.
6794
+ */
6675
6795
  protected readonly activeErrors: _angular_core.Signal<string[] | null>;
6676
6796
  /** Cultures with a server error, in tab order. */
6677
6797
  private readonly culturesInError;
@@ -6679,6 +6799,15 @@ declare class EfLocalizedInputComponent implements ControlValueAccessor, DoCheck
6679
6799
  protected readonly errorsElsewhere: _angular_core.Signal<EfCulture[]>;
6680
6800
  /** Changes only when the set of errors does, so a tab the user picked stays picked. */
6681
6801
  private readonly errorSignature;
6802
+ /** How many row owners list this input in their `linkedInputs`. */
6803
+ private readonly linkedBy;
6804
+ /** Danger tone on the default culture: required, empty, and touched, changed or submitted. */
6805
+ private requiredTone;
6806
+ /**
6807
+ * What this input's tab would show for each culture it lists, read by
6808
+ * the input that draws a shared row (`linkedInputs`). Read-only.
6809
+ */
6810
+ readonly cultureFlags: _angular_core.Signal<Readonly<Record<string, EfLocalizedCultureFlags>>>;
6682
6811
  protected readonly tabItems: _angular_core.Signal<EfTabItem<string>[]>;
6683
6812
  private readonly cvaDisabled;
6684
6813
  /** Every culture is disabled: `[disabled]`, a form's `disable()`, or `[efReadOnly]`. */
@@ -6693,12 +6822,44 @@ declare class EfLocalizedInputComponent implements ControlValueAccessor, DoCheck
6693
6822
  protected readonly activeLength: _angular_core.Signal<number>;
6694
6823
  protected readonly labelId: string;
6695
6824
  protected readonly counterLimit: _angular_core.Signal<number | undefined>;
6825
+ /**
6826
+ * The polite over-limit announcement: empty under the limit, else the
6827
+ * `counterOverKey` text, prefixed with the culture's name when the field
6828
+ * has more than one. Its text changes only with the (culture, over)
6829
+ * pair, so typing past the limit is announced once, and a switch to
6830
+ * another language that is also over is announced and names it.
6831
+ */
6832
+ protected readonly overMessage: _angular_core.Signal<any>;
6696
6833
  protected readonly panelId: string;
6697
6834
  protected readonly counterId: string;
6835
+ /** The culture's name, read with a field that has no tab row. */
6836
+ protected readonly cultureNameId: string;
6837
+ /** Extra `aria-describedby` ids for the active field: the counter, and
6838
+ * the culture's name when no tab says it. */
6839
+ protected readonly describedByExtra: _angular_core.Signal<string>;
6698
6840
  private onChange;
6699
6841
  private touched;
6700
6842
  constructor();
6701
6843
  private createRich;
6844
+ /**
6845
+ * Inserts `text` (a `{{token}}`) into the culture on show, at the caret,
6846
+ * replacing a selection, or at the end when its field was never entered
6847
+ * or was just recreated by a culture switch; then emits the whole object
6848
+ * once, as typing would. Returns false, and changes nothing, when the
6849
+ * field is disabled, the culture is read-only, the result would pass
6850
+ * `maxLength`, there is no active field (no culture listed), or the
6851
+ * field is the rich editor (which has no insert yet). The field says
6852
+ * nothing itself on a refusal, so the caller should tell the user (a
6853
+ * toast such as "the variable would pass the length limit"); otherwise
6854
+ * a click on a variable silently does nothing.
6855
+ *
6856
+ * On a phone, the focus that follows the insert opens the keyboard.
6857
+ *
6858
+ * A caller tracking "the field last focused" should ignore focus on the
6859
+ * culture tabs (`[role="tab"]`): picking a language is not choosing where
6860
+ * the token goes.
6861
+ */
6862
+ insertAtCaret(text: string): boolean;
6702
6863
  protected tabId(code: string): string;
6703
6864
  protected controlId(code: string): string;
6704
6865
  protected select(code: string): void;
@@ -6713,7 +6874,7 @@ declare class EfLocalizedInputComponent implements ControlValueAccessor, DoCheck
6713
6874
  registerOnTouched(fn: () => void): void;
6714
6875
  setDisabledState(disabled: boolean): void;
6715
6876
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfLocalizedInputComponent, never>;
6716
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfLocalizedInputComponent, "ef-localized-input", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "advisedLength": { "alias": "advisedLength"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readOnlyCultures": { "alias": "readOnlyCultures"; "required": false; "isSignal": true; }; "labelKey": { "alias": "labelKey"; "required": false; "isSignal": true; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; "isSignal": true; }; "hintKey": { "alias": "hintKey"; "required": false; "isSignal": true; }; "counterHintKey": { "alias": "counterHintKey"; "required": false; "isSignal": true; }; "counterOverKey": { "alias": "counterOverKey"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "cultures": { "alias": "cultures"; "required": false; "isSignal": true; }; }, { "valueChangeEvent": "valueChangeEvent"; }, never, ["[read-only-link]"], true, never>;
6877
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfLocalizedInputComponent, "ef-localized-input", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "advisedLength": { "alias": "advisedLength"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "readOnlyCultures": { "alias": "readOnlyCultures"; "required": false; "isSignal": true; }; "labelKey": { "alias": "labelKey"; "required": false; "isSignal": true; }; "placeholderKey": { "alias": "placeholderKey"; "required": false; "isSignal": true; }; "hintKey": { "alias": "hintKey"; "required": false; "isSignal": true; }; "counterHintKey": { "alias": "counterHintKey"; "required": false; "isSignal": true; }; "counterOverKey": { "alias": "counterOverKey"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "cultures": { "alias": "cultures"; "required": false; "isSignal": true; }; "activeCulture": { "alias": "activeCulture"; "required": false; "isSignal": true; }; "showTabs": { "alias": "showTabs"; "required": false; "isSignal": true; }; "linkedInputs": { "alias": "linkedInputs"; "required": false; "isSignal": true; }; "preview": { "alias": "preview"; "required": false; "isSignal": true; }; "tabBadges": { "alias": "tabBadges"; "required": false; "isSignal": true; }; }, { "activeCulture": "activeCultureChange"; "valueChangeEvent": "valueChangeEvent"; }, never, ["[read-only-link]"], true, never>;
6717
6878
  }
6718
6879
 
6719
6880
  /**
@@ -7422,5 +7583,5 @@ declare class EfEmailMetricsCardComponent {
7422
7583
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfEmailMetricsCardComponent, "ef-email-metrics-card", never, { "metrics": { "alias": "metrics"; "required": false; "isSignal": true; }; "recentEvents": { "alias": "recentEvents"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; }, { "rangeChange": "rangeChange"; }, never, never, true, never>;
7423
7584
  }
7424
7585
 
7425
- export { AbstractEfFormControl, EF_BADGE_BG_COLORS, EF_BADGE_BG_LIGHT_COLORS, EF_BADGE_BORDER_COLORS, EF_BADGE_DEFAULTS, EF_BADGE_TEXT_COLORS, EF_CHART_PALETTE, EF_DATATABLE_ACTIONS_DEFAULTS, EF_DATATABLE_COLUMN_DEFAULTS, EF_DATATABLE_DEFAULTS, EF_DATA_CARD_MOBILE_LAYOUT, EF_HTML_PREVIEW_DEFAULT_TITLE_KEY, EF_RICH_TEXT, EF_SEO_DEFAULT_LOCALES, EF_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, EfAboutDialogComponent, EfActivationFilterComponent, EfAppMainComponent, EfAppShellComponent, EfAppShellMobileComponent, EfAppTopComponent, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfBottomSheetComponent, EfBuildStampComponent, EfBulkBarComponent, EfButtonComponent, EfButtonGroupComponent, EfCardComponent, EfChangeHistoryComponent, EfChangePasswordComponent, EfChartComponent, EfCheckboxComponent, EfClearButtonComponent, EfColumnHeaderTemplateDirective, EfColumnTemplateDirective, EfCompactPipe, EfConfirmDialogComponent, EfCurrencyPipe, EfDataCardComponent, EfDatatableActionBarComponent, EfDatatableComponent, EfDatepickerAdvancedComponent, EfDatepickerComponent, EfDetailToolbarComponent, EfDialogComponent, EfEmailMetricsCardComponent, EfEmptyStateComponent, EfFabComponent, EfFieldsetComponent, EfFileUploadComponent, EfFilterDrawerComponent, EfFilterPillComponent, EfFormGridComponent, EfHtmlPreviewComponent, EfIdentityThumbComponent, EfInputNumberComponent, EfInputTextComponent, EfKpiCardComponent, EfLabelComponent, EfLocalizedInputComponent, EfModuleRailComponent, EfModuleSideComponent, EfMultiSelectComponent, EfOrderBuilderComponent, EfOrderSummaryComponent, EfOverflowTooltipDirective, EfPagerComponent, EfPasswordComponent, EfPdfPreviewComponent, EfPillGroupComponent, EfPresetPillComponent, EfPriceDisplayComponent, EfProductCatalogueComponent, EfProductCatalogueFilterComponent, EfProductPickerComponent, EfProductTypeaheadComponent, EfProfileChipComponent, EfProfileMenuComponent, EfPulseComponent, EfQuantitySelectorComponent, EfQuantityStepperComponent, EfRadioComponent, EfRankListComponent, EfReadOnlyDirective, EfRowActionsComponent, EfSearchToolbarComponent, EfSelectButtonComponent, EfSelectComponent, EfSeoFieldsComponent, EfSeoPreviewComponent, EfServerErrorsDirective, EfSessionIdleDialogComponent, EfShortcutsDialogComponent, EfSkeletonComponent, EfSmartBarComponent, EfStatsComponent, EfStatusChipComponent, EfTabPanelDirective, EfTabsComponent, EfTextareaComponent, EfThemeConfiguratorComponent, EfThemeToggleComponent, EfTimelineComponent, EfToastRegionComponent, EfToggleSwitchComponent, EfToolbarComponent, EfTooltipDirective, EfTotalsComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, buildChartConfig, defaultUnitPrice, getColumnAlignment, mergeColumnDefaults, plainTextLength, resolveEfStatusColor };
7426
- export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfAboutServer, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfButtonComptoirSeverity, EfButtonPrimeNGSeverity, EfButtonSeverity, EfChangeHistoryEntry, EfChangeHistoryFieldChange, EfChangeHistoryValueItem, EfChangePasswordSubmit, EfChartSeries, EfChartType, EfDataCardMobileLayout, EfDataCardRowAction, EfDataCardRowActionState, EfDatatableActions, EfDatatableColumn, EfDatatableColumnAlign, EfDatatableColumnType, EfDatatableConfig, EfDateFieldOutput, EfDateFieldValue, EfDatePreset, EfDialogAction, EfDialogSeverity, EfDialogSize, EfFabPosition, EfFileRejectReason, EfFileRejection, EfIdentityThumbSize, EfKpiDeltaTone, EfKpiSparkline, EfOrderPriceList, EfOrderRecipient, EfPillItem, EfPresetItem, EfProductPickerItem, EfProductPickerQuery, EfProfileMenuItem, EfRankRow, EfRowAction, EfSeoLocale, EfSeoPatch, EfSkeletonVariant, EfStatsRow, EfStatusColor, EfStatusReferenceItem, EfTabItem, EfTabsModule, EfTabsVariant, EfTimelineItem, EfTimelineState, EfToastRegionPosition, EfTotalsGrand, EfTotalsRow, HighlightSegment, OrderChangeInfo, OrderEntity, OrderLineItem, OrderProductsSummary, OrderSummaryItem, ProductCountGroup, ProductCountGroupLabel, ProductTypeaheadRow, ProductTypeaheadSelection, ProductWithCountGroup, SelectedFilter, ValidationResult };
7586
+ export { AbstractEfFormControl, EF_BADGE_BG_COLORS, EF_BADGE_BG_LIGHT_COLORS, EF_BADGE_BORDER_COLORS, EF_BADGE_DEFAULTS, EF_BADGE_TEXT_COLORS, EF_CHART_PALETTE, EF_DATATABLE_ACTIONS_DEFAULTS, EF_DATATABLE_COLUMN_DEFAULTS, EF_DATATABLE_DEFAULTS, EF_DATA_CARD_MOBILE_LAYOUT, EF_HTML_PREVIEW_DEFAULT_TITLE_KEY, EF_RICH_TEXT, EF_SEO_DEFAULT_LOCALES, EF_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, EfAboutDialogComponent, EfActivationFilterComponent, EfAppMainComponent, EfAppShellComponent, EfAppShellMobileComponent, EfAppTopComponent, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfBottomSheetComponent, EfBuildStampComponent, EfBulkBarComponent, EfButtonComponent, EfButtonGroupComponent, EfCardComponent, EfChangeHistoryComponent, EfChangePasswordComponent, EfChartComponent, EfCheckboxComponent, EfClearButtonComponent, EfColumnHeaderTemplateDirective, EfColumnTemplateDirective, EfCompactPipe, EfConfirmDialogComponent, EfCurrencyPipe, EfDataCardComponent, EfDatatableActionBarComponent, EfDatatableComponent, EfDatepickerAdvancedComponent, EfDatepickerComponent, EfDetailToolbarComponent, EfDialogComponent, EfEmailMetricsCardComponent, EfEmptyStateComponent, EfFabComponent, EfFieldsetComponent, EfFileUploadComponent, EfFilterDrawerComponent, EfFilterPillComponent, EfFormGridComponent, EfHtmlPreviewComponent, EfIdentityThumbComponent, EfInputNumberComponent, EfInputTextComponent, EfKpiCardComponent, EfLabelComponent, EfLocalizedInputComponent, EfModuleRailComponent, EfModuleSideComponent, EfMultiSelectComponent, EfOrderBuilderComponent, EfOrderSummaryComponent, EfOverflowTooltipDirective, EfPagerComponent, EfPasswordComponent, EfPdfPreviewComponent, EfPillGroupComponent, EfPresetPillComponent, EfPriceDisplayComponent, EfProductCatalogueComponent, EfProductCatalogueFilterComponent, EfProductPickerComponent, EfProductTypeaheadComponent, EfProfileChipComponent, EfProfileMenuComponent, EfPulseComponent, EfQuantitySelectorComponent, EfQuantityStepperComponent, EfRadioComponent, EfRankListComponent, EfReadOnlyDirective, EfRowActionsComponent, EfSearchToolbarComponent, EfSelectButtonComponent, EfSelectComponent, EfSeoFieldsComponent, EfSeoPreviewComponent, EfServerErrorsDirective, EfSessionIdleDialogComponent, EfShortcutsDialogComponent, EfSkeletonComponent, EfSmartBarComponent, EfStatsComponent, EfStatusChipComponent, EfTabPanelDirective, EfTabsComponent, EfTextareaComponent, EfThemeConfiguratorComponent, EfThemeToggleComponent, EfTimelineComponent, EfToastRegionComponent, EfToggleSwitchComponent, EfToolbarComponent, EfTooltipDirective, EfTotalsComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, auditEntityKeySegment, buildChartConfig, defaultUnitPrice, getColumnAlignment, mergeColumnDefaults, plainTextLength, resolveEfStatusColor };
7587
+ export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfAboutServer, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfButtonComptoirSeverity, EfButtonPrimeNGSeverity, EfButtonSeverity, EfChangeHistoryEntry, EfChangeHistoryFieldChange, EfChangeHistoryValueItem, EfChangePasswordSubmit, EfChartSeries, EfChartType, EfDataCardMobileLayout, EfDataCardRowAction, EfDataCardRowActionState, EfDatatableActions, EfDatatableColumn, EfDatatableColumnAlign, EfDatatableColumnType, EfDatatableConfig, EfDateFieldOutput, EfDateFieldValue, EfDatePreset, EfDialogAction, EfDialogSeverity, EfDialogSize, EfFabPosition, EfFileRejectReason, EfFileRejection, EfIdentityThumbSize, EfKpiDeltaTone, EfKpiSparkline, EfLocalizedCultureFlags, EfOrderPriceList, EfOrderRecipient, EfPillItem, EfPresetItem, EfProductPickerItem, EfProductPickerQuery, EfProfileMenuItem, EfRankRow, EfRowAction, EfSeoLocale, EfSeoPatch, EfSkeletonVariant, EfStatsRow, EfStatusColor, EfStatusReferenceItem, EfTabItem, EfTabsModule, EfTabsVariant, EfTimelineItem, EfTimelineState, EfToastRegionPosition, EfTotalsGrand, EfTotalsRow, HighlightSegment, OrderChangeInfo, OrderEntity, OrderLineItem, OrderProductsSummary, OrderSummaryItem, ProductCountGroup, ProductCountGroupLabel, ProductTypeaheadRow, ProductTypeaheadSelection, ProductWithCountGroup, SelectedFilter, ValidationResult };