@eagami/ui 5.10.0 → 5.10.1

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/README.md CHANGED
@@ -74,7 +74,7 @@ Full API and live demos at [eagami.com/ui/components](https://eagami.com/ui/comp
74
74
 
75
75
  ## Icons
76
76
 
77
- Standalone Angular components (`<ea-icon-*>`) that inherit their color and scale with `font-size`, so they render at any size. The library ships the full [Feather Icons](https://feathericons.com/) set (287 icons at their canonical slugs) by [Cole Bemis](https://github.com/colebemis), used under the [MIT License](https://github.com/feathericons/feather/blob/master/LICENSE), plus additional line icons from [Lucide](https://lucide.dev/) (ISC License), a set of original Eagami UI additions (basic shapes, household objects, the Eagami brand mark), and a coloured brand-icon set for nominative use that includes marks from [Simple Icons](https://simpleicons.org/) (CC0).
77
+ Standalone Angular components (`<ea-icon-*>`) that inherit their color and scale with `font-size`, so they render at any size. The library ships the [Feather Icons](https://feathericons.com/) set (286 icons at their canonical slugs) by [Cole Bemis](https://github.com/colebemis), used under the [MIT License](https://github.com/feathericons/feather/blob/master/LICENSE), plus additional line icons from [Lucide](https://lucide.dev/) (ISC License), a set of original Eagami UI additions (basic shapes, household objects, the Eagami brand mark), and a coloured brand-icon set for nominative use that includes marks from [Simple Icons](https://simpleicons.org/) (CC0).
78
78
 
79
79
  Each icon component exposes `static readonly` metadata so consumers can build catalogues, search indices, or doc tables without importing every icon:
80
80
 
@@ -3660,7 +3660,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
3660
3660
  args: [{ providedIn: 'root' }]
3661
3661
  }], ctorParameters: () => [] });
3662
3662
 
3663
- // Excludes U+202F and U+00A0 so the substitution is idempotent.
3663
+ // Excludes U+202F and U+00A0 so the substitution is idempotent
3664
3664
  const SPACE_BEFORE_HIGH_PUNCT = / ([!?:;»])/g;
3665
3665
  const SPACE_AFTER_OPEN_GUILLEMET = /(«) /g;
3666
3666
  /**
@@ -4211,7 +4211,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
4211
4211
  */
