@eagami/ui 5.26.0 → 5.27.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.26.0",
3
+ "version": "5.27.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",
@@ -149,10 +149,22 @@ $target-size-min: 24px;
149
149
  }
150
150
  }
151
151
 
152
+ // Hairline rule for a pseudo-element, so it spans its container's inner edges
153
+ // instead of being inset by the content's own padding. `$inset` pulls the rule
154
+ // in from those edges, matching a list that pads its rows.
155
+ @mixin divider-rule($edge: top, $inset: 0) {
156
+ position: absolute;
157
+ #{$edge}: 0;
158
+ inset-inline-end: $inset;
159
+ inset-inline-start: $inset;
160
+ height: var(--border-width-thin);
161
+ background-color: var(--color-divider);
162
+ content: '';
163
+ }
164
+
152
165
  // Section wrapper in a grouped select-like option list, and the rule an
153
- // unlabelled section carries in place of a heading. The rule is a
154
- // pseudo-element so it spans the list's inner edges instead of being inset by
155
- // the option padding, and stays out of the option list entirely.
166
+ // unlabelled section carries in place of a heading. The rule stays out of the
167
+ // option list entirely.
156
168
  @mixin option-group {
157
169
  position: relative;
158
170
 
@@ -161,13 +173,7 @@ $target-size-min: 24px;
161
173
  margin-top: 0.25em;
162
174
 
163
175
  &::before {
164
- position: absolute;
165
- top: 0;
166
- inset-inline-end: 0;
167
- inset-inline-start: 0;
168
- height: var(--border-width-thin);
169
- background-color: var(--color-divider);
170
- content: '';
176
+ @include divider-rule;
171
177
  }
172
178
  }
173
179
  }
@@ -1231,12 +1231,14 @@ interface CommandPaletteItem<T = unknown> {
1231
1231
  data?: T;
1232
1232
  }
1233
1233
 
1234
+ interface PaletteEntry {
1235
+ item: CommandPaletteItem;
1236
+ flatIndex: number;
1237
+ disabled: boolean;
1238
+ }
1234
1239
  interface GroupedItems {
1235
1240
  group: string;
1236
- items: ReadonlyArray<{
1237
- item: CommandPaletteItem;
1238
- flatIndex: number;
1239
- }>;
1241
+ items: readonly PaletteEntry[];
1240
1242
  }
1241
1243
  /**
1242
1244
  * `<ea-command-palette>` is a search-driven action launcher: a modal dialog
@@ -1274,15 +1276,17 @@ declare class CommandPaletteComponent {
1274
1276
  /**
1275
1277
  * Items bucketed by `group`, then flattened back into display order
1276
1278
  * (ungrouped items first, then each named group). The matching
1277
- * `filteredItems` array follows this same order so `flatIndex` lines up
1278
- * one-to-one with what the user sees.
1279
+ * `filteredEntries` array follows this same order so `flatIndex` lines up
1280
+ * one-to-one with what the user sees. Each entry resolves its disabled state
1281
+ * once here, so a consumer's `disabledWhen` runs once per match rather than
1282
+ * on every binding read.
1279
1283
  */
1280
1284
  protected readonly groupedItems: _angular_core.Signal<GroupedItems[]>;
1281
1285
  /**
1282
1286
  * Flat list of matches in display order. Drives keyboard navigation and
1283
1287
  * `aria-activedescendant`.
1284
1288
  */
1285
- protected readonly filteredItems: _angular_core.Signal<CommandPaletteItem<unknown>[]>;
1289
+ protected readonly filteredEntries: _angular_core.Signal<PaletteEntry[]>;
1286
1290
  private readonly _activeIndex;
1287
1291
  /**
1288
1292
  * Tracks what the user last did so the visual highlight only renders when
@@ -1297,10 +1301,11 @@ declare class CommandPaletteComponent {
1297
1301
  */
1298
1302
  private readonly interaction;
1299
1303
  protected readonly activeIndex: _angular_core.Signal<number>;
1300
- protected readonly activeId: _angular_core.Signal<string | null>;
1304
+ protected readonly activeId: _angular_core.Signal<string | undefined>;
1301
1305
  constructor();
1302
1306
  protected itemDomId(item: CommandPaletteItem): string;
1303
- protected isItemDisabled(item: CommandPaletteItem): boolean;
1307
+ /** Index of the first enabled entry from `start`, walking in `step`; -1 when none. */
1308
+ private firstEnabled;
1304
1309
  protected isActive(flatIndex: number): boolean;
