@elasticias/ui 1.0.2 → 1.0.4

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.2",
3
+ "version": "1.0.4",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -800,6 +800,102 @@
800
800
  letter-spacing: -0.005em;
801
801
  }
802
802
 
803
+ /* ──────────── TOOLTIP — COMPTOIR SKIN OVER P-TOOLTIP ────────────
804
+ PrimeNG owns the positioning and the show/hide; these rules own the
805
+ look, so `efTooltip` and `ef-button`'s own tooltip read the same.
806
+ Ink-active ground rather than paper: a tooltip is an overlay on top
807
+ of the surface, not another surface. */
808
+
809
+ .p-tooltip .p-tooltip-text {
810
+ background: var(--ink-active);
811
+ color: var(--paper);
812
+ border-radius: var(--r-md);
813
+ padding: 7px 10px;
814
+ font-size: 12px;
815
+ font-weight: 600;
816
+ line-height: 1.4;
817
+ letter-spacing: -0.005em;
818
+ max-width: 260px;
819
+ box-shadow: var(--shadow-3);
820
+ white-space: normal;
821
+ }
822
+
823
+ /* The arrow is a bordered triangle per side; colour the one that shows. */
824
+ .p-tooltip.p-tooltip-top .p-tooltip-arrow {
825
+ border-top-color: var(--ink-active);
826
+ }
827
+ .p-tooltip.p-tooltip-bottom .p-tooltip-arrow {
828
+ border-bottom-color: var(--ink-active);
829
+ }
830
+ .p-tooltip.p-tooltip-left .p-tooltip-arrow {
831
+ border-left-color: var(--ink-active);
832
+ }
833
+ .p-tooltip.p-tooltip-right .p-tooltip-arrow {
834
+ border-right-color: var(--ink-active);
835
+ }
836
+
837
+ /* ──────────── BUILD STAMP ───────────────────────────────────────
838
+ Footer-weight metadata: mono, muted, never competing with the
839
+ content above it. */
840
+
841
+ .ef-build-stamp {
842
+ display: inline-flex;
843
+ align-items: center;
844
+ gap: 6px;
845
+ font-family: 'JetBrains Mono', ui-monospace, monospace;
846
+ font-size: 11px;
847
+ letter-spacing: 0.02em;
848
+ color: var(--text-soft);
849
+ white-space: nowrap;
850
+ }
851
+
852
+ .ef-build-stamp__sep {
853
+ opacity: 0.6;
854
+ }
855
+
856
+ /* ──────────── APP-BAR ICON ACTIONS ──────────────────────────────
857
+ The theme switch and sign-out sit at the trailing edge of
858
+ ef-app-top. They borrow the row-actions trigger's shape rather
859
+ than inventing a third kind of icon button. */
860
+
861
+ .ef-theme-toggle,
862
+ .ef-app-top__logout {
863
+ appearance: none;
864
+ background: var(--paper-alt);
865
+ border: 1px solid var(--rule);
866
+ width: var(--hit);
867
+ height: var(--hit);
868
+ border-radius: var(--r-pill);
869
+ display: inline-grid;
870
+ place-items: center;
871
+ color: var(--text-mute);
872
+ cursor: pointer;
873
+ transition:
874
+ background var(--t-fast) var(--ease-out),
875
+ border-color var(--t-fast) var(--ease-out),
876
+ color var(--t-fast) var(--ease-out);
877
+ }
878
+
879
+ .ef-theme-toggle:hover,
880
+ .ef-app-top__logout:hover {
881
+ color: var(--text);
882
+ border-color: var(--ink-400);
883
+ }
884
+
885
+ .ef-theme-toggle:focus-visible,
886
+ .ef-app-top__logout:focus-visible {
887
+ outline: 0;
888
+ border-color: var(--tenant-400);
889
+ box-shadow: 0 0 0 4px var(--tenant-100);
890
+ color: var(--text);
891
+ }
892
+
893
+ .ef-theme-toggle i,
894
+ .ef-app-top__logout i {
895
+ font-size: 14px;
896
+ line-height: 1;
897
+ }
898
+
803
899
  /* ──────────── PAGER ─────────────────────────────────────────────── */
804
900
 
805
901
  .pager {
@@ -850,16 +946,22 @@
850
946
  color: var(--text-mute);
851
947
  }