4212
4212
  function controlErrorStateFrom(control, config) {
4213
4213
  const i18n = inject(EagamiI18nService);
4214
- // Bumped on every status/touched change so the computed re-reads the control.
4214
+ // Bumped on every status/touched change so the computed re-reads the control
4215
4215
  const revision = signal(0, ...(ngDevMode ? [{ debugName: "revision" }] : /* istanbul ignore next */ []));
4216
4216
  effect(onCleanup => {
4217
4217
  const ctrl = control();
@@ -4570,7 +4570,7 @@ class PopoverComponent {
4570
4570
  this.stable.set(false);
4571
4571
  return;
4572
4572
  }
4573
- // Re-read inputs so signal subscriptions stay current after a re-open.
4573
+ // Re-read inputs so signal subscriptions stay current after a re-open
4574
4574
  this.placement();
4575
4575
  this.offset();
4576
4576
  this.flip();
@@ -6672,7 +6672,7 @@ class CheckboxComponent {
6672
6672
  useExisting: forwardRef(() => CheckboxComponent),
6673
6673
  multi: true,
6674
6674
  },
6675
- ], ngImport: i0, template: "<div class=\"ea-checkbox-field\">\n <label\n class=\"ea-checkbox\"\n [ngClass]=\"hostClasses()\"\n [for]=\"id()\">\n <input\n #inputEl\n type=\"checkbox\"\n class=\"ea-checkbox__input\"\n [id]=\"id()\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [indeterminate]=\"indeterminate()\"\n [attr.aria-checked]=\"indeterminate() ? 'mixed' : checked()\"\n [attr.aria-label]=\"!label() ? (ariaLabel() ?? null) : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (change)=\"handleChange()\" />\n\n <span\n class=\"ea-checkbox__box\"\n aria-hidden=\"true\">\n @if (indeterminate()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\" />\n </svg>\n } @else if (checked()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </span>\n\n @if (label()) {\n <span\n class=\"ea-checkbox__label\"\n [class.ea-checkbox__label--required]=\"required()\">\n {{ label() }}\n @if (count() !== undefined && count() !== null) {\n <span class=\"ea-checkbox__count\">{{ count() }}</span>\n }\n </span>\n }\n </label>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n", styles: [":host{display:inline-flex;vertical-align:middle;line-height:1}.ea-checkbox-field{display:inline-flex;flex-direction:column;gap:var(--space-1-5)}.ea-checkbox{display:inline-flex;align-items:center;gap:.5em;cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-checkbox--xs{font-size:var(--font-size-xs)}.ea-checkbox--sm{font-size:var(--font-size-sm)}.ea-checkbox--md{font-size:var(--font-size-md)}.ea-checkbox--lg{font-size:var(--font-size-lg)}.ea-checkbox--xl{font-size:var(--font-size-xl)}.ea-checkbox--disabled{opacity:.45;cursor:not-allowed}.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:var(--color-brand-default);border-color:var(--color-brand-default);color:var(--color-text-inverse)}@media(forced-colors:active){.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-checkbox:hover:not(.ea-checkbox--disabled) .ea-checkbox__box{border-color:var(--color-brand-default)}.ea-checkbox__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ea-checkbox__input:focus-visible+.ea-checkbox__box{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-checkbox__input:focus-visible+.ea-checkbox__box{outline:2px solid Highlight;outline-offset:2px}}.ea-checkbox__box{position:relative;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-sizing:border-box;width:1.25em;height:1.25em;border:var(--border-width-thin) solid var(--color-border-strong);border-radius:var(--radius-sm);background-color:var(--color-bg-base);transition:var(--transition-colors),var(--transition-shadow)}.ea-checkbox__box svg{position:absolute;width:65%;height:65%}.ea-checkbox__label{font-weight:var(--font-weight-regular)}.ea-checkbox__label--required:after{content:\" *\";color:var(--color-error-default)}.ea-checkbox__count{margin-inline-start:.25em;color:var(--color-text-tertiary)}.ea-checkbox--error .ea-checkbox__box{border-color:var(--color-error-default)}\n"], dependencies: [{ kind: "component", type: FieldMessagesComponent, selector: "ea-field-messages", inputs: ["id", "error", "hint"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6675
+ ], ngImport: i0, template: "<div class=\"ea-checkbox-field\">\n <label\n class=\"ea-checkbox\"\n [ngClass]=\"hostClasses()\"\n [for]=\"id()\">\n <input\n #inputEl\n type=\"checkbox\"\n class=\"ea-checkbox__input\"\n [id]=\"id()\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [indeterminate]=\"indeterminate()\"\n [attr.aria-checked]=\"indeterminate() ? 'mixed' : checked()\"\n [attr.aria-label]=\"!label() ? (ariaLabel() ?? null) : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (change)=\"handleChange()\" />\n\n <span\n class=\"ea-checkbox__box\"\n aria-hidden=\"true\">\n @if (indeterminate()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\" />\n </svg>\n } @else if (checked()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </span>\n\n @if (label()) {\n <span\n class=\"ea-checkbox__label\"\n [class.ea-checkbox__label--required]=\"required()\">\n {{ label() }}\n @if (count() !== undefined && count() !== null) {\n <span class=\"ea-checkbox__count\">{{ count() }}</span>\n }\n </span>\n }\n </label>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n", styles: [":host{display:inline-flex;vertical-align:middle;line-height:1}.ea-checkbox-field{display:inline-flex;flex-direction:column;gap:var(--space-1-5)}.ea-checkbox{display:inline-flex;align-items:center;gap:.5em;cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-checkbox--xs{font-size:var(--font-size-xs)}.ea-checkbox--sm{font-size:var(--font-size-sm)}.ea-checkbox--md{font-size:var(--font-size-md)}.ea-checkbox--lg{font-size:var(--font-size-lg)}.ea-checkbox--xl{font-size:var(--font-size-xl)}.ea-checkbox--disabled{opacity:.45;cursor:not-allowed}.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:var(--color-brand-default);border-color:var(--color-brand-default);color:var(--color-text-inverse)}@media(forced-colors:active){.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-checkbox:hover:not(.ea-checkbox--disabled) .ea-checkbox__box{border-color:var(--color-brand-default)}.ea-checkbox__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ea-checkbox__input:focus-visible+.ea-checkbox__box{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-checkbox__input:focus-visible+.ea-checkbox__box{outline:2px solid Highlight;outline-offset:2px}}.ea-checkbox__box{position:relative;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-sizing:border-box;width:1.25em;height:1.25em;border:var(--border-width-thin) solid var(--color-border-strong);border-radius:var(--radius-sm);background-color:var(--color-bg-base);transition:var(--transition-colors),var(--transition-shadow)}.ea-checkbox__box svg{position:absolute;width:65%;height:65%}.ea-checkbox__label{font-weight:var(--font-weight-regular);color:var(--ea-checkbox-label-color, inherit);transition:color var(--duration-fast) var(--ease-out)}.ea-checkbox__label--required:after{content:\" *\";color:var(--color-error-default)}.ea-checkbox__count{margin-inline-start:.25em;color:var(--ea-checkbox-count-color, var(--color-text-tertiary));transition:color var(--duration-fast) var(--ease-out)}.ea-checkbox--error .ea-checkbox__box{border-color:var(--color-error-default)}\n"], dependencies: [{ kind: "component", type: FieldMessagesComponent, selector: "ea-field-messages", inputs: ["id", "error", "hint"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6676
6676
  }
6677
6677
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: CheckboxComponent, decorators: [{
6678
6678
  type: Component,
@@ -6682,7 +6682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
6682
6682
  useExisting: forwardRef(() => CheckboxComponent),
6683
6683
  multi: true,
6684
6684
  },
6685
- ], template: "<div class=\"ea-checkbox-field\">\n <label\n class=\"ea-checkbox\"\n [ngClass]=\"hostClasses()\"\n [for]=\"id()\">\n <input\n #inputEl\n type=\"checkbox\"\n class=\"ea-checkbox__input\"\n [id]=\"id()\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [indeterminate]=\"indeterminate()\"\n [attr.aria-checked]=\"indeterminate() ? 'mixed' : checked()\"\n [attr.aria-label]=\"!label() ? (ariaLabel() ?? null) : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (change)=\"handleChange()\" />\n\n <span\n class=\"ea-checkbox__box\"\n aria-hidden=\"true\">\n @if (indeterminate()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\" />\n </svg>\n } @else if (checked()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </span>\n\n @if (label()) {\n <span\n class=\"ea-checkbox__label\"\n [class.ea-checkbox__label--required]=\"required()\">\n {{ label() }}\n @if (count() !== undefined && count() !== null) {\n <span class=\"ea-checkbox__count\">{{ count() }}</span>\n }\n </span>\n }\n </label>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n", styles: [":host{display:inline-flex;vertical-align:middle;line-height:1}.ea-checkbox-field{display:inline-flex;flex-direction:column;gap:var(--space-1-5)}.ea-checkbox{display:inline-flex;align-items:center;gap:.5em;cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-checkbox--xs{font-size:var(--font-size-xs)}.ea-checkbox--sm{font-size:var(--font-size-sm)}.ea-checkbox--md{font-size:var(--font-size-md)}.ea-checkbox--lg{font-size:var(--font-size-lg)}.ea-checkbox--xl{font-size:var(--font-size-xl)}.ea-checkbox--disabled{opacity:.45;cursor:not-allowed}.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:var(--color-brand-default);border-color:var(--color-brand-default);color:var(--color-text-inverse)}@media(forced-colors:active){.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-checkbox:hover:not(.ea-checkbox--disabled) .ea-checkbox__box{border-color:var(--color-brand-default)}.ea-checkbox__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ea-checkbox__input:focus-visible+.ea-checkbox__box{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-checkbox__input:focus-visible+.ea-checkbox__box{outline:2px solid Highlight;outline-offset:2px}}.ea-checkbox__box{position:relative;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-sizing:border-box;width:1.25em;height:1.25em;border:var(--border-width-thin) solid var(--color-border-strong);border-radius:var(--radius-sm);background-color:var(--color-bg-base);transition:var(--transition-colors),var(--transition-shadow)}.ea-checkbox__box svg{position:absolute;width:65%;height:65%}.ea-checkbox__label{font-weight:var(--font-weight-regular)}.ea-checkbox__label--required:after{content:\" *\";color:var(--color-error-default)}.ea-checkbox__count{margin-inline-start:.25em;color:var(--color-text-tertiary)}.ea-checkbox--error .ea-checkbox__box{border-color:var(--color-error-default)}\n"] }]
6685
+ ], template: "<div class=\"ea-checkbox-field\">\n <label\n class=\"ea-checkbox\"\n [ngClass]=\"hostClasses()\"\n [for]=\"id()\">\n <input\n #inputEl\n type=\"checkbox\"\n class=\"ea-checkbox__input\"\n [id]=\"id()\"\n [checked]=\"checked()\"\n [disabled]=\"isDisabled()\"\n [required]=\"required()\"\n [indeterminate]=\"indeterminate()\"\n [attr.aria-checked]=\"indeterminate() ? 'mixed' : checked()\"\n [attr.aria-label]=\"!label() ? (ariaLabel() ?? null) : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"hasError() || null\"\n [attr.aria-describedby]=\"\n showError() ? id() + '-error' : showHint() ? id() + '-hint' : null\n \"\n (change)=\"handleChange()\" />\n\n <span\n class=\"ea-checkbox__box\"\n aria-hidden=\"true\">\n @if (indeterminate()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 8h8\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\" />\n </svg>\n } @else if (checked()) {\n <svg\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M3.5 8.5L6.5 11.5L12.5 4.5\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n }\n </span>\n\n @if (label()) {\n <span\n class=\"ea-checkbox__label\"\n [class.ea-checkbox__label--required]=\"required()\">\n {{ label() }}\n @if (count() !== undefined && count() !== null) {\n <span class=\"ea-checkbox__count\">{{ count() }}</span>\n }\n </span>\n }\n </label>\n\n <ea-field-messages\n [id]=\"id()\"\n [error]=\"errorText()\"\n [hint]=\"showHint() ? hint() : null\" />\n</div>\n", styles: [":host{display:inline-flex;vertical-align:middle;line-height:1}.ea-checkbox-field{display:inline-flex;flex-direction:column;gap:var(--space-1-5)}.ea-checkbox{display:inline-flex;align-items:center;gap:.5em;cursor:pointer;-webkit-user-select:none;user-select:none;font-family:var(--font-family-sans);color:var(--color-text-primary)}.ea-checkbox--xs{font-size:var(--font-size-xs)}.ea-checkbox--sm{font-size:var(--font-size-sm)}.ea-checkbox--md{font-size:var(--font-size-md)}.ea-checkbox--lg{font-size:var(--font-size-lg)}.ea-checkbox--xl{font-size:var(--font-size-xl)}.ea-checkbox--disabled{opacity:.45;cursor:not-allowed}.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:var(--color-brand-default);border-color:var(--color-brand-default);color:var(--color-text-inverse)}@media(forced-colors:active){.ea-checkbox--checked .ea-checkbox__box,.ea-checkbox--indeterminate .ea-checkbox__box{background-color:Highlight;border-color:Highlight;color:HighlightText}}.ea-checkbox:hover:not(.ea-checkbox--disabled) .ea-checkbox__box{border-color:var(--color-brand-default)}.ea-checkbox__input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.ea-checkbox__input:focus-visible+.ea-checkbox__box{box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-checkbox__input:focus-visible+.ea-checkbox__box{outline:2px solid Highlight;outline-offset:2px}}.ea-checkbox__box{position:relative;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-sizing:border-box;width:1.25em;height:1.25em;border:var(--border-width-thin) solid var(--color-border-strong);border-radius:var(--radius-sm);background-color:var(--color-bg-base);transition:var(--transition-colors),var(--transition-shadow)}.ea-checkbox__box svg{position:absolute;width:65%;height:65%}.ea-checkbox__label{font-weight:var(--font-weight-regular);color:var(--ea-checkbox-label-color, inherit);transition:color var(--duration-fast) var(--ease-out)}.ea-checkbox__label--required:after{content:\" *\";color:var(--color-error-default)}.ea-checkbox__count{margin-inline-start:.25em;color:var(--ea-checkbox-count-color, var(--color-text-tertiary));transition:color var(--duration-fast) var(--ease-out)}.ea-checkbox--error .ea-checkbox__box{border-color:var(--color-error-default)}\n"] }]
6686
6686
  }], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], count: [{ type: i0.Input, args: [{ isSignal: true, alias: "count", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], errorMsg: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMsg", required: false }] }], errorMessages: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorMessages", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], checked: [{ type: i0.Input, args: [{ isSignal: true, alias: "checked", required: false }] }, { type: i0.Output, args: ["checkedChange"] }], changed: [{ type: i0.Output, args: ["changed"] }] } });
