@joanroucoux/cairn-ui 0.8.1 → 0.9.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.
Files changed (125) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/README.md +2 -0
  3. package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs +57 -53
  4. package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs.map +1 -1
  5. package/fesm2022/joanroucoux-cairn-ui-alert.mjs +155 -47
  6. package/fesm2022/joanroucoux-cairn-ui-alert.mjs.map +1 -1
  7. package/fesm2022/joanroucoux-cairn-ui-amount.mjs +220 -110
  8. package/fesm2022/joanroucoux-cairn-ui-amount.mjs.map +1 -1
  9. package/fesm2022/joanroucoux-cairn-ui-async.mjs +392 -216
  10. package/fesm2022/joanroucoux-cairn-ui-async.mjs.map +1 -1
  11. package/fesm2022/joanroucoux-cairn-ui-avatar.mjs +145 -68
  12. package/fesm2022/joanroucoux-cairn-ui-avatar.mjs.map +1 -1
  13. package/fesm2022/joanroucoux-cairn-ui-back-link.mjs +87 -47
  14. package/fesm2022/joanroucoux-cairn-ui-back-link.mjs.map +1 -1
  15. package/fesm2022/joanroucoux-cairn-ui-badge.mjs +83 -43
  16. package/fesm2022/joanroucoux-cairn-ui-badge.mjs.map +1 -1
  17. package/fesm2022/joanroucoux-cairn-ui-button.mjs +184 -104
  18. package/fesm2022/joanroucoux-cairn-ui-button.mjs.map +1 -1
  19. package/fesm2022/joanroucoux-cairn-ui-card.mjs +232 -137
  20. package/fesm2022/joanroucoux-cairn-ui-card.mjs.map +1 -1
  21. package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs +298 -102
  22. package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs.map +1 -1
  23. package/fesm2022/joanroucoux-cairn-ui-control.mjs +4 -17
  24. package/fesm2022/joanroucoux-cairn-ui-control.mjs.map +1 -1
  25. package/fesm2022/joanroucoux-cairn-ui-delta.mjs +150 -83
  26. package/fesm2022/joanroucoux-cairn-ui-delta.mjs.map +1 -1
  27. package/fesm2022/joanroucoux-cairn-ui-dialog.mjs +508 -471
  28. package/fesm2022/joanroucoux-cairn-ui-dialog.mjs.map +1 -1
  29. package/fesm2022/joanroucoux-cairn-ui-donut.mjs +255 -157
  30. package/fesm2022/joanroucoux-cairn-ui-donut.mjs.map +1 -1
  31. package/fesm2022/joanroucoux-cairn-ui-drawer.mjs +303 -0
  32. package/fesm2022/joanroucoux-cairn-ui-drawer.mjs.map +1 -0
  33. package/fesm2022/joanroucoux-cairn-ui-empty.mjs +76 -35
  34. package/fesm2022/joanroucoux-cairn-ui-empty.mjs.map +1 -1
  35. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs +40 -31
  36. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs.map +1 -1
  37. package/fesm2022/joanroucoux-cairn-ui-fact.mjs +188 -79
  38. package/fesm2022/joanroucoux-cairn-ui-fact.mjs.map +1 -1
  39. package/fesm2022/joanroucoux-cairn-ui-field.mjs +309 -173
  40. package/fesm2022/joanroucoux-cairn-ui-field.mjs.map +1 -1
  41. package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs +165 -87
  42. package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs.map +1 -1
  43. package/fesm2022/joanroucoux-cairn-ui-group-header.mjs +269 -0
  44. package/fesm2022/joanroucoux-cairn-ui-group-header.mjs.map +1 -0
  45. package/fesm2022/joanroucoux-cairn-ui-input.mjs +205 -85
  46. package/fesm2022/joanroucoux-cairn-ui-input.mjs.map +1 -1
  47. package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs +838 -512
  48. package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs.map +1 -1
  49. package/fesm2022/joanroucoux-cairn-ui-menu.mjs +401 -225
  50. package/fesm2022/joanroucoux-cairn-ui-menu.mjs.map +1 -1
  51. package/fesm2022/joanroucoux-cairn-ui-meter.mjs +143 -57
  52. package/fesm2022/joanroucoux-cairn-ui-meter.mjs.map +1 -1
  53. package/fesm2022/joanroucoux-cairn-ui-motion.mjs +367 -399
  54. package/fesm2022/joanroucoux-cairn-ui-motion.mjs.map +1 -1
  55. package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs +73 -44
  56. package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs.map +1 -1
  57. package/fesm2022/joanroucoux-cairn-ui-result-group.mjs +191 -0
  58. package/fesm2022/joanroucoux-cairn-ui-result-group.mjs.map +1 -0
  59. package/fesm2022/joanroucoux-cairn-ui-row.mjs +376 -146
  60. package/fesm2022/joanroucoux-cairn-ui-row.mjs.map +1 -1
  61. package/fesm2022/joanroucoux-cairn-ui-segmented.mjs +183 -81
  62. package/fesm2022/joanroucoux-cairn-ui-segmented.mjs.map +1 -1
  63. package/fesm2022/joanroucoux-cairn-ui-select-pill.mjs +233 -0
  64. package/fesm2022/joanroucoux-cairn-ui-select-pill.mjs.map +1 -0
  65. package/fesm2022/joanroucoux-cairn-ui-select.mjs +121 -67
  66. package/fesm2022/joanroucoux-cairn-ui-select.mjs.map +1 -1
  67. package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs +129 -51
  68. package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs.map +1 -1
  69. package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs +80 -39
  70. package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs.map +1 -1
  71. package/fesm2022/joanroucoux-cairn-ui-stat.mjs +85 -55
  72. package/fesm2022/joanroucoux-cairn-ui-stat.mjs.map +1 -1
  73. package/fesm2022/joanroucoux-cairn-ui-switch.mjs +48 -35
  74. package/fesm2022/joanroucoux-cairn-ui-switch.mjs.map +1 -1
  75. package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs +113 -69
  76. package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs.map +1 -1
  77. package/fesm2022/joanroucoux-cairn-ui-table.mjs +1036 -310
  78. package/fesm2022/joanroucoux-cairn-ui-table.mjs.map +1 -1
  79. package/fesm2022/joanroucoux-cairn-ui-toast.mjs +240 -127
  80. package/fesm2022/joanroucoux-cairn-ui-toast.mjs.map +1 -1
  81. package/fesm2022/joanroucoux-cairn-ui.mjs +0 -4
  82. package/package.json +17 -1
  83. package/styles/motion.css +1 -13
  84. package/styles/tokens.css +35 -64
  85. package/types/joanroucoux-cairn-ui-action-bar.d.ts +9 -14
  86. package/types/joanroucoux-cairn-ui-alert.d.ts +29 -15
  87. package/types/joanroucoux-cairn-ui-amount.d.ts +64 -32
  88. package/types/joanroucoux-cairn-ui-async.d.ts +85 -38
  89. package/types/joanroucoux-cairn-ui-avatar.d.ts +34 -22
  90. package/types/joanroucoux-cairn-ui-back-link.d.ts +20 -15
  91. package/types/joanroucoux-cairn-ui-badge.d.ts +22 -14
  92. package/types/joanroucoux-cairn-ui-button.d.ts +36 -18
  93. package/types/joanroucoux-cairn-ui-card.d.ts +48 -23
  94. package/types/joanroucoux-cairn-ui-choice-chips.d.ts +91 -35
  95. package/types/joanroucoux-cairn-ui-control.d.ts +9 -18
  96. package/types/joanroucoux-cairn-ui-delta.d.ts +46 -24
  97. package/types/joanroucoux-cairn-ui-dialog.d.ts +124 -57
  98. package/types/joanroucoux-cairn-ui-donut.d.ts +83 -46
  99. package/types/joanroucoux-cairn-ui-drawer.d.ts +73 -0
  100. package/types/joanroucoux-cairn-ui-empty.d.ts +20 -13
  101. package/types/joanroucoux-cairn-ui-external-link.d.ts +6 -10
  102. package/types/joanroucoux-cairn-ui-fact.d.ts +49 -25
  103. package/types/joanroucoux-cairn-ui-field.d.ts +72 -49
  104. package/types/joanroucoux-cairn-ui-filter-chips.d.ts +35 -20
  105. package/types/joanroucoux-cairn-ui-group-header.d.ts +58 -0
  106. package/types/joanroucoux-cairn-ui-input.d.ts +59 -37
  107. package/types/joanroucoux-cairn-ui-line-chart.d.ts +199 -89
  108. package/types/joanroucoux-cairn-ui-menu.d.ts +81 -44
  109. package/types/joanroucoux-cairn-ui-meter.d.ts +44 -22
  110. package/types/joanroucoux-cairn-ui-motion.d.ts +61 -75
  111. package/types/joanroucoux-cairn-ui-nav-item.d.ts +15 -13
  112. package/types/joanroucoux-cairn-ui-result-group.d.ts +52 -0
  113. package/types/joanroucoux-cairn-ui-row.d.ts +79 -37
  114. package/types/joanroucoux-cairn-ui-segmented.d.ts +51 -27
  115. package/types/joanroucoux-cairn-ui-select-pill.d.ts +52 -0
  116. package/types/joanroucoux-cairn-ui-select.d.ts +28 -18
  117. package/types/joanroucoux-cairn-ui-skeleton.d.ts +35 -18
  118. package/types/joanroucoux-cairn-ui-stale-link.d.ts +23 -16
  119. package/types/joanroucoux-cairn-ui-stat.d.ts +26 -21
  120. package/types/joanroucoux-cairn-ui-switch.d.ts +7 -11
  121. package/types/joanroucoux-cairn-ui-tab-bar.d.ts +20 -17
  122. package/types/joanroucoux-cairn-ui-table.d.ts +251 -89
  123. package/types/joanroucoux-cairn-ui-toast.d.ts +46 -36
  124. package/types/joanroucoux-cairn-ui.d.ts +1 -2
  125. package/fesm2022/joanroucoux-cairn-ui.mjs.map +0 -1
