@eagami/ui 5.28.0 → 5.29.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eagami/ui",
3
- "version": "5.28.0",
3
+ "version": "5.29.0",
4
4
  "description": "Lightweight, accessible, themeable Angular UI component library and icon set built on CSS custom properties",
5
5
  "author": "Michal Wiraszka <michal@eagami.com>",
6
6
  "license": "MIT",
@@ -158,6 +158,7 @@ interface EagamiMessages {
158
158
  clearAll: string;
159
159
  removeOption: (label: string) => string;
160
160
  selectedCount: (count: number) => string;
161
+ create: (text: string) => string;
161
162
  };
162
163
  paginator: {
163
164
  label: string;
@@ -588,9 +589,11 @@ declare function oklchToHex(oklch: Oklch): string;
588
589
  type EaSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl';
589
590
  /**
590
591
  * Size scale for width-based components (panels such as drawer and dialog),
591
- * adding a full-bleed option on top of the standard scale.
592
+ * adding a step above `xl` and a full-bleed option on top of the standard
593
+ * scale. A panel holds layouts (grids, tables) that a control never does, so it
594
+ * runs one step wider before the jump to full.
592
595
  */
593
- type EaWidth = EaSize | 'full';
596
+ type EaWidth = EaSize | '2xl' | 'full';
594
597
 
595
598
  /** Heading level exposed by each item's header for assistive technology. */
596
599
  type AccordionHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
@@ -1105,6 +1108,12 @@ declare class CheckboxComponent implements ControlValueAccessor {
1105
1108
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
1106
1109
  readonly errorMessages: _angular_core.InputSignal<Partial<Record<string, string>> | undefined>;
1107
1110
  readonly size: _angular_core.InputSignal<EaSize>;
1111
+ /**
1112
+ * Ellipsize a label too long for the space the checkbox is given, revealing
1113
+ * the full text in a tooltip while it is clipped. Off by default, since a
1114
+ * checkbox otherwise widens its column rather than hiding any of its label.
1115
+ */
1116
+ readonly truncate: _angular_core.InputSignal<boolean>;
1108
1117
  readonly disabled: _angular_core.InputSignal<boolean>;
1109
1118
  readonly required: _angular_core.InputSignal<boolean>;
1110
1119
  readonly indeterminate: _angular_core.InputSignal<boolean>;
@@ -1120,8 +1129,11 @@ declare class CheckboxComponent implements ControlValueAccessor {
1120
1129
  readonly hasError: _angular_core.Signal<boolean>;
1121
1130
  readonly showError: _angular_core.Signal<boolean>;
1122
1131
  readonly showHint: _angular_core.Signal<boolean>;
1132
+ /** What a clamped label reveals: the count rides along, since the ellipsis takes it first. */
1133
+ protected readonly clampedText: _angular_core.Signal<string>;
1123
1134
  readonly hostClasses: _angular_core.Signal<{
1124
1135
  [x: string]: boolean;
1136
+ 'ea-checkbox--truncate': boolean;
1125
1137
  'ea-checkbox--disabled': boolean;
1126
1138
  'ea-checkbox--checked': boolean;
1127
1139
  'ea-checkbox--indeterminate': boolean;
@@ -1133,9 +1145,10 @@ declare class CheckboxComponent implements ControlValueAccessor {
1133
1145
  registerOnChange(fn: (value: boolean) => void): void;
1134
1146
  registerOnTouched(fn: () => void): void;
1135
1147
  setDisabledState(isDisabled: boolean): void;
1148
+ handleKeydown(event: KeyboardEvent): void;
1136
1149
  handleChange(): void;
1137
1150
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<CheckboxComponent, never>;
1138
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "ea-checkbox", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "changed": "changed"; }, never, never, true, never>;
1151
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CheckboxComponent, "ea-checkbox", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "truncate": { "alias": "truncate"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "indeterminate": { "alias": "indeterminate"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "checked": { "alias": "checked"; "required": false; "isSignal": true; }; }, { "checked": "checkedChange"; "changed": "changed"; }, never, never, true, never>;
1139
1152
  }
1140
1153
 
1141
1154
  /**
@@ -1376,6 +1389,12 @@ declare class ColorPickerComponent implements ControlValueAccessor {
1376
1389
  readonly showAlpha: _angular_core.InputSignal<boolean>;
1377
1390
  /** Whether to show the clear button when a value is set. */
1378
1391
  readonly clearable: _angular_core.InputSignal<boolean>;
1392
+ /**
1393
+ * Trigger as a bare square swatch instead of a field with the value beside
1394
+ * it, for a colour sitting in a dense row or a toolbar. The value text and
1395
+ * the clear button, which have nowhere to go at that size, are dropped.
1396
+ */
1397
+ readonly compact: _angular_core.InputSignal<boolean>;
1379
1398
  /** Output format. `all` lets the user cycle hex/rgb/hsl in the popover; a specific value locks it. */
1380
1399
  readonly format: _angular_core.InputSignal<ColorPickerFormat>;
1381
1400
  /** Preset swatches shown at the bottom of the popover. Pass an empty array to hide. */
@@ -1442,6 +1461,7 @@ declare class ColorPickerComponent implements ControlValueAccessor {
1442
1461
  readonly triggerLabelledBy: _angular_core.Signal<string | null>;
1443
1462
  readonly triggerClasses: _angular_core.Signal<{
1444
1463
  [x: string]: boolean;
1464
+ 'ea-color-picker__trigger--compact': boolean;
1445
1465
  'ea-color-picker__trigger--error': boolean;
1446
1466
  'ea-color-picker__trigger--open': boolean;
1447
1467
  'ea-color-picker__trigger--disabled': boolean;
@@ -1518,7 +1538,7 @@ declare class ColorPickerComponent implements ControlValueAccessor {
1518
1538
  private commit;
1519
1539
  private refreshHexInput;
1520
1540
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColorPickerComponent, never>;
1521
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorPickerComponent, "ea-color-picker", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "showAlpha": { "alias": "showAlpha"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "changed": "changed"; }, never, never, true, never>;
1541
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ColorPickerComponent, "ea-color-picker", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "showAlpha": { "alias": "showAlpha"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "presets": { "alias": "presets"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "changed": "changed"; }, never, never, true, never>;
1522
1542
  }
1523
1543
 
1524
1544
  /** Vertical density preset for table rows and header cells. */
@@ -1835,6 +1855,19 @@ declare class DialogComponent implements AfterContentChecked {
1835
1855
  readonly closeOnBackdrop: _angular_core.InputSignal<boolean>;
1836
1856
  readonly closeOnEscape: _angular_core.InputSignal<boolean>;
1837
1857
  readonly showClose: _angular_core.InputSignal<boolean>;
1858
+ /**
1859
+ * Disables the built-in close button while a task is in flight (a save, an
1860
+ * upload). It governs that button alone; pair it with `closeOnEscape` /
1861
+ * `closeOnBackdrop` or `manualClose` to hold the other routes shut too.
1862
+ */
1863
+ readonly closeDisabled: _angular_core.InputSignal<boolean>;
1864
+ /**
1865
+ * Hands every close route to the consumer: the dialog reports
1866
+ * `closeRequested` and stays open until `open` is set false, so an unsaved
1867
+ * edit can be confirmed first. Escape and the backdrop still report, which is
1868
+ * what `closeOnEscape` / `closeOnBackdrop` remove entirely.
1869
+ */
1870
+ readonly manualClose: _angular_core.InputSignal<boolean>;
1838
1871
  readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
1839
1872
  readonly id: _angular_core.InputSignal<string>;
1840
1873
  readonly open: _angular_core.ModelSignal<boolean>;
@@ -1842,6 +1875,8 @@ declare class DialogComponent implements AfterContentChecked {
1842
1875
  readonly opened: _angular_core.OutputEmitterRef<void>;
1843
1876
  /** Fires when the dialog closes (via close button, backdrop, or Escape). */
1844
1877
  readonly closed: _angular_core.OutputEmitterRef<void>;
1878
+ /** Fires under `manualClose` for every close the user asks for, leaving the dialog open. */
1879
+ readonly closeRequested: _angular_core.OutputEmitterRef<void>;
1845
1880
  readonly panelClasses: _angular_core.Signal<{
1846
1881
  [x: string]: boolean;
1847
1882
  }>;
@@ -1850,10 +1885,12 @@ declare class DialogComponent implements AfterContentChecked {
1850
1885
  ngAfterContentChecked(): void;
1851
1886
  constructor();
1852
1887
  handleClose(): void;
1888
+ /** Every close route the user can take, routed through `manualClose`. */
1889
+ protected requestClose(): void;
1853
1890
  handleBackdropClick(event: MouseEvent): void;
1854
1891
  handleCancel(event: Event): void;
1855
1892
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DialogComponent, never>;
1856
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogComponent, "ea-dialog", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; }, never, ["[slot=header]", "*", "[slot=footer]"], true, never>;
1893
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogComponent, "ea-dialog", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "closeOnEscape": { "alias": "closeOnEscape"; "required": false; "isSignal": true; }; "showClose": { "alias": "showClose"; "required": false; "isSignal": true; }; "closeDisabled": { "alias": "closeDisabled"; "required": false; "isSignal": true; }; "manualClose": { "alias": "manualClose"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; "closeRequested": "closeRequested"; }, never, ["[slot=header]", "*", "[slot=status]", "[slot=footer]"], true, never>;
1857
1894
  }
1858
1895
 
1859
1896
  /** Orientation of the divider rule. */
@@ -2748,6 +2785,13 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2748
2785
  readonly searchable: _angular_core.InputSignal<boolean>;
2749
2786
  /** Toggle the "Select all" row at the top of the option list. */
2750
2787
  readonly selectAll: _angular_core.InputSignal<boolean>;
2788
+ /**
2789
+ * Offer a "Create" row when the search text matches no option, for a value
2790
+ * the list cannot know about yet (a new tag, a new person). The component
2791
+ * only reports the text through `created`; the consumer creates the record
2792
+ * and pushes its value into `value`.
2793
+ */
2794
+ readonly allowCreate: _angular_core.InputSignal<boolean>;
2751
2795
  /** Max number of chips shown inside the trigger; the rest collapse into a "+N more" pill. `0` removes the cap so every chip shows and the row scrolls horizontally. */
2752
2796
  readonly maxVisibleChips: _angular_core.InputSignal<number>;
2753
2797
  /**
@@ -2765,6 +2809,8 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2765
2809
  readonly value: _angular_core.ModelSignal<readonly string[]>;
2766
2810
  /** Fires with the new value whenever the selection changes. */
2767
2811
  readonly changed: _angular_core.OutputEmitterRef<readonly string[]>;
2812
+ /** Fires with the typed text when the user takes the `allowCreate` row. */
2813
+ readonly created: _angular_core.OutputEmitterRef<string>;
2768
2814
  readonly isOpen: _angular_core.WritableSignal<boolean>;
2769
2815
  readonly searchTerm: _angular_core.WritableSignal<string>;
2770
2816
  /** Index into `filteredOptions()` for keyboard navigation. `-1` when none focused. */
@@ -2798,6 +2844,10 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2798
2844
  protected readonly selectAllVisible: _angular_core.Signal<boolean>;
2799
2845
  /** Row-index offset the Select-all row adds ahead of the filtered options. */
2800
2846
  protected readonly selectAllOffset: _angular_core.Signal<1 | 0>;
2847
+ /** The text a Create row would carry, or `''` when no such row is offered. */
2848
+ protected readonly creatableText: _angular_core.Signal<string>;
2849
+ /** Row index of the Create row, which sits after the options, or `-1`. */
2850
+ protected readonly createRow: _angular_core.Signal<number>;
2801
2851
  private readonly rowCount;
2802
2852
  protected readonly selectAllAriaChecked: _angular_core.Signal<"true" | "mixed" | "false">;
2803
2853
  /** Id of the keyboard-focused option, for `aria-activedescendant`. */
@@ -2874,6 +2924,8 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2874
2924
  private moveFocusedRow;
2875
2925
  /** Enter/Space on the focused row: row 0 is Select-all when visible. */
2876
2926
  private activateRow;
2927
+ /** Report the typed text, then clear it so the new value can be followed by another. */
2928
+ protected createOption(): void;
2877
2929
  /** Reorder a value-set against the input `options` array. */
2878
2930
  private orderedValues;
2879
2931
  private optionsFor;
@@ -2887,7 +2939,7 @@ declare class MultiSelectComponent implements ControlValueAccessor {
2887
2939
  private measureClippedOptions;
2888
2940
  private watchListWidth;
2889
2941
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<MultiSelectComponent, never>;
2890
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<MultiSelectComponent, "ea-multi-select", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "selectAll": { "alias": "selectAll"; "required": false; "isSignal": true; }; "maxVisibleChips": { "alias": "maxVisibleChips"; "required": false; "isSignal": true; }; "maxChipWidth": { "alias": "maxChipWidth"; "required": false; "isSignal": true; }; "popoverMaxWidth": { "alias": "popoverMaxWidth"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "changed": "changed"; }, never, never, true, never>;
2942
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MultiSelectComponent, "ea-multi-select", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "errorMessages": { "alias": "errorMessages"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "selectAll": { "alias": "selectAll"; "required": false; "isSignal": true; }; "allowCreate": { "alias": "allowCreate"; "required": false; "isSignal": true; }; "maxVisibleChips": { "alias": "maxVisibleChips"; "required": false; "isSignal": true; }; "maxChipWidth": { "alias": "maxChipWidth"; "required": false; "isSignal": true; }; "popoverMaxWidth": { "alias": "popoverMaxWidth"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "changed": "changed"; "created": "created"; }, never, never, true, never>;
2891
2943
  }
2892
2944
 
2893
2945
  /** Visual size of the number input. */
@@ -3682,6 +3734,19 @@ declare class TooltipDirective implements OnDestroy {
3682
3734
  private readonly viewContainer;
3683
3735
  readonly eaTooltip: _angular_core.InputSignal<string | TemplateRef<unknown>>;
3684
3736
  readonly tooltipPosition: _angular_core.InputSignal<TooltipPosition>;
3737
+ /**
3738
+ * Whether a bubble with no room on the requested side moves to the opposite
3739
+ * one. The side is resolved when the bubble opens and held while it still
3740
+ * fits, so a bubble does not hop across its trigger mid-hover.
3741
+ */
3742
+ readonly flip: _angular_core.InputSignal<boolean>;
3743
+ /**
3744
+ * Show only while the trigger is cutting its own content off, which is how a
3745
+ * label that ellipsizes reveals its full text without a bubble on every
3746
+ * label that fits. The whole subtree is measured, since the box doing the
3747
+ * cutting is usually an inner one.
3748
+ */
3749
+ readonly whenClipped: _angular_core.InputSignal<boolean>;
3685
3750
  /**
3686
3751
  * Max width in px; the text wraps at this width. Clamped to a 50px floor, and
3687
3752
  * to the viewport, which no value can push the bubble past.
@@ -3694,6 +3759,8 @@ declare class TooltipDirective implements OnDestroy {
3694
3759
  */
3695
3760
  readonly dismissDelay: _angular_core.InputSignal<number>;
3696
3761
  private tooltipEl;
3762
+ /** Side the open bubble settled on, held across repositions while it fits. */
3763
+ private placedPosition;
3697
3764
  private templateView;
3698
3765
  private scrollable;
3699
3766
  private hideTimer;
@@ -3724,10 +3791,11 @@ declare class TooltipDirective implements OnDestroy {
3724
3791
  private appendDescribedBy;
3725
3792
  private removeDescribedBy;
3726
3793
  private positionTooltip;
3794
+ private applyPlacedPosition;
3727
3795
  private viewportMargin;
3728
3796
  private syncScrollable;
3729
3797
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipDirective, never>;
3730
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TooltipDirective, "[eaTooltip]", never, { "eaTooltip": { "alias": "eaTooltip"; "required": true; "isSignal": true; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "dismissDelay": { "alias": "dismissDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3798
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TooltipDirective, "[eaTooltip]", never, { "eaTooltip": { "alias": "eaTooltip"; "required": true; "isSignal": true; }; "tooltipPosition": { "alias": "tooltipPosition"; "required": false; "isSignal": true; }; "flip": { "alias": "flip"; "required": false; "isSignal": true; }; "whenClipped": { "alias": "whenClipped"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "dismissDelay": { "alias": "dismissDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3731
3799
  }
3732
3800
 
3733
3801
  /** Semantic colour scheme of a tag. */
@@ -3756,10 +3824,17 @@ declare class TagComponent {
3756
3824
  readonly disabled: _angular_core.InputSignal<boolean>;
3757
3825
  readonly removeLabel: _angular_core.InputSignal<string | undefined>;
3758
3826
  /**
3759
- * Widest the chip may grow, in px; a longer label ellipsizes instead. Also
3760
- * settable in CSS as `--ea-tag-max-width`, which this input overrides.
3827
+ * Widest the chip may grow: a number of px, or any CSS length for a chip that
3828
+ * has to give way to its container (`'100%'` in a responsive grid cell).
3829
+ * Also settable in CSS as `--ea-tag-max-width`, which this input overrides.
3761
3830
  */
3762
- readonly maxWidth: _angular_core.InputSignal<number | undefined>;
3831
+ readonly maxWidth: _angular_core.InputSignal<string | number | undefined>;
3832
+ /**
3833
+ * Fill colour as a hex value, for a tag carrying a colour of its own (a
3834
+ * user-chosen label). Paints the chip and its border, and picks whichever ink
3835
+ * reads better on it. Takes precedence over `variant`.
3836
+ */
3837
+ readonly color: _angular_core.InputSignal<string | undefined>;
3763
3838
  /**
3764
3839
  * Where a label clipped by `maxWidth` reveals its full text. Set `none` for
3765
3840
  * a tag rendered inside a tooltip, which would otherwise stack a second
@@ -3785,6 +3860,11 @@ declare class TagComponent {
3785
3860
  [x: string]: boolean;
3786
3861
  'ea-tag--disabled': boolean;
3787
3862
  }>;
3863
+ /** `maxWidth` as a CSS length; a bare number is px, as the input documents. */
3864
+ protected readonly resolvedMaxWidth: _angular_core.Signal<string | null>;
3865
+ /** Ink that reads on `color`, or `null` when it is not a hex the library can measure. */
3866
+ protected readonly resolvedInk: _angular_core.Signal<string | null>;
3867
+ protected readonly resolvedColor: _angular_core.Signal<string | null>;
3788
3868
  constructor();
3789
3869
  onRemove(event: MouseEvent): void;
3790
3870
  /**
@@ -3794,7 +3874,7 @@ declare class TagComponent {
3794
3874
  */
3795
3875
  private watchLabel;
3796
3876
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TagComponent, never>;
3797
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "ea-tag", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "removeTabbable": { "alias": "removeTabbable"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
3877
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TagComponent, "ea-tag", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "removeTabbable": { "alias": "removeTabbable"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
3798
3878
  }
3799
3879
 
3800
3880
  /** Visual size of the textarea. */