6687
6687
 
6688
6688
  class SearchIconComponent extends IconComponentBase {
@@ -7520,7 +7520,7 @@ class ColorPickerComponent {
7520
7520
  }
7521
7521
  }
7522
7522
  onHexBlur() {
7523
- // Reset the partial text to the canonical hex of the current color.
7523
+ // Reset the partial text to the canonical hex of the current color
7524
7524
  this.hexInputValue.set(this.hexDisplay());
7525
7525
  this.onTouched();
7526
7526
  }
@@ -7629,7 +7629,7 @@ class ColorPickerComponent {
7629
7629
  }
7630
7630
  applyRgba(r, g, b, a, commit, refreshHex = true) {
7631
7631
  const hsv = rgbToHsv(r, g, b);
7632
- // Preserve current hue when the new color is achromatic (sat = 0).
7632
+ // Preserve current hue when the new color is achromatic (sat = 0)
7633
7633
  this.hue.set(hsv.s === 0 ? this.hue() : hsv.h);
7634
7634
  this.sat.set(hsv.s);
7635
7635
  this.val.set(hsv.v);
@@ -8123,7 +8123,7 @@ class DataTableComponent {
8123
8123
  // Roving-tabindex active cell for grid navigation. Row 0 is the header row;
8124
8124
  // body rows are 1..N. Only meaningful while `navigable` is true.
8125
8125
  activeCell = signal({ row: 0, col: 0 }, ...(ngDevMode ? [{ debugName: "activeCell" }] : /* istanbul ignore next */ []));
8126
- // Rows skipped per PageUp/PageDown within the grid body.
8126
+ // Rows skipped per PageUp/PageDown within the grid body
8127
8127
  static PAGE_JUMP = 10;
8128
8128
  columns = input.required(...(ngDevMode ? [{ debugName: "columns" }] : /* istanbul ignore next */ []));
8129
8129
  data = input.required(...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
@@ -8496,7 +8496,7 @@ class CodeInputComponent {
8496
8496
  const index = Math.min(val.length, this.length() - 1);
8497
8497
  this.focusDigit(index);
8498
8498
  }
8499
- // Removes disallowed characters: whitespace in free mode, non-digits otherwise.
8499
+ // Removes disallowed characters: whitespace in free mode, non-digits otherwise
8500
8500
  sanitize(text) {
8501
8501
  return this.allowAllChars() ? text.replace(/\s/g, '') : text.replace(/[^0-9]/g, '');
8502
8502
  }
@@ -9274,7 +9274,7 @@ class DrawerComponent {
9274
9274
  const drawerRef = this.drawerEl()?.nativeElement;
9275
9275
  const open = this.open();
9276
9276
  const mode = this.mode();
9277
- // Re-run the push measurement if size, position, or target change while open.
9277
+ // Re-run the push measurement if size, position, or target change while open
9278
9278
  this.size();
9279
9279
  this.position();
9280
9280
  this.pushTarget();
@@ -9283,7 +9283,7 @@ class DrawerComponent {
9283
9283
  if (!drawerRef || !this.isBrowser) {
9284
9284
  return;
9285
9285
  }
9286
- // Push mode stays non-modal so the page behind it remains interactive.
9286
+ // Push mode stays non-modal so the page behind it remains interactive
9287
9287
  const wantModal = mode !== 'push';
9288
9288
  if (open) {
9289
9289
  if (!drawerRef.open) {
@@ -9293,7 +9293,7 @@ class DrawerComponent {
9293
9293
  this.opened.emit();
9294
9294
  }
9295
9295
  else if (this.isLeaving) {
9296
- // Reopened mid-exit: cancel the pending close and slide back in.
9296
+ // Reopened mid-exit: cancel the pending close and slide back in
9297
9297
  this.enter(true);
9298
9298
  }
9299
9299
  else if (this.shownAsModal !== wantModal) {
@@ -9409,7 +9409,7 @@ class DrawerComponent {
9409
9409
  }
9410
9410
  }
9411
9411
  finishClose(dialog) {
9412
- // A reopen during the exit animation supersedes the close.
9412
+ // A reopen during the exit animation supersedes the close
9413
9413
  if (this.open()) {
9414
9414
  return;
9415
9415
  }
@@ -9432,7 +9432,7 @@ class DrawerComponent {
9432
9432
  this.open.set(false);
9433
9433
  this.closed.emit();
9434
9434
  }
9435
- // Non-modal push drawers do not emit `cancel`, so Escape is handled here.
9435
+ // Non-modal push drawers do not emit `cancel`, so Escape is handled here
9436
9436
  handleKeydown(event) {
9437
9437
  if (this.mode() === 'push' && this.closeOnEscape() && event.key === 'Escape') {
9438
9438
  this.handleClose();
@@ -9484,7 +9484,7 @@ class DrawerComponent {
9484
9484
  const ease = animation === 'linear' ? 'var(--ease-linear)' : 'var(--ease-out)';
9485
9485
  target.style.transition = `padding var(--duration-slower) ${ease}`;
9486
9486
  }
9487
- // Clear every side first so a position change never stacks two offsets.
9487
+ // Clear every side first so a position change never stacks two offsets
9488
9488
  this.clearPushProperties(target);
9489
9489
  target.style.setProperty(PUSH_PROPERTY[position], `${size}px`);
9490
9490
  this.pushedTarget = target;
@@ -9546,7 +9546,7 @@ class DrawerComponent {
9546
9546
  this.documentPointerListener = null;
9547
9547
  }
9548
9548
  }
9549
- // Removes the push styles immediately, for teardown where no animation is wanted.
9549
+ // Removes the push styles immediately, for teardown where no animation is wanted
9550
9550
  teardownPush() {
9551
9551
  if (this.pushRaf !== null) {
9552
9552
  cancelAnimationFrame(this.pushRaf);
@@ -9586,7 +9586,7 @@ class DrawerComponent {
9586
9586
  // keep the drawer open; otherwise mirror the close back into the model.
9587
9587
  onDialogClose() {
9588
9588
  const drawerRef = this.drawerEl()?.nativeElement;
9589
- // Ignore the stale close event fired while reopening to switch modality.
9589
+ // Ignore the stale close event fired while reopening to switch modality
9590
9590
  if (this.reopening || !this.open() || drawerRef?.open) {
9591
9591
  return;
9592
9592
  }
@@ -10285,7 +10285,7 @@ class EagamiWordmarkComponent {
10285
10285
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: EagamiWordmarkComponent, decorators: [{
10286
10286
  type: Component,
10287
10287
  args: [{ selector: 'ea-eagami-wordmark', imports: [EagamiIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: {
10288
- // The wordmark is a fixed brand lockup; it never mirrors with UI direction.
10288
+ // The wordmark is a fixed brand lockup; it never mirrors with UI direction
10289
10289
  dir: 'ltr',
10290
10290
  '[style.--_size]': 'resolvedSize()',
10291
10291
  }, template: "<a\n class=\"ea-eagami-wordmark\"\n [class.ea-eagami-wordmark--inline]=\"layout() === 'inline'\"\n href=\"https://eagami.com\"\n target=\"_blank\"\n rel=\"noopener\"\n [attr.aria-label]=\"ariaLabel()\">\n <ea-icon-eagami\n class=\"ea-eagami-wordmark__logo\"\n aria-hidden=\"true\" />\n\n <span class=\"ea-eagami-wordmark__text\">\n @if (showOverline()) {\n <span class=\"ea-eagami-wordmark__overline\">\n {{ i18n.messages().wordmark.overline }}\n </span>\n }\n <span class=\"ea-eagami-wordmark__brand\">{{ brandText() }}</span>\n @if (showTagline()) {\n @if (layout() === 'inline') {\n <span\n class=\"ea-eagami-wordmark__separator\"\n aria-hidden=\"true\">\n \u2014\n </span>\n }\n <span class=\"ea-eagami-wordmark__tagline\">\n {{ i18n.messages().wordmark.tagline }}\n </span>\n }\n </span>\n</a>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Syne:wght@400;500&display=swap\";:host{display:inline-block;line-height:var(--line-height-none)}.ea-eagami-wordmark{display:inline-flex;align-items:center;border-radius:var(--radius-sm);color:var(--color-text-primary);text-decoration:none;transition:var(--transition-opacity)}.ea-eagami-wordmark:hover{opacity:.75}.ea-eagami-wordmark:focus-visible{outline:none;box-shadow:var(--shadow-focus-ring)}@media(forced-colors:active){.ea-eagami-wordmark:focus-visible{outline:2px solid Highlight;outline-offset:2px}}.ea-eagami-wordmark__logo{flex-shrink:0;font-size:calc(var(--_size) * 1px);forced-color-adjust:none}.ea-eagami-wordmark__text{display:inline-flex;flex-direction:column;align-items:center;justify-content:center;line-height:var(--line-height-tight)}.ea-eagami-wordmark__overline,.ea-eagami-wordmark__brand,.ea-eagami-wordmark__tagline{white-space:nowrap;text-transform:lowercase}.ea-eagami-wordmark__overline,.ea-eagami-wordmark__separator,.ea-eagami-wordmark__tagline{font-size:calc(var(--_size) * .2px);font-weight:var(--font-weight-regular);letter-spacing:var(--letter-spacing-wide);font-family:var(--font-family-sans);color:var(--color-text-secondary)}.ea-eagami-wordmark__overline{color:var(--ea-eagami-wordmark-overline-color, var(--color-text-secondary))}.ea-eagami-wordmark__brand{font-size:calc(var(--_size) * .5px);font-weight:var(--font-weight-medium);letter-spacing:var(--letter-spacing-wide);font-family:var(--font-family-brand)}.ea-eagami-wordmark--inline .ea-eagami-wordmark__text{flex-direction:row;align-items:baseline;gap:calc(var(--_size) * .2px)}.ea-eagami-wordmark--inline .ea-eagami-wordmark__overline,.ea-eagami-wordmark--inline .ea-eagami-wordmark__separator,.ea-eagami-wordmark--inline .ea-eagami-wordmark__tagline{font-size:calc(var(--_size) * .5px)}\n"] }]
@@ -11134,7 +11134,7 @@ class FileUploaderComponent {
11134
11134
  if (files.length) {
11135
11135
  this.acceptFiles(files);
11136
11136
  }
11137
- // Reset so re-picking the same file re-triggers the input.
11137
+ // Reset so re-picking the same file re-triggers the input
11138
11138
  inputEl.value = '';
11139
11139
  }
11140
11140
  onDragOver(event) {
@@ -11603,7 +11603,7 @@ class InputComponent {
11603
11603
  const el = event.target;
11604
11604
  let value = el.value;
11605
11605
  const maxLen = this.maxLength();
11606
- // Native maxlength is ignored on number inputs, so enforce it here.
11606
+ // Native maxlength is ignored on number inputs, so enforce it here
11607
11607
  if (this.type() === 'number' && maxLen != null && value.length > maxLen) {
11608
11608
  value = value.slice(0, maxLen);
11609
11609
  el.value = value;
@@ -12256,7 +12256,7 @@ class MultiSelectComponent {
12256
12256
  this.triggerEl()?.nativeElement.focus();
12257
12257
  }
12258
12258
  else if (event.key === 'Backspace' && this.hasValue() && !this.isOpen()) {
12259
- // Quick-remove the last chip when the trigger is focused and no popover.
12259
+ // Quick-remove the last chip when the trigger is focused and no popover
12260
12260
  event.preventDefault();
12261
12261
  this.commit(this.value().slice(0, -1));
12262
12262
  }
@@ -14097,7 +14097,7 @@ class StepperComponent {
14097
14097
  if (nextIndex >= 0 && nextIndex !== this.activeStep()) {
14098
14098
  this.selectStep(nextIndex);
14099
14099
  const buttons = event.currentTarget.querySelectorAll('.ea-stepper__button:not([disabled])');
14100
- // Match the focused button to the new index (visit order matches DOM order).
14100
+ // Match the focused button to the new index (visit order matches DOM order)
14101
14101
  const reachableIndices = this.registeredSteps()
14102
14102
  .map((_, i) => i)
14103
14103
  .filter(i => this.canNavigateTo(i));
@@ -14856,7 +14856,7 @@ class TimePickerComponent {
14856
14856
  else if (event.key === 'PageUp') {
14857
14857
  event.preventDefault();
14858
14858
  this.flushBuffer();
14859
- // Coarse step: 5× the configured step (or 10 for hours).
14859
+ // Coarse step: 5× the configured step (or 10 for hours)
14860
14860
  const coarse = unit === 'hours' ? 10 : 5;
14861
14861
  for (let i = 0; i < coarse; i++) {
14862
14862
  this.step(unit, 1);
@@ -14893,7 +14893,7 @@ class TimePickerComponent {
14893
14893
  /** Select-all on focus so the first keystroke replaces the current value. */
14894
14894
  onSpinnerFocus(event) {
14895
14895
  const el = event.currentTarget;
14896
- // afterNextRender-ish: wait one tick so iOS / Safari accept the select().
14896
+ // afterNextRender-ish: wait one tick so iOS / Safari accept the select()
14897
14897
  queueMicrotask(() => el.select());
14898
14898
  }
14899
14899
  /**
@@ -24810,6 +24810,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
24810
24810
  class FramerIconComponent extends IconComponentBase {
24811
24811
  static slug = 'framer';
24812
24812
  static category = 'feather';
24813
+ static isBrand = true;
24813
24814
  static tags = [
24814
24815
  'framer',
24815
24816
  'design',