@@ -1,29 +1,53 @@
1
- import * as _angular_core from '@angular/core';
2
-
3
- /** Named dialog widths; any other CSS length is accepted as is. `DialogWidth` is derived from this tuple. */
4
- declare const DIALOG_WIDTHS: readonly ["md", "lg"];
1
+ import * as i0 from "@angular/core";
2
+ import { OutputEmitterRef, Signal } from "@angular/core";
3
+ type SharedReason = 'escape' | 'backdrop' | 'cross' | 'programmatic';
4
+ type ModalCloseConfig<R extends string> = {
5
+ readonly open: Signal<boolean>;
6
+ readonly busy: Signal<boolean>;
7
+ readonly dismissed: OutputEmitterRef<void>;
8
+ readonly closed: OutputEmitterRef<R | SharedReason>;
9
+ readonly reset?: () => void;
10
+ readonly opening?: () => void;
11
+ };
12
+ /**
13
+ * The close protocol of a modal on the native <dialog> under the host: `open` drives `showModal()` and `close()`,
14
+ * Escape and a press-and-release on the veil close it unless `busy`, `dismissed` reports a close the user asked for
15
+ * and `closed` its reason once the exit transition has played. `opening` runs just before `showModal()`. Must be
16
+ * created in an injection context.
17
+ */
18
+ export declare class ModalClose<R extends string> {
19
+ #private;
20
+ constructor(config: ModalCloseConfig<R>);
21
+ close(reason: R | SharedReason): void;
22
+ onCancel(event: Event): void;
23
+ onKeydown(event: KeyboardEvent): void;
24
+ onPointerDown(event: MouseEvent): void;
25
+ onClick(event: MouseEvent): void;
26
+ onNativeClose(): void;
27
+ }
28
+ /** Named dialog widths; any other CSS length is accepted as is. */
29
+ export declare const DIALOG_WIDTHS: readonly ["md", "lg"];
5
30
  type DialogWidth = (typeof DIALOG_WIDTHS)[number];
