@elasticias/ui 1.0.21 → 1.0.22

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.21",
3
+ "version": "1.0.22",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -1134,22 +1134,6 @@
1134
1134
  lives in the "DETAIL SCREEN PRIMITIVES (Phase 7)" section below. Only the
1135
1135
  sub-element rules (`.left` / `.ref` / `.name` / `.right`) live here. */
1136
1136
 
1137
- .detail-toolbar .left {
1138
- display: flex;
1139
- align-items: center;
1140
- gap: 10px;
1141
- flex: 1;
1142
- min-width: 0;
1143
- flex-wrap: wrap;
1144
- }
1145
-
1146
-
1147
- .detail-toolbar .ref {
1148
- font-family: var(--font-mono);
1149
- font-size: 14px;
1150
- font-weight: 700;
1151
- letter-spacing: -0.01em;
1152
- }
1153
1137
 
1154
1138
  .detail-toolbar .name {
1155
1139
  font-family: var(--font-display);
@@ -1161,121 +1145,99 @@
1161
1145
  letter-spacing: -0.015em;
1162
1146
  }
1163
1147
 
1164
- .detail-toolbar .right {
1165
- display: flex;
1166
- align-items: center;
1167
- gap: 6px;
1168
- flex-wrap: wrap;
1169
- margin-inline-start: auto;
1170
- }
1171
-
1172
1148
  /* ──────────── DETAIL GRID + CARD ───────────────────────────────── */
1173
1149
 
1174
- .detail-grid {
1175
- display: grid;
1176
- grid-template-columns: minmax(0, 1fr);
1177
- gap: var(--s-3);
1178
- }
1179
-
1180
1150
  @media (min-width: 1100px) {
1181
1151
  .detail-grid {
1182
1152
  grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr);
1183
1153
  }
1184
1154
  }
1185
1155
 
1186
- .detail-stack {
1187
- display: grid;
1188
- gap: var(--s-3);
1189
- align-content: start;
1190
- min-width: 0;
1191
- }
1192
-
1193
- .card {
1194
- background: var(--paper-alt);
1195
- border: 1px solid var(--rule);
1196
- border-radius: var(--r-2xl);
1197
- overflow: hidden;
1198
- }
1199
-
1200
- .card-head {
1201
- display: flex;
1202
- justify-content: space-between;
1203
- align-items: center;
1204
- padding: 12px 16px;
1205
- border-bottom: 1px solid var(--rule-soft, rgba(15, 17, 21, 0.05));
1206
- gap: var(--s-3);
1207
- }
1208
-
1209
- .card-head .title {
1210
- font-family: var(--font-display);
1211
- font-variation-settings:
1212
- 'opsz' 12,
1213
- 'wght' 700,
1214
- 'wdth' 88;
1215
- font-size: 14.5px;
1216
- letter-spacing: -0.01em;
1217
- }
1218
-
1219
- .card-head .meta {
1220
- font-size: 11.5px;
1221
- color: var(--text-mute);
1222
- font-weight: 600;
1223
- }
1224
-
1225
- .card-body {
1226
- padding: 16px;
1227
- display: grid;
1228
- /* minmax(0, 1fr): a grid item's default min-width is auto, so a wide child
1229
- — a table, a nested data card — sized this column and pushed the card
1230
- past its own container. Same trap as the content area and the screen
1231
- host; this is the third place it bites. */
1232
- grid-template-columns: minmax(0, 1fr);
1233
- gap: var(--s-3);
1234
- }
1235
-
1236
- .card-foot {
1237
- padding: 10px 16px;
1238
- border-top: 1px solid var(--rule-soft, rgba(15, 17, 21, 0.05));
1239
- display: flex;
1240
- justify-content: space-between;
1241
- align-items: center;
1242
- gap: var(--s-3);
1243
- background: var(--paper);
1244
- }
1245
-
1246
1156
  /* ──────────── FORM GRID + FIELD ────────────────────────────────── */
