@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/fesm2022/elasticias-ui.mjs +358 -51
- package/fesm2022/elasticias-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/styles/_patterns.scss +225 -9
- package/types/elasticias-ui.d.ts +162 -5
package/package.json
CHANGED
package/styles/_patterns.scss
CHANGED
|
@@ -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
|
-
|
|
854
|
-
|
|
855
|
-
|
|
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
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
padding:
|
|
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;
|
package/types/elasticias-ui.d.ts
CHANGED
|
@@ -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 };
|