@elasticias/ui 1.0.30 → 1.0.32

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.30",
3
+ "version": "1.0.32",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0",
@@ -119,6 +119,22 @@
119
119
  --text-soft: var(--ink-400);
120
120
  --ink-active: var(--ink-900);
121
121
 
122
+ /* The module rail is the shell's deepest chrome, and it is dark in BOTH
123
+ themes on purpose: it anchors the app rather than tracking the page.
124
+
125
+ It used to paint `--ink-active` on `--paper`. Both of those flip, so the
126
+ rail was a dark strip on a light app in light mode and a WHITE strip on a
127
+ dark app in dark mode — while its icons still hardcoded white, which
128
+ measured 1.03:1. The ink ramp itself is theme-independent (`--ink-900` is
129
+ #0f1115 under both `:root` and `.p-dark`); only the `--ink-active` alias
130
+ flips. Naming the ramp step directly is what makes the rail hold still. */
131
+ --rail-bg: var(--ink-900);
132
+ --rail-fg: #fff;
133
+ --rail-fg-mute: rgba(255, 255, 255, 0.6);
134
+ --rail-rule: rgba(255, 255, 255, 0.08);
135
+ --rail-hover: rgba(255, 255, 255, 0.08);
136
+ --rail-active: rgba(255, 255, 255, 0.12);
137
+
122
138
  /* `--ink-soft` is not a ramp step and was never defined anywhere; it is an
123
139
  alias, added because eight call sites across three files already name it
124
140
  as `var(--ink-soft, #64748b)`. Undefined, every one of them fell through
@@ -192,6 +208,14 @@
192
208
  --text-mute: var(--ink-400);
193
209
  --text-soft: var(--ink-500);
194
210
  --ink-active: var(--ink-50);
211
+
212
+ /* The page is already `--ink-900` here, so the rail goes one step deeper to
213
+ stay a surface of its own instead of merging into the canvas. In light
214
+ mode the rail is far darker than the page; this keeps that relationship
215
+ rather than the literal colour. Everything painted on it stays white, so
216
+ only the ground is restated. */
217
+ --rail-bg: #08090c;
218
+
195
219
  /* Status pairs. Without these a chip kept its light pastel ground on a dark
196
220
  page — the one place the dark theme visibly fell apart, because chips are
197
221
  the densest colour in any list.
@@ -734,7 +734,12 @@
734
734
  }
735
735
 
736
736
  .popover .preset.active .hint {
737
- color: rgba(255, 255, 255, 0.7);
737
+ /* The active preset inverts against the page: its ground is `--ink-active`
738
+ and its ink `--paper`, and both flip together, so the pair stays readable
739
+ in either theme. This hint has to ride that inversion rather than assume
740
+ the ground is dark — hardcoded white measured 1.04:1 on the light ground
741
+ the token resolves to in dark mode. */
742
+ color: color-mix(in srgb, var(--paper) 70%, transparent);
738
743
  }
739
744
 
740
745
  .f-pill.has-pop {
@@ -1093,11 +1098,15 @@
1093
1098
  }
1094
1099
 
1095
1100
  .bulk .count {
1096
- color: rgba(255, 255, 255, 0.7);
1101
+ /* `.bulk` inverts against the page (`--ink-active` ground, `--paper` ink),
1102
+ and both flip together. The count has to ride that inversion; hardcoded
1103
+ white read as white-on-white once the ground resolved light in dark mode.
1104
+ Same for the buttons below, whose scrims were white-on-white too. */
1105
+ color: color-mix(in srgb, var(--paper) 70%, transparent);
1097
1106
  }
1098
1107
 
1099
1108
  .bulk .btn {
1100
- background: rgba(255, 255, 255, 0.1);
1109
+ background: color-mix(in srgb, var(--paper) 10%, transparent);
1101
1110
  color: var(--paper);
1102
1111
  border: 0;
1103
1112
  min-height: 28px;
@@ -1106,7 +1115,7 @@
1106
1115
  }
1107
1116
 
1108
1117
  .bulk .btn:hover {
1109
- background: rgba(255, 255, 255, 0.2);
1118
+ background: color-mix(in srgb, var(--paper) 20%, transparent);
1110
1119
  }
1111
1120
 
1112
1121
  /* ──────────── EMPTY STATE ──────────────────────────────────────── */
