@joanroucoux/cairn-ui 0.5.0 → 0.6.0

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.
@@ -41,6 +41,22 @@ type AmountFormatOptions = {
41
41
  /** Formats a number or an amount for the locale, with a missing value as an em dash and masking behind four bullets. */
42
42
  declare function formatAmount(value: number | null | undefined, options: AmountFormatOptions, masked?: boolean): string;
43
43
 
44
+ declare const ALERT_VARIANTS: readonly ["error", "warning"];
45
+ type AlertVariant = (typeof ALERT_VARIANTS)[number];
46
+ /**
47
+ * Inline message explaining a failure or a consequence: an icon, an optional heading and a text.
48
+ *
49
+ * @example
50
+ * <ui-alert heading="Sign-in failed">Try again.</ui-alert>
51
+ */
52
+ declare class UiAlert {
53
+ readonly variant: _angular_core.InputSignal<"error" | "warning">;
54
+ readonly heading: _angular_core.InputSignal<string | undefined>;
55
+ protected readonly classes: _angular_core.Signal<string>;
56
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAlert, never>;
57
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiAlert, "ui-alert", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
58
+ }
59
+
44
60
  /** Available async block states. `AsyncState` is derived from this tuple. */
45
61
  declare const ASYNC_STATES: readonly ["loading", "error", "empty", "ready"];
46
62
  type AsyncState = (typeof ASYNC_STATES)[number];
@@ -55,18 +71,18 @@ type AsyncState = (typeof ASYNC_STATES)[number];
55
71
  * </ui-async>
56
72
  */
57
73
  declare class UiAsync {
58
- readonly state: _angular_core.InputSignal<"loading" | "error" | "empty" | "ready">;
74
+ readonly state: _angular_core.InputSignal<"error" | "loading" | "empty" | "ready">;
59
75
  readonly errorTitle: _angular_core.InputSignal<string | undefined>;
60
76
  readonly errorMessage: _angular_core.InputSignal<string | undefined>;
61
77
  readonly retryLabel: _angular_core.InputSignal<string | undefined>;
62
78
  readonly retry: _angular_core.OutputEmitterRef<void>;
63
- protected readonly retryButtonClasses = "mt-2 relative inline-flex items-center justify-center gap-2 rounded-control font-medium whitespace-nowrap cursor-pointer select-none touch-manipulation transition-[transform,background-color,opacity] duration-(--duration-press) ease-out active:scale-(--press-scale) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) min-h-(--row-min) px-4 text-label bg-(--card) text-(--foreground) shadow-[inset_0_0_0_1px_var(--border)] hover:bg-(--glow)";
79
+ protected readonly retryButtonClasses = "mt-2 relative inline-flex items-center justify-center gap-2 rounded-control font-medium whitespace-nowrap cursor-pointer select-none touch-manipulation transition-[transform,background-color,opacity] duration-(--duration-press) ease-out active:scale-(--press-scale) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) min-h-(--row-min) pl-3 pr-4 text-label bg-(--card) text-(--foreground) shadow-[inset_0_0_0_1px_var(--border)] hover:bg-(--glow)";
64
80
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAsync, never>;
65
81
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiAsync, "ui-async", never, { "state": { "alias": "state"; "required": true; "isSignal": true; }; "errorTitle": { "alias": "errorTitle"; "required": false; "isSignal": true; }; "errorMessage": { "alias": "errorMessage"; "required": false; "isSignal": true; }; "retryLabel": { "alias": "retryLabel"; "required": false; "isSignal": true; }; }, { "retry": "retry"; }, never, ["[asyncLoading]", "[asyncEmpty]", "*"], true, never>;
66
82
  }
67
83
 
68
84
  /** Available avatar sizes. `AvatarSize` is derived from this tuple. */
69
- declare const AVATAR_SIZES: readonly ["sm", "md"];
85
+ declare const AVATAR_SIZES: readonly ["sm", "md", "lg"];
70
86
  type AvatarSize = (typeof AVATAR_SIZES)[number];
71
87
  /**
72
88
  * Initials in a disc, standing in for a person. Single-user application: there is exactly one.
@@ -77,7 +93,7 @@ type AvatarSize = (typeof AVATAR_SIZES)[number];
77
93
  declare class UiAvatar {
78
94
  readonly initials: _angular_core.InputSignal<string>;
79
95
  readonly label: _angular_core.InputSignal<string>;
80
- readonly size: _angular_core.InputSignal<"sm" | "md">;
96
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
81
97
  protected readonly classes: _angular_core.Signal<string>;
82
98
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAvatar, never>;
83
99
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiAvatar, "ui-avatar", never, { "initials": { "alias": "initials"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -86,6 +102,8 @@ declare class UiAvatar {
86
102
  /** Available badge variants. `BadgeVariant` is derived from this tuple. */
87
103
  declare const BADGE_VARIANTS: readonly ["neutral", "outline"];
88
104
  type BadgeVariant = (typeof BADGE_VARIANTS)[number];
105
+ declare const BADGE_SIZES: readonly ["md", "sm"];
106
+ type BadgeSize = (typeof BADGE_SIZES)[number];
89
107
  /**
90
108
  * Small status descriptor for counts, states or labels, such as an instrument's asset class.
91
109
  *
@@ -94,16 +112,17 @@ type BadgeVariant = (typeof BADGE_VARIANTS)[number];
94
112
  */
95
113
  declare class UiBadge {
96
114
  readonly variant: _angular_core.InputSignal<"neutral" | "outline">;
115
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
97
116
  protected readonly classes: _angular_core.Signal<string>;
98
117
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiBadge, never>;
99
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiBadge, "ui-badge", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
118
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiBadge, "ui-badge", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
100
119
  }
101
120
 
102
121
  /** Available button variants. `ButtonVariant` is derived from this tuple. */
103
122
  declare const BUTTON_VARIANTS: readonly ["primary", "outline", "ghost", "destructive"];
104
123
  type ButtonVariant = (typeof BUTTON_VARIANTS)[number];
105
- /** Available button sizes. `md` is the touch target Cairn asks for everywhere. */
106
- declare const BUTTON_SIZES: readonly ["md", "lg", "xl", "icon"];
124
+ /** Available button sizes. */
125
+ declare const BUTTON_SIZES: readonly ["md", "lg", "xl", "xxl", "icon"];
107
126
  type ButtonSize = (typeof BUTTON_SIZES)[number];
108
127
  /**
109
128
  * Styled native button or anchor, applied as an attribute so the host keeps every native behavior.
@@ -114,7 +133,7 @@ type ButtonSize = (typeof BUTTON_SIZES)[number];
114
133
  */
115
134
  declare class UiButton {
116
135
  readonly variant: _angular_core.InputSignal<"outline" | "primary" | "ghost" | "destructive">;
117
- readonly size: _angular_core.InputSignal<"md" | "lg" | "xl" | "icon">;
136
+ readonly size: _angular_core.InputSignal<"md" | "lg" | "xl" | "xxl" | "icon">;
118
137
  readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
119
138
  protected readonly classes: _angular_core.Signal<string>;
120
139
  constructor();
@@ -126,7 +145,7 @@ declare class UiButton {
126
145
  declare const CARD_VARIANTS: readonly ["default", "elevated"];
127
146
  type CardVariant = (typeof CARD_VARIANTS)[number];
128
147
  /** Available card paddings. `CardPadding` is derived from this tuple. */
129
- declare const CARD_PADDINGS: readonly ["none", "sm", "md"];
148
+ declare const CARD_PADDINGS: readonly ["none", "sm", "md", "list"];
130
149
  type CardPadding = (typeof CARD_PADDINGS)[number];
131
150
  /**
132
151
  * Surface that groups related content: a summary block, a table, a side panel.
@@ -136,7 +155,7 @@ type CardPadding = (typeof CARD_PADDINGS)[number];
136
155
  */
137
156
  declare class UiCard {
138
157
  readonly variant: _angular_core.InputSignal<"default" | "elevated">;
139
- readonly padding: _angular_core.InputSignal<"sm" | "md" | "none">;
158
+ readonly padding: _angular_core.InputSignal<"sm" | "md" | "none" | "list">;
140
159
  protected readonly classes: _angular_core.Signal<string>;
141
160
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiCard, never>;
142
161
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiCard, "ui-card", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -156,6 +175,46 @@ type UiControl = {
156
175
  readonly touched: Signal<boolean>;
157
176
  };
158
177
 
178
+ type ChoiceChipOption = {
179
+ value: string;
180
+ label: string;
181
+ };
182
+ /**
183
+ * Exclusive choice among a handful of named options, shown as wrapping pills: an account envelope,
184
+ * a category, a frequency. Binds to Signal Forms with `[formField]`.
185
+ *
186
+ * @example
187
+ * <ui-choice-chips label="Envelope" [options]="envelopes" [(value)]="envelope" />
188
+ *
189
+ * @example
190
+ * <ui-choice-chips label="Envelope" [options]="envelopes" [formField]="form.envelope" />
191
+ */
192
+ declare class UiChoiceChips implements UiControl {
193
+ #private;
194
+ readonly options: _angular_core.InputSignal<ChoiceChipOption[]>;
195
+ readonly value: _angular_core.ModelSignal<string>;
196
+ readonly label: _angular_core.InputSignal<string | undefined>;
197
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
198
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
199
+ readonly surface: _angular_core.InputSignal<"background" | "card">;
200
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
201
+ readonly errors: _angular_core.InputSignal<readonly UiControlError[]>;
202
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
203
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
204
+ readonly touched: _angular_core.InputSignal<boolean>;
205
+ readonly touch: _angular_core.OutputEmitterRef<void>;
206
+ protected readonly labelId: string;
207
+ protected readonly radios: _angular_core.Signal<readonly ElementRef<HTMLButtonElement>[]>;
208
+ protected readonly labelledBy: _angular_core.Signal<string | null>;
209
+ protected chipClasses(optionValue: string): string;
210
+ protected tabIndexFor(optionValue: string): number;
211
+ protected select(optionValue: string): void;
212
+ protected onFocusOut(event: FocusEvent): void;
213
+ protected onKeydown(event: KeyboardEvent, index: number): void;
214
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiChoiceChips, never>;
215
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiChoiceChips, "ui-choice-chips", never, { "options": { "alias": "options"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "ariaLabelledby": { "alias": "ariaLabelledby"; "required": false; "isSignal": true; }; "surface": { "alias": "surface"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "touch": "touch"; }, never, never, true, never>;
216
+ }
217
+
159
218
  /** Available delta emphases. `DeltaEmphasis` is derived from this tuple. */
160
219
  declare const DELTA_EMPHASES: readonly ["text", "pill"];
161
220
  type DeltaEmphasis = (typeof DELTA_EMPHASES)[number];
@@ -182,33 +241,58 @@ declare class UiDelta {
182
241
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiDelta, "ui-delta", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "unknownLabel": { "alias": "unknownLabel"; "required": true; "isSignal": true; }; "emphasis": { "alias": "emphasis"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
183
242
  }
184
243
 
185
- /** Available dialog widths. `DialogWidth` is derived from this tuple. */
244
+ /** Named dialog widths; any other CSS length is accepted as is. `DialogWidth` is derived from this tuple. */
186
245
  declare const DIALOG_WIDTHS: readonly ["md", "lg"];
187
246
  type DialogWidth = (typeof DIALOG_WIDTHS)[number];
247
+ /** Spacing presets. `DialogLayout` is derived from this tuple. */
248
+ declare const DIALOG_LAYOUTS: readonly ["trade", "form", "list", "confirm"];
249
+ type DialogLayout = (typeof DIALOG_LAYOUTS)[number];
250
+ type LayoutClasses = {
251
+ dialog: string;
252
+ header: string;
253
+ title: string;
254
+ cross: string;
255
+ icon: string;
256
+ handle: string;
257
+ body: string;
258
+ footer: string;
259
+ };
188
260
  /**
189
- * Modal dialog on the native <dialog>: a sheet rising from the bottom under `64rem`, centered
190
- * above it. Two projection slots - the body, and [dialogActions] for the footer.
261
+ * Modal dialog on the native <dialog>: a bottom sheet under `64rem`, centered above it.
191
262
  *
192
263
  * @example
193
- * <ui-dialog heading="Delete this holding?" [open]="confirming()" (dismissed)="confirming.set(false)">
194
- * <p>This cannot be undone.</p>
195
- * <button dialogActions ui-button variant="outline" (click)="confirming.set(false)">Cancel</button>
264
+ * <ui-dialog heading="Buy" description="Ferrari" closeLabel="Close" width="528px" [open]="buying()" (dismissed)="buying.set(false)">
265
+ * <p>Body</p>
266
+ * <button dialogActions ui-button variant="outline" class="max-lg:hidden" (click)="buying.set(false)">Cancel</button>
267
+ * <button dialogActions ui-button>Buy 40 shares</button>
196
268
  * </ui-dialog>
197
269
  */
198
270
  declare class UiDialog {
199
271
  #private;
200
272
  readonly heading: _angular_core.InputSignal<string>;
201
273
  readonly description: _angular_core.InputSignal<string | undefined>;
202
- readonly width: _angular_core.InputSignal<"md" | "lg">;
274
+ readonly closeLabel: _angular_core.InputSignal<string | undefined>;
275
+ readonly layout: _angular_core.InputSignal<"list" | "trade" | "form" | "confirm">;
276
+ readonly truncateDescription: _angular_core.InputSignalWithTransform<boolean, unknown>;
277
+ readonly width: _angular_core.InputSignal<"md" | "lg" | (string & {})>;
203
278
  readonly open: _angular_core.InputSignalWithTransform<boolean, unknown>;
204
279
  readonly dismissed: _angular_core.OutputEmitterRef<void>;
205
280
  protected readonly headingId: string;
206
281
  protected readonly descriptionId: string;
282
+ protected readonly widthValue: _angular_core.Signal<string>;
283
+ protected readonly spec: _angular_core.Signal<LayoutClasses>;
284
+ protected readonly headerClasses: _angular_core.Signal<string>;
285
+ protected readonly titleClasses: _angular_core.Signal<string>;
286
+ protected readonly crossClasses: _angular_core.Signal<string>;
287
+ protected readonly iconClasses: _angular_core.Signal<string>;
288
+ protected readonly footerClasses: _angular_core.Signal<string>;
207
289
  protected readonly classes: _angular_core.Signal<string>;
208
290
  constructor();
291
+ protected onPointerDown(event: MouseEvent): void;
292
+ protected onClick(event: MouseEvent): void;
209
293
  protected onNativeClose(): void;
210
294
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiDialog, never>;
211
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiDialog, "ui-dialog", never, { "heading": { "alias": "heading"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, never, ["*", "[dialogActions]"], true, never>;
295
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiDialog, "ui-dialog", never, { "heading": { "alias": "heading"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "truncateDescription": { "alias": "truncateDescription"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, never, ["*", "[dialogActions]"], true, never>;
212
296
  }
213
297
 
214
298
  type DonutSlice = {
@@ -225,7 +309,8 @@ type RankedSlice = DonutSlice & {
225
309
  };
226
310
 
227
311
  type PositionedSlice = RankedSlice & {
228
- path: string;
312
+ dash: string;
313
+ offset: string;
229
314
  };
230
315
 
231
316
  /**
@@ -247,11 +332,13 @@ declare class UiDonut {
247
332
  protected readonly positioned: _angular_core.Signal<PositionedSlice[]>;
248
333
  protected readonly active: _angular_core.Signal<RankedSlice | null>;
249
334
  protected readonly ariaLabel: _angular_core.Signal<string>;
250
- protected pathClasses(slice: RankedSlice): string;
335
+ protected readonly radius = 78;
336
+ protected readonly ringWidth = 30;
337
+ protected strokeColor(slice: RankedSlice): string;
338
+ protected strokeWidth(slice: RankedSlice): number;
251
339
  protected dotClasses(slice: RankedSlice): string;
252
340
  protected rowClasses(slice: RankedSlice): string;
253
341
  protected subLabel(slice: RankedSlice): string;
254
- protected arcTransform(slice: RankedSlice): string;
255
342
  protected isActive(slice: RankedSlice): boolean;
256
343
  protected highlight(id: string): void;
257
344
  protected clearHighlight(id: string): void;
@@ -260,6 +347,21 @@ declare class UiDonut {
260
347
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiDonut, "ui-donut", never, { "slices": { "alias": "slices"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "othersLabel": { "alias": "othersLabel"; "required": true; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "shareFormat": { "alias": "shareFormat"; "required": false; "isSignal": true; }; }, { "sliceSelect": "sliceSelect"; }, never, never, true, never>;
261
348
  }
262
349
 
350
+ /**
351
+ * Marks an element, typically an 18px svg icon, as the leading content of a `ui-field`: it sits
352
+ * inside the control's left edge and the control's text is inset to clear it. Decorative, so hidden
353
+ * from assistive technologies.
354
+ *
355
+ * @example
356
+ * <ui-field label="Search" labelHidden>
357
+ * <svg uiFieldLeading width="18" height="18" viewBox="0 0 24 24">...</svg>
358
+ * <input uiInput type="search" />
359
+ * </ui-field>
360
+ */
361
+ declare class UiFieldLeading {
362
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiFieldLeading, never>;
363
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiFieldLeading, "[uiFieldLeading]", never, {}, {}, never, never, true, never>;
364
+ }
263
365
  /**
264
366
  * Label, control, hint and error as one unit. The control stays a plain native element:
265
367
  * the field finds it in its own projected content and wires the ARIA attributes onto it.
@@ -292,7 +394,9 @@ declare class UiField {
292
394
  protected readonly hintId: string;
293
395
  protected readonly errorId: string;
294
396
  protected readonly control: _angular_core.Signal<UiControl | undefined>;
295
- protected readonly labelClasses: _angular_core.Signal<"sr-only" | "text-label font-medium text-(--muted-foreground)">;
397
+ protected readonly leading: _angular_core.Signal<UiFieldLeading | undefined>;
398
+ protected readonly rowClasses: _angular_core.Signal<"relative flex items-center [&>input]:pl-[38px]" | "relative flex items-center">;
399
+ protected readonly labelClasses: _angular_core.Signal<"sr-only" | "text-label leading-[17px] font-medium text-(--muted-foreground)">;
296
400
  /**
297
401
  * The caller's own `error` wins: it is the only way to report something the control does not
298
402
  * know about, such as a search box refusing an empty query.
@@ -300,12 +404,14 @@ declare class UiField {
300
404
  protected readonly message: _angular_core.Signal<string | undefined>;
301
405
  constructor();
302
406
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiField, never>;
303
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiField, "ui-field", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "labelHidden": { "alias": "labelHidden"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; }, {}, ["control"], ["*"], true, never>;
407
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiField, "ui-field", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "labelHidden": { "alias": "labelHidden"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "unit": { "alias": "unit"; "required": false; "isSignal": true; }; }, {}, ["control", "leading"], ["[uiFieldLeading]", "*"], true, never>;
304
408
  }
305
409
 
306
410
  /** Available control sizes. `md` is the 44/40px touch target. */
307
411
  declare const CONTROL_SIZES: readonly ["sm", "md"];
308
412
  type ControlSize = (typeof CONTROL_SIZES)[number];
413
+ declare const CONTROL_SURFACES: readonly ["background", "card"];
414
+ type ControlSurface = (typeof CONTROL_SURFACES)[number];
309
415
  /**
310
416
  * Styled native text input. A directive (not a wrapper component) so the host
311
417
  * stays a plain <input>: every forms flavor (ngModel, reactive, signal forms)
@@ -319,11 +425,12 @@ type ControlSize = (typeof CONTROL_SIZES)[number];
319
425
  */
320
426
  declare class UiInput implements UiControl {
321
427
  readonly size: _angular_core.InputSignal<"sm" | "md">;
428
+ readonly surface: _angular_core.InputSignal<"background" | "card">;
322
429
  readonly errors: _angular_core.InputSignal<readonly UiControlError[]>;
323
430
  readonly touched: _angular_core.InputSignal<boolean>;
324
431
  protected readonly classes: _angular_core.Signal<string>;
325
432
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiInput, never>;
326
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiInput, "input[uiInput]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
433
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiInput, "input[uiInput]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "surface": { "alias": "surface"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
327
434
  }
328
435
  /**
329
436
  * Styled native textarea. Lives beside the input because it shares every one of its
@@ -343,6 +450,10 @@ declare class UiTextarea implements UiControl {
343
450
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTextarea, "textarea[uiTextarea]", never, { "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "touched": { "alias": "touched"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
344
451
  }
345
452
 
453
+ declare const TOOLTIP_SIZES: readonly ["compact", "large"];
454
+ type TooltipSize = (typeof TOOLTIP_SIZES)[number];
455
+ type AxisTicks = 3 | 5 | 'auto';
456
+
346
457
  type ChartPoint = {
347
458
  t: number;
348
459
  v: number;
@@ -365,12 +476,6 @@ type ChartGeometry = {
365
476
  plotTop: number;
366
477
  };
367
478
 
368
- type StartLabelPlacement = {
369
- x: number;
370
- y: number;
371
- anchor: 'start' | 'end';
372
- };
373
-
374
479
  type PlotRef = ElementRef<SVGSVGElement>;
375
480
  /**
376
481
  * Value over time: a monotone curve with a dashed line at the starting value and a tooltip.
@@ -389,6 +494,12 @@ declare class UiLineChart {
389
494
  readonly startLabel: _angular_core.InputSignal<string>;
390
495
  readonly timeColumnLabel: _angular_core.InputSignal<string>;
391
496
  readonly valueColumnLabel: _angular_core.InputSignal<string>;
497
+ readonly sparkline: _angular_core.InputSignalWithTransform<boolean, unknown>;
498
+ readonly tooltip: _angular_core.InputSignal<"compact" | "large" | "auto">;
499
+ readonly tooltipDelta: _angular_core.InputSignalWithTransform<boolean, unknown>;
500
+ readonly axisGap: _angular_core.InputSignal<number | "auto">;
501
+ readonly axisTicks: _angular_core.InputSignalWithTransform<AxisTicks, string | 3 | 5>;
502
+ protected readonly isCoreTick: (index: number, count: number) => boolean;
392
503
  protected readonly svgRef: _angular_core.Signal<PlotRef>;
393
504
  protected readonly activeIndex: _angular_core.WritableSignal<number | null>;
394
505
  protected readonly animatedLine: _angular_core.WritableSignal<string | null>;
@@ -398,24 +509,33 @@ declare class UiLineChart {
398
509
  } | null>;
399
510
  protected readonly effectiveWidth: _angular_core.Signal<number>;
400
511
  protected readonly effectiveHeight: _angular_core.Signal<number>;
512
+ protected readonly plotHeight: _angular_core.Signal<number>;
513
+ protected readonly tooltipStyle: (point: PlottedPoint) => string;
514
+ protected readonly tooltipClasses: _angular_core.Signal<{
515
+ box: string;
516
+ value: string;
517
+ delta: string;
518
+ }>;
401
519
  protected readonly geometry: _angular_core.Signal<ChartGeometry | null>;
402
520
  protected readonly displayLine: _angular_core.Signal<string>;
403
521
  protected readonly ticks: _angular_core.Signal<PlottedPoint[]>;
404
522
  protected readonly active: _angular_core.Signal<PlottedPoint | null>;
405
523
  protected readonly startLabelInfo: _angular_core.Signal<{
406
524
  label: string;
407
- placement: StartLabelPlacement;
525
+ placement: {
526
+ y: number;
527
+ x: number;
528
+ anchor: "start" | "end";
529
+ };
408
530
  } | null>;
409
531
  constructor();
410
- protected coreTick(index: number, count: number): boolean;
411
532
  protected deltaFor(point: PlottedPoint): number;
412
533
  protected deltaClasses(point: PlottedPoint): string;
413
- protected tooltipStyle(point: PlottedPoint): string;
414
534
  protected onPointerMove(event: PointerEvent): void;
415
535
  protected onPointerLeave(): void;
416
536
  protected onKeydown(event: KeyboardEvent): void;
417
537
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiLineChart, never>;
418
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiLineChart, "ui-line-chart", never, { "points": { "alias": "points"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "deltaFormat": { "alias": "deltaFormat"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "axisFormat": { "alias": "axisFormat"; "required": false; "isSignal": true; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "timeColumnLabel": { "alias": "timeColumnLabel"; "required": false; "isSignal": true; }; "valueColumnLabel": { "alias": "valueColumnLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
538
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiLineChart, "ui-line-chart", never, { "points": { "alias": "points"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": true; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "deltaFormat": { "alias": "deltaFormat"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "axisFormat": { "alias": "axisFormat"; "required": false; "isSignal": true; }; "startLabel": { "alias": "startLabel"; "required": false; "isSignal": true; }; "timeColumnLabel": { "alias": "timeColumnLabel"; "required": false; "isSignal": true; }; "valueColumnLabel": { "alias": "valueColumnLabel"; "required": false; "isSignal": true; }; "sparkline": { "alias": "sparkline"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "tooltipDelta": { "alias": "tooltipDelta"; "required": false; "isSignal": true; }; "axisGap": { "alias": "axisGap"; "required": false; "isSignal": true; }; "axisTicks": { "alias": "axisTicks"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
419
539
  }
420
540
 
421
541
  /**
@@ -449,7 +569,7 @@ declare class UiMenu {
449
569
  readonly label: _angular_core.InputSignal<string>;
450
570
  readonly menuId: string;
451
571
  readonly isOpen: _angular_core.WritableSignal<boolean>;
452
- protected readonly classes = "m-0 min-w-44 p-1 rounded-container bg-(--elevated) shadow-[0_8px_24px_rgb(0_0_0/0.16)] text-(--foreground) transition-[opacity,transform,overlay,display] transition-discrete duration-(--duration-fast) ease-out starting:open:opacity-0 starting:open:scale-(--enter-scale) opacity-0 scale-(--enter-scale) open:opacity-100 open:scale-100";
572
+ protected readonly classes = "m-0 min-w-44 p-1 rounded-container bg-(--elevated) shadow-[0_8px_24px_rgb(0_0_0/0.16),inset_0_0_0_1px_var(--border)] text-(--foreground) transition-[opacity,transform,overlay,display] transition-discrete duration-(--duration-fast) ease-out starting:open:opacity-0 starting:open:scale-(--enter-scale) opacity-0 scale-(--enter-scale) open:opacity-100 open:scale-100";
453
573
  protected readonly items: _angular_core.Signal<readonly UiMenuItem[]>;
454
574
  open(trigger: HTMLElement): void;
455
575
  close(): void;
@@ -487,7 +607,7 @@ declare class UiMeter {
487
607
  readonly value: _angular_core.InputSignal<number>;
488
608
  readonly label: _angular_core.InputSignal<string>;
489
609
  readonly valueText: _angular_core.InputSignal<string>;
490
- readonly tone: _angular_core.InputSignal<2 | 4 | 1 | 3 | 5 | 6>;
610
+ readonly tone: _angular_core.InputSignal<3 | 5 | 2 | 1 | 4 | 6>;
491
611
  protected readonly percent: _angular_core.Signal<number>;
492
612
  protected readonly fillClasses: _angular_core.Signal<string>;
493
613
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiMeter, never>;
@@ -510,6 +630,10 @@ declare class UiNavItem {
510
630
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiNavItem, "a[ui-nav-item]", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; }, {}, never, ["[navIcon]", "*"], true, never>;
511
631
  }
512
632
 
633
+ declare const ROW_SIZES: readonly ["md", "lg", "xl"];
634
+ type RowSize = (typeof ROW_SIZES)[number];
635
+ declare const ROW_PADDINGS: readonly ["md", "sm", "none"];
636
+ type RowPadding = (typeof ROW_PADDINGS)[number];
513
637
  /**
514
638
  * Clickable row of a list: a holding, an envelope, an account.
515
639
  *
@@ -520,9 +644,11 @@ declare class UiNavItem {
520
644
  */
521
645
  declare class UiRow {
522
646
  readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
647
+ readonly size: _angular_core.InputSignal<"md" | "lg" | "xl">;
648
+ readonly padding: _angular_core.InputSignal<"sm" | "md" | "none">;
523
649
  protected readonly classes: _angular_core.Signal<string>;
524
650
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiRow, never>;
525
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiRow, "a[ui-row], button[ui-row]", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
651
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiRow, "a[ui-row], button[ui-row]", never, { "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
526
652
  }
527
653
 
528
654
  type SegmentedOption = {
@@ -581,10 +707,11 @@ declare class UiSkeleton {
581
707
  readonly shape: _angular_core.InputSignal<"text" | "figure" | "row" | "chart" | "ring">;
582
708
  readonly lines: _angular_core.InputSignal<number>;
583
709
  readonly height: _angular_core.InputSignal<number>;
710
+ readonly size: _angular_core.InputSignal<number>;
584
711
  protected readonly animation = "cairn-pulse var(--pulse-duration) var(--ease-out) infinite alternate";
585
712
  protected readonly bars: _angular_core.Signal<("62%" | "100%")[]>;
586
713
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiSkeleton, never>;
587
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiSkeleton, "ui-skeleton", never, { "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
714
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiSkeleton, "ui-skeleton", never, { "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
588
715
  }
589
716
 
590
717
  /** Available stat sizes. `StatSize` is derived from this tuple. */
@@ -608,7 +735,8 @@ type StatSize = (typeof STAT_SIZES)[number];
608
735
  declare class UiStat {
609
736
  readonly label: _angular_core.InputSignal<string>;
610
737
  readonly size: _angular_core.InputSignal<"hero" | "tile">;
611
- protected readonly labelClasses = "text-label font-medium text-(--subtle-foreground)";
738
+ protected readonly labelClasses: _angular_core.Signal<string>;
739
+ protected readonly stackClasses: _angular_core.Signal<string>;
612
740
  protected readonly valueClasses: _angular_core.Signal<string>;
613
741
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiStat, never>;
614
742
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiStat, "ui-stat", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["[uiStatValue]", "[uiStatDelta]", "[uiStatCaption]", "[uiStatAside]"], true, never>;
@@ -616,12 +744,13 @@ declare class UiStat {
616
744
 
617
745
  /**
618
746
  * Native checkbox styled as an iOS-style switch, exposed to assistive technology as `role="switch"`.
747
+ * 51 by 31 on touch, 40 by 24 with a mouse.
619
748
  *
620
749
  * @example
621
750
  * <input type="checkbox" uiSwitch [checked]="hidden()" (change)="toggle()" aria-label="Hide amounts" />
622
751
  */
623
752
  declare class UiSwitch {
624
- protected readonly classes = "relative shrink-0 w-[51px] h-[31px] appearance-none cursor-pointer rounded-pill bg-(--muted) checked:bg-(--primary) transition-colors duration-(--duration-fast) ease-out disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2 before:h-(--row-min) before:content-[''] after:absolute after:top-0.5 after:left-0.5 after:size-[27px] after:rounded-pill after:bg-(--card) after:shadow-[0_1px_3px_rgb(0_0_0/0.2)] after:transition-transform after:duration-(--duration-fast) after:ease-out after:content-[''] checked:after:translate-x-[20px]";
753
+ protected readonly classes = "relative shrink-0 w-[51px] h-[31px] pointer-fine:w-10 pointer-fine:h-6 appearance-none cursor-pointer rounded-pill bg-(--muted) checked:bg-(--primary) transition-colors duration-(--duration-fast) ease-out disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) before:absolute before:inset-x-0 before:top-1/2 before:-translate-y-1/2 before:h-(--row-min) before:content-[''] after:absolute after:top-0.5 after:left-0.5 after:size-[27px] pointer-fine:after:size-5 after:rounded-pill after:bg-(--card) after:shadow-[0_1px_3px_rgb(0_0_0/0.2)] after:transition-transform after:duration-(--duration-fast) after:ease-out after:content-[''] checked:after:translate-x-[20px] pointer-fine:checked:after:translate-x-4";
625
754
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiSwitch, never>;
626
755
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiSwitch, "input[type=checkbox][uiSwitch]", never, {}, {}, never, never, true, never>;
627
756
  }
@@ -629,46 +758,135 @@ declare class UiSwitch {
629
758
  /** Breakpoints a secondary column can be held back until. */
630
759
  declare const CELL_BREAKPOINTS: readonly ["md", "lg"];
631
760
  type CellBreakpoint = (typeof CELL_BREAKPOINTS)[number];
632
- /** Styled native table. The rows and cells stay plain <tr> and <td>. */
761
+ /** Body row heights. */
762
+ declare const TABLE_ROWS: readonly ["48", "52", "60"];
763
+ type TableRow = (typeof TABLE_ROWS)[number];
764
+ /**
765
+ * Styled native table. The rows and cells stay plain <tr> and <td>. `row` sets the height of every
766
+ * body row, `rule` draws or drops the hairline under the header, `spaced` leaves 4px between the
767
+ * header and the first row.
768
+ *
769
+ * @example
770
+ * <table uiTable row="60" [rule]="false">
771
+ */
633
772
  declare class UiTable {
773
+ readonly row: _angular_core.InputSignal<"48" | "52" | "60">;
774
+ readonly rule: _angular_core.InputSignalWithTransform<boolean, unknown>;
775
+ readonly spaced: _angular_core.InputSignalWithTransform<boolean, unknown>;
776
+ protected readonly classes: _angular_core.Signal<string>;
634
777
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiTable, never>;
635
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTable, "table[uiTable]", never, {}, {}, never, never, true, never>;
778
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTable, "table[uiTable]", never, { "row": { "alias": "row"; "required": false; "isSignal": true; }; "rule": { "alias": "rule"; "required": false; "isSignal": true; }; "spaced": { "alias": "spaced"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
779
+ }
780
+ /** Body of one group of rows: leaves a 4px tail after its last row. */
781
+ declare class UiGroup {
782
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiGroup, never>;
783
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiGroup, "tbody[uiGroup]", never, {}, {}, never, never, true, never>;
636
784
  }
637
785
  /**
638
- * Body or group row. `group` draws the muted banner that opens each account inside a list of
639
- * holdings: it carries no hover state of its own, unlike an ordinary row.
786
+ * Body or group row. An ordinary row glows on hover and takes the soft fill when `selected`; an
787
+ * `interactive` row (one that opens something) also presses to the soft fill. A row with no action keeps a
788
+ * plain name: `<td uiTd primary class="truncate font-medium">`.
789
+ * `group` marks the row that holds a group band: it carries no hover state.
640
790
  *
641
791
  * @example
642
- * <tr uiTr>...
643
- * <tr uiTr group>...
792
+ * <tr uiTr [selected]="open">...
793
+ * <tr uiTr group><td ui-group-cell name="Brokerage">...
644
794
  */
645
795
  declare class UiTr {
646
796
  readonly group: _angular_core.InputSignalWithTransform<boolean, unknown>;
647
- protected readonly classes: _angular_core.Signal<"min-h-(--row-min) rounded-control bg-(--muted) font-semibold" | "rounded-control hover:bg-(--glow)">;
797
+ readonly selected: _angular_core.InputSignalWithTransform<boolean, unknown>;
798
+ readonly interactive: _angular_core.InputSignalWithTransform<boolean, unknown>;
799
+ protected readonly classes: _angular_core.Signal<string>;
648
800
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiTr, never>;
649
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTr, "tr[uiTr]", never, { "group": { "alias": "group"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
801
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTr, "tr[uiTr]", never, { "group": { "alias": "group"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
650
802
  }
651
803
  /**
652
- * Column header. `numeric` right-aligns and lines the digits up; `from` holds a
653
- * secondary column back until the viewport is wide enough for it.
804
+ * Column header, centred in its 36px. `numeric` right-aligns and lines the digits up; `secondary`
805
+ * (or `from`) holds a column back until the viewport is wide enough for it; `primary` makes it
806
+ * the column that absorbs the free width and truncates; `tall` is a 40px header; `width` fixes the column width and keeps it from shrinking.
654
807
  *
655
808
  * @example
656
- * <th uiTh numeric from="md">Average cost</th>
809
+ * <th uiTh numeric secondary width="108px">Quantity</th>
657
810
  */
658
811
  declare class UiTh {
812
+ readonly width: _angular_core.InputSignal<string | null>;
659
813
  readonly numeric: _angular_core.InputSignalWithTransform<boolean, unknown>;
814
+ readonly primary: _angular_core.InputSignalWithTransform<boolean, unknown>;
815
+ readonly secondary: _angular_core.InputSignalWithTransform<boolean, unknown>;
816
+ readonly tall: _angular_core.InputSignalWithTransform<boolean, unknown>;
660
817
  readonly from: _angular_core.InputSignal<"md" | "lg" | null>;
661
818
  protected readonly classes: _angular_core.Signal<string>;
662
819
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiTh, never>;
663
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTh, "th[uiTh]", never, { "numeric": { "alias": "numeric"; "required": false; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
820
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTh, "th[uiTh]", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "numeric": { "alias": "numeric"; "required": false; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "secondary": { "alias": "secondary"; "required": false; "isSignal": true; }; "tall": { "alias": "tall"; "required": false; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
664
821
  }
665
- /** Body cell. Same two inputs as `UiTh`, and they must be set on both to match. */
822
+ /** Body cell. Same inputs as `UiTh` (bar `tall` and `width`), and they must be set on both to match. */
666
823
  declare class UiTd {
667
824
  readonly numeric: _angular_core.InputSignalWithTransform<boolean, unknown>;
825
+ readonly primary: _angular_core.InputSignalWithTransform<boolean, unknown>;
826
+ readonly secondary: _angular_core.InputSignalWithTransform<boolean, unknown>;
668
827
  readonly from: _angular_core.InputSignal<"md" | "lg" | null>;
669
828
  protected readonly classes: _angular_core.Signal<string>;
670
829
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiTd, never>;
671
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTd, "td[uiTd]", never, { "numeric": { "alias": "numeric"; "required": false; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
830
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTd, "td[uiTd]", never, { "numeric": { "alias": "numeric"; "required": false; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; "secondary": { "alias": "secondary"; "required": false; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
831
+ }
832
+ /** Group band sizes. */
833
+ declare const GROUP_SIZES: readonly ["md", "lg"];
834
+ type GroupSize = (typeof GROUP_SIZES)[number];
835
+ /**
836
+ * The band that opens a group of rows: name in 600 (a heading), meta beside it, the projected
837
+ * total pinned to the right. Spans the whole row through `colspan`.
838
+ *
839
+ * @example
840
+ * <tr uiTr group><td ui-group-cell colspan="4" name="Brokerage" meta="Savings plan">...total...</td></tr>
841
+ */
842
+ declare class UiGroupCell {
843
+ readonly name: _angular_core.InputSignal<string>;
844
+ readonly meta: _angular_core.InputSignal<string | undefined>;
845
+ readonly size: _angular_core.InputSignal<"md" | "lg">;
846
+ protected readonly hostClasses: _angular_core.Signal<string>;
847
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiGroupCell, never>;
848
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiGroupCell, "td[ui-group-cell]", never, { "name": { "alias": "name"; "required": true; "isSignal": true; }; "meta": { "alias": "meta"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
849
+ }
850
+ /**
851
+ * Makes a link or button the way into its row. By default an invisible layer stretches over the
852
+ * whole row, so the row is one target for the pointer, the keyboard and a screen reader, and its
853
+ * focus ring wraps the row. With `[stretch]="false"` only the name is the
854
+ * target: it underlines on hover and takes its own ring. `current` marks the open line.
855
+ *
856
+ * @example
857
+ * <td uiTd primary><a uiRowLink href="/lines/42">Ferrari</a></td>
858
+ * <td uiTd primary><a uiRowLink [stretch]="false" href="/accounts/3">Brokerage</a></td>
859
+ */
860
+ declare class UiRowLink {
861
+ readonly stretch: _angular_core.InputSignalWithTransform<boolean, unknown>;
862
+ readonly current: _angular_core.InputSignalWithTransform<boolean, unknown>;
863
+ protected readonly classes: _angular_core.Signal<"block max-w-full truncate rounded-control text-left font-medium outline-none after:absolute after:inset-0 after:rounded-control after:content-[\"\"] focus-visible:after:outline-2 focus-visible:after:-outline-offset-2 focus-visible:after:outline-(--ring)" | "block max-w-full truncate rounded-sm text-left font-medium underline-offset-[3px] outline-none hover:underline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring)">;
864
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiRowLink, never>;
865
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiRowLink, "a[uiRowLink], button[uiRowLink]", never, { "stretch": { "alias": "stretch"; "required": false; "isSignal": true; }; "current": { "alias": "current"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
866
+ }
867
+ /** A control in another cell of a stretched-link row: lifts it above the layer that covers the row. */
868
+ declare class UiRowAction {
869
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiRowAction, never>;
870
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiRowAction, "[uiRowAction]", never, {}, {}, never, never, true, never>;
871
+ }
872
+ /** Tones of a subtitle: subtle (default), `--stale` at 500, or the color of the cell. */
873
+ declare const SUB_TONES: readonly ["subtle", "stale", "inherit"];
874
+ type SubTone = (typeof SUB_TONES)[number];
875
+ /**
876
+ * A second line under a cell's main text. `narrow` shows it only under 1024px, where it carries
877
+ * the quantity, average cost and quote that were held back. Its amounts go through `ui-amount`
878
+ * so they mask.
879
+ *
880
+ * @example
881
+ * <span uiCellSub narrow>10 × 421.26 € · cost 388.10 €</span>
882
+ * <span uiCellSub tone="stale">Quote of 24/09</span>
883
+ */
884
+ declare class UiCellSub {
885
+ readonly narrow: _angular_core.InputSignalWithTransform<boolean, unknown>;
886
+ readonly tone: _angular_core.InputSignal<"subtle" | "stale" | "inherit">;
887
+ protected readonly classes: _angular_core.Signal<string>;
888
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiCellSub, never>;
889
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiCellSub, "[uiCellSub]", never, { "narrow": { "alias": "narrow"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
672
890
  }
673
891
 
674
892
  /**
@@ -696,5 +914,5 @@ declare class UiTab {
696
914
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiTab, "a[ui-tab]", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; }, {}, never, ["[tabIcon]", "*"], true, never>;
697
915
  }
698
916
 
699
- export { AMOUNT_MASKINGS, AMOUNT_NUMERICS, ASYNC_STATES, AVATAR_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, DELTA_EMPHASES, DIALOG_WIDTHS, METER_TONES, STAT_SIZES, UI_AMOUNT_MASKED, UiAmount, UiAsync, UiAvatar, UiBadge, UiButton, UiCard, UiDelta, UiDialog, UiDonut, UiField, UiInput, UiLineChart, UiMenu, UiMenuItem, UiMenuTrigger, UiMeter, UiNavItem, UiRow, UiSegmented, UiSelect, UiSkeleton, UiStat, UiSwitch, UiTab, UiTabBar, UiTable, UiTd, UiTextarea, UiTh, UiTr, formatAmount };
700
- export type { AmountFormatOptions, AmountMasking, AmountNumeric, AsyncState, AvatarSize, BadgeVariant, ButtonSize, ButtonVariant, CardPadding, CardVariant, CellBreakpoint, ChartPoint, ControlSize, DeltaEmphasis, DialogWidth, DonutSlice, MeterTone, SegmentedOption, StatSize, UiControlError };
917
+ export { ALERT_VARIANTS, AMOUNT_MASKINGS, AMOUNT_NUMERICS, ASYNC_STATES, AVATAR_SIZES, BADGE_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, CONTROL_SURFACES, DELTA_EMPHASES, DIALOG_LAYOUTS, DIALOG_WIDTHS, GROUP_SIZES, METER_TONES, ROW_PADDINGS, ROW_SIZES, STAT_SIZES, SUB_TONES, TABLE_ROWS, UI_AMOUNT_MASKED, UiAlert, UiAmount, UiAsync, UiAvatar, UiBadge, UiButton, UiCard, UiCellSub, UiChoiceChips, UiDelta, UiDialog, UiDonut, UiField, UiFieldLeading, UiGroup, UiGroupCell, UiInput, UiLineChart, UiMenu, UiMenuItem, UiMenuTrigger, UiMeter, UiNavItem, UiRow, UiRowAction, UiRowLink, UiSegmented, UiSelect, UiSkeleton, UiStat, UiSwitch, UiTab, UiTabBar, UiTable, UiTd, UiTextarea, UiTh, UiTr, formatAmount };
918
+ export type { AlertVariant, AmountFormatOptions, AmountMasking, AmountNumeric, AsyncState, AvatarSize, AxisTicks, BadgeSize, BadgeVariant, ButtonSize, ButtonVariant, CardPadding, CardVariant, CellBreakpoint, ChartPoint, ChoiceChipOption, ControlSize, ControlSurface, DeltaEmphasis, DialogLayout, DialogWidth, DonutSlice, GroupSize, MeterTone, RowPadding, RowSize, SegmentedOption, StatSize, SubTone, TableRow, TooltipSize, UiControlError };