@eagami/ui 5.65.0 → 5.67.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.65.0",
3
+ "version": "5.67.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",
@@ -26,7 +26,6 @@
26
26
  }
27
27
 
28
28
  &:focus {
29
- border-color: var(--color-border-focus);
30
29
  @include ea.focus-ring;
31
30
  }
32
31
 
@@ -348,10 +348,25 @@ export interface PaletteConfig {
348
348
  * unset and accept the defaults. */
349
349
  roles?: Partial<PaletteRoles>;
350
350
  }
351
+ /**
352
+ * A focus colour of its own, for focus rings and outlines. Light mode draws
353
+ * focus in the derived 500 shade and dark mode in the 300 shade, the same
354
+ * steps the primary colour uses when no focus colour is set.
355
+ */
356
+ export interface FocusColorConfig {
357
+ /** Anchor hex (`#RRGGBB`) the focus shades are derived from. */
358
+ base: string;
359
+ /** Pin individual shades to specific hex values, bypassing derivation for
360
+ * those slots. */
361
+ overrides?: Partial<Record<PaletteShade, string>>;
362
+ }
351
363
  /** Top-level palette config accepted by `provideEagamiUi()`. */
352
364
  export interface EagamiPaletteConfig {
353
365
  primary?: PaletteConfig;
354
366
  secondary?: PaletteConfig;
367
+ /** Focus follows the primary colour unless this sets one apart, as a brand
368
+ * whose hue reads as an error or a warning needs. */
369
+ focus?: FocusColorConfig;
355
370
  }
356
371
  /** Flat CSS-custom-property name to value map for a single mode. */
357
372
  export type DerivedPalette = Record<string, string>;