1305
1310
  /**
1306
1311
  * Whether the active row should render its highlighted background right
@@ -1316,8 +1321,8 @@ declare class CommandPaletteComponent {
1316
1321
  /** Home/End move to the first enabled item from the given end. */
1317
1322
  private edgeActive;
1318
1323
  private setActiveByKeyboard;
1319
- protected onItemClick(item: CommandPaletteItem): void;
1320
- protected onItemMouseEnter(flatIndex: number): void;
1324
+ protected onItemClick(entry: PaletteEntry): void;
1325
+ protected onItemMouseEnter(entry: PaletteEntry): void;
1321
1326
  protected onListMouseLeave(): void;
1322
1327
  protected onBackdropClick(event: MouseEvent): void;
1323
1328
  protected onDialogClose(): void;
@@ -2329,7 +2334,7 @@ declare class InputComponent implements ControlValueAccessor {
2329
2334
  /** `id` of the popup element the input controls, forwarded as `aria-controls`. */
2330
2335
  readonly ariaControls: _angular_core.InputSignal<string | undefined>;
2331
2336
  /** `id` of the active option in a controlled popup, forwarded as `aria-activedescendant`. */
2332
- readonly ariaActivedescendant: _angular_core.InputSignal<string | null | undefined>;
2337
+ readonly ariaActivedescendant: _angular_core.InputSignal<string | undefined>;
2333
2338
  /** Autocomplete behavior hint, forwarded as `aria-autocomplete`. */
2334
2339
  readonly ariaAutocomplete: _angular_core.InputSignal<"none" | "inline" | "list" | "both" | undefined>;
2335
2340
  /** Native input type; `password` adds a built-in show/hide toggle. */
@@ -2356,6 +2361,8 @@ declare class InputComponent implements ControlValueAccessor {
2356
2361
  readonly required: _angular_core.InputSignal<boolean>;
2357
2362
  /** Value for the native `autocomplete` attribute. */
2358
2363
  readonly autocomplete: _angular_core.InputSignal<string | undefined>;
2364
+ /** Value for the native `spellcheck` attribute; left to the browser default when unset. */
2365
+ readonly spellcheck: _angular_core.InputSignal<boolean | undefined>;
2359
2366
  /** `id` of a `<datalist>` to associate for native suggestions. */
2360
2367
  readonly list: _angular_core.InputSignal<string | undefined>;
2361
2368
  /** Minimum value for `type="number"`; the value is clamped to it on blur. */
@@ -2426,7 +2433,7 @@ declare class InputComponent implements ControlValueAccessor {
2426
2433
  /** Moves keyboard focus to the underlying native input element. */
2427
2434
  focus(): void;
2428
2435
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
2429
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "ea-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "ariaExpanded": { "alias": "aria-expanded"; "required": false; "isSignal": true; }; "ariaControls": { "alias": "aria-controls"; "required": false; "isSignal": true; }; "ariaActivedescendant": { "alias": "aria-activedescendant"; "required": false; "isSignal": true; }; "ariaAutocomplete": { "alias": "aria-autocomplete"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "keepIcon": { "alias": "keepIcon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "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; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "list": { "alias": "list"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "showPasswordToggle": { "alias": "showPasswordToggle"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "focused": "focused"; "blurred": "blurred"; }, never, ["[slot=prefix]", "[slot=suffix]"], true, never>;
2436
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "ea-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "aria-label"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "ariaExpanded": { "alias": "aria-expanded"; "required": false; "isSignal": true; }; "ariaControls": { "alias": "aria-controls"; "required": false; "isSignal": true; }; "ariaActivedescendant": { "alias": "aria-activedescendant"; "required": false; "isSignal": true; }; "ariaAutocomplete": { "alias": "aria-autocomplete"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "keepIcon": { "alias": "keepIcon"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "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; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "autocomplete": { "alias": "autocomplete"; "required": false; "isSignal": true; }; "spellcheck": { "alias": "spellcheck"; "required": false; "isSignal": true; }; "list": { "alias": "list"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "step": { "alias": "step"; "required": false; "isSignal": true; }; "maxLength": { "alias": "maxLength"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; "autofocus": { "alias": "autofocus"; "required": false; "isSignal": true; }; "showPasswordToggle": { "alias": "showPasswordToggle"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "id": { "alias": "id"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "focused": "focused"; "blurred": "blurred"; }, never, ["[slot=prefix]", "[slot=suffix]"], true, never>;
2430
2437
  }
2431
2438
 
2432
2439
  /** Placement of the menu list relative to its trigger. */