@@ -2045,7 +2054,10 @@
2045
2054
  }
2046
2055
 
2047
2056
  .dp__preset.active .hint {
2048
- color: rgba(255, 255, 255, 0.7);
2057
+ /* Rides the active preset's inversion, same as `.popover .preset.active
2058
+ .hint`. The two lists are styled separately and carried the same
2059
+ hardcoded white, so they broke in dark mode together. */
2060
+ color: color-mix(in srgb, var(--paper) 70%, transparent);
2049
2061
  }
2050
2062
 
2051
2063
  .dp__preset.muted {
@@ -4452,7 +4452,9 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4452
4452
  * equivalent and a tabindex to be usable, which a decorative box should
4453
4453
  * not have.
4454
4454
  */
4455
- protected onRowHeadActivate(row: unknown, index: number, event: Event): void;
4455
+ protected onRowHeadActivate(row: TRow, index: number, event: Event): void;
4456
+ /** The chevron owns expansion once the head is busy navigating. */
4457
+ protected onDisclosureToggle(row: unknown, index: number, event: Event): void;
4456
4458
  protected toggleExpanded(row: unknown, index: number): void;
4457
4459
  private rowKey;
4458
4460
  /**
@@ -4487,6 +4489,10 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4487
4489
  /** Fields a collapsed card shows. A row shows none until it opens. */
4488
4490
  protected readonly cardPreviewColumns: _angular_core.Signal<EfDataCardColumn[]>;
4489
4491
  protected readonly hasDetail: _angular_core.Signal<boolean>;
4492
+ /** Whether the screen wired an open-the-record action to this table. */
4493
+ protected readonly rowNavigable: _angular_core.Signal<boolean>;
4494
+ /** The head is a control when it either opens the row or expands it. */
4495
+ protected readonly headIsControl: _angular_core.Signal<boolean>;
4490
4496
  /** Only worth a toggle when opening actually reveals something. */
4491
4497
  protected readonly hasMoreThanPreview: _angular_core.Signal<boolean>;
4492
4498
  /** Fields visible for a row right now, given layout and open state. */
@@ -4773,9 +4779,39 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
4773
4779
  * popup can escape its rounded edges. */
4774
4780
  readonly openMenuCount: _angular_core.WritableSignal<number>;
4775
4781
  onRowActionsToggle(event: Event): void;
4776
- /** Fires `rowDoubleClick` unless the dblclick originated on an
4777
- * interactive child (checkbox, button, link, form control). */
4778
- onRowDoubleClick(row: TRow, event: MouseEvent): void;
4782
+ /**
4783
+ * Children that own their own click. Opening the row on top of them would
4784
+ * run two things from one gesture.
4785
+ */
4786
+ private static readonly INTERACTIVE_CHILD;
4787
+ /**
4788
+ * Bounded by the row on purpose. The row itself is given `role="button"`
4789
+ * when it is openable, so an unbounded `closest()` matches the row as its
4790
+ * own ancestor and suppresses every click on it — the interaction looks
4791
+ * wired and does nothing. Only a control *inside* the row counts.
4792
+ */
4793
+ private isInteractiveTarget;
4794
+ /**
4795
+ * A drag that selects text ends in a click. Opening the row on that click
4796
+ * throws the selection away at the instant it was made, which is worse
4797
+ * than not opening, because the work is lost rather than merely delayed.
4798
+ */
4799
+ private hasTextSelection;
4800
+ /**
4801
+ * Open a row with one click.
4802
+ *
4803
+ * This used to take two. The tell was not the pointer but the keyboard:
4804
+ * Enter on a focused row already opened it with a single press, because a
4805
+ * keyboard cannot produce a double-click at all. So the component was
4806
+ * already committed to single activation and only the mouse was asking
4807
+ * twice — and the row paints `cursor: pointer` the whole time, which says
4808
+ * a click does something.
4809
+ *
4810
+ * The output is still named `rowDoubleClick` so the twelve screens bound
4811
+ * to it keep working untouched. The name is now wrong; renaming it is a
4812
+ * breaking change to a published component and belongs in its own commit.
4813
+ */
4814
+ onRowClick(row: TRow, event: MouseEvent): void;
4779
4815
  /**
4780
4816
  * `aria-sort` for the header cell: the only thing that tells a screen
4781
4817
  * reader which column is ordered and which way. The arrow glyph is