1247
1157
 
1248
- .form-grid {
1158
+ /* ──────────────────────────────────────────────────────────────────
1159
+ The 12-column form grid — one definition, two names.
1160
+
1161
+ `.ef-form-grid` is the host class of the <ef-form-grid> primitive;
1162
+ `.form-grid` is the raw-class form written directly in templates.
1163
+ Both are in active use (110 span sites across 13 files), and they
1164
+ were maintained as two separate blocks that had already drifted
1165
+ apart: one supported spans {1,2,3,4,6,12}, the other
1166
+ {2,3,4,6,8,9,12}. A `col-8` inside a `.form-grid` therefore did
1167
+ nothing at all, silently, and so did a `col-1` inside an
1168
+ `.ef-form-grid`. Keeping both names on one rule per span makes the
1169
+ two impossible to drift again.
1170
+
1171
+ Every span collapses to full width at the shell's own mobile
1172
+ breakpoint (767px, the one EfViewportService uses). That single
1173
+ rule is why a field never carries a per-breakpoint span in its
1174
+ template, and why this grid stays mobile-first by default rather
1175
+ than by remembering.
1176
+ ────────────────────────────────────────────────────────────────── */
1177
+ .form-grid,
1178
+ .ef-form-grid {
1249
1179
  display: grid;
1250
1180
  gap: var(--s-3);
1251
1181
  grid-template-columns: repeat(12, minmax(0, 1fr));
1252
1182
  }
1253
1183
 
1254
- .form-grid > .col-1 {
1184
+ .form-grid > .col-1,
1185
+ .ef-form-grid > .col-1 {
1255
1186
  grid-column: span 1;
1256
1187
  }
1257
- .form-grid > .col-2 {
1188
+ .form-grid > .col-2,
1189
+ .ef-form-grid > .col-2 {
1258
1190
  grid-column: span 2;
1259
1191
  }
1260
- .form-grid > .col-3 {
1192
+ .form-grid > .col-3,
1193
+ .ef-form-grid > .col-3 {
1261
1194
  grid-column: span 3;
1262
1195
  }
1263
- .form-grid > .col-4 {
1196
+ .form-grid > .col-4,
1197
+ .ef-form-grid > .col-4 {
1264
1198
  grid-column: span 4;
1265
1199
  }
1266
- .form-grid > .col-6 {
1200
+ .form-grid > .col-5,
1201
+ .ef-form-grid > .col-5 {
1202
+ grid-column: span 5;
1203
+ }
1204
+ .form-grid > .col-6,
1205
+ .ef-form-grid > .col-6 {
1267
1206
  grid-column: span 6;
1268
1207
  }
1269
- .form-grid > .col-12 {
1208
+ .form-grid > .col-7,
1209
+ .ef-form-grid > .col-7 {
1210
+ grid-column: span 7;
1211
+ }
1212
+ .form-grid > .col-8,
1213
+ .ef-form-grid > .col-8 {
1214
+ grid-column: span 8;
1215
+ }
1216
+ .form-grid > .col-9,
1217
+ .ef-form-grid > .col-9 {
1218
+ grid-column: span 9;
1219
+ }
1220
+ .form-grid > .col-10,
1221
+ .ef-form-grid > .col-10 {
1222
+ grid-column: span 10;
1223
+ }
1224
+ .form-grid > .col-11,
1225
+ .ef-form-grid > .col-11 {
1226
+ grid-column: span 11;
1227
+ }
1228
+ .form-grid > .col-12,
1229
+ .ef-form-grid > .col-12 {
1270
1230
  grid-column: span 12;
1271
1231
  }
1272
1232
 
1273
1233
  @media (max-width: 767px) {
1274
- .form-grid > [class*='col-'] {
1234
+ .form-grid > [class*='col-'],
1235
+ .ef-form-grid > [class*='col-'] {
1275
1236
  grid-column: span 12;
1276
1237
  }
1277
1238
  }
1278
1239
 
1240
+
1279
1241
  .field {
1280
1242
  display: grid;
1281
1243
  gap: 4px;
@@ -1422,12 +1384,6 @@
1422
1384
 
1423
1385
  /* ──────────── DASHBOARD KPI CARDS ───────────────────────────────── */
1424
1386
 
1425
- .kpi-grid {
1426
- display: grid;
1427
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1428
- gap: var(--s-3);
1429
- }
1430
-
1431
1387
  .kpi-card {
1432
1388
  background: var(--paper-alt);
1433
1389
  border: 1px solid var(--rule);
@@ -1438,60 +1394,6 @@
1438
1394
  align-content: start;
1439
1395
  }
1440
1396
 
1441
- .kpi-head {
1442
- display: flex;
1443
- justify-content: space-between;
1444
- align-items: center;
1445
- gap: 8px;
1446
- }
1447
-
1448
- .kpi-value {
1449
- font-family: var(--font-display);
1450
- font-variation-settings:
1451
- 'opsz' 96,
1452
- 'wght' 700,
1453
- 'wdth' 80;
1454
- font-size: clamp(28px, 4vw, 40px);
1455
- letter-spacing: -0.03em;
1456
- line-height: 1;
1457
- font-feature-settings: 'tnum';
1458
- color: var(--text);
1459
- }
1460
-
1461
- .kpi-value .unit {
1462
- font-family: var(--font-mono);
1463
- font-size: 0.4em;
1464
- font-weight: 500;
1465
- color: var(--text-mute);
1466
- margin-inline-start: 6px;
1467
- letter-spacing: 0;
1468
- }
1469
-
1470
- .spark {
1471
- width: 100%;
1472
- height: 28px;
1473
- margin-top: 4px;
1474
- }
1475
-
1476
- .delta {
1477
- font-family: var(--font-mono);
1478
- font-size: 11px;
1479
- font-weight: 700;
1480
- padding: 2px 8px;
1481
- border-radius: var(--r-pill);
1482
- letter-spacing: 0;
1483
- }
1484
-
1485
- .delta.up {
1486
- background: var(--st-delivered-bg);
1487
- color: var(--st-delivered-fg);
1488
- }
1489
-
1490
- .delta.down {
1491
- background: var(--st-cancelled-bg);
1492
- color: var(--st-cancelled-fg);
1493
- }
1494
-
1495
1397
  /* Lower-half dashboard grid (recent activity / pipeline / top lists). */
1496
1398
 
1497
1399
  .dash-grid {
@@ -2953,40 +2855,7 @@
2953
2855
  background: var(--paper);
2954
2856
  }
2955
2857
 
2956
- /* Form grid — 12 cols, collapses to single col under 720px. */
2957
- .ef-form-grid {
2958
- display: grid;
2959
- gap: var(--s-3);
2960
- grid-template-columns: repeat(12, minmax(0, 1fr));
2961
- }
2962
-
2963
- .ef-form-grid > .col-2 {
2964
- grid-column: span 2;
2965
- }
2966
- .ef-form-grid > .col-3 {
2967
- grid-column: span 3;
2968
- }
2969
- .ef-form-grid > .col-4 {
2970
- grid-column: span 4;
2971
- }
2972
- .ef-form-grid > .col-6 {
2973
- grid-column: span 6;
2974
- }
2975
- .ef-form-grid > .col-8 {
2976
- grid-column: span 8;
2977
- }
2978
- .ef-form-grid > .col-9 {
2979
- grid-column: span 9;
2980
- }
2981
- .ef-form-grid > .col-12 {
2982
- grid-column: span 12;
2983
- }
2984
-
2985
- @media (max-width: 767px) {
2986
- .ef-form-grid > [class*='col-'] {
2987
- grid-column: span 12;
2988
- }
2989
- }
2858
+ /* The 12-column form grid lives with `.form-grid` above. */
2990
2859
 
2991
2860
  /* Field row inside a form grid. */
2992
2861
  .ef-field {
@@ -3214,6 +3083,7 @@
3214
3083
  display: flex;
3215
3084
  justify-content: space-between;
3216
3085
  align-items: center;
3086
+ gap: 8px;
3217
3087
  }
3218
3088
 
3219
3089
  .kpi-value {
@@ -3227,6 +3097,7 @@
3227
3097
  letter-spacing: -0.04em;
3228
3098
  font-feature-settings: 'tnum';
3229
3099
  font-variant-numeric: tabular-nums;
3100
+ color: var(--text);
3230
3101
  }
3231
3102
 
3232
3103
  .kpi-value .unit {
@@ -3242,13 +3113,18 @@
3242
3113
  font-family: var(--font-mono);
3243
3114
  font-size: 11px;
3244
3115
  font-weight: 600;
3116
+ padding: 2px 8px;
3117
+ border-radius: var(--r-pill);
3118
+ letter-spacing: 0;
3245
3119
  }
3246
3120
 
3247
3121
  .delta.up {
3248
3122
  color: var(--st-delivered-fg);
3123
+ background: var(--st-delivered-bg);
3249
3124
  }
3250
3125
  .delta.down {
3251
3126
  color: var(--st-cancelled-fg);
3127
+ background: var(--st-cancelled-bg);
3252
3128
  }
3253
3129
  .delta.flat {
3254
3130
  color: var(--text-mute);
@@ -3259,6 +3135,7 @@
3259
3135
  opacity: 0.9;
3260
3136
  display: block;
3261
3137
  width: 100%;
3138
+ margin-top: 4px;
3262
3139
  }
3263
3140
 
3264
3141
  .kpi-grid {
@@ -1,12 +1,12 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { PipeTransform, OnInit, OnChanges, TemplateRef, EventEmitter, AfterContentInit, OnDestroy, SimpleChanges, InjectionToken, AfterViewInit } from '@angular/core';
3
+ import * as _elasticias_screens from '@elasticias/screens';
4
+ import { EfDataCardColumn, ScreenContext, EfDetailToolbarAction, EfSearchToolbarAction, EfDataCardSort, EfDataCardExportRequest, EfDateRange, EfDatePresetKey } from '@elasticias/screens';
5
+ export { EfDataCardColumn, EfDataCardColumnAlign, EfDataCardColumnMobileRole, EfDataCardColumnType, EfDataCardSort, EfDataCardSortDirection, EfDatePresetKey, EfDateRange, EfDetailToolbarAction, EfSearchToolbarAction } from '@elasticias/screens';
3
6
  import { Menu } from 'primeng/menu';
4
7
  import * as _elasticias_core from '@elasticias/core';
5
8
  import { EfBuildPackage, EfModule, EfNavSection, EfNavItem, EfModuleId, EfToast, EfToastAction, EfThemeConfigService } from '@elasticias/core';
6
9
  import * as i1 from 'primeng/tooltip';
7
- import * as _elasticias_screens from '@elasticias/screens';
8
- import { ScreenContext, EfDetailToolbarAction, EfSearchToolbarAction, EfDataCardColumn, EfDataCardSort, EfDataCardExportRequest, EfDateRange, EfDatePresetKey } from '@elasticias/screens';
9
- export { EfDataCardColumn, EfDataCardColumnAlign, EfDataCardColumnMobileRole, EfDataCardColumnType, EfDataCardSort, EfDataCardSortDirection, EfDatePresetKey, EfDateRange, EfDetailToolbarAction, EfSearchToolbarAction } from '@elasticias/screens';
10
10
  import { BlockableUI } from 'primeng/api';
11
11
  import { SafeResourceUrl } from '@angular/platform-browser';
12
12
  import { ChartConfiguration } from 'chart.js';
@@ -435,8 +435,18 @@ declare class EfOrderBuilderComponent implements OnInit {
435
435
  id: OrderLineItem["id"];
436
436
  field: EditableLineField;
437
437
  }>;
438
- /** Number of table columns, used for the empty-state colspan. */
439
- colCount: _angular_core.Signal<number>;
438
+ /**
439
+ * Columns for the lines table.
440
+ *
441
+ * Only the article column is elastic: it carries no width and so absorbs
442
+ * whatever the fixed columns leave. Every other column holds a number whose
443
+ * magnitude is known in advance, so a fixed track keeps the decimal points
444
+ * aligned down the table instead of letting the longest product description
445
+ * shift them. The `mobile` roles decide what `ef-data-card` shows on a
446
+ * phone before the row is expanded, which is why the article leads and the
447
+ * subtotal reads as the row's status.
448
+ */
449
+ readonly lineColumns: _angular_core.Signal<EfDataCardColumn[]>;
440
450
  isEditingCell(item: OrderLineItem, field: EditableLineField): boolean;
441
451
  startEditCell(item: OrderLineItem, field: EditableLineField): void;
442
452
  stopEditCell(): void;
@@ -448,6 +458,17 @@ declare class EfOrderBuilderComponent implements OnInit {
448
458
  recapColumns: _angular_core.Signal<OrderSummaryItem[][]>;
449
459
  constructor();
450
460
  ngOnInit(): void;
461
+ /**
462
+ * Move a line to a new position.
463
+ *
464
+ * The order of an order's lines is data the operator owns — it is the order
465
+ * the picker walks the shelves in and the order the printed document reads
466
+ * in — so it is reordered by hand rather than derived from a sort.
467
+ */
468
+ reorderLine(ev: {
469
+ from: number;
470
+ to: number;
471
+ }): void;
451
472
  removeOrderLine(id: string | number | undefined): void;
452
473
  onFieldChange(item: OrderLineItem): void;
453
474
  calculateSubtotal(item: OrderLineItem): number;
@@ -2460,8 +2481,10 @@ declare class EfCardComponent {
2460
2481
  }
2461
2482
 
2462
2483
  /**
2463
- * 12-column form-grid primitive. Children use `.col-2/3/4/6/8/9/12`
2464
- * to claim spans; on viewports < 720px every span collapses to 12.
2484
+ * 12-column form-grid primitive. Children use `.col-1` through
2485
+ * `.col-12` to claim spans; at 767px and below (the shell's own
2486
+ * mobile breakpoint) every span collapses to the full 12, so a
2487
+ * field never carries a per-breakpoint span of its own.
2465
2488
  *
2466
2489
  * ```html
2467
2490
  * <ef-form-grid>
@@ -4496,6 +4519,40 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4496
4519
  numberFormat(col: EfDataCardColumn): string;
4497
4520
  /** Which tools panel is open, if any. */
4498
4521
  readonly openTool: _angular_core.WritableSignal<"density" | "columns">;
4522
+ /**
4523
+ * Density this table starts at.
4524
+ *
4525
+ * A viewer's own choice, restored from storage via `tableKey`, still wins;
4526
+ * this only moves the starting point for a table whose rows are meant to be
4527
+ * scanned in bulk (an order's lines, say) rather than read one at a time.
4528
+ */
4529
+ readonly defaultDensity: _angular_core.InputSignal<EfTableDensity>;
4530
+ /**
4531
+ * Let the viewer drag rows into a new order. Off by default: reordering
4532
+ * only means something where the row order is itself data the user owns
4533
+ * (an order's lines), not on a list whose order comes from a sort.
4534
+ *
4535
+ * Adds a leading handle column; the row is only draggable by that handle,
4536
+ * so selecting text in a cell still works.
4537
+ */
4538
+ readonly reorderable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4539
+ /** The moved row's original and new index, once the drag settles. */
4540
+ readonly rowReorder: _angular_core.OutputEmitterRef<{
4541
+ from: number;
4542
+ to: number;
4543
+ }>;
4544
+ /** Index being dragged, and the index it would land on. */
4545
+ readonly dragFrom: _angular_core.WritableSignal<number>;
4546
+ readonly dragTo: _angular_core.WritableSignal<number>;
4547
+ onDragPointerDown(index: number, ev: PointerEvent): void;
4548
+ onDragPointerMove(ev: PointerEvent): void;
4549
+ onDragPointerUp(): void;
4550
+ /**
4551
+ * Keyboard equivalent of the drag. A handle that only answers to a pointer
4552
+ * puts the row order out of reach of anyone not using a mouse, so the same
4553
+ * move is on the arrow keys while the handle has focus.
4554
+ */
4555
+ onDragKeydown(index: number, ev: KeyboardEvent): void;
4499
4556
  /** Row density. Applied as a class on `.tbl-wrap`. */
4500
4557
  readonly density: _angular_core.WritableSignal<EfTableDensity>;
4501
4558
  /** Column ids the viewer has hidden. */
@@ -4568,7 +4625,7 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4568
4625
  trackByRow: (_: number, row: TRow) => unknown;
4569
4626
  trackByColumn: (_: number, col: EfDataCardColumn) => string;
4570
4627
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDataCardComponent<any>, never>;
4571
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDataCardComponent<any>, "ef-data-card", never, { "mobileLayout": { "alias": "mobileLayout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "trackByField": { "alias": "trackByField"; "required": false; "isSignal": true; }; "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; }; "hidePager": { "alias": "hidePager"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "loadingKey": { "alias": "loadingKey"; "required": false; "isSignal": true; }; "rowDoubleClickable": { "alias": "rowDoubleClickable"; "required": false; "isSignal": true; }; "hasActionsColumn": { "alias": "hasActionsColumn"; "required": false; "isSignal": true; }; "rowActionsContext": { "alias": "rowActionsContext"; "required": false; "isSignal": true; }; "showViewAction": { "alias": "showViewAction"; "required": false; "isSignal": true; }; "showEditAction": { "alias": "showEditAction"; "required": false; "isSignal": true; }; "showDuplicateAction": { "alias": "showDuplicateAction"; "required": false; "isSignal": true; }; "showDeleteAction": { "alias": "showDeleteAction"; "required": false; "isSignal": true; }; "showDensityControl": { "alias": "showDensityControl"; "required": false; "isSignal": true; }; "showColumnPicker": { "alias": "showColumnPicker"; "required": false; "isSignal": true; }; "showExportControl": { "alias": "showExportControl"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "screenContext": { "alias": "screenContext"; "required": false; "isSignal": true; }; "searchTerm": { "alias": "searchTerm"; "required": false; "isSignal": true; }; "tableKey": { "alias": "tableKey"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; "sortChange": "sortChange"; "rowDoubleClick": "rowDoubleClick"; "rowAction": "rowAction"; "exportRequest": "exportRequest"; "clearSearch": "clearSearch"; }, ["bodyTemplates", "headerTemplates"], ["[tbl-head-info]", "[tbl-head-actions]", "[empty-state-mobile]", "[empty-state]"], true, never>;
4628
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDataCardComponent<any>, "ef-data-card", never, { "mobileLayout": { "alias": "mobileLayout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "trackByField": { "alias": "trackByField"; "required": false; "isSignal": true; }; "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; }; "hidePager": { "alias": "hidePager"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "loadingKey": { "alias": "loadingKey"; "required": false; "isSignal": true; }; "rowDoubleClickable": { "alias": "rowDoubleClickable"; "required": false; "isSignal": true; }; "hasActionsColumn": { "alias": "hasActionsColumn"; "required": false; "isSignal": true; }; "rowActionsContext": { "alias": "rowActionsContext"; "required": false; "isSignal": true; }; "showViewAction": { "alias": "showViewAction"; "required": false; "isSignal": true; }; "showEditAction": { "alias": "showEditAction"; "required": false; "isSignal": true; }; "showDuplicateAction": { "alias": "showDuplicateAction"; "required": false; "isSignal": true; }; "showDeleteAction": { "alias": "showDeleteAction"; "required": false; "isSignal": true; }; "showDensityControl": { "alias": "showDensityControl"; "required": false; "isSignal": true; }; "showColumnPicker": { "alias": "showColumnPicker"; "required": false; "isSignal": true; }; "showExportControl": { "alias": "showExportControl"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "screenContext": { "alias": "screenContext"; "required": false; "isSignal": true; }; "searchTerm": { "alias": "searchTerm"; "required": false; "isSignal": true; }; "tableKey": { "alias": "tableKey"; "required": false; "isSignal": true; }; "defaultDensity": { "alias": "defaultDensity"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; "sortChange": "sortChange"; "rowDoubleClick": "rowDoubleClick"; "rowAction": "rowAction"; "exportRequest": "exportRequest"; "clearSearch": "clearSearch"; "rowReorder": "rowReorder"; }, ["bodyTemplates", "headerTemplates"], ["[tbl-head-info]", "[tbl-head-actions]", "[empty-state-mobile]", "[empty-state]"], true, never>;
4572
4629
  }
4573
4630
 
4574
4631
  /**
@@ -4611,6 +4668,42 @@ declare class EfColumnHeaderTemplateDirective {
4611
4668
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<EfColumnHeaderTemplateDirective, "[efColumnHeaderTemplate]", never, { "columnId": { "alias": "efColumnHeaderTemplate"; "required": true; }; }, {}, never, never, true, never>;
4612
4669
  }
4613
4670
 
4671
+ /**
4672
+ * Feeds a cell's full text to the `ef-tooltip` sitting on the same element,
4673
+ * but only when that text is actually clipped.
4674
+ *
4675
+ * A column wide enough for the longest product description would starve every
4676
+ * other column, so the description ellipsises. The operator is then left with
4677
+ * a row they cannot read and nothing telling them the rest exists. This gives
4678
+ * it back on hover, through the same comptoir-skinned tooltip the rest of the
4679
+ * product uses rather than the browser's unstyled `title` bubble.
4680
+ *
4681
+ * The directive is always attached; what varies is whether it has anything to
4682
+ * say. A cell whose text fits gets its tooltip disabled, so hovering a number
4683
+ * that is fully visible does not pop a bubble repeating it.
4684
+ *
4685
+ * Measuring happens on `mouseenter`/`focusin` rather than from a ResizeObserver
4686
+ * per cell: a 150-line table is a thousand observers for information nobody
4687
+ * needs until a pointer is over one of them, and the tooltip's own show delay
4688
+ * leaves ample time to measure.
4689
+ *
4690
+ * Truncation can happen on the cell or on an element inside it (the order
4691
+ * builder ellipsises an inner `.nm` span, not the `td`), so both are checked.
4692
+ */
4693
+ declare class EfOverflowTooltipDirective {
4694
+ private readonly host;
4695
+ /** Provided by the `efTooltip` host directive on the same element. */
4696
+ private readonly tooltip;
4697
+ /** 1px of slack: sub-pixel layout rounding otherwise reads as clipped. */
4698
+ private static readonly SLACK;
4699
+ protected sync(): void;
4700
+ /** The cell itself, or the first descendant whose text is cut off. */
4701
+ private findClipped;
4702
+ private isClipped;
4703
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfOverflowTooltipDirective, never>;
4704
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<EfOverflowTooltipDirective, "[efOverflowTooltip]", never, {}, {}, never, never, true, never>;
4705
+ }
4706
+
4614
4707
  /**
4615
4708
  * Row-actions dropdown — V2 successor to `ef-datatable-actionbar`.
4616
4709
  *
@@ -5677,5 +5770,5 @@ declare class EfEmailMetricsCardComponent {
5677
5770
  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>;
5678
5771
  }
5679
5772
 
5680
- 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 };
5773
+ 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, EfOverflowTooltipDirective, 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 };
5681
5774
  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 };