@@ -541,6 +556,8 @@ export interface ContrastSurfaces {
541
556
  * - `--color-brand-text` vs `canvas` >= 4.5:1 (link / foreground text)
542
557
  * - `--color-brand-default` vs `onBrandText` >= 4.5:1 (button label)
543
558
  * - `--color-brand-default` vs `canvas` >= 3:1 (WCAG 1.4.11 non-text)
559
+ * - `--color-border-focus` vs `canvas` >= 3:1 (WCAG 1.4.11 non-text), when a
560
+ * focus colour is set
544
561
  */
545
562
  export declare function validatePalette(palette: ModePalette, surfaces?: ContrastSurfaces): ContrastViolation[];
546
563
  /** Format a violation list as a human-readable error message. */
@@ -894,7 +911,7 @@ export declare class AutocompleteComponent implements ControlValueAccessor {
894
911
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
895
912
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
896
913
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
897
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
914
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
898
915
  readonly minLength: import("@angular/core").InputSignal<number>;
899
916
  /** Maximum number of characters the input accepts (native `maxlength`). */
900
917
  readonly maxLength: import("@angular/core").InputSignal<number | undefined>;
@@ -2073,7 +2090,7 @@ export declare class CheckboxComponent implements ControlValueAccessor {
2073
2090
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
2074
2091
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
2075
2092
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
2076
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
2093
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
2077
2094
  readonly size: import("@angular/core").InputSignal<EaSize>;
2078
2095
  /**
2079
2096
  * Ellipsize a label too long for the space the checkbox is given, revealing
@@ -2454,7 +2471,7 @@ export declare class ColorPickerComponent implements ControlValueAccessor {
2454
2471
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
2455
2472
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
2456
2473
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
2457
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
2474
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
2458
2475
  /** Whether to show the alpha slider. When `false` the emitted value always has alpha = 1. */
2459
2476
  readonly showAlpha: import("@angular/core").InputSignal<boolean>;
2460
2477
  /** Whether to show the clear button when a value is set. */
@@ -3468,7 +3485,7 @@ export declare class CodeInputComponent implements ControlValueAccessor {
3468
3485
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
3469
3486
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
3470
3487
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
3471
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
3488
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
3472
3489
  readonly disabled: import("@angular/core").InputSignal<boolean>;
3473
3490
  readonly readonly: import("@angular/core").InputSignal<boolean>;
3474
3491
  readonly required: import("@angular/core").InputSignal<boolean>;
@@ -3643,7 +3660,7 @@ export declare class DatePickerComponent implements ControlValueAccessor {
3643
3660
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
3644
3661
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
3645
3662
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
3646
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
3663
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
3647
3664
  readonly minDate: import("@angular/core").InputSignal<Date | null>;
3648
3665
  readonly maxDate: import("@angular/core").InputSignal<Date | null>;
3649
3666
  /** Weekdays that cannot be picked, numbered as `Date.getDay()` does: 0 for Sunday through 6 for Saturday. */
@@ -4301,7 +4318,7 @@ export declare class DropdownComponent implements ControlValueAccessor {
4301
4318
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
4302
4319
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
4303
4320
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
4304
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
4321
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
4305
4322
  readonly id: import("@angular/core").InputSignal<string>;
4306
4323
  readonly value: import("@angular/core").ModelSignal<string>;
4307
4324
  /** Fires with the new value when the user selects an option or clears the selection. */
@@ -4685,7 +4702,7 @@ export declare class FormFieldComponent {
4685
4702
  /** Error message shown below the control; replaces the hint and flags the field invalid. */
4686
4703
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
4687
4704
  /** Per-validator-key message overrides for the projected form control (e.g. `{ required: '...' }`). */
4688
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
4705
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
4689
4706
  /** Marks the field as required. */
4690
4707
  readonly required: import("@angular/core").InputSignal<boolean>;
4691
4708
  /** Visual size of the field; the label, control text, spacing, and messages scale with it. */
@@ -4758,9 +4775,10 @@ type EaValidationErrorKey = 'required' | 'email' | 'min' | 'max' | 'minlength' |
4758
4775
  * Per-error-key message overrides for a form control. Keys are validator error
4759
4776
  * names (`required`, `email`, or any custom validator key); values are the text
4760
4777
  * shown when that error is the active one. Keys left unset fall back to the
4761
- * library's localized default message.
4778
+ * library's localized default message, and a key set to `null` is never shown,
4779
+ * so a field whose only errors are hidden keeps out of its error state.
4762
4780
  */
4763
- type EaErrorMessages = Partial<Record<string, string>>;
4781
+ type EaErrorMessages = Partial<Record<string, string | null>>;
4764
4782
  interface ControlErrorStateConfig {
4765
4783
  /** Explicit error text; shown unconditionally and overrides any auto-derived message. */
4766
4784
  errorMsg: Signal<string | null | undefined>;
@@ -4776,12 +4794,19 @@ interface ControlErrorState {
4776
4794
  /**
4777
4795
  * Derives a form control's display error from, in priority order: an explicit
4778
4796
  * `errorMsg`, a consumer `errorMessages` override, then the library's localized
4779
- * default for the active `ValidationErrors` key. Auto-derived messages surface
4780
- * only once the bound control is `invalid && touched`, matching the moment a
4781
- * user expects validation feedback. A message revealed by a pointer press
4782
- * moving focus away waits until that press has landed its click. The control
4783
- * arrives as a signal so callers decide how it is resolved: from the host's own
4784
- * `NgControl` (CVA components) or from projected content (`<ea-form-field>`).
4797
+ * default for the active `ValidationErrors` key.
4798
+ *
4799
+ * Auto-derived messages surface only once the bound control is `invalid &&
4800
+ * touched`, and a new one waits while focus is still inside the field, until
4801
+ * the user leaves it or submits the form, so nothing is flagged mid-edit. A
4802
+ * field the user only passed through, leaving it without changing it, stays
4803
+ * quiet until they change it or the form is submitted, so tabbing past an
4804
+ * empty required field never flags it. A
4805
+ * message already showing follows the value as it is typed and clears the
4806
+ * moment it is fixed. A message revealed by a pointer press moving focus away
4807
+ * waits until that press has landed its click. The control arrives as a signal
4808
+ * so callers decide how it is resolved: from the host's own `NgControl` (CVA
4809
+ * components) or from projected content (`<ea-form-field>`).
4785
4810
  */
4786
4811
  declare function controlErrorStateFrom(control: Signal<AbstractControl | null>, config: ControlErrorStateConfig): ControlErrorState;
4787
4812
  /**
@@ -4852,7 +4877,7 @@ export declare class FileUploaderComponent implements ControlValueAccessor {
4852
4877
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
4853
4878
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
4854
4879
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
4855
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
4880
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
4856
4881
  readonly size: import("@angular/core").InputSignal<EaSize>;
4857
4882
  /**
4858
4883
  * `dropzone` renders the drag-and-drop area; `button` renders a compact
@@ -5131,7 +5156,7 @@ export declare class InputComponent implements ControlValueAccessor {
5131
5156
  /** Error message shown below the field; replaces the hint and flags the field invalid. */
5132
5157
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
5133
5158
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
5134
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
5159
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
5135
5160
  /** Disables the field. */
5136
5161
  readonly disabled: import("@angular/core").InputSignal<boolean>;
5137
5162
  /** Renders the field read-only. */
@@ -5837,7 +5862,7 @@ export declare class MultiSelectComponent implements ControlValueAccessor {
5837
5862
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
5838
5863
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
5839
5864
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
5840
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
5865
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
5841
5866
  /** Toggle the search input at the top of the popover. */
5842
5867
  readonly searchable: import("@angular/core").InputSignal<boolean>;
5843
5868
  /** Toggle the "Select all" row at the top of the option list. */
@@ -6154,7 +6179,7 @@ export declare class NumberInputComponent implements ControlValueAccessor {
6154
6179
  /** Error message shown below the field; replaces the hint and flags the field invalid. */
6155
6180
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6156
6181
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
6157
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
6182
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
6158
6183
  /** Disables the field. */
6159
6184
  readonly disabled: import("@angular/core").InputSignal<boolean>;
6160
6185
  /** Renders the field read-only. */
@@ -6730,7 +6755,7 @@ export declare class RadioGroupComponent implements ControlValueAccessor {
6730
6755
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
6731
6756
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6732
6757
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
6733
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
6758
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
6734
6759
  readonly ariaLabel: import("@angular/core").InputSignal<string | undefined>;
6735
6760
  /** Space-separated ids of the elements whose text names the group, such as a label outside the component. */
6736
6761
  readonly ariaLabelledby: import("@angular/core").InputSignal<string | undefined>;
@@ -6908,7 +6933,7 @@ export declare class RangeSliderComponent implements ControlValueAccessor {
6908
6933
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
6909
6934
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
6910
6935
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
6911
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
6936
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
6912
6937
  readonly min: import("@angular/core").InputSignal<number>;
6913
6938
  readonly max: import("@angular/core").InputSignal<number>;
6914
6939
  readonly step: import("@angular/core").InputSignal<number>;
@@ -7115,7 +7140,7 @@ export declare class RatingComponent implements ControlValueAccessor {
7115
7140
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
7116
7141
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
7117
7142
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
7118
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
7143
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
7119
7144
  readonly size: import("@angular/core").InputSignal<EaSize>;
7120
7145
  readonly min: import("@angular/core").InputSignal<number>;
7121
7146
  readonly max: import("@angular/core").InputSignal<number>;
@@ -7301,7 +7326,7 @@ export declare class SegmentedComponent implements ControlValueAccessor {
7301
7326
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
7302
7327
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
7303
7328
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
7304
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
7329
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
7305
7330
  readonly size: import("@angular/core").InputSignal<EaSize>;
7306
7331
  readonly disabled: import("@angular/core").InputSignal<boolean>;
7307
7332
  readonly required: import("@angular/core").InputSignal<boolean>;
@@ -7476,7 +7501,7 @@ export declare class SliderComponent implements ControlValueAccessor {
7476
7501
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
7477
7502
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
7478
7503
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
7479
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
7504
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
7480
7505
  /** Force the error-state styling without binding `errorMsg`. Lets consumers
7481
7506
  * render the error text themselves (e.g. above the slider in a form layout)
7482
7507
  * while still getting the built-in recolour of the fill and thumb. */
@@ -7827,7 +7852,7 @@ export declare class SwitchComponent implements ControlValueAccessor {
7827
7852
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
7828
7853
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
7829
7854
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
7830
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
7855
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
7831
7856
  readonly size: import("@angular/core").InputSignal<EaSize>;
7832
7857
  /**
7833
7858
  * Status tone for the track: a tinted wash with a toned border while off and
@@ -8368,7 +8393,7 @@ export declare class TextareaComponent implements ControlValueAccessor {
8368
8393
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
8369
8394
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
8370
8395
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
8371
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
8396
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
8372
8397
  readonly disabled: import("@angular/core").InputSignal<boolean>;
8373
8398
  readonly readonly: import("@angular/core").InputSignal<boolean>;
8374
8399
  readonly required: import("@angular/core").InputSignal<boolean>;
@@ -8589,7 +8614,7 @@ export declare class TimePickerComponent implements ControlValueAccessor {
8589
8614
  readonly hint: import("@angular/core").InputSignal<string | undefined>;
8590
8615
  readonly errorMsg: import("@angular/core").InputSignal<string | undefined>;
8591
8616
  /** Per-validator-key message overrides for a bound form control (e.g. `{ required: '...' }`). */
8592
- readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string>> | undefined>;
8617
+ readonly errorMessages: import("@angular/core").InputSignal<Partial<Record<string, string | null>> | undefined>;
8593
8618
  /** Display format for the trigger label. Wire value is always 24h. */
8594
8619
  readonly format: import("@angular/core").InputSignal<TimePickerFormat>;
8595
8620
  readonly includeSeconds: import("@angular/core").InputSignal<boolean>;
@@ -9020,14 +9045,16 @@ export declare class ToastComponent {
9020
9045
  }
9021
9046
  export type ToggleChipSize = EaSize;
9022
9047
  /**
9023
- * Pill-shaped toggle button for filters and feature pickers. Projected content,
9024
- * an optional leading icon and a label, names it, and a check marks it as on,
9025
- * so its state never rests on colour alone.
9048
+ * Pill-shaped toggle button for filters and feature pickers. Projected content
9049
+ * names it, an optional icon leads it, and a check marks it as on, so its state
9050
+ * never rests on colour alone.
9026
9051
  */
9027
9052
  export declare class ToggleChipComponent {
9028
9053
  /** Whether the chip is on, two-way bindable via [(selected)]. */
9029
9054
  readonly selected: import("@angular/core").ModelSignal<boolean>;
9030
9055
  readonly size: import("@angular/core").InputSignal<EaSize>;
9056
+ /** Optional icon component rendered before the label. */
9057
+ readonly icon: import("@angular/core").InputSignal<Type<unknown> | undefined>;
9031
9058
  /** Disables the chip and blocks toggling. */
9032
9059
  readonly disabled: import("@angular/core").InputSignal<boolean>;
9033
9060
  /** Accessible label for a chip whose projected content has no visible text. */
@@ -9053,6 +9080,11 @@ export declare class ToggleChipComponent {
9053
9080
  "required": false;
9054
9081
  "isSignal": true;
9055
9082
  };
9083
+ "icon": {
9084
+ "alias": "icon";
9085
+ "required": false;
9086
+ "isSignal": true;
9087
+ };
9056
9088
  "disabled": {
9057
9089
  "alias": "disabled";
9058
9090
  "required": false;