@joanroucoux/cairn-ui 0.7.0 → 0.7.2

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": "@joanroucoux/cairn-ui",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Cairn UI — a monochrome, accessible Angular design system.",
5
5
  "keywords": [
6
6
  "angular",
package/styles/motion.css CHANGED
@@ -69,6 +69,15 @@
69
69
  transition: none !important;
70
70
  }
71
71
 
72
+ [data-ui-settling],
73
+ [data-ui-settling]::before,
74
+ [data-ui-settling]::after,
75
+ [data-ui-settling] *,
76
+ [data-ui-settling] *::before,
77
+ [data-ui-settling] *::after {
78
+ transition: none !important;
79
+ }
80
+
72
81
  @media (prefers-reduced-motion: reduce) {
73
82
  .ui-enter-fade-up,
74
83
  .ui-enter-panel {
@@ -3,7 +3,7 @@ import { InjectionToken, Signal, ElementRef } from '@angular/core';
3
3
 
4
4
  /**
5
5
  * Bar of actions fixed above the tab bar on iPhone: the primary actions of a detail screen, within
6
- * thumb reach. It sits 52px plus the safe area above the bottom edge, so it clears `ui-tab-bar`, and
6
+ * thumb reach. It sits `--tab-bar-height` (52px plus the safe area) above the bottom edge, so it clears `ui-tab-bar`, and
7
7
  * it is hidden from `64rem`, where the same actions live in the page itself. Its children share the
8
8
  * width equally. While it is on the page it publishes its height as `--action-bar-height` on the
9
9
  * root element, which `ui-toaster` adds to its offset so a confirmation never covers the actions.
@@ -116,6 +116,7 @@ declare class UiAsync {
116
116
  protected readonly titleClasses: _angular_core.Signal<string>;
117
117
  protected readonly messageClasses: _angular_core.Signal<string>;
118
118
  protected readonly retryButtonClasses: _angular_core.Signal<string>;
119
+ constructor();
119
120
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAsync, never>;
120
121
  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; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "card": { "alias": "card"; "required": false; "isSignal": true; }; "fill": { "alias": "fill"; "required": false; "isSignal": true; }; }, { "retry": "retry"; }, never, ["[asyncLoading]", "[asyncEmpty]", "*"], true, never>;
121
122
  }
@@ -151,7 +152,8 @@ declare class UiAvatar {
151
152
  /**
152
153
  * Round hit area around a `ui-avatar` that links somewhere: 44px on touch, 40px from 64rem, with a
153
154
  * glow on hover and the press scale. On the current page (`aria-current="page"`, which `routerLinkActive`
154
- * sets through `ariaCurrentWhenActive`) it holds a soft halo. The avatar itself keeps its own size.
155
+ * sets through `ariaCurrentWhenActive`) it holds a soft halo, drawn at once when the route changes. The avatar
156
+ * itself keeps its own size.
155
157
  *
156
158
  * @example
157
159
  * <a uiAvatarLink routerLink="/profile"><ui-avatar initials="JR" label="Profile" size="auto" /></a>
@@ -174,6 +176,7 @@ declare class UiBackLink {
174
176
  readonly size: _angular_core.InputSignal<"sm" | "md" | "header">;
175
177
  protected readonly chevron: _angular_core.Signal<number>;
176
178
  protected readonly classes: _angular_core.Signal<string>;
179
+ constructor();
177
180
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiBackLink, never>;
178
181
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiBackLink, "a[ui-back-link]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
179
182
  }
@@ -364,6 +367,9 @@ type DialogCloseReason = (typeof DIALOG_CLOSE_REASONS)[number];
364
367
  /**
365
368
  * Modal dialog on the native <dialog>: a bottom sheet under `64rem`, centered above it.
366
369
  *
370
+ * `busy` keeps it open while its action runs: Escape, a click on the backdrop and a drag of the sheet do
371
+ * nothing and the cross is disabled. The owner disables its own buttons and still closes it through `open`.
372
+ *
367
373
  * @example
368
374
  * <ui-dialog heading="Buy" description="Ferrari" closeLabel="Close" width="528px" [open]="buying()" (dismissed)="buying.set(false)">
369
375
  * <p>Body</p>
@@ -380,6 +386,7 @@ declare class UiDialog {
380
386
  readonly truncateDescription: _angular_core.InputSignalWithTransform<boolean, unknown>;
381
387
  readonly width: _angular_core.InputSignal<"md" | "lg" | (string & {})>;
382
388
  readonly open: _angular_core.InputSignalWithTransform<boolean, unknown>;
389
+ readonly busy: _angular_core.InputSignalWithTransform<boolean, unknown>;
383
390
  readonly dismissed: _angular_core.OutputEmitterRef<void>;
384
391
  readonly closed: _angular_core.OutputEmitterRef<"drag" | "escape" | "backdrop" | "cross" | "programmatic">;
385
392
  protected readonly headingId: string;
@@ -398,11 +405,12 @@ declare class UiDialog {
398
405
  constructor();
399
406
  protected close(reason: DialogCloseReason): void;
400
407
  protected onCancel(event: Event): void;
408
+ protected onKeydown(event: KeyboardEvent): void;
401
409
  protected onPointerDown(event: MouseEvent): void;
402
410
  protected onClick(event: MouseEvent): void;
403
411
  protected onNativeClose(): void;
404
412
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiDialog, never>;
405
- 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"; "closed": "closed"; }, never, ["*", "[dialogActions]"], true, never>;
413
+ 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; }; "busy": { "alias": "busy"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; "closed": "closed"; }, never, ["*", "[dialogActions]"], true, never>;
406
414
  }
407
415
 
408
416
  type DonutSlice = {
@@ -717,6 +725,10 @@ type EndRef = ElementRef<SVGCircleElement>;
717
725
  * only the first, middle and last ticks count; with `auto` every tick counts from `sm` up and the
718
726
  * three core ticks below it. Tick positions are unchanged.
719
727
  *
728
+ * A new series interpolates from the drawn curve, fading the start label and the dashed line. With
729
+ * `rangeKey` bound, only a series that comes with a new key does so: a new series under the same key
730
+ * (a reload after a buy) is drawn at once, with no fade. The key may change before its series arrives.
731
+ *
720
732
  * @example
721
733
  * <ui-line-chart [points]="points" label="Net worth over one month" startLabel="Since" [valueFormat]="formatEur" />
722
734
  */
@@ -737,6 +749,7 @@ declare class UiLineChart {
737
749
  readonly tooltipDelta: _angular_core.InputSignalWithTransform<boolean, unknown>;
738
750
  readonly axisGap: _angular_core.InputSignal<number | "auto">;
739
751
  readonly axisTicks: _angular_core.InputSignalWithTransform<AxisTicks, string | 3 | 5>;
752
+ readonly rangeKey: _angular_core.InputSignal<string | null>;
740
753
  protected readonly svgRef: _angular_core.Signal<PlotRef>;
741
754
  protected readonly lineRef: _angular_core.Signal<LineRef | undefined>;
742
755
  protected readonly endRef: _angular_core.Signal<EndRef | undefined>;
@@ -776,7 +789,7 @@ declare class UiLineChart {
776
789
  protected onPointerLeave(): void;
777
790
  protected onKeydown(event: KeyboardEvent): void;
778
791
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiLineChart, never>;
779
- 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; }; "tooltipFormat": { "alias": "tooltipFormat"; "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>;
792
+ 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; }; "tooltipFormat": { "alias": "tooltipFormat"; "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; }; "rangeKey": { "alias": "rangeKey"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
780
793
  }
781
794
 
782
795
  /**
@@ -859,7 +872,7 @@ declare class UiMeter {
859
872
  readonly value: _angular_core.InputSignal<number>;
860
873
  readonly label: _angular_core.InputSignal<string>;
861
874
  readonly valueText: _angular_core.InputSignal<string>;
862
- readonly tone: _angular_core.InputSignal<2 | 4 | 1 | 3 | 6 | 5>;
875
+ readonly tone: _angular_core.InputSignal<2 | 3 | 1 | 4 | 6 | 5>;
863
876
  readonly size: _angular_core.InputSignal<"sm" | "md">;
864
877
  protected readonly trackClasses: _angular_core.Signal<string>;
865
878
  protected readonly percent: _angular_core.Signal<number>;
@@ -869,17 +882,35 @@ declare class UiMeter {
869
882
  }
870
883
 
871
884
  /**
872
- * Slides the remaining children of a list into place when one is removed or inserted (FLIP): it
873
- * measures every child before and after the change, then animates the shift in `translateY` over
874
- * `--duration-base` `--ease-out`. Pair it with `animate.leave="ui-leave-fade"` on the item so it fades
885
+ * Slides the items of a list into place when one is removed or inserted (FLIP): it measures every item
886
+ * before and after the change, from the top of the list itself, then animates the shift in `translateY`
887
+ * over `--duration-base` `--ease-out`. Pair it with `animate.leave="ui-leave-fade"` on the item so it fades
875
888
  * out first. Nothing moves under `prefers-reduced-motion`: the list closes up at once.
876
889
  *
890
+ * By default the items are the direct children of the list. Mark them with `uiFlipItem` instead when they
891
+ * sit deeper, for instance a page of several groups: put `uiFlipList` on the element around every group and
892
+ * `uiFlipItem` on each group heading and row, so a removal also slides the groups below. An item may sit
893
+ * inside another item (a row inside a card): it then moves by its own share and its card carries the rest.
894
+ * Only an item added or removed starts a slide; a change inside an item does not. Positions leave out the
895
+ * translate of any animation running inside the list (a slide in progress, an enter fade-up).
896
+ *
877
897
  * @example
878
898
  * <ul uiFlipList>
879
899
  * @for (key of keys(); track key.id) {
880
900
  * <li uiListRow animate.leave="ui-leave-fade">...</li>
881
901
  * }
882
902
  * </ul>
903
+ *
904
+ * <table uiTable uiFlipList>
905
+ * @for (group of groups(); track group.id) {
906
+ * <tbody>
907
+ * <tr uiTr group uiFlipItem>...</tr>
908
+ * @for (row of group.rows; track row.id) {
909
+ * <tr uiTr uiFlipItem animate.leave="ui-leave-fade">...</tr>
910
+ * }
911
+ * </tbody>
912
+ * }
913
+ * </table>
883
914
  */
884
915
  declare class UiFlipList {
885
916
  private readonly host;
@@ -888,14 +919,29 @@ declare class UiFlipList {
888
919
  private readonly resizes;
889
920
  private readonly running;
890
921
  private readonly watched;
922
+ private readonly items;
891
923
  private tops;
924
+ private shifts;
892
925
  constructor();
926
+ private tracked;
893
927
  private measure;
894
- private interruptedOffset;
895
928
  private onChange;
929
+ private parentItem;
896
930
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiFlipList, never>;
897
931
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiFlipList, "[uiFlipList]", never, {}, {}, never, never, true, never>;
898
932
  }
933
+ /**
934
+ * Marks an element as an item of the nearest `uiFlipList`, at any depth: a group heading, a row inside a
935
+ * group, a card. Once one item is marked, the list follows its marked items only.
936
+ *
937
+ * @example
938
+ * <tr uiTr uiFlipItem animate.leave="ui-leave-fade">...</tr>
939
+ */
940
+ declare class UiFlipItem {
941
+ constructor();
942
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiFlipItem, never>;
943
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiFlipItem, "[uiFlipItem]", never, {}, {}, never, never, true, never>;
944
+ }
899
945
 
900
946
  /**
901
947
  * Draws the eye to an element that just changed: scrolls it into view when it is off screen, holds the
@@ -905,6 +951,10 @@ declare class UiFlipList {
905
951
  * cells, on a `td[ui-group-cell]` the band, anywhere else the host. Under `prefers-reduced-motion` the
906
952
  * scroll is instant and the fade lasts 600 ms.
907
953
  *
954
+ * It starts on the next frame and, when the element is still playing a finite animation of its own (an
955
+ * `animate.enter` fade on a new row), once that animation has finished, waiting no longer than
956
+ * `--duration-base`: the element fades in, then lights up. Both can sit on the same element.
957
+ *
908
958
  * Give the element `scroll-margin-top` and `scroll-margin-bottom` equal to what is pinned above and
909
959
  * below it (header, tab bar, action bar): a row under them counts as off screen and is scrolled out.
910
960
  * For an arrival on a page opened at the element, scroll to it at once first (`scrollIntoView` in
@@ -937,7 +987,23 @@ declare class UiHighlight {
937
987
  declare function injectReducedMotion(): Signal<boolean>;
938
988
 
939
989
  /**
940
- * One destination of the sidebar navigation (Portfolio, Holdings, Allocation, Accounts).
990
+ * Holds the transitions of the host and of everything inside it until two frames after its first
991
+ * render, through the `data-ui-settling` attribute and the matching rule of `styles/motion.css`.
992
+ * A route's elements are created a tick before their classes are bound; a layout read in between
993
+ * would otherwise turn the bound fill, colour or switch track into a transition on page open. Call it
994
+ * in an injection context. A host whose view is never refreshed (a detached change detector) keeps the
995
+ * attribute, and with it no transition.
996
+ *
997
+ * @example
998
+ * constructor() {
999
+ * holdTransitionsUntilRendered();
1000
+ * }
1001
+ */
1002
+ declare function holdTransitionsUntilRendered(): void;
1003
+
1004
+ /**
1005
+ * One destination of the sidebar navigation (Portfolio, Holdings, Allocation, Accounts). The active
1006
+ * fill and text colour switch at once on navigation; only the hover fill fades.
941
1007
  *
942
1008
  * @example
943
1009
  * <a ui-nav-item [active]="url === '/'" routerLink="/">
@@ -948,6 +1014,7 @@ declare function injectReducedMotion(): Signal<boolean>;
948
1014
  declare class UiNavItem {
949
1015
  readonly active: _angular_core.InputSignalWithTransform<boolean, unknown>;
950
1016
  protected readonly classes: _angular_core.Signal<string>;
1017
+ constructor();
951
1018
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiNavItem, never>;
952
1019
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiNavItem, "a[ui-nav-item]", never, { "active": { "alias": "active"; "required": false; "isSignal": true; }; }, {}, never, ["[navIcon]", "*"], true, never>;
953
1020
  }
@@ -1048,6 +1115,7 @@ declare class UiSegmented {
1048
1115
  readonly size: _angular_core.InputSignal<"sm" | "md">;
1049
1116
  protected readonly radios: _angular_core.Signal<readonly ElementRef<HTMLButtonElement>[]>;
1050
1117
  protected readonly thumbIndex: _angular_core.Signal<number>;
1118
+ constructor();
1051
1119
  protected optionClasses(optionValue: string): string;
1052
1120
  protected tabIndexFor(optionValue: string): number;
1053
1121
  protected select(optionValue: string): void;
@@ -1097,19 +1165,24 @@ declare class UiSkeleton {
1097
1165
  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>;
1098
1166
  }
1099
1167
 
1168
+ /** Available stale link sizes. `StaleLinkSize` is derived from this tuple. */
1169
+ declare const STALE_LINK_SIZES: readonly ["caption", "label"];
1170
+ type StaleLinkSize = (typeof STALE_LINK_SIZES)[number];
1100
1171
  /**
1101
1172
  * Link in the stale tone, for a caption about data that is late or left out of a total, such as
1102
- * "1 ligne sans cours, non comptée". Caption size, weight 500, underlined on hover, with an optional
1103
- * trailing chevron.
1173
+ * "1 ligne sans cours, non comptée". Weight 500, underlined on hover, with an optional trailing
1174
+ * chevron. `size` is `caption` (12/17, the default) or `label` (14/20, the dashboard total's
1175
+ * "1 cours en retard").
1104
1176
  *
1105
1177
  * @example
1106
- * <a uiStaleLink chevron routerLink="/holdings">1 cours en retard</a>
1178
+ * <a uiStaleLink chevron size="label" routerLink="/holdings">1 cours en retard</a>
1107
1179
  */
1108
1180
  declare class UiStaleLink {
1109
1181
  readonly chevron: _angular_core.InputSignalWithTransform<boolean, unknown>;
1110
- protected readonly classes: _angular_core.Signal<"inline-flex items-center gap-0.5 rounded-[4px] text-caption font-medium text-(--stale) hover:underline underline-offset-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring)" | "inline-flex items-center gap-0.5 rounded-[4px] text-caption font-medium text-(--stale) hover:underline underline-offset-3 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) after:size-4 after:flex-none after:bg-current after:content-[''] after:mask-center after:mask-no-repeat after:mask-[url(data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27black%27%20stroke-width%3D%271.75%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27m9%2018%206-6-6-6%27%2F%3E%3C%2Fsvg%3E)]">;
1182
+ readonly size: _angular_core.InputSignal<"label" | "caption">;
1183
+ protected readonly classes: _angular_core.Signal<string>;
1111
1184
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiStaleLink, never>;
1112
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiStaleLink, "a[uiStaleLink]", never, { "chevron": { "alias": "chevron"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1185
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiStaleLink, "a[uiStaleLink]", never, { "chevron": { "alias": "chevron"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1113
1186
  }
1114
1187
 
1115
1188
  /** Available stat sizes. `StatSize` is derived from this tuple. */
@@ -1149,12 +1222,15 @@ declare class UiStat {
1149
1222
  */
1150
1223
  declare class UiSwitch {
1151
1224
  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-[background-color] 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";
1225
+ constructor();
1152
1226
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiSwitch, never>;
1153
1227
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiSwitch, "input[type=checkbox][uiSwitch]", never, {}, {}, never, never, true, never>;
1154
1228
  }
1155
1229
 
1156
1230
  /**
1157
- * Bottom navigation bar for iPhone: 52px of tabs plus the home indicator's safe area.
1231
+ * Bottom navigation bar for iPhone: 52px of tabs plus the home indicator's safe area. While it is on the
1232
+ * page it publishes that height as `--tab-bar-height` on the root element, which `ui-action-bar` and
1233
+ * `ui-toaster` sit above; use it rather than restating 52px for anything that must clear the bar.
1158
1234
  *
1159
1235
  * @example
1160
1236
  * <nav ui-tab-bar>
@@ -1162,6 +1238,7 @@ declare class UiSwitch {
1162
1238
  * </nav>
1163
1239
  */
1164
1240
  declare class UiTabBar {
1241
+ constructor();
1165
1242
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiTabBar, never>;
1166
1243
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiTabBar, "nav[ui-tab-bar]", never, {}, {}, never, ["*"], true, never>;
1167
1244
  }
@@ -1244,6 +1321,7 @@ declare class UiTable {
1244
1321
  readonly rule: _angular_core.InputSignalWithTransform<boolean, unknown>;
1245
1322
  readonly spaced: _angular_core.InputSignalWithTransform<boolean, unknown>;
1246
1323
  protected readonly classes: _angular_core.Signal<string>;
1324
+ constructor();
1247
1325
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiTable, never>;
1248
1326
  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>;
1249
1327
  }
@@ -1359,5 +1437,5 @@ declare class UiCellSub {
1359
1437
  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>;
1360
1438
  }
1361
1439
 
1362
- export { ALERT_VARIANTS, AMOUNT_MASKINGS, AMOUNT_NUMERICS, ASYNC_ALIGNS, ASYNC_STATES, ASYNC_VARIANTS, AVATAR_SIZES, BACK_LINK_SIZES, BADGE_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_SURFACES, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, CONTROL_SURFACES, DELTA_EMPHASES, DELTA_SIZES, DELTA_WEIGHTS, DIALOG_CLOSE_REASONS, DIALOG_LAYOUTS, DIALOG_WIDTHS, FACT_SIZES, FACT_SUB_TONES, GROUP_SIZES, METER_SIZES, METER_TONES, ROW_GAPS, ROW_PADDINGS, ROW_SIZES, SEGMENTED_SIZES, SKELETON_SHAPES, STAT_SIZES, SUB_TONES, TABLE_ROWS, UI_AMOUNT_MASKED, UiActionBar, UiAlert, UiAmount, UiAsync, UiAvatar, UiAvatarLink, UiBackLink, UiBadge, UiButton, UiCard, UiCellSub, UiChoiceChips, UiDelta, UiDialog, UiDonut, UiEmpty, UiExternalLink, UiFact, UiFacts, UiField, UiFieldLeading, UiFieldTrailing, UiFilterChips, UiFlipList, UiGroup, UiGroupCell, UiHighlight, UiInput, UiLineChart, UiListRow, UiMenu, UiMenuItem, UiMenuTrigger, UiMeter, UiNavItem, UiRow, UiRowAction, UiRowItem, UiRowLink, UiRowTile, UiSegmented, UiSelect, UiSkeleton, UiStaleLink, UiStat, UiSwitch, UiTab, UiTabBar, UiTable, UiTd, UiTextarea, UiTh, UiToaster, UiToasts, UiTr, delayedState, formatAmount, injectReducedMotion };
1363
- export type { AlertVariant, AmountFormatOptions, AmountMasking, AmountNumeric, AsyncAlign, AsyncState, AsyncVariant, AvatarSize, AxisTicks, BackLinkSize, BadgeSize, BadgeVariant, ButtonSize, ButtonVariant, CardPadding, CardSurface, CardVariant, CellBreakpoint, ChartPoint, ChoiceChipOption, ControlSize, ControlSurface, DeltaEmphasis, DeltaSize, DeltaWeight, DialogCloseReason, DialogLayout, DialogWidth, DonutSlice, FactSize, FactSubTone, FilterChipOption, GroupSize, MeterSize, MeterTone, RowGap, RowPadding, RowSize, SegmentedOption, SegmentedSize, SkeletonShape, StatSize, SubTone, TableRow, Toast, TooltipSize, UiControlError };
1440
+ export { ALERT_VARIANTS, AMOUNT_MASKINGS, AMOUNT_NUMERICS, ASYNC_ALIGNS, ASYNC_STATES, ASYNC_VARIANTS, AVATAR_SIZES, BACK_LINK_SIZES, BADGE_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_SURFACES, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, CONTROL_SURFACES, DELTA_EMPHASES, DELTA_SIZES, DELTA_WEIGHTS, DIALOG_CLOSE_REASONS, DIALOG_LAYOUTS, DIALOG_WIDTHS, FACT_SIZES, FACT_SUB_TONES, GROUP_SIZES, METER_SIZES, METER_TONES, ROW_GAPS, ROW_PADDINGS, ROW_SIZES, SEGMENTED_SIZES, SKELETON_SHAPES, STALE_LINK_SIZES, STAT_SIZES, SUB_TONES, TABLE_ROWS, UI_AMOUNT_MASKED, UiActionBar, UiAlert, UiAmount, UiAsync, UiAvatar, UiAvatarLink, UiBackLink, UiBadge, UiButton, UiCard, UiCellSub, UiChoiceChips, UiDelta, UiDialog, UiDonut, UiEmpty, UiExternalLink, UiFact, UiFacts, UiField, UiFieldLeading, UiFieldTrailing, UiFilterChips, UiFlipItem, UiFlipList, UiGroup, UiGroupCell, UiHighlight, UiInput, UiLineChart, UiListRow, UiMenu, UiMenuItem, UiMenuTrigger, UiMeter, UiNavItem, UiRow, UiRowAction, UiRowItem, UiRowLink, UiRowTile, UiSegmented, UiSelect, UiSkeleton, UiStaleLink, UiStat, UiSwitch, UiTab, UiTabBar, UiTable, UiTd, UiTextarea, UiTh, UiToaster, UiToasts, UiTr, delayedState, formatAmount, holdTransitionsUntilRendered, injectReducedMotion };
1441
+ export type { AlertVariant, AmountFormatOptions, AmountMasking, AmountNumeric, AsyncAlign, AsyncState, AsyncVariant, AvatarSize, AxisTicks, BackLinkSize, BadgeSize, BadgeVariant, ButtonSize, ButtonVariant, CardPadding, CardSurface, CardVariant, CellBreakpoint, ChartPoint, ChoiceChipOption, ControlSize, ControlSurface, DeltaEmphasis, DeltaSize, DeltaWeight, DialogCloseReason, DialogLayout, DialogWidth, DonutSlice, FactSize, FactSubTone, FilterChipOption, GroupSize, MeterSize, MeterTone, RowGap, RowPadding, RowSize, SegmentedOption, SegmentedSize, SkeletonShape, StaleLinkSize, StatSize, SubTone, TableRow, Toast, TooltipSize, UiControlError };