6
- /** Spacing presets. `DialogLayout` is derived from this tuple. */
7
- declare const DIALOG_LAYOUTS: readonly ["trade", "form", "list", "confirm"];
8
- type DialogLayout = (typeof DIALOG_LAYOUTS)[number];
9
- type LayoutClasses = {
10
- dialog: string;
11
- header: string;
12
- title: string;
13
- cross: string;
14
- icon: string;
15
- handle: string;
16
- body: string;
17
- footer: string;
31
+ /** `confirm` is a short alertdialog: no cross, no hairlines, one 24px padding, 440px wide unless told otherwise. */
32
+ export declare const DIALOG_VARIANTS: readonly ["default", "confirm"];
33
+ type DialogVariant = (typeof DIALOG_VARIANTS)[number];
34
+ /** `full` makes the sheet under `64rem` fill the screen below the status area; `fit` sizes it to its content. */
35
+ export declare const DIALOG_SHEETS: readonly ["fit", "full"];
36
+ type DialogSheet = (typeof DIALOG_SHEETS)[number];
37
+ type VariantClasses = {
38
+ handle: string;
39
+ header: string;
40
+ body: string;
41
+ footer: string;
18
42
  };
19
- /** What started a close, as `closed` reports it. `DialogCloseReason` is derived from this tuple. */
20
- declare const DIALOG_CLOSE_REASONS: readonly ["escape", "backdrop", "cross", "drag", "programmatic"];
43
+ /** What started a close, as `closed` reports it. */
44
+ export declare const DIALOG_CLOSE_REASONS: readonly ["escape", "backdrop", "cross", "drag", "programmatic"];
21
45
  type DialogCloseReason = (typeof DIALOG_CLOSE_REASONS)[number];
22
46
  /**
23
47
  * Modal dialog on the native <dialog>: a bottom sheet under `64rem`, centered above it.
24
48
  *
25
- * `busy` keeps it open while its action runs: Escape, a click on the backdrop and a drag of the sheet do
26
- * nothing and the cross is disabled. The owner disables its own buttons and still closes it through `open`.
49
+ * `busy` keeps it open while its action runs: Escape, a backdrop click and a sheet drag do nothing
50
+ * and the cross is disabled. The owner disables its own buttons and still closes it through `open`.
27
51
  *
28
52
  * @example
29
53
  * <ui-dialog heading="Buy" description="Ferrari" closeLabel="Close" width="528px" [open]="buying()" (dismissed)="buying.set(false)">
@@ -32,41 +56,84 @@ type DialogCloseReason = (typeof DIALOG_CLOSE_REASONS)[number];
32
56
  * <button dialogActions ui-button>Buy 40 shares</button>
33
57
  * </ui-dialog>
34
58
  */
35
- declare class UiDialog {
36
- #private;
37
- readonly heading: _angular_core.InputSignal<string>;
38
- readonly description: _angular_core.InputSignal<string | undefined>;
39
- readonly closeLabel: _angular_core.InputSignal<string | undefined>;
40
- readonly layout: _angular_core.InputSignal<"form" | "trade" | "list" | "confirm">;
41
- readonly truncateDescription: _angular_core.InputSignalWithTransform<boolean, unknown>;
42
- readonly width: _angular_core.InputSignal<"md" | "lg" | (string & {})>;
43
- readonly open: _angular_core.InputSignalWithTransform<boolean, unknown>;
44
- readonly busy: _angular_core.InputSignalWithTransform<boolean, unknown>;
45
- readonly dismissed: _angular_core.OutputEmitterRef<void>;
46
- readonly closed: _angular_core.OutputEmitterRef<"drag" | "escape" | "backdrop" | "cross" | "programmatic">;
47
- protected readonly headingId: string;
48
- protected readonly descriptionId: string;
49
- protected readonly bodyId: string;
50
- protected readonly scrollable: _angular_core.WritableSignal<boolean>;
51
- protected readonly describedBy: _angular_core.Signal<string | null>;
52
- protected readonly widthValue: _angular_core.Signal<string>;
53
- protected readonly spec: _angular_core.Signal<LayoutClasses>;
54
- protected readonly headerClasses: _angular_core.Signal<string>;
55
- protected readonly titleClasses: _angular_core.Signal<string>;
56
- protected readonly crossClasses: _angular_core.Signal<string>;
57
- protected readonly iconClasses: _angular_core.Signal<string>;
58
- protected readonly footerClasses: _angular_core.Signal<string>;
59
- protected readonly classes: _angular_core.Signal<string>;
60
- constructor();
61
- protected close(reason: DialogCloseReason): void;
62
- protected onCancel(event: Event): void;
63
- protected onKeydown(event: KeyboardEvent): void;
64
- protected onPointerDown(event: MouseEvent): void;
65
- protected onClick(event: MouseEvent): void;
66
- protected onNativeClose(): void;
67
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiDialog, never>;
68
- 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>;
59
+ export declare class UiDialog {
60
+ #private;
61
+ readonly heading: import("@angular/core").InputSignal<string>;
62
+ readonly description: import("@angular/core").InputSignal<string | undefined>;
63
+ readonly closeLabel: import("@angular/core").InputSignal<string | undefined>;
64
+ readonly variant: import("@angular/core").InputSignal<"default" | "confirm">;
65
+ readonly sheet: import("@angular/core").InputSignal<"fit" | "full">;
66
+ readonly truncateDescription: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
67
+ readonly width: import("@angular/core").InputSignal<"md" | "lg" | (string & {}) | undefined>;
68
+ readonly open: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
69
+ readonly busy: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
70
+ readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
71
+ readonly closed: import("@angular/core").OutputEmitterRef<"drag" | "escape" | "backdrop" | "cross" | "programmatic">;
72
+ protected readonly headingId: string;
73
+ protected readonly descriptionId: string;
74
+ protected readonly bodyId: string;
75
+ protected readonly scrollable: import("@angular/core").WritableSignal<boolean>;
76
+ protected readonly stacked: import("@angular/core").WritableSignal<boolean>;
77
+ protected readonly describedBy: import("@angular/core").Signal<string | null>;
78
+ protected readonly widthValue: import("@angular/core").Signal<string>;
79
+ protected readonly spec: import("@angular/core").Signal<VariantClasses>;
80
+ protected readonly hairlines: import("@angular/core").Signal<boolean>;
81
+ protected readonly headerClasses: import("@angular/core").Signal<string>;
82
+ protected readonly crossClasses = "rounded-pill lg:rounded-control grid size-11 flex-none cursor-pointer place-items-center text-(--muted-foreground) transition-[scale,background-color,color] [transition-duration:var(--duration-press),var(--duration-fast),var(--duration-fast)] ease-out outline-none focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-(--ring) active:scale-(--press-scale) active:bg-(--soft) disabled:pointer-events-none disabled:opacity-40 lg:size-9 lg:hover:bg-(--glow) lg:hover:text-(--foreground)";
83
+ protected readonly footerClasses: import("@angular/core").Signal<string>;
84
+ protected readonly classes: import("@angular/core").Signal<string>;
85
+ protected readonly modal: ModalClose<DialogCloseReason>;
86
+ constructor();
87
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiDialog, never>;
88
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiDialog, "ui-dialog", never, {
89
+ "heading": {
90
+ "alias": "heading";
91
+ "required": true;
92
+ "isSignal": true;
93
+ };
94
+ "description": {
95
+ "alias": "description";
96
+ "required": false;
97
+ "isSignal": true;
98
+ };
99
+ "closeLabel": {
100
+ "alias": "closeLabel";
101
+ "required": false;
102
+ "isSignal": true;
103
+ };
104
+ "variant": {
105
+ "alias": "variant";
106
+ "required": false;
107
+ "isSignal": true;
108
+ };
109
+ "sheet": {
110
+ "alias": "sheet";
111
+ "required": false;
112
+ "isSignal": true;
113
+ };
114
+ "truncateDescription": {
115
+ "alias": "truncateDescription";
116
+ "required": false;
117
+ "isSignal": true;
118
+ };
119
+ "width": {
120
+ "alias": "width";
121
+ "required": false;
122
+ "isSignal": true;
123
+ };
124
+ "open": {
125
+ "alias": "open";
126
+ "required": false;
127
+ "isSignal": true;
128
+ };
129
+ "busy": {
130
+ "alias": "busy";
131
+ "required": false;
132
+ "isSignal": true;
133
+ };
134
+ }, {
135
+ "dismissed": "dismissed";
136
+ "closed": "closed";
137
+ }, never, ["*", "[dialogActions]"], true, never>;
69
138
  }
70
-
71
- export { DIALOG_CLOSE_REASONS, DIALOG_LAYOUTS, DIALOG_WIDTHS, UiDialog };
72
- export type { DialogCloseReason, DialogLayout, DialogWidth };
139
+ export type { DialogCloseReason, DialogSheet, DialogVariant, DialogWidth, ModalCloseConfig };
@@ -1,59 +1,96 @@
1
- import * as _angular_core from '@angular/core';
2
-
1
+ import * as i0 from "@angular/core";
3
2
  type DonutSlice = {
4
- id: string;
5
- label: string;
6
- value: number;
7
- sublabel?: string;
3
+ id: string;
4
+ label: string;
5
+ value: number;
6
+ sublabel?: string;
8
7
  };
9
8
  type Ramp = 1 | 2 | 3 | 4 | 5 | 6;
9
+ type SharedSlice = DonutSlice & {
10
+ share: number;
11
+ };
10
12
  type RankedSlice = DonutSlice & {
11
- share: number;
12
- ramp: Ramp;
13
- members: string[];
13
+ share: number;
14
+ ramp: Ramp;
15
+ members: string[];
14
16
  };
15
-
17
+ declare function shareSlices(slices: DonutSlice[]): SharedSlice[];
18
+ declare function rankSlices(slices: DonutSlice[], othersLabel: string): RankedSlice[];
16
19
  type PositionedSlice = RankedSlice & {
17
- dash: string;
18
- offset: string;
20
+ dash: string;
21
+ offset: string;
19
22
  };
20
-
23
+ declare const RADIUS = 78;
24
+ declare const RING_WIDTH = 30;
25
+ declare const CIRCUMFERENCE: number;
26
+ declare function positionSlices(slices: RankedSlice[]): PositionedSlice[];
21
27
  /**
22
- * A ring chart with a legend: slices rank from largest to smallest on a grey ramp, and hovering,
23
- * focusing or activating a legend row highlights its slice and centres it in the ring.
28
+ * A ring chart with a legend: slices rank from largest to smallest, and hovering, focusing or
29
+ * activating a legend row highlights its slice.
24
30
  *
25
31
  * @example
26
32
  * <ui-donut [slices]="byAssetClass()" label="Par classe d'actif" othersLabel="Autres" [valueFormat]="formatEur" [shareFormat]="formatShare" (sliceSelect)="goToHoldings($event)" />
27
33
  */
28
- declare class UiDonut {
29
- readonly slices: _angular_core.InputSignal<DonutSlice[]>;
30
- readonly label: _angular_core.InputSignal<string>;
31
- readonly othersLabel: _angular_core.InputSignal<string>;
32
- readonly valueFormat: _angular_core.InputSignal<(value: number) => string>;
33
- readonly shareFormat: _angular_core.InputSignal<(share: number) => string>;
34
- readonly legendHref: _angular_core.InputSignal<((id: string) => string | null) | undefined>;
35
- readonly sliceSelect: _angular_core.OutputEmitterRef<string>;
36
- protected readonly activeId: _angular_core.WritableSignal<string | null>;
37
- protected readonly ranked: _angular_core.Signal<RankedSlice[]>;
38
- protected readonly positioned: _angular_core.Signal<PositionedSlice[]>;
39
- protected readonly active: _angular_core.Signal<RankedSlice | null>;
40
- protected readonly ariaLabel: _angular_core.Signal<string>;
41
- protected readonly radius = 78;
42
- protected readonly ringWidth = 30;
43
- protected strokeColor(slice: RankedSlice): string;
44
- protected sliceClasses(slice: RankedSlice): string;
45
- protected dotClasses(slice: RankedSlice): string;
46
- protected rowClasses(slice: RankedSlice): string;
47
- protected subLabel(slice: RankedSlice): string;
48
- protected isActive(slice: RankedSlice): boolean;
49
- protected highlight(id: string): void;
50
- protected clearHighlight(id: string): void;
51
- protected hrefFor(id: string): string | null;
52
- protected follow(event: MouseEvent, slice: RankedSlice): void;
53
- protected select(slice: RankedSlice): void;
54
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiDonut, never>;
55
- 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; }; "legendHref": { "alias": "legendHref"; "required": false; "isSignal": true; }; }, { "sliceSelect": "sliceSelect"; }, never, never, true, never>;
34
+ export declare class UiDonut {
35
+ readonly slices: import("@angular/core").InputSignal<DonutSlice[]>;
36
+ readonly label: import("@angular/core").InputSignal<string>;
37
+ readonly othersLabel: import("@angular/core").InputSignal<string>;
38
+ readonly valueFormat: import("@angular/core").InputSignal<(value: number) => string>;
39
+ readonly shareFormat: import("@angular/core").InputSignal<(share: number) => string>;
40
+ readonly legendHref: import("@angular/core").InputSignal<((id: string) => string | null) | undefined>;
41
+ readonly sliceSelect: import("@angular/core").OutputEmitterRef<string>;
42
+ protected readonly activeId: import("@angular/core").WritableSignal<string | null>;
43
+ protected readonly ranked: import("@angular/core").Signal<RankedSlice[]>;
44
+ protected readonly positioned: import("@angular/core").Signal<PositionedSlice[]>;
45
+ protected readonly active: import("@angular/core").Signal<RankedSlice | null>;
46
+ protected readonly ariaLabel: import("@angular/core").Signal<string>;
47
+ protected readonly radius = 78;
48
+ protected readonly ringWidth = 30;
49
+ protected strokeColor(slice: RankedSlice): string;
50
+ protected sliceClasses(slice: RankedSlice): string;
51
+ protected dotClasses(slice: RankedSlice): string;
52
+ protected rowClasses(slice: RankedSlice): string;
53
+ protected subLabel(slice: RankedSlice): string;
54
+ protected isActive(slice: RankedSlice): boolean;
55
+ protected highlight(id: string): void;
56
+ protected clearHighlight(id: string): void;
57
+ protected hrefFor(id: string): string | null;
58
+ protected follow(event: MouseEvent, slice: RankedSlice): void;
59
+ protected select(slice: RankedSlice): void;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiDonut, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiDonut, "ui-donut", never, {
62
+ "slices": {
63
+ "alias": "slices";
64
+ "required": true;
65
+ "isSignal": true;
66
+ };
67
+ "label": {
68
+ "alias": "label";
69
+ "required": true;
70
+ "isSignal": true;
71
+ };
72
+ "othersLabel": {
73
+ "alias": "othersLabel";
74
+ "required": true;
75
+ "isSignal": true;
76
+ };
77
+ "valueFormat": {
78
+ "alias": "valueFormat";
79
+ "required": false;
80
+ "isSignal": true;
81
+ };
82
+ "shareFormat": {
83
+ "alias": "shareFormat";
84
+ "required": false;
85
+ "isSignal": true;
86
+ };
87
+ "legendHref": {
88
+ "alias": "legendHref";
89
+ "required": false;
90
+ "isSignal": true;
91
+ };
92
+ }, {
93
+ "sliceSelect": "sliceSelect";
94
+ }, never, never, true, never>;
56
95
  }
57
-
58
- export { UiDonut };
59
- export type { DonutSlice };
96
+ export type { DonutSlice };
@@ -0,0 +1,73 @@
1
+ import { ModalClose } from "@joanroucoux/cairn-ui/dialog";
2
+ import * as i0 from "@angular/core";
3
+ /** What started a close, as `closed` reports it. */
4
+ export declare const DRAWER_CLOSE_REASONS: readonly ["escape", "backdrop", "cross", "programmatic"];
5
+ type DrawerCloseReason = (typeof DRAWER_CLOSE_REASONS)[number];
6
+ /**
7
+ * Modal side panel on the native <dialog>, against the right edge at full height, for a detail opened from a list.
8
+ *
9
+ * Without `heading` it draws no header: the content brings its own title and close button, and `label` names it.
10
+ *
11
+ * @example
12
+ * <ui-drawer heading="Northwind Monde" closeLabel="Fermer le détail" [open]="open()" (dismissed)="open.set(false)">
13
+ * <p>Body</p>
14
+ * </ui-drawer>
15
+ */
16
+ export declare class UiDrawer {
17
+ readonly heading: import("@angular/core").InputSignal<string | undefined>;
18
+ readonly description: import("@angular/core").InputSignal<string | undefined>;
19
+ readonly closeLabel: import("@angular/core").InputSignal<string | undefined>;
20
+ readonly label: import("@angular/core").InputSignal<string | undefined>;
21
+ readonly width: import("@angular/core").InputSignal<string>;
22
+ readonly open: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
23
+ readonly busy: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
24
+ readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
25
+ readonly closed: import("@angular/core").OutputEmitterRef<"escape" | "backdrop" | "cross" | "programmatic">;
26
+ protected readonly headingId: string;
27
+ protected readonly descriptionId: string;
28
+ protected readonly describedBy: import("@angular/core").Signal<string | null>;
29
+ protected readonly ariaLabel: import("@angular/core").Signal<string | null | undefined>;
30
+ protected readonly modal: ModalClose<"escape" | "backdrop" | "cross" | "programmatic">;
31
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiDrawer, never>;
32
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiDrawer, "ui-drawer", never, {
33
+ "heading": {
34
+ "alias": "heading";
35
+ "required": false;
36
+ "isSignal": true;
37
+ };
38
+ "description": {
39
+ "alias": "description";
40
+ "required": false;
41
+ "isSignal": true;
42
+ };
43
+ "closeLabel": {
44
+ "alias": "closeLabel";
45
+ "required": false;
46
+ "isSignal": true;
47
+ };
48
+ "label": {
49
+ "alias": "label";
50
+ "required": false;
51
+ "isSignal": true;
52
+ };
53
+ "width": {
54
+ "alias": "width";
55
+ "required": false;
56
+ "isSignal": true;
57
+ };
58
+ "open": {
59
+ "alias": "open";
60
+ "required": false;
61
+ "isSignal": true;
62
+ };
63
+ "busy": {
64
+ "alias": "busy";
65
+ "required": false;
66
+ "isSignal": true;
67
+ };
68
+ }, {
69
+ "dismissed": "dismissed";
70
+ "closed": "closed";
71
+ }, never, ["*"], true, never>;
72
+ }
73
+ export type { DrawerCloseReason };
@@ -1,19 +1,26 @@
1
- import * as _angular_core from '@angular/core';
2
-
1
+ import * as i0 from "@angular/core";
3
2
  /**
4
- * Centred empty state: a title, a hint and an action slot, such as a catalogue search that matches
5
- * nothing. The padding is 24px, 48px from 64rem.
3
+ * Centred empty state: a title, a hint and an action slot, such as a search that matches nothing.
6
4
  *
7
5
  * @example
8
- * <ui-empty heading="Aucun instrument ne correspond à « zzz »" hint="La recherche porte sur le nom et l'ISIN.">
6
+ * <ui-empty heading="Aucune ligne ne correspond à « zzz »" hint="La recherche porte sur le nom et l'ISIN.">
9
7
  * <button ui-button variant="outline" size="md" type="button">Ajouter une ligne</button>
10
8
  * </ui-empty>
11
9
  */
12
- declare class UiEmpty {
13
- readonly heading: _angular_core.InputSignal<string>;
14
- readonly hint: _angular_core.InputSignal<string>;
15
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiEmpty, never>;
16
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiEmpty, "ui-empty", never, { "heading": { "alias": "heading"; "required": true; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
17
- }
18
-
19
- export { UiEmpty };
10
+ export declare class UiEmpty {
11
+ readonly heading: import("@angular/core").InputSignal<string>;
12
+ readonly hint: import("@angular/core").InputSignal<string>;
13
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiEmpty, never>;
14
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiEmpty, "ui-empty", never, {
15
+ "heading": {
16
+ "alias": "heading";
17
+ "required": true;
18
+ "isSignal": true;
19
+ };
20
+ "hint": {
21
+ "alias": "hint";
22
+ "required": false;
23
+ "isSignal": true;
24
+ };
25
+ }, {}, never, ["*"], true, never>;
26
+ }
@@ -1,15 +1,11 @@
1
- import * as i0 from '@angular/core';
2
-
1
+ import * as i0 from "@angular/core";
3
2
  /**
4
- * Link to another site: the label followed by an external-link icon. A 44px target on touch,
5
- * an underline on hover with a mouse.
3
+ * Link to another site: the label followed by an external-link icon.
6
4
  *
7
5
  * @example
8
6
  * <a ui-external-link href="https://example.com" target="_blank" rel="noopener">Page on example.com</a>
9
7
  */
10
- declare class UiExternalLink {
11
- static ɵfac: i0.ɵɵFactoryDeclaration<UiExternalLink, never>;
12
- static ɵcmp: i0.ɵɵComponentDeclaration<UiExternalLink, "a[ui-external-link]", never, {}, {}, never, ["*"], true, never>;
13
- }
14
-
15
- export { UiExternalLink };
8
+ export declare class UiExternalLink {
9
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiExternalLink, never>;
10
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiExternalLink, "a[ui-external-link]", never, {}, {}, never, ["*"], true, never>;
11
+ }
@@ -1,10 +1,9 @@
1
- import * as _angular_core from '@angular/core';
2
-
3
- /** Available fact row sizes. `FactSize` is derived from this tuple. */
4
- declare const FACT_SIZES: readonly ["md", "sm", "auto", "recap"];
1
+ import * as i0 from "@angular/core";
2
+ /** Available fact row sizes. */
3
+ export declare const FACT_SIZES: readonly ["md", "sm", "auto", "recap"];
5
4
  type FactSize = (typeof FACT_SIZES)[number];
6
5
  /** Colour of the line under a fact value. `stale` flags an out-of-date figure. */
7
- declare const FACT_SUB_TONES: readonly ["subtle", "stale"];
6
+ export declare const FACT_SUB_TONES: readonly ["subtle", "stale"];
8
7
  type FactSubTone = (typeof FACT_SUB_TONES)[number];
9
8
  /**
10
9
  * The list that holds `div[ui-fact]` rows, as a native description list.
@@ -15,30 +14,55 @@ type FactSubTone = (typeof FACT_SUB_TONES)[number];
15
14
  * <div ui-fact label="Price" sub="24/09 · Yahoo">28,64 €</div>
16
15
  * </dl>
17
16
  */
18
- declare class UiFacts {
19
- readonly ruled: _angular_core.InputSignalWithTransform<boolean, unknown>;
20
- protected readonly classes: _angular_core.Signal<"m-0 flex flex-col shadow-[inset_0_1px_0_var(--hairline)]" | "m-0 flex flex-col">;
21
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiFacts, never>;
22
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiFacts, "dl[uiFacts]", never, { "ruled": { "alias": "ruled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
17
+ export declare class UiFacts {
18
+ readonly ruled: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
19
+ protected readonly classes: import("@angular/core").Signal<"m-0 flex flex-col shadow-[inset_0_1px_0_var(--hairline)]" | "m-0 flex flex-col">;
20
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFacts, never>;
21
+ static ɵdir: i0.ɵɵDirectiveDeclaration<UiFacts, "dl[uiFacts]", never, {
22
+ "ruled": {
23
+ "alias": "ruled";
24
+ "required": false;
25
+ "isSignal": true;
26
+ };
27
+ }, {}, never, never, true, never>;
23
28
  }
24
29
  /**
25
- * One fact of a `dl[uiFacts]`: a label on the left, its value on the right, an optional sub-line
26
- * under the value, and a hairline above every row but the first at the `md` size (the `sm` desktop list is separated by space only). The projected content is the value.
30
+ * One fact of a `dl[uiFacts]`: a label, its value (the projected content) and an optional sub-line
31
+ * under the value.
27
32
  *
28
33
  * @example
29
34
  * <div ui-fact label="Price" sub="24/09 · Yahoo" subTone="stale">28,64 €</div>
30
35
  */
31
- declare class UiFact {
32
- readonly label: _angular_core.InputSignal<string>;
33
- readonly sub: _angular_core.InputSignal<string | undefined>;
34
- readonly subTone: _angular_core.InputSignal<"subtle" | "stale">;
35
- readonly size: _angular_core.InputSignal<"md" | "sm" | "auto" | "recap">;
36
- protected readonly classes: _angular_core.Signal<string>;
37
- protected readonly valueClasses: _angular_core.Signal<string>;
38
- protected readonly subClasses: _angular_core.Signal<string>;
39
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiFact, never>;
40
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiFact, "div[ui-fact]", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "sub": { "alias": "sub"; "required": false; "isSignal": true; }; "subTone": { "alias": "subTone"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
36
+ export declare class UiFact {
37
+ readonly label: import("@angular/core").InputSignal<string>;
38
+ readonly sub: import("@angular/core").InputSignal<string | undefined>;
39
+ readonly subTone: import("@angular/core").InputSignal<"subtle" | "stale">;
40
+ readonly size: import("@angular/core").InputSignal<"md" | "sm" | "auto" | "recap">;
41
+ protected readonly classes: import("@angular/core").Signal<string>;
42
+ protected readonly valueClasses: import("@angular/core").Signal<string>;
43
+ protected readonly subClasses: import("@angular/core").Signal<string>;
44
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiFact, never>;
45
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiFact, "div[ui-fact]", never, {
46
+ "label": {
47
+ "alias": "label";
48
+ "required": true;
49
+ "isSignal": true;
50
+ };
51
+ "sub": {
52
+ "alias": "sub";
53
+ "required": false;
54
+ "isSignal": true;
55
+ };
56
+ "subTone": {
57
+ "alias": "subTone";
58
+ "required": false;
59
+ "isSignal": true;
60
+ };
61
+ "size": {
62
+ "alias": "size";
63
+ "required": false;
64
+ "isSignal": true;
65
+ };
66
+ }, {}, never, ["*"], true, never>;
41
67
  }
42
-
43
- export { FACT_SIZES, FACT_SUB_TONES, UiFact, UiFacts };
44
- export type { FactSize, FactSubTone };
68
+ export type { FactSize, FactSubTone };