@elasticias/ui 1.0.10 → 1.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elasticias/ui",
3
- "version": "1.0.10",
3
+ "version": "1.0.13",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -1586,7 +1586,8 @@
1586
1586
  }
1587
1587
  }
1588
1588
 
1589
- .row-actions__item {
1589
+ .row-actions__item,
1590
+ .ef-menu__item {
1590
1591
  appearance: none;
1591
1592
  background: transparent;
1592
1593
  border: 0;
@@ -1606,19 +1607,24 @@
1606
1607
  }
1607
1608
 
1608
1609
  .row-actions__item:hover,
1609
- .row-actions__item:focus-visible {
1610
+ .row-actions__item:focus-visible,
1611
+ .ef-menu__item:hover,
1612
+ .ef-menu__item:focus-visible {
1610
1613
  background: var(--paper);
1611
1614
  outline: 0;
1612
1615
  }
1613
1616
 
1614
- .row-actions__item[disabled] {
1617
+ .row-actions__item[disabled],
1618
+ .ef-menu__item[disabled] {
1615
1619
  opacity: 0.45;
1616
1620
  cursor: not-allowed;
1617
1621
  background: transparent;
1618
1622
  }
1619
1623
 
1620
1624
  .row-actions__item .ico,
1621
- .row-actions__item i {
1625
+ .row-actions__item i,
1626
+ .ef-menu__item .ico,
1627
+ .ef-menu__item i {
1622
1628
  width: 16px;
1623
1629
  height: 16px;
1624
1630
  font-size: 16px;
@@ -1633,11 +1639,16 @@
1633
1639
  .row-actions__item:hover .ico,
1634
1640
  .row-actions__item:hover i,
1635
1641
  .row-actions__item:focus-visible .ico,
1636
- .row-actions__item:focus-visible i {
1642
+ .row-actions__item:focus-visible i,
1643
+ .ef-menu__item:hover .ico,
1644
+ .ef-menu__item:hover i,
1645
+ .ef-menu__item:focus-visible .ico,
1646
+ .ef-menu__item:focus-visible i {
1637
1647
  color: var(--text);
1638
1648
  }
1639
1649
 
1640
- .row-actions__item .kbd {
1650
+ .row-actions__item .kbd,
1651
+ .ef-menu__item .kbd {
1641
1652
  margin-inline-start: auto;
1642
1653
  font-family: 'JetBrains Mono', monospace;
1643
1654
  font-size: 10px;
@@ -1650,26 +1661,142 @@
1650
1661
  line-height: 1;
1651
1662
  }
1652
1663
 
1653
- .row-actions__item.danger {
1664
+ .row-actions__item.danger,
1665
+ .ef-menu__item.danger {
1654
1666
  color: var(--st-cancelled-fg);
1655
1667
  }
1656
1668
 
1657
1669
  .row-actions__item.danger .ico,
1658
- .row-actions__item.danger i {
1670
+ .row-actions__item.danger i,
1671
+ .ef-menu__item.danger .ico,
1672
+ .ef-menu__item.danger i {
1659
1673
  color: var(--st-cancelled-fg);
1660
1674
  }
1661
1675
 
1662
1676
  .row-actions__item.danger:hover,
1663
- .row-actions__item.danger:focus-visible {
1677
+ .row-actions__item.danger:focus-visible,
1678
+ .ef-menu__item.danger:hover,
1679
+ .ef-menu__item.danger:focus-visible {
1664
1680
  background: var(--st-cancelled-bg);
1665
1681
  }
1666
1682
 
1667
- .row-actions__divider {
1683
+ .row-actions__divider,
1684
+ .ef-menu__divider {
1668
1685
  height: 1px;
1669
1686
  background: var(--rule);
1670
1687
  margin: 4px;
1671
1688
  }
1672
1689
 
1690
+ /* ──────────── MENU (shared) ─────────────────────────────────────
1691
+ The panel half of the menu language above, without the absolute
1692
+ positioning `.row-actions__menu` needs for its own trigger. Anything
1693
+ that already owns its placement (a popover, a bottom sheet) styles its
1694
+ surface with `.ef-menu` and fills it with `.ef-menu__item`. */
1695
+
1696
+ .ef-menu {
1697
+ display: grid;
1698
+ /* A grid track defaults to auto, so one long row would size the column and
1699
+ widen the whole panel. minmax(0, 1fr) is what lets a label truncate. */
1700
+ grid-template-columns: minmax(0, 1fr);
1701
+ gap: 1px;
1702
+ min-width: 212px;
1703
+ padding: 6px;
1704
+ background: var(--paper-alt);
1705
+ border: 1px solid var(--rule);
1706
+ border-radius: var(--r-xl);
1707
+ box-shadow: var(--shadow-3);
1708
+ }
1709
+
1710
+ /* Identity block at the top of a menu: a name and a secondary line.
1711
+ Sized to sit level with the items rather than tower over them. */
1712
+ .ef-menu__head {
1713
+ display: grid;
1714
+ gap: 1px;
1715
+ min-width: 0;
1716
+ padding: 8px 12px 7px;
1717
+ margin-bottom: 4px;
1718
+ border-bottom: 1px solid var(--rule);
1719
+ }
1720
+
1721
+ .ef-menu__head-name {
1722
+ min-width: 0;
1723
+ overflow: hidden;
1724
+ text-overflow: ellipsis;
1725
+ white-space: nowrap;
1726
+ font-size: 13.5px;
1727
+ font-weight: 700;
1728
+ line-height: 1.3;
1729
+ color: var(--text);
1730
+ }
1731
+
1732
+ .ef-menu__head-sub {
1733
+ min-width: 0;
1734
+ overflow: hidden;
1735
+ text-overflow: ellipsis;
1736
+ white-space: nowrap;
1737
+ font-size: 12px;
1738
+ line-height: 1.3;
1739
+ color: var(--text-mute);
1740
+ }
1741
+
1742
+ /* A nested group, revealed by expanding its parent row. Indented to the
1743
+ label column so the children line up under the text, not the icon. */
1744
+ /* Label takes the free space so a trailing chip or caret can sit at the
1745
+ inline end, and a long name truncates instead of widening the panel. */
1746
+ .ef-menu__label {
1747
+ flex: 1 1 auto;
1748
+ min-width: 0;
1749
+ overflow: hidden;
1750
+ text-overflow: ellipsis;
1751
+ white-space: nowrap;
1752
+ }
1753
+
1754
+ .ef-menu__item .ef-menu__caret {
1755
+ margin-inline-start: auto;
1756
+ width: 12px;
1757
+ height: 12px;
1758
+ font-size: 12px;
1759
+ }
1760
+
1761
+ .ef-menu__item .ef-menu__badge {
1762
+ margin-inline-start: auto;
1763
+ flex: 0 0 auto;
1764
+ padding: 1px 7px;
1765
+ border-radius: var(--r-pill);
1766
+ background: var(--st-cancelled-fg);
1767
+ color: #fff;
1768
+ font-size: 11px;
1769
+ font-weight: 700;
1770
+ line-height: 1.5;
1771
+ }
1772
+
1773
+ /* A popover reduced to a placement mechanism. The `.ef-menu` inside draws
1774
+ the surface, so PrimeNG must not draw a second panel or an arrow. */
1775
+ .p-popover.ef-menu-popover {
1776
+ background: transparent;
1777
+ border: 0;
1778
+ box-shadow: none;
1779
+ padding: 0;
1780
+ }
1781
+
1782
+ .p-popover.ef-menu-popover .p-popover-content {
1783
+ padding: 0;
1784
+ }
1785
+
1786
+ .p-popover.ef-menu-popover:before,
1787
+ .p-popover.ef-menu-popover:after {
1788
+ display: none;
1789
+ }
1790
+
1791
+ .ef-menu__sublist {
1792
+ display: grid;
1793
+ gap: 1px;
1794
+ margin: 0;
1795
+ padding: 0 0 2px 28px;
1796
+ list-style: none;
1797
+ min-width: 0;
1798
+ }
1799
+
1673
1800
  /* When a row-actions menu is open inside a data card, the table-wrap
1674
1801
  should let the popover escape its overflow. The data-card binds
1675
1802
  .has-open-menu when any descendant trigger is in `.open` state. */
@@ -981,6 +981,21 @@ declare class EfBuildStampComponent {
981
981
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfBuildStampComponent, "ef-build-stamp", never, { "owner": { "alias": "owner"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
982
982
  }
983
983
 
984
+ /**
985
+ * The server half of the deployment, as an app fetches it from its own API.
986
+ * Every field is optional: the dialog renders the group only for what it was
987
+ * given, so an app with no such endpoint simply omits the input.
988
+ */
989
+ interface EfAboutServer {
990
+ /** Hosting environment — may differ from the build's own environment. */
991
+ environment?: string;
992
+ /** Runtime description, e.g. `.NET 10.0.6`. */
993
+ runtime?: string;
994
+ /** Version of the API itself. */
995
+ version?: string;
996
+ /** Shared framework assemblies loaded by the API. */
997
+ packages?: EfBuildPackage[];
998
+ }
984
999
  /**
985
1000
  * "About this app" — which build is running and what shared packages it
986
1001
  * was compiled against.
@@ -1004,6 +1019,14 @@ declare class EfAboutDialogComponent {
1004
1019
  readonly product: _angular_core.InputSignal<string>;
1005
1020
  /** One muted line under the product — a tenant, a plan, an edition. */
1006
1021
  readonly edition: _angular_core.InputSignal<string>;
1022
+ /** Which organisation this deployment serves, as a labelled row. */
1023
+ readonly organisation: _angular_core.InputSignal<string>;
1024
+ /** What the API reports about itself. Leave empty to hide the group. */
1025
+ readonly server: _angular_core.InputSignal<EfAboutServer>;
1026
+ /** Outbound link, already carrying whatever query the app wants on it. */
1027
+ readonly websiteUrl: _angular_core.InputSignal<string>;
1028
+ /** What the link reads as — a domain, not a sentence. */
1029
+ readonly websiteLabel: _angular_core.InputSignal<string>;
1007
1030
  /** Brand mark. A logo wins over the initial when both are set; empty
1008
1031
  * means "none", the same way `edition` and `initial` read. */
1009
1032
  readonly logoUrl: _angular_core.InputSignal<string>;
@@ -1022,10 +1045,17 @@ declare class EfAboutDialogComponent {
1022
1045
  labelKey: string;
1023
1046
  value: string;
1024
1047
  }[]>;
1048
+ /** The API's own identity, above the assemblies it loaded. */
1049
+ protected readonly serverRows: _angular_core.Signal<{
1050
+ labelKey: string;
1051
+ value: string;
1052
+ }[]>;
1053
+ protected readonly serverPackages: _angular_core.Signal<EfBuildPackage[]>;
1054
+ protected readonly hasServer: _angular_core.Signal<boolean>;
1025
1055
  /** A footer button, not only the header ✕: a thumb needs a real target. */
1026
1056
  protected readonly closeAction: EfDialogAction[];
1027
1057
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfAboutDialogComponent, never>;
1028
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfAboutDialogComponent, "ef-about-dialog", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "product": { "alias": "product"; "required": false; "isSignal": true; }; "edition": { "alias": "edition"; "required": false; "isSignal": true; }; "logoUrl": { "alias": "logoUrl"; "required": false; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; "owner": { "alias": "owner"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; }, never, never, true, never>;
1058
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfAboutDialogComponent, "ef-about-dialog", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "product": { "alias": "product"; "required": false; "isSignal": true; }; "edition": { "alias": "edition"; "required": false; "isSignal": true; }; "organisation": { "alias": "organisation"; "required": false; "isSignal": true; }; "server": { "alias": "server"; "required": false; "isSignal": true; }; "websiteUrl": { "alias": "websiteUrl"; "required": false; "isSignal": true; }; "websiteLabel": { "alias": "websiteLabel"; "required": false; "isSignal": true; }; "logoUrl": { "alias": "logoUrl"; "required": false; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; "owner": { "alias": "owner"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; }, never, never, true, never>;
1029
1059
  }
1030
1060
 
1031
1061
  /**
@@ -1049,6 +1079,35 @@ declare class EfTooltipDirective {
1049
1079
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<EfTooltipDirective, "[efTooltip]", never, {}, {}, never, never, true, [{ directive: typeof i1.Tooltip; inputs: { "pTooltip": "efTooltip"; "tooltipPosition": "efTooltipPosition"; "tooltipDisabled": "efTooltipDisabled"; "tooltipStyleClass": "efTooltipStyleClass"; "tooltipEvent": "efTooltipEvent"; "showDelay": "efTooltipShowDelay"; "hideDelay": "efTooltipHideDelay"; "appendTo": "efTooltipAppendTo"; "autoHide": "efTooltipAutoHide"; "escape": "efTooltipEscape"; "life": "efTooltipLife"; }; outputs: {}; }]>;
1050
1080
  }
1051
1081
 
1082
+ /**
1083
+ * The keyboard-shortcuts reference: every registration currently sitting
1084
+ * in `EfShortcutService`, grouped and rendered with the same `.kbd` chip
1085
+ * `ef-row-actions` and `ef-menu` already use, so a chip means one thing
1086
+ * everywhere it appears.
1087
+ *
1088
+ * Reads `EfShortcutService.list()` directly, so it stays live: open it
1089
+ * while a row menu is on screen and its row-scoped shortcuts are already
1090
+ * listed under "Row actions". Close the row menu and, since a row's
1091
+ * shortcuts unregister with it, they're gone from here too.
1092
+ *
1093
+ * ```html
1094
+ * <ef-shortcuts-dialog [(visible)]="shortcutsOpen" />
1095
+ * ```
1096
+ */
1097
+ declare class EfShortcutsDialogComponent {
1098
+ private readonly shortcutService;
1099
+ /** Two-way open state. */
1100
+ readonly visible: _angular_core.ModelSignal<boolean>;
1101
+ protected readonly groups: _angular_core.Signal<_elasticias_core.EfShortcutGroup[]>;
1102
+ /** Only macOS reads `⌘` at a glance. Everyone else needs the line
1103
+ * spelling out that it means Ctrl. */
1104
+ protected readonly isMacPlatform: boolean;
1105
+ protected readonly closeAction: EfDialogAction[];
1106
+ protected formatKeys(keys: string): string;
1107
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfShortcutsDialogComponent, never>;
1108
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfShortcutsDialogComponent, "ef-shortcuts-dialog", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; }, never, never, true, never>;
1109
+ }
1110
+
1052
1111
  declare class EfFieldsetComponent {
1053
1112
  /** Direct legend text (not translated) */
1054
1113
  legend?: string;
@@ -1890,6 +1949,89 @@ declare class EfProfileChipComponent {
1890
1949
  static ngAcceptInputType_readonly: unknown;
1891
1950
  }
1892
1951
 
1952
+ /**
1953
+ * One row in `ef-profile-menu`.
1954
+ *
1955
+ * Navigation is a `command` like everything else: a host that wants to
1956
+ * route passes `command: () => this.router.navigate([...])`, which keeps
1957
+ * the lib free of `RouterModule`.
1958
+ */
1959
+ interface EfProfileMenuItem {
1960
+ /** Stable identifier, used for tracking and for expansion state. */
1961
+ id: string;
1962
+ /** Translation key for the row label. */
1963
+ labelKey: string;
1964
+ /** PrimeIcons class, e.g. `'pi pi-user'`. */
1965
+ icon?: string;
1966
+ /** Trailing count pill. `0` renders; `undefined` and `null` do not. */
1967
+ badge?: string | number;
1968
+ /** `'danger'` tints the row, for log out and other one-way actions. */
1969
+ severity?: 'default' | 'danger';
1970
+ /** Draw a separating rule above this row. */
1971
+ groupStart?: boolean;
1972
+ /** Rows shown when this one is expanded. A row with children never
1973
+ * runs its own `command`; choosing it toggles the group. */
1974
+ children?: EfProfileMenuItem[];
1975
+ /** What choosing the row does. */
1976
+ command?: () => void;
1977
+ }
1978
+
1979
+ /** The slice of PrimeNG's Popover this component actually calls. Typing it
1980
+ * structurally keeps the template ref usable and the tests free of PrimeNG. */
1981
+ interface Dismissible {
1982
+ hide: () => void;
1983
+ /** PrimeNG positions a popover once, when it opens. Expanding a group
1984
+ * changes the panel's height afterwards, so the host has to ask for a
1985
+ * reposition or the panel grows past the edge it was anchored to. */
1986
+ align?: () => void;
1987
+ }
1988
+ /**
1989
+ * The signed-in user's menu.
1990
+ *
1991
+ * Two renderings of one `items` array. `variant="chip"` (the default) shows
1992
+ * an `ef-profile-chip` that opens a popover, for the side footer on a
1993
+ * desktop. `variant="list"` renders the same rows flat, with no popover,
1994
+ * for the mobile sheet: `ef-app-shell` does not render the side footer on a
1995
+ * phone, and this menu is the only way to sign out, so it cannot live only
1996
+ * there.
1997
+ *
1998
+ * ```html
1999
+ * <ef-profile-menu
2000
+ * side-footer
2001
+ * [name]="userName()"
2002
+ * [secondary]="userEmail()"
2003
+ * [initial]="userInitial()"
2004
+ * [items]="menuItems()"
2005
+ * />
2006
+ * ```
2007
+ */
2008
+ declare class EfProfileMenuComponent {
2009
+ /** Display name, shown on the chip and in the panel header. */
2010
+ readonly name: _angular_core.InputSignal<string>;
2011
+ /** Second header line. The email, usually. */
2012
+ readonly secondary: _angular_core.InputSignal<string>;
2013
+ /** Chip subtitle. Falls back to `secondary` when empty. */
2014
+ readonly role: _angular_core.InputSignal<string>;
2015
+ /** Avatar glyph. Up to two characters; falls back to the first of `name`. */
2016
+ readonly initial: _angular_core.InputSignal<string>;
2017
+ readonly tone: _angular_core.InputSignal<"tenant" | "neutral">;
2018
+ readonly items: _angular_core.InputSignal<readonly EfProfileMenuItem[]>;
2019
+ readonly variant: _angular_core.InputSignal<"chip" | "list">;
2020
+ readonly itemSelected: _angular_core.OutputEmitterRef<EfProfileMenuItem>;
2021
+ /** Id of the one expanded group, or null. One at a time: a menu that
2022
+ * grows in two directions at once stops being scannable. */
2023
+ private readonly expandedId;
2024
+ readonly chipRole: _angular_core.Signal<string>;
2025
+ isExpanded(id: string): boolean;
2026
+ /**
2027
+ * Choose a row. A row with children toggles its group and leaves the
2028
+ * popover open; a leaf runs its command, reports it, and dismisses.
2029
+ */
2030
+ select(item: EfProfileMenuItem, popover?: Dismissible): void;
2031
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfProfileMenuComponent, never>;
2032
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfProfileMenuComponent, "ef-profile-menu", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "secondary": { "alias": "secondary"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; }, never, never, true, never>;
2033
+ }
2034
+
1893
2035
  declare class EfBlockUiComponent {
1894
2036
  isLoading: boolean;
1895
2037
  contentPanel: any;
@@ -4216,7 +4358,11 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4216
4358
  /** Items array for the auto row-actions cell. Rebuilt per call so
4217
4359
  * the ef-row-actions component receives a fresh closure per row.
4218
4360
  * Visibility is filtered later by ef-row-actions against
4219
- * `rowActionsContext` (ScreenContext.isGranted). */
4361
+ * `rowActionsContext` (ScreenContext.isGranted).
4362
+ *
4363
+ * `kbd` is rendered through `formatShortcut()`, not a literal glyph:
4364
+ * `ef-row-actions` binds these same keys for real while the row's
4365
+ * menu is open, and a hardcoded `'⌘D'` would lie to a Windows user. */
4220
4366
  defaultRowActions(row: TRow): ReadonlyArray<EfRowAction>;
4221
4367
  bodyTemplate(columnId: string): TemplateRef<unknown> | undefined;
4222
4368
  headerTemplate(columnId: string): TemplateRef<unknown> | undefined;
@@ -4325,11 +4471,11 @@ declare class EfColumnHeaderTemplateDirective {
4325
4471
  *
4326
4472
  * ```ts
4327
4473
  * actions: ReadonlyArray<EfRowAction> = [
4328
- * { id: 'view', labelKey: 'common_view', icon: 'pi pi-eye', kbd: '',
4474
+ * { id: 'view', labelKey: 'common_view', icon: 'pi pi-eye', kbd: formatShortcut('enter'),
4329
4475
  * permission: Permissions.Read, command: () => view(row) },
4330
- * { id: 'edit', labelKey: 'common_edit', icon: 'pi pi-pencil', kbd: 'E',
4476
+ * { id: 'edit', labelKey: 'common_edit', icon: 'pi pi-pencil', kbd: formatShortcut('e'),
4331
4477
  * permission: Permissions.Edit, command: () => edit(row) },
4332
- * { id: 'duplicate', labelKey: 'common_duplicate', icon: 'pi pi-copy',
4478
+ * { id: 'duplicate', labelKey: 'common_duplicate', icon: 'pi pi-copy', kbd: formatShortcut('mod+d'),
4333
4479
  * command: () => duplicate(row) },
4334
4480
  * { separator: true },
4335
4481
  * { id: 'delete', labelKey: 'common_delete', icon: 'pi pi-trash', severity: 'danger',
@@ -4355,9 +4501,25 @@ declare class EfColumnHeaderTemplateDirective {
4355
4501
  * Permission filtering: pass `[context]="..."` (a `ScreenContext`); items
4356
4502
  * declaring a `permission` are hidden unless that permission is granted.
4357
4503
  * Items with no `permission` always show.
4504
+ *
4505
+ * The `kbd` hint is decorative unless it's one of `view` / `edit` /
4506
+ * `duplicate`: this component registers Enter, `E` and `mod+D` against
4507
+ * `EfShortcutService`, gated on `open()`, so they only fire while this
4508
+ * row's menu is on screen. Render `kbd` through `formatShortcut()` (as
4509
+ * above): a hardcoded `'⌘D'` is wrong for a Windows user, which is
4510
+ * exactly the bug this wiring fixes.
4358
4511
  */
4359
4512
  declare class EfRowActionsComponent {
4360
4513
  private readonly host;
4514
+ private readonly shortcuts;
4515
+ /** Distinguishes this instance's registrations from every other row's:
4516
+ * each row on screen constructs its own component, and ids must not
4517
+ * collide or one row's disposer (and its `when`) would clobber
4518
+ * another's still-live registration. */
4519
+ private static nextInstanceId;
4520
+ private readonly instanceId;
4521
+ constructor();
4522
+ private isFocusInsideMenu;
4361
4523
  /** Action descriptors. */
4362
4524
  readonly items: _angular_core.InputSignal<readonly EfRowAction[]>;
4363
4525
  /** Optional context — when present, items with a `permission` are
@@ -4702,6 +4864,58 @@ declare class EfClearButtonComponent {
4702
4864
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfClearButtonComponent, "ef-clear-button", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "clear": "clear"; }, never, never, true, never>;
4703
4865
  }
4704
4866
 
4867
+ /** What the form hands back. `currentPassword` is absent when the host
4868
+ * did not ask for one (an administrator resetting someone else's). */
4869
+ interface EfChangePasswordSubmit {
4870
+ currentPassword?: string;
4871
+ newPassword: string;
4872
+ }
4873
+ /**
4874
+ * Password form, deliberately without an API client.
4875
+ *
4876
+ * `@elasticias/ui` cannot import an app's generated HTTP client, and that
4877
+ * limitation is what makes one component serve two different endpoints: a
4878
+ * user changing their own password proves the old one, an administrator
4879
+ * resetting someone else's does not. The host reads `canSubmit()`, calls
4880
+ * `submit()` from its dialog footer, and listens to `submitted`.
4881
+ *
4882
+ * ```html
4883
+ * <ef-change-password
4884
+ * #form
4885
+ * [requireCurrent]="!userId()"
4886
+ * [busy]="saving()"
4887
+ * [errors]="serverErrors()"
4888
+ * (submitted)="save($event)"
4889
+ * />
4890
+ * ```
4891
+ *
4892
+ * There is no `reset()`: hosts mount it under `@if`, so every open is a
4893
+ * fresh instance.
4894
+ */
4895
+ declare class EfChangePasswordComponent {
4896
+ /** Ask for the existing password. False for an administrator reset. */
4897
+ readonly requireCurrent: _angular_core.InputSignalWithTransform<boolean, unknown>;
4898
+ /** A request is in flight: the form refuses to submit again. */
4899
+ readonly busy: _angular_core.InputSignalWithTransform<boolean, unknown>;
4900
+ /** Already-translated server messages, rendered under the fields. */
4901
+ readonly errors: _angular_core.InputSignal<readonly string[]>;
4902
+ /** Minimum length. Kept in step with the backend validator's 8. */
4903
+ readonly minLength: _angular_core.InputSignal<number>;
4904
+ readonly submitted: _angular_core.OutputEmitterRef<EfChangePasswordSubmit>;
4905
+ readonly currentPassword: _angular_core.WritableSignal<string>;
4906
+ readonly newPassword: _angular_core.WritableSignal<string>;
4907
+ readonly confirmation: _angular_core.WritableSignal<string>;
4908
+ /**
4909
+ * Translation keys for every rule the current input breaks. Empty while
4910
+ * the user has typed nothing, so the form does not scold on open.
4911
+ */
4912
+ readonly validationKeys: _angular_core.Signal<string[]>;
4913
+ readonly canSubmit: _angular_core.Signal<boolean>;
4914
+ submit(): void;
4915
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfChangePasswordComponent, never>;
4916
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfChangePasswordComponent, "ef-change-password", never, { "requireCurrent": { "alias": "requireCurrent"; "required": false; "isSignal": true; }; "busy": { "alias": "busy"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; }, { "submitted": "submitted"; }, never, never, true, never>;
4917
+ }
4918
+
4705
4919
  /**
4706
4920
  * Native Comptoir textarea — no PrimeNG wrapper. Pairs with the
4707
4921
  * `.ef-textarea` rule in `@elasticias/ui/styles/patterns` (focus
@@ -5288,5 +5502,5 @@ declare class EfEmailMetricsCardComponent {
5288
5502
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfEmailMetricsCardComponent, "ef-email-metrics-card", never, { "metrics": { "alias": "metrics"; "required": false; "isSignal": true; }; "recentEvents": { "alias": "recentEvents"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; }, { "rangeChange": "rangeChange"; }, never, never, true, never>;
5289
5503
  }
5290
5504
 
5291
- export { EF_BADGE_BG_COLORS, EF_BADGE_BG_LIGHT_COLORS, EF_BADGE_BORDER_COLORS, EF_BADGE_DEFAULTS, EF_BADGE_TEXT_COLORS, EF_CHART_PALETTE, EF_DATATABLE_ACTIONS_DEFAULTS, EF_DATATABLE_COLUMN_DEFAULTS, EF_DATATABLE_DEFAULTS, EF_DATA_CARD_MOBILE_LAYOUT, EF_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, EfAboutDialogComponent, EfActivationFilterComponent, EfAppMainComponent, EfAppShellComponent, EfAppShellMobileComponent, EfAppTopComponent, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfBottomSheetComponent, EfBuildStampComponent, EfBulkBarComponent, EfButtonComponent, EfButtonGroupComponent, EfCardComponent, EfChangeHistoryComponent, EfChartComponent, EfCheckboxComponent, EfClearButtonComponent, EfColumnHeaderTemplateDirective, EfColumnTemplateDirective, EfCompactPipe, EfConfirmDialogComponent, EfCurrencyPipe, EfDataCardComponent, EfDatatableActionBarComponent, EfDatatableComponent, EfDatepickerAdvancedComponent, EfDatepickerComponent, EfDetailToolbarComponent, EfDialogComponent, EfEmailMetricsCardComponent, EfEmptyStateComponent, EfFabComponent, EfFieldsetComponent, EfFilterDrawerComponent, EfFilterPillComponent, EfFormGridComponent, EfInputNumberComponent, EfInputTextComponent, EfKpiCardComponent, EfLabelComponent, EfModuleRailComponent, EfModuleSideComponent, EfMultiSelectComponent, EfOrderBuilderComponent, EfOrderSummaryComponent, EfPagerComponent, EfPasswordComponent, EfPdfPreviewComponent, EfPillGroupComponent, EfPresetPillComponent, EfPriceDisplayComponent, EfProductCatalogueComponent, EfProductCatalogueFilterComponent, EfProductTypeaheadComponent, EfProfileChipComponent, EfPulseComponent, EfQuantitySelectorComponent, EfQuantityStepperComponent, EfRankListComponent, EfRowActionsComponent, EfSearchToolbarComponent, EfSelectButtonComponent, EfSelectComponent, EfServerErrorsDirective, EfSkeletonComponent, EfSmartBarComponent, EfStatsComponent, EfStatusChipComponent, EfTabPanelDirective, EfTabsComponent, EfTextareaComponent, EfThemeConfiguratorComponent, EfThemeToggleComponent, EfTimelineComponent, EfToastRegionComponent, EfToggleSwitchComponent, EfToolbarComponent, EfTooltipDirective, EfTotalsComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, buildChartConfig, getColumnAlignment, mergeColumnDefaults, resolveEfStatusColor };
5292
- export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfButtonComptoirSeverity, EfButtonPrimeNGSeverity, EfButtonSeverity, EfChangeHistoryEntry, EfChangeHistoryFieldChange, EfChartSeries, EfChartType, EfDataCardMobileLayout, EfDataCardRowAction, EfDatatableActions, EfDatatableColumn, EfDatatableColumnAlign, EfDatatableColumnType, EfDatatableConfig, EfDateFieldValue, EfDatePreset, EfDialogAction, EfDialogSeverity, EfDialogSize, EfFabPosition, EfKpiDeltaTone, EfKpiSparkline, EfPillItem, EfPresetItem, EfRankRow, EfRowAction, EfSkeletonVariant, EfStatsRow, EfStatusColor, EfStatusReferenceItem, EfTabItem, EfTabsModule, EfTabsVariant, EfTimelineItem, EfTimelineState, EfToastRegionPosition, EfTotalsGrand, EfTotalsRow, HighlightSegment, OrderChangeInfo, OrderEntity, OrderLineItem, OrderProductsSummary, OrderSummaryItem, ProductCountGroup, ProductCountGroupLabel, ProductTypeaheadRow, ProductTypeaheadSelection, ProductWithCountGroup, SelectedFilter, ValidationResult };
5505
+ export { EF_BADGE_BG_COLORS, EF_BADGE_BG_LIGHT_COLORS, EF_BADGE_BORDER_COLORS, EF_BADGE_DEFAULTS, EF_BADGE_TEXT_COLORS, EF_CHART_PALETTE, EF_DATATABLE_ACTIONS_DEFAULTS, EF_DATATABLE_COLUMN_DEFAULTS, EF_DATATABLE_DEFAULTS, EF_DATA_CARD_MOBILE_LAYOUT, EF_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, EfAboutDialogComponent, EfActivationFilterComponent, EfAppMainComponent, EfAppShellComponent, EfAppShellMobileComponent, EfAppTopComponent, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfBottomSheetComponent, EfBuildStampComponent, EfBulkBarComponent, EfButtonComponent, EfButtonGroupComponent, EfCardComponent, EfChangeHistoryComponent, EfChangePasswordComponent, EfChartComponent, EfCheckboxComponent, EfClearButtonComponent, EfColumnHeaderTemplateDirective, EfColumnTemplateDirective, EfCompactPipe, EfConfirmDialogComponent, EfCurrencyPipe, EfDataCardComponent, EfDatatableActionBarComponent, EfDatatableComponent, EfDatepickerAdvancedComponent, EfDatepickerComponent, EfDetailToolbarComponent, EfDialogComponent, EfEmailMetricsCardComponent, EfEmptyStateComponent, EfFabComponent, EfFieldsetComponent, EfFilterDrawerComponent, EfFilterPillComponent, EfFormGridComponent, EfInputNumberComponent, EfInputTextComponent, EfKpiCardComponent, EfLabelComponent, EfModuleRailComponent, EfModuleSideComponent, EfMultiSelectComponent, EfOrderBuilderComponent, EfOrderSummaryComponent, EfPagerComponent, EfPasswordComponent, EfPdfPreviewComponent, EfPillGroupComponent, EfPresetPillComponent, EfPriceDisplayComponent, EfProductCatalogueComponent, EfProductCatalogueFilterComponent, EfProductTypeaheadComponent, EfProfileChipComponent, EfProfileMenuComponent, EfPulseComponent, EfQuantitySelectorComponent, EfQuantityStepperComponent, EfRankListComponent, EfRowActionsComponent, EfSearchToolbarComponent, EfSelectButtonComponent, EfSelectComponent, EfServerErrorsDirective, EfShortcutsDialogComponent, EfSkeletonComponent, EfSmartBarComponent, EfStatsComponent, EfStatusChipComponent, EfTabPanelDirective, EfTabsComponent, EfTextareaComponent, EfThemeConfiguratorComponent, EfThemeToggleComponent, EfTimelineComponent, EfToastRegionComponent, EfToggleSwitchComponent, EfToolbarComponent, EfTooltipDirective, EfTotalsComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, buildChartConfig, getColumnAlignment, mergeColumnDefaults, resolveEfStatusColor };
5506
+ export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfAboutServer, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfButtonComptoirSeverity, EfButtonPrimeNGSeverity, EfButtonSeverity, EfChangeHistoryEntry, EfChangeHistoryFieldChange, EfChangePasswordSubmit, EfChartSeries, EfChartType, EfDataCardMobileLayout, EfDataCardRowAction, EfDatatableActions, EfDatatableColumn, EfDatatableColumnAlign, EfDatatableColumnType, EfDatatableConfig, EfDateFieldValue, EfDatePreset, EfDialogAction, EfDialogSeverity, EfDialogSize, EfFabPosition, EfKpiDeltaTone, EfKpiSparkline, EfPillItem, EfPresetItem, EfProfileMenuItem, EfRankRow, EfRowAction, EfSkeletonVariant, EfStatsRow, EfStatusColor, EfStatusReferenceItem, EfTabItem, EfTabsModule, EfTabsVariant, EfTimelineItem, EfTimelineState, EfToastRegionPosition, EfTotalsGrand, EfTotalsRow, HighlightSegment, OrderChangeInfo, OrderEntity, OrderLineItem, OrderProductsSummary, OrderSummaryItem, ProductCountGroup, ProductCountGroupLabel, ProductTypeaheadRow, ProductTypeaheadSelection, ProductWithCountGroup, SelectedFilter, ValidationResult };