852
948
 
853
- .pager .size select {
854
- font: inherit;
855
- font-size: 12.5px;
949
+ /* The lines-per-page control is an <ef-select> (`.es--sm`, 32px) so it
950
+ matches every other dropdown in the app. Only the width needs walking
951
+ back: the shared trigger is full-width with a 200px floor, which is
952
+ right in a form column and far too wide next to a page count. */
953
+ .pager .size ef-select {
954
+ flex: 0 0 auto;
955
+ }
956
+
957
+ .pager .size .es.p-select {
958
+ width: auto;
959
+ min-width: 0;
856
960
  font-weight: 600;
857
- background: var(--paper);
858
- border: 1px solid var(--rule);
859
- border-radius: var(--r-md);
860
- padding: 5px 8px;
861
- color: var(--text);
862
- min-height: 30px;
961
+ }
962
+
963
+ .pager .size .es .p-select-label {
964
+ padding-right: 2px;
863
965
  }
864
966
 
865
967
  /* ──────────── BULK ACTIONS BAR ─────────────────────────────────── */
@@ -1419,6 +1521,25 @@
1419
1521
  inset-inline-start: 0;
1420
1522
  }
1421
1523
 
1524
+ /* Not enough room below the trigger — flip above it, and reverse the
1525
+ entry slide so the menu still moves away from its trigger. */
1526
+ .row-actions__menu.up {
1527
+ top: auto;
1528
+ bottom: calc(100% + 8px);
1529
+ animation-name: row-actions-menu-in-up;
1530
+ }
1531
+
1532
+ @keyframes row-actions-menu-in-up {
1533
+ from {
1534
+ opacity: 0;
1535
+ transform: translateY(4px) scale(0.98);
1536
+ }
1537
+ to {
1538
+ opacity: 1;
1539
+ transform: none;
1540
+ }
1541
+ }
1542
+
1422
1543
  @keyframes row-actions-menu-in {
1423
1544
  from {
1424
1545
  opacity: 0;
@@ -3927,6 +4048,101 @@ input.ef-input[type='number'] {
3927
4048
  color: var(--tenant-700);
3928
4049
  }
3929
4050
 
4051
+ /* ── Confirm dialog ───────────────────────────────────────────
4052
+ `ef-confirm-dialog` hands PrimeNG's confirm modal the `es-dialog`
4053
+ classes, so the panel, header, footer and close button above already
4054
+ apply. What is left is what only the confirm modal renders: an icon
4055
+ and a message in the body, and the accept / reject pair in the
4056
+ footer, which are `p-button`s rather than our own `.btn`. */
4057
+
4058
+ .es-confirm .p-dialog-content {
4059
+ display: flex;
4060
+ align-items: center;
4061
+ gap: var(--s-3);
4062
+ }
4063
+
4064
+ /* Same 36px tile as the dialog header icon, tinted like a warning
4065
+ since that is what a confirmation is. */
4066
+ .es-confirm .p-confirmdialog-icon {
4067
+ width: 36px;
4068
+ height: 36px;
4069
+ border-radius: var(--r-pill);
4070
+ display: inline-grid;
4071
+ place-items: center;
4072
+ background: var(--st-pending-bg);
4073
+ color: var(--st-pending-fg);
4074
+ font-size: 15px;
4075
+ flex-shrink: 0;
4076
+ }
4077
+
4078
+ .es-confirm .p-confirmdialog-message {
4079
+ font-size: 14px;
4080
+ line-height: 1.5;
4081
+ color: var(--text);
4082
+ margin: 0;
4083
+ }
4084
+
4085
+ /* Action pair — `.btn` shape and tokens, applied to the p-buttons
4086
+ PrimeNG renders. Written out rather than shared with `.btn` because
4087
+ these carry PrimeNG's own base rules at equal specificity, and the
4088
+ two-class selector is what wins. */
4089
+ .es-confirm .p-confirmdialog-accept-button,
4090
+ .es-confirm .p-confirmdialog-reject-button {
4091
+ appearance: none;
4092
+ font: inherit;
4093
+ font-size: 13.5px;
4094
+ font-weight: 600;
4095
+ line-height: 1;
4096
+ letter-spacing: -0.005em;
4097
+ padding: 10px 18px;
4098
+ min-height: var(--hit-base);
4099
+ border-radius: var(--r-pill);
4100
+ border: 1px solid transparent;
4101
+ display: inline-flex;
4102
+ align-items: center;
4103
+ gap: 8px;
4104
+ cursor: pointer;
4105
+ transition: all var(--t-base) var(--ease-spring);
4106
+ }
4107
+
4108
+ .es-confirm .p-confirmdialog-accept-button:active,
4109
+ .es-confirm .p-confirmdialog-reject-button:active {
4110
+ transform: scale(0.97);
4111
+ }
4112
+
4113
+ .es-confirm .p-confirmdialog-accept-button {
4114
+ background: var(--ink-active);
4115
+ color: var(--paper);
4116
+ border-color: var(--ink-active);
4117
+ }
4118
+
4119
+ .es-confirm .p-confirmdialog-accept-button:hover {
4120
+ background: var(--ink-active);
4121
+ transform: translateY(-1px);
4122
+ box-shadow: var(--shadow-2, 0 4px 14px -4px rgba(15, 17, 21, 0.1));
4123
+ }
4124
+
4125
+ /* The reject button is a secondary + outlined p-button, whose own colour
4126
+ rule matches this one's specificity — the footer in the selector is
4127
+ what makes ours win, so "Annuler" reads at --text like every other
4128
+ ghost button rather than PrimeNG's muted grey. */
4129
+ .es-confirm .p-dialog-footer .p-confirmdialog-reject-button {
4130
+ background: var(--paper-alt);
4131
+ color: var(--text);
4132
+ border-color: var(--rule);
4133
+ }
4134
+
4135
+ .es-confirm .p-dialog-footer .p-confirmdialog-reject-button:hover {
4136
+ background: var(--paper-alt);
4137
+ border-color: var(--text);
4138
+ }
4139
+
4140
+ .es-confirm .p-confirmdialog-accept-button:focus-visible,
4141
+ .es-confirm .p-confirmdialog-reject-button:focus-visible {
4142
+ outline: 2px solid var(--tenant-400);
4143
+ outline-offset: 2px;
4144
+ }
4145
+
3930
4146
  .es-dialog .es-dialog__title-block {
3931
4147
  display: grid;
3932
4148
  gap: 2px;
@@ -1,11 +1,12 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { PipeTransform, OnInit, OnChanges, TemplateRef, EventEmitter, AfterContentInit, OnDestroy, SimpleChanges, AfterViewInit } from '@angular/core';
3
3
  import { Menu } from 'primeng/menu';
4
+ import * as _elasticias_core from '@elasticias/core';
5
+ import { EfModule, EfModuleId, EfNavSection, EfNavItem, EfToast, EfToastAction, EfThemeConfigService } from '@elasticias/core';
6
+ import * as i1 from 'primeng/tooltip';
4
7
  import * as _elasticias_screens from '@elasticias/screens';
5
8
  import { ScreenContext, EfDetailToolbarAction, EfSearchToolbarAction, EfDataCardColumn, EfDataCardSort, EfDateRange, EfDatePresetKey } from '@elasticias/screens';
6
9
  export { EfDataCardColumn, EfDataCardColumnAlign, EfDataCardColumnType, EfDataCardSort, EfDataCardSortDirection, EfDatePresetKey, EfDateRange, EfDetailToolbarAction, EfSearchToolbarAction } from '@elasticias/screens';
7
- import * as _elasticias_core from '@elasticias/core';
8
- import { EfModule, EfModuleId, EfNavSection, EfNavItem, EfToast, EfToastAction, EfThemeConfigService } from '@elasticias/core';
9
10
  import { BlockableUI } from 'primeng/api';
10
11
  import { SafeResourceUrl } from '@angular/platform-browser';
11
12
  import { ChartConfiguration } from 'chart.js';
@@ -889,6 +890,108 @@ declare class EfDialogComponent {
889
890
  static ngAcceptInputType_saveDisabled: unknown;
890
891
  }
891
892
 
893
+ /**
894
+ * The app-wide confirmation modal, wearing the same skin as `ef-dialog`.
895
+ *
896
+ * PrimeNG's `<p-confirmdialog>` renders an ordinary `<p-dialog>` inside
897
+ * itself and forwards `styleClass` to its root, so handing it the
898
+ * `es-dialog` classes makes every rule that dresses `ef-dialog` — the
899
+ * paper-alt panel, the rule-separated header and footer, the Bricolage
900
+ * title, the ghost close — apply here too. Only the confirm-specific
901
+ * internals (the icon tile, the message, the two action buttons) need
902
+ * their own rules, and those live beside the rest in `_patterns.scss`.
903
+ *
904
+ * Drop one instance at the application root; the content is driven by
905
+ * `ConfirmDialogService.confirm()`, not by inputs.
906
+ *
907
+ * ```html
908
+ * <ef-confirm-dialog />
909
+ * ```
910
+ */
911
+ declare class EfConfirmDialogComponent {
912
+ /** Panel width preset, mirroring `ef-dialog`'s `size`. */
913
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
914
+ /** Extra classes appended to the panel. */
915
+ readonly styleClass: _angular_core.InputSignal<string>;
916
+ protected readonly effectiveStyleClass: () => string;
917
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfConfirmDialogComponent, never>;
918
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfConfirmDialogComponent, "ef-confirm-dialog", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "styleClass": { "alias": "styleClass"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
919
+ }
920
+
921
+ /**
922
+ * Light / dark switch.
923
+ *
924
+ * All of the machinery already exists in `EfThemeConfigService`: it holds
925
+ * `darkTheme` in the persisted app state, puts `.p-dark` on `<html>`, and
926
+ * runs the swap through a view transition where the browser supports one.
927
+ * This is the control that was missing, so the preference had no way to be
928
+ * expressed.
929
+ *
930
+ * The icon shows the theme you would move to, not the one you are in, which
931
+ * is what makes a single-button toggle readable: a moon means "go dark".
932
+ *
933
+ * ```html
934
+ * <ef-theme-toggle />
935
+ * ```
936
+ */
937
+ declare class EfThemeToggleComponent {
938
+ private readonly themeConfig;
939
+ /** Icon shown while light is active (i.e. "switch to dark"). */
940
+ readonly darkIcon: _angular_core.InputSignal<string>;
941
+ /** Icon shown while dark is active (i.e. "switch to light"). */
942
+ readonly lightIcon: _angular_core.InputSignal<string>;
943
+ /** Translation key for the accessible name. */
944
+ readonly ariaLabelKey: _angular_core.InputSignal<string>;
945
+ readonly isDark: _angular_core.Signal<boolean>;
946
+ protected readonly labelKey: _angular_core.Signal<string>;
947
+ toggle(): void;
948
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfThemeToggleComponent, never>;
949
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfThemeToggleComponent, "ef-theme-toggle", never, { "darkIcon": { "alias": "darkIcon"; "required": false; "isSignal": true; }; "lightIcon": { "alias": "lightIcon"; "required": false; "isSignal": true; }; "ariaLabelKey": { "alias": "ariaLabelKey"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
950
+ }
951
+
952
+ /**
953
+ * Which build is running, for a footer or an about box.
954
+ *
955
+ * Reads `EF_BUILD_INFO` optionally and renders nothing when the app has not
956
+ * provided it, so a consumer that never wired a build stamp shows no empty
957
+ * line. The commit and branch go in the tooltip rather than the label: the
958
+ * date is what a person recognises, the hash is what you paste into an issue.
959
+ *
960
+ * ```html
961
+ * <ef-build-stamp owner="Elasticias" />
962
+ * ```
963
+ */
964
+ declare class EfBuildStampComponent {
965
+ /** Copyright holder shown before the build. Omit for the build alone. */
966
+ readonly owner: _angular_core.InputSignal<string>;
967
+ protected readonly info: _elasticias_core.EfBuildInfo;
968
+ protected readonly year: number;
969
+ protected readonly detail: _angular_core.Signal<string>;
970
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfBuildStampComponent, never>;
971
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfBuildStampComponent, "ef-build-stamp", never, { "owner": { "alias": "owner"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
972
+ }
973
+
974
+ /**
975
+ * Comptoir-skinned tooltip.
976
+ *
977
+ * `ef-button` already drives PrimeNG's tooltip through its `tooltipKey`
978
+ * input, so this composes the same directive rather than introducing a
979
+ * second tooltip with its own positioning and its own bugs. It contributes
980
+ * the `ef-*` name the house style asks for and nothing else; the look comes
981
+ * from the `.p-tooltip` rules in `_patterns.scss`, which means every tooltip
982
+ * in the app — this one and `ef-button`'s — reads the same.
983
+ *
984
+ * Text is a plain input, so translate at the call site:
985
+ *
986
+ * ```html
987
+ * <span [efTooltip]="'module_sales_hint' | translate" efTooltipPosition="top"></span>
988
+ * ```
989
+ */
990
+ declare class EfTooltipDirective {
991
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfTooltipDirective, never>;
992
+ 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: {}; }]>;
993
+ }
994
+
892
995
  declare class EfFieldsetComponent {
893
996
  /** Direct legend text (not translated) */
894
997
  legend?: string;
@@ -1336,12 +1439,30 @@ declare class EfAppMainComponent {
1336
1439
  * breadcrumb can still project their own content into `[breadcrumb]`.
1337
1440
  */
1338
1441
  declare class EfAppTopComponent {
1442
+ /**
1443
+ * Show the light/dark switch at the trailing edge of the bar.
1444
+ *
1445
+ * It lives here rather than being projected through `[actions]`
1446
+ * because that slot is declared once per viewport branch in
1447
+ * `ef-app-shell` and only the mobile one receives content — so
1448
+ * anything an app projects there never appears on desktop.
1449
+ */
1450
+ readonly themeToggle: _angular_core.InputSignalWithTransform<boolean, unknown>;
1451
+ /**
1452
+ * Show the sign-out button. It only renders when the app has provided
1453
+ * `EF_SESSION`, so this input turns off a control the app opted into
1454
+ * rather than being the thing that enables it.
1455
+ */
1456
+ readonly logout: _angular_core.InputSignalWithTransform<boolean, unknown>;
1457
+ /** Present only when the app provides `EF_SESSION`. */
1458
+ protected readonly session: _elasticias_core.EfSession;
1459
+ protected signOut(): void;
1339
1460
  private readonly active;
1340
1461
  readonly module: _angular_core.Signal<_elasticias_core.EfModule>;
1341
1462
  readonly navItem: _angular_core.Signal<_elasticias_core.EfNavItem>;
1342
1463
  readonly hasBreadcrumb: _angular_core.Signal<boolean>;
1343
1464
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfAppTopComponent, never>;
1344
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfAppTopComponent, "ef-app-top", never, {}, {}, never, ["[breadcrumb]", "[actions]"], true, never>;
1465
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfAppTopComponent, "ef-app-top", never, { "themeToggle": { "alias": "themeToggle"; "required": false; "isSignal": true; }; "logout": { "alias": "logout"; "required": false; "isSignal": true; }; }, {}, never, ["[breadcrumb]", "[actions]"], true, never>;
1345
1466
  }
1346
1467
 
1347
1468
  /**
@@ -4053,6 +4174,8 @@ declare class EfColumnHeaderTemplateDirective {
4053
4174
  *
4054
4175
  * Behaviour:
4055
4176
  * - Click the trigger to toggle. Trigger gets `.open` (ink-active) while the menu is open.
4177
+ * - Only one row menu is open at a time — opening one closes the last.
4178
+ * - The menu flips above the trigger when there isn't room below it.
4056
4179
  * - Click outside or press `Escape` to close.
4057
4180
  * - Clicking an item runs its `command` then closes the menu.
4058
4181
  * - dblclick on the trigger or menu does NOT propagate, so the data-card's
@@ -4088,9 +4211,35 @@ declare class EfRowActionsComponent {
4088
4211
  readonly visibleItems: _angular_core.Signal<readonly EfRowAction[]>;
4089
4212
  /** Open state. */
4090
4213
  readonly open: _angular_core.WritableSignal<boolean>;
4214
+ /** Menu renders above the trigger instead of below it. */
4215
+ readonly dropUp: _angular_core.WritableSignal<boolean>;
4216
+ /**
4217
+ * The one menu currently open, app-wide.
4218
+ *
4219
+ * The trigger click is stopped from reaching `document` so it can't
4220
+ * select or open the row, which also means no other instance's
4221
+ * outside-click listener ever sees it. Without an explicit hand-off
4222
+ * every menu clicked stays open and they stack up on screen.
4223
+ */
4224
+ private static openInstance;
4091
4225
  toggle(event: MouseEvent): void;
4092
4226
  runCommand(action: EfRowAction, event: MouseEvent): void;
4093
4227
  close(): void;
4228
+ /** Gap between the trigger and the menu, plus a little breathing room
4229
+ * against the viewport edge. Matches `top: calc(100% + 8px)`. */
4230
+ private static readonly EDGE_GAP;
4231
+ /**
4232
+ * Drop upward when the menu would not fit below the trigger and there
4233
+ * is more room above. On a short viewport where it fits neither way,
4234
+ * below wins, which is where it has always been.
4235
+ */
4236
+ private shouldDropUp;
4237
+ /** Rough height before the menu exists: item padding + line box, with
4238
+ * dividers and the menu's own padding and border. */
4239
+ private estimateMenuHeight;
4240
+ /** Re-decide against the rendered height — item labels wrap, and the
4241
+ * estimate can't know that. */
4242
+ private correctPlacementAfterRender;
4094
4243
  /** Bubbling DOM event so ancestors (e.g. ef-data-card) can react —
4095
4244
  * see `.tbl-wrap.has-open-menu { overflow: visible }`. */
4096
4245
  private dispatchToggle;
@@ -4142,6 +4291,14 @@ declare class EfPagerComponent {
4142
4291
  readonly hideSize: _angular_core.InputSignal<boolean>;
4143
4292
  readonly pageChange: _angular_core.OutputEmitterRef<number>;
4144
4293
  readonly pageSizeChange: _angular_core.OutputEmitterRef<number>;
4294
+ /** Falls back to the first configured option if the value ever goes empty. */
4295
+ private get defaultSize();
4296
+ /** `pageSizeOptions` shaped for `ef-select`, which reads a label and a
4297
+ * value off each option rather than taking bare primitives. */
4298
+ readonly sizeOptions: _angular_core.Signal<{
4299
+ label: string;
4300
+ value: number;
4301
+ }[]>;
4145
4302
  readonly totalPages: _angular_core.Signal<number>;
4146
4303
  readonly range: _angular_core.Signal<{
4147
4304
  start: number;
@@ -4150,7 +4307,7 @@ declare class EfPagerComponent {
4150
4307
  /** First page · current ±1 · last page, with ellipsis fillers. */
4151
4308
  readonly pageButtons: _angular_core.Signal<readonly PageBtn[]>;
4152
4309
  goToPage(page: number): void;
4153
- onSizeChange(value: string): void;
4310
+ onSizeChange(value: number | string | null): void;
4154
4311
  trackBtn(index: number, btn: PageBtn): string;
4155
4312
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfPagerComponent, never>;
4156
4313
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfPagerComponent, "ef-pager", never, { "pageNumber": { "alias": "pageNumber"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "linesPerPageLabelKey": { "alias": "linesPerPageLabelKey"; "required": false; "isSignal": true; }; "ofLabelKey": { "alias": "ofLabelKey"; "required": false; "isSignal": true; }; "prevLabelKey": { "alias": "prevLabelKey"; "required": false; "isSignal": true; }; "nextLabelKey": { "alias": "nextLabelKey"; "required": false; "isSignal": true; }; "hideSize": { "alias": "hideSize"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, never, never, true, never>;
@@ -4960,5 +5117,5 @@ declare class EfEmailMetricsCardComponent {
4960
5117
  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>;
4961
5118
  }
4962
5119
 
4963
- 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_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, EfActivationFilterComponent, EfAppMainComponent, EfAppShellComponent, EfAppShellMobileComponent, EfAppTopComponent, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfBottomSheetComponent, EfBulkBarComponent, EfButtonComponent, EfButtonGroupComponent, EfCardComponent, EfChangeHistoryComponent, EfChartComponent, EfCheckboxComponent, EfClearButtonComponent, EfColumnHeaderTemplateDirective, EfColumnTemplateDirective, EfCompactPipe, 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, EfTimelineComponent, EfToastRegionComponent, EfToggleSwitchComponent, EfToolbarComponent, EfTotalsComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, buildChartConfig, getColumnAlignment, mergeColumnDefaults, resolveEfStatusColor };
5120
+ 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_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, 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 };
4964
5121
  export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfButtonComptoirSeverity, EfButtonPrimeNGSeverity, EfButtonSeverity, EfChangeHistoryEntry, EfChangeHistoryFieldChange, EfChartSeries, EfChartType, 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 };