@joanroucoux/cairn-ui 0.7.2 → 0.8.1

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 (111) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +67 -0
  3. package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs +54 -0
  4. package/fesm2022/joanroucoux-cairn-ui-action-bar.mjs.map +1 -0
  5. package/fesm2022/joanroucoux-cairn-ui-alert.mjs +129 -0
  6. package/fesm2022/joanroucoux-cairn-ui-alert.mjs.map +1 -0
  7. package/fesm2022/joanroucoux-cairn-ui-amount.mjs +114 -0
  8. package/fesm2022/joanroucoux-cairn-ui-amount.mjs.map +1 -0
  9. package/fesm2022/joanroucoux-cairn-ui-async.mjs +282 -0
  10. package/fesm2022/joanroucoux-cairn-ui-async.mjs.map +1 -0
  11. package/fesm2022/joanroucoux-cairn-ui-avatar.mjs +71 -0
  12. package/fesm2022/joanroucoux-cairn-ui-avatar.mjs.map +1 -0
  13. package/fesm2022/joanroucoux-cairn-ui-back-link.mjs +79 -0
  14. package/fesm2022/joanroucoux-cairn-ui-back-link.mjs.map +1 -0
  15. package/fesm2022/joanroucoux-cairn-ui-badge.mjs +48 -0
  16. package/fesm2022/joanroucoux-cairn-ui-badge.mjs.map +1 -0
  17. package/fesm2022/joanroucoux-cairn-ui-button.mjs +128 -0
  18. package/fesm2022/joanroucoux-cairn-ui-button.mjs.map +1 -0
  19. package/fesm2022/joanroucoux-cairn-ui-card.mjs +146 -0
  20. package/fesm2022/joanroucoux-cairn-ui-card.mjs.map +1 -0
  21. package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs +172 -0
  22. package/fesm2022/joanroucoux-cairn-ui-choice-chips.mjs.map +1 -0
  23. package/fesm2022/joanroucoux-cairn-ui-control.mjs +18 -0
  24. package/fesm2022/joanroucoux-cairn-ui-control.mjs.map +1 -0
  25. package/fesm2022/joanroucoux-cairn-ui-delta.mjs +103 -0
  26. package/fesm2022/joanroucoux-cairn-ui-delta.mjs.map +1 -0
  27. package/fesm2022/joanroucoux-cairn-ui-dialog.mjs +626 -0
  28. package/fesm2022/joanroucoux-cairn-ui-dialog.mjs.map +1 -0
  29. package/fesm2022/joanroucoux-cairn-ui-donut.mjs +347 -0
  30. package/fesm2022/joanroucoux-cairn-ui-donut.mjs.map +1 -0
  31. package/fesm2022/joanroucoux-cairn-ui-empty.mjs +47 -0
  32. package/fesm2022/joanroucoux-cairn-ui-empty.mjs.map +1 -0
  33. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs +65 -0
  34. package/fesm2022/joanroucoux-cairn-ui-external-link.mjs.map +1 -0
  35. package/fesm2022/joanroucoux-cairn-ui-fact.mjs +99 -0
  36. package/fesm2022/joanroucoux-cairn-ui-fact.mjs.map +1 -0
  37. package/fesm2022/joanroucoux-cairn-ui-field.mjs +232 -0
  38. package/fesm2022/joanroucoux-cairn-ui-field.mjs.map +1 -0
  39. package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs +89 -0
  40. package/fesm2022/joanroucoux-cairn-ui-filter-chips.mjs.map +1 -0
  41. package/fesm2022/joanroucoux-cairn-ui-input.mjs +90 -0
  42. package/fesm2022/joanroucoux-cairn-ui-input.mjs.map +1 -0
  43. package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs +844 -0
  44. package/fesm2022/joanroucoux-cairn-ui-line-chart.mjs.map +1 -0
  45. package/fesm2022/joanroucoux-cairn-ui-menu.mjs +241 -0
  46. package/fesm2022/joanroucoux-cairn-ui-menu.mjs.map +1 -0
  47. package/fesm2022/joanroucoux-cairn-ui-meter.mjs +86 -0
  48. package/fesm2022/joanroucoux-cairn-ui-meter.mjs.map +1 -0
  49. package/fesm2022/joanroucoux-cairn-ui-motion.mjs +415 -0
  50. package/fesm2022/joanroucoux-cairn-ui-motion.mjs.map +1 -0
  51. package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs +45 -0
  52. package/fesm2022/joanroucoux-cairn-ui-nav-item.mjs.map +1 -0
  53. package/fesm2022/joanroucoux-cairn-ui-row.mjs +164 -0
  54. package/fesm2022/joanroucoux-cairn-ui-row.mjs.map +1 -0
  55. package/fesm2022/joanroucoux-cairn-ui-segmented.mjs +165 -0
  56. package/fesm2022/joanroucoux-cairn-ui-segmented.mjs.map +1 -0
  57. package/fesm2022/joanroucoux-cairn-ui-select.mjs +69 -0
  58. package/fesm2022/joanroucoux-cairn-ui-select.mjs.map +1 -0
  59. package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs +91 -0
  60. package/fesm2022/joanroucoux-cairn-ui-skeleton.mjs.map +1 -0
  61. package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs +43 -0
  62. package/fesm2022/joanroucoux-cairn-ui-stale-link.mjs.map +1 -0
  63. package/fesm2022/joanroucoux-cairn-ui-stat.mjs +96 -0
  64. package/fesm2022/joanroucoux-cairn-ui-stat.mjs.map +1 -0
  65. package/fesm2022/joanroucoux-cairn-ui-switch.mjs +37 -0
  66. package/fesm2022/joanroucoux-cairn-ui-switch.mjs.map +1 -0
  67. package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs +75 -0
  68. package/fesm2022/joanroucoux-cairn-ui-tab-bar.mjs.map +1 -0
  69. package/fesm2022/joanroucoux-cairn-ui-table.mjs +321 -0
  70. package/fesm2022/joanroucoux-cairn-ui-table.mjs.map +1 -0
  71. package/fesm2022/joanroucoux-cairn-ui-toast.mjs +153 -0
  72. package/fesm2022/joanroucoux-cairn-ui-toast.mjs.map +1 -0
  73. package/fesm2022/joanroucoux-cairn-ui.mjs +0 -5462
  74. package/fesm2022/joanroucoux-cairn-ui.mjs.map +1 -1
  75. package/package.json +141 -1
  76. package/types/joanroucoux-cairn-ui-action-bar.d.ts +22 -0
  77. package/types/joanroucoux-cairn-ui-alert.d.ts +23 -0
  78. package/types/joanroucoux-cairn-ui-amount.d.ts +45 -0
  79. package/types/joanroucoux-cairn-ui-async.d.ts +58 -0
  80. package/types/joanroucoux-cairn-ui-avatar.d.ts +35 -0
  81. package/types/joanroucoux-cairn-ui-back-link.d.ts +22 -0
  82. package/types/joanroucoux-cairn-ui-badge.d.ts +23 -0
  83. package/types/joanroucoux-cairn-ui-button.d.ts +29 -0
  84. package/types/joanroucoux-cairn-ui-card.d.ts +36 -0
  85. package/types/joanroucoux-cairn-ui-choice-chips.d.ts +46 -0
  86. package/types/joanroucoux-cairn-ui-control.d.ts +27 -0
  87. package/types/joanroucoux-cairn-ui-delta.d.ts +38 -0
  88. package/types/joanroucoux-cairn-ui-dialog.d.ts +72 -0
  89. package/types/joanroucoux-cairn-ui-donut.d.ts +59 -0
  90. package/types/joanroucoux-cairn-ui-empty.d.ts +19 -0
  91. package/types/joanroucoux-cairn-ui-external-link.d.ts +15 -0
  92. package/types/joanroucoux-cairn-ui-fact.d.ts +44 -0
  93. package/types/joanroucoux-cairn-ui-field.d.ts +84 -0
  94. package/types/joanroucoux-cairn-ui-filter-chips.d.ts +28 -0
  95. package/types/joanroucoux-cairn-ui-input.d.ts +51 -0
  96. package/types/joanroucoux-cairn-ui-line-chart.d.ts +114 -0
  97. package/types/joanroucoux-cairn-ui-menu.d.ts +66 -0
  98. package/types/joanroucoux-cairn-ui-meter.d.ts +30 -0
  99. package/types/joanroucoux-cairn-ui-motion.d.ts +124 -0
  100. package/types/joanroucoux-cairn-ui-nav-item.d.ts +21 -0
  101. package/types/joanroucoux-cairn-ui-row.d.ts +78 -0
  102. package/types/joanroucoux-cairn-ui-segmented.d.ts +36 -0
  103. package/types/joanroucoux-cairn-ui-select.d.ts +23 -0
  104. package/types/joanroucoux-cairn-ui-skeleton.d.ts +26 -0
  105. package/types/joanroucoux-cairn-ui-stale-link.d.ts +24 -0
  106. package/types/joanroucoux-cairn-ui-stat.d.ts +32 -0
  107. package/types/joanroucoux-cairn-ui-switch.d.ts +17 -0
  108. package/types/joanroucoux-cairn-ui-tab-bar.d.ts +31 -0
  109. package/types/joanroucoux-cairn-ui-table.d.ts +139 -0
  110. package/types/joanroucoux-cairn-ui-toast.d.ts +51 -0
  111. package/types/joanroucoux-cairn-ui.d.ts +1 -1440
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joanroucoux/cairn-ui",
3
- "version": "0.7.2",
3
+ "version": "0.8.1",
4
4
  "description": "Cairn UI — a monochrome, accessible Angular design system.",
5
5
  "keywords": [
6
6
  "angular",
@@ -47,6 +47,146 @@
47
47
  ".": {
48
48
  "types": "./types/joanroucoux-cairn-ui.d.ts",
49
49
  "default": "./fesm2022/joanroucoux-cairn-ui.mjs"
50
+ },
51
+ "./action-bar": {
52
+ "types": "./types/joanroucoux-cairn-ui-action-bar.d.ts",
53
+ "default": "./fesm2022/joanroucoux-cairn-ui-action-bar.mjs"
54
+ },
55
+ "./alert": {
56
+ "types": "./types/joanroucoux-cairn-ui-alert.d.ts",
57
+ "default": "./fesm2022/joanroucoux-cairn-ui-alert.mjs"
58
+ },
59
+ "./amount": {
60
+ "types": "./types/joanroucoux-cairn-ui-amount.d.ts",
61
+ "default": "./fesm2022/joanroucoux-cairn-ui-amount.mjs"
62
+ },
63
+ "./async": {
64
+ "types": "./types/joanroucoux-cairn-ui-async.d.ts",
65
+ "default": "./fesm2022/joanroucoux-cairn-ui-async.mjs"
66
+ },
67
+ "./avatar": {
68
+ "types": "./types/joanroucoux-cairn-ui-avatar.d.ts",
69
+ "default": "./fesm2022/joanroucoux-cairn-ui-avatar.mjs"
70
+ },
71
+ "./back-link": {
72
+ "types": "./types/joanroucoux-cairn-ui-back-link.d.ts",
73
+ "default": "./fesm2022/joanroucoux-cairn-ui-back-link.mjs"
74
+ },
75
+ "./badge": {
76
+ "types": "./types/joanroucoux-cairn-ui-badge.d.ts",
77
+ "default": "./fesm2022/joanroucoux-cairn-ui-badge.mjs"
78
+ },
79
+ "./button": {
80
+ "types": "./types/joanroucoux-cairn-ui-button.d.ts",
81
+ "default": "./fesm2022/joanroucoux-cairn-ui-button.mjs"
82
+ },
83
+ "./card": {
84
+ "types": "./types/joanroucoux-cairn-ui-card.d.ts",
85
+ "default": "./fesm2022/joanroucoux-cairn-ui-card.mjs"
86
+ },
87
+ "./choice-chips": {
88
+ "types": "./types/joanroucoux-cairn-ui-choice-chips.d.ts",
89
+ "default": "./fesm2022/joanroucoux-cairn-ui-choice-chips.mjs"
90
+ },
91
+ "./control": {
92
+ "types": "./types/joanroucoux-cairn-ui-control.d.ts",
93
+ "default": "./fesm2022/joanroucoux-cairn-ui-control.mjs"
94
+ },
95
+ "./delta": {
96
+ "types": "./types/joanroucoux-cairn-ui-delta.d.ts",
97
+ "default": "./fesm2022/joanroucoux-cairn-ui-delta.mjs"
98
+ },
99
+ "./dialog": {
100
+ "types": "./types/joanroucoux-cairn-ui-dialog.d.ts",
101
+ "default": "./fesm2022/joanroucoux-cairn-ui-dialog.mjs"
102
+ },
103
+ "./donut": {
104
+ "types": "./types/joanroucoux-cairn-ui-donut.d.ts",
105
+ "default": "./fesm2022/joanroucoux-cairn-ui-donut.mjs"
106
+ },
107
+ "./empty": {
108
+ "types": "./types/joanroucoux-cairn-ui-empty.d.ts",
109
+ "default": "./fesm2022/joanroucoux-cairn-ui-empty.mjs"
110
+ },
111
+ "./external-link": {
112
+ "types": "./types/joanroucoux-cairn-ui-external-link.d.ts",
113
+ "default": "./fesm2022/joanroucoux-cairn-ui-external-link.mjs"
114
+ },
115
+ "./fact": {
116
+ "types": "./types/joanroucoux-cairn-ui-fact.d.ts",
117
+ "default": "./fesm2022/joanroucoux-cairn-ui-fact.mjs"
118
+ },
119
+ "./field": {
120
+ "types": "./types/joanroucoux-cairn-ui-field.d.ts",
121
+ "default": "./fesm2022/joanroucoux-cairn-ui-field.mjs"
122
+ },
123
+ "./filter-chips": {
124
+ "types": "./types/joanroucoux-cairn-ui-filter-chips.d.ts",
125
+ "default": "./fesm2022/joanroucoux-cairn-ui-filter-chips.mjs"
126
+ },
127
+ "./input": {
128
+ "types": "./types/joanroucoux-cairn-ui-input.d.ts",
129
+ "default": "./fesm2022/joanroucoux-cairn-ui-input.mjs"
130
+ },
131
+ "./line-chart": {
132
+ "types": "./types/joanroucoux-cairn-ui-line-chart.d.ts",
133
+ "default": "./fesm2022/joanroucoux-cairn-ui-line-chart.mjs"
134
+ },
135
+ "./menu": {
136
+ "types": "./types/joanroucoux-cairn-ui-menu.d.ts",
137
+ "default": "./fesm2022/joanroucoux-cairn-ui-menu.mjs"
138
+ },
139
+ "./meter": {
140
+ "types": "./types/joanroucoux-cairn-ui-meter.d.ts",
141
+ "default": "./fesm2022/joanroucoux-cairn-ui-meter.mjs"
142
+ },
143
+ "./motion": {
144
+ "types": "./types/joanroucoux-cairn-ui-motion.d.ts",
145
+ "default": "./fesm2022/joanroucoux-cairn-ui-motion.mjs"
146
+ },
147
+ "./nav-item": {
148
+ "types": "./types/joanroucoux-cairn-ui-nav-item.d.ts",
149
+ "default": "./fesm2022/joanroucoux-cairn-ui-nav-item.mjs"
150
+ },
151
+ "./row": {
152
+ "types": "./types/joanroucoux-cairn-ui-row.d.ts",
153
+ "default": "./fesm2022/joanroucoux-cairn-ui-row.mjs"
154
+ },
155
+ "./segmented": {
156
+ "types": "./types/joanroucoux-cairn-ui-segmented.d.ts",
157
+ "default": "./fesm2022/joanroucoux-cairn-ui-segmented.mjs"
158
+ },
159
+ "./select": {
160
+ "types": "./types/joanroucoux-cairn-ui-select.d.ts",
161
+ "default": "./fesm2022/joanroucoux-cairn-ui-select.mjs"
162
+ },
163
+ "./skeleton": {
164
+ "types": "./types/joanroucoux-cairn-ui-skeleton.d.ts",
165
+ "default": "./fesm2022/joanroucoux-cairn-ui-skeleton.mjs"
166
+ },
167
+ "./stale-link": {
168
+ "types": "./types/joanroucoux-cairn-ui-stale-link.d.ts",
169
+ "default": "./fesm2022/joanroucoux-cairn-ui-stale-link.mjs"
170
+ },
171
+ "./stat": {
172
+ "types": "./types/joanroucoux-cairn-ui-stat.d.ts",
173
+ "default": "./fesm2022/joanroucoux-cairn-ui-stat.mjs"
174
+ },
175
+ "./switch": {
176
+ "types": "./types/joanroucoux-cairn-ui-switch.d.ts",
177
+ "default": "./fesm2022/joanroucoux-cairn-ui-switch.mjs"
178
+ },
179
+ "./tab-bar": {
180
+ "types": "./types/joanroucoux-cairn-ui-tab-bar.d.ts",
181
+ "default": "./fesm2022/joanroucoux-cairn-ui-tab-bar.mjs"
182
+ },
183
+ "./table": {
184
+ "types": "./types/joanroucoux-cairn-ui-table.d.ts",
185
+ "default": "./fesm2022/joanroucoux-cairn-ui-table.mjs"
186
+ },
187
+ "./toast": {
188
+ "types": "./types/joanroucoux-cairn-ui-toast.d.ts",
189
+ "default": "./fesm2022/joanroucoux-cairn-ui-toast.mjs"
50
190
  }
51
191
  },
52
192
  "module": "fesm2022/joanroucoux-cairn-ui.mjs",
@@ -0,0 +1,22 @@
1
+ import * as i0 from '@angular/core';
2
+
3
+ /**
4
+ * Bar of actions fixed above the tab bar on iPhone: the primary actions of a detail screen, within
5
+ * thumb reach. It sits `--tab-bar-height` (52px plus the safe area) above the bottom edge, so it clears `ui-tab-bar`, and
6
+ * it is hidden from `64rem`, where the same actions live in the page itself. Its children share the
7
+ * width equally. While it is on the page it publishes its height as `--action-bar-height` on the
8
+ * root element, which `ui-toaster` adds to its offset so a confirmation never covers the actions.
9
+ *
10
+ * @example
11
+ * <ui-action-bar>
12
+ * <button ui-button variant="outline" size="tall">Sell</button>
13
+ * <button ui-button size="tall">Buy</button>
14
+ * </ui-action-bar>
15
+ */
16
+ declare class UiActionBar {
17
+ constructor();
18
+ static ɵfac: i0.ɵɵFactoryDeclaration<UiActionBar, never>;
19
+ static ɵcmp: i0.ɵɵComponentDeclaration<UiActionBar, "ui-action-bar", never, {}, {}, never, ["*"], true, never>;
20
+ }
21
+
22
+ export { UiActionBar };
@@ -0,0 +1,23 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ declare const ALERT_VARIANTS: readonly ["error", "warning"];
4
+ type AlertVariant = (typeof ALERT_VARIANTS)[number];
5
+ /**
6
+ * Inline message explaining a failure or a consequence: an icon, an optional heading and a text.
7
+ * It fades in when it appears; set `[fadeIn]="false"` on an alert that is part of the page as it
8
+ * opens (an error state after a load), which shows without motion.
9
+ *
10
+ * @example
11
+ * <ui-alert heading="Sign-in failed">Try again.</ui-alert>
12
+ */
13
+ declare class UiAlert {
14
+ readonly variant: _angular_core.InputSignal<"error" | "warning">;
15
+ readonly heading: _angular_core.InputSignal<string | undefined>;
16
+ readonly fadeIn: _angular_core.InputSignalWithTransform<boolean, unknown>;
17
+ protected readonly classes: _angular_core.Signal<string>;
18
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAlert, never>;
19
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiAlert, "ui-alert", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "fadeIn": { "alias": "fadeIn"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
20
+ }
21
+
22
+ export { ALERT_VARIANTS, UiAlert };
23
+ export type { AlertVariant };
@@ -0,0 +1,45 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InjectionToken, Signal } from '@angular/core';
3
+
4
+ /** App-wide "amounts are hidden" state. Defaults to never masked; the app overrides it. */
5
+ declare const UI_AMOUNT_MASKED: InjectionToken<Signal<boolean>>;
6
+ /** Available figure styles. `AmountNumeric` is derived from this tuple. */
7
+ declare const AMOUNT_NUMERICS: readonly ["tabular", "proportional"];
8
+ type AmountNumeric = (typeof AMOUNT_NUMERICS)[number];
9
+ /** Available masking behaviors. `AmountMasking` is derived from this tuple. */
10
+ declare const AMOUNT_MASKINGS: readonly ["dots", "hide"];
11
+ type AmountMasking = (typeof AMOUNT_MASKINGS)[number];
12
+ /**
13
+ * A number or an amount of money, formatted for the locale and masked when the app hides amounts.
14
+ *
15
+ * @example
16
+ * <ui-amount [value]="total" currency="EUR" numeric="proportional" />
17
+ * <ui-amount [value]="dayChange" currency="EUR" signed whenMasked="hide" />
18
+ */
19
+ declare class UiAmount {
20
+ #private;
21
+ readonly value: _angular_core.InputSignal<number | null | undefined>;
22
+ readonly currency: _angular_core.InputSignal<string | undefined>;
23
+ readonly locale: _angular_core.InputSignal<string>;
24
+ readonly signed: _angular_core.InputSignalWithTransform<boolean, unknown>;
25
+ readonly fractionDigits: _angular_core.InputSignal<number>;
26
+ readonly numeric: _angular_core.InputSignal<"tabular" | "proportional">;
27
+ readonly whenMasked: _angular_core.InputSignal<"dots" | "hide">;
28
+ protected readonly hidden: Signal<boolean>;
29
+ protected readonly text: Signal<string>;
30
+ protected readonly classes: Signal<string>;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAmount, never>;
32
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiAmount, "ui-amount", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "currency": { "alias": "currency"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "signed": { "alias": "signed"; "required": false; "isSignal": true; }; "fractionDigits": { "alias": "fractionDigits"; "required": false; "isSignal": true; }; "numeric": { "alias": "numeric"; "required": false; "isSignal": true; }; "whenMasked": { "alias": "whenMasked"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
33
+ }
34
+
35
+ type AmountFormatOptions = {
36
+ locale: string;
37
+ currency?: string;
38
+ signed?: boolean;
39
+ fractionDigits?: number;
40
+ };
41
+ /** Formats a number or an amount for the locale, with a missing value as an em dash and masking behind four bullets. */
42
+ declare function formatAmount(value: number | null | undefined, options: AmountFormatOptions, masked?: boolean): string;
43
+
44
+ export { AMOUNT_MASKINGS, AMOUNT_NUMERICS, UI_AMOUNT_MASKED, UiAmount, formatAmount };
45
+ export type { AmountFormatOptions, AmountMasking, AmountNumeric };
@@ -0,0 +1,58 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { Signal } from '@angular/core';
3
+
4
+ /** Available async block states. `AsyncState` is derived from this tuple. */
5
+ declare const ASYNC_STATES: readonly ["loading", "error", "empty", "ready"];
6
+ type AsyncState = (typeof ASYNC_STATES)[number];
7
+ /** Looks of the error block. `AsyncVariant` is derived from this tuple. */
8
+ declare const ASYNC_VARIANTS: readonly ["elevated", "plain", "emphasis", "inline"];
9
+ type AsyncVariant = (typeof ASYNC_VARIANTS)[number];
10
+ /** Alignments of the error block; `auto` is centred from 64rem. `AsyncAlign` is derived from this tuple. */
11
+ declare const ASYNC_ALIGNS: readonly ["start", "center", "auto"];
12
+ type AsyncAlign = (typeof ASYNC_ALIGNS)[number];
13
+ /**
14
+ * The three states of a block that depends on a service call, next to the ready content.
15
+ *
16
+ * @example
17
+ * <ui-async [state]="totalState()" errorTitle="Total could not be loaded" errorMessage="The server did not answer." retryLabel="Retry" (retry)="reload()">
18
+ * <span asyncLoading><ui-skeleton shape="figure" /></span>
19
+ * <span asyncEmpty>Add a holding to see your total.</span>
20
+ * <span>{{ total() }}</span>
21
+ * </ui-async>
22
+ */
23
+ declare class UiAsync {
24
+ #private;
25
+ readonly state: _angular_core.InputSignal<"loading" | "error" | "empty" | "ready">;
26
+ readonly errorTitle: _angular_core.InputSignal<string | undefined>;
27
+ readonly errorMessage: _angular_core.InputSignal<string | undefined>;
28
+ readonly retryLabel: _angular_core.InputSignal<string | undefined>;
29
+ readonly variant: _angular_core.InputSignal<"elevated" | "plain" | "emphasis" | "inline">;
30
+ readonly align: _angular_core.InputSignal<"start" | "center" | "auto">;
31
+ readonly card: _angular_core.InputSignalWithTransform<boolean, unknown>;
32
+ readonly fill: _angular_core.InputSignalWithTransform<boolean, unknown>;
33
+ readonly retry: _angular_core.OutputEmitterRef<void>;
34
+ protected readonly shown: _angular_core.Signal<"loading" | "error" | "empty" | "ready" | null>;
35
+ protected readonly filling: _angular_core.Signal<boolean>;
36
+ protected readonly iconSize: _angular_core.Signal<16 | 18>;
37
+ protected readonly boxClasses: _angular_core.Signal<string>;
38
+ protected readonly titleClasses: _angular_core.Signal<string>;
39
+ protected readonly messageClasses: _angular_core.Signal<string>;
40
+ protected readonly retryButtonClasses: _angular_core.Signal<string>;
41
+ constructor();
42
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAsync, never>;
43
+ 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>;
44
+ }
45
+
46
+ /**
47
+ * Turns the live state of a call into the state to draw: `loading` only appears once the call has
48
+ * lasted 150 ms and, once shown, stays at least 400 ms, so a fast call never flashes a skeleton and a
49
+ * slow one never blinks. Until then the previous state stays on screen (a reload keeps its content);
50
+ * `null` means nothing to draw yet, for a first load still under 150 ms. Call it in an injection context.
51
+ *
52
+ * @example
53
+ * protected readonly shown = delayedState(this.state);
54
+ */
55
+ declare function delayedState(source: Signal<AsyncState>): Signal<AsyncState | null>;
56
+
57
+ export { ASYNC_ALIGNS, ASYNC_STATES, ASYNC_VARIANTS, UiAsync, delayedState };
58
+ export type { AsyncAlign, AsyncState, AsyncVariant };
@@ -0,0 +1,35 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Available avatar sizes. `AvatarSize` is derived from this tuple. */
4
+ declare const AVATAR_SIZES: readonly ["sm", "md", "lg", "auto"];
5
+ type AvatarSize = (typeof AVATAR_SIZES)[number];
6
+ /**
7
+ * Initials in a disc, standing in for a person. Single-user application: there is exactly one.
8
+ *
9
+ * @example
10
+ * <ui-avatar initials="JR" label="My account" />
11
+ */
12
+ declare class UiAvatar {
13
+ readonly initials: _angular_core.InputSignal<string>;
14
+ readonly label: _angular_core.InputSignal<string>;
15
+ readonly size: _angular_core.InputSignal<"sm" | "md" | "lg" | "auto">;
16
+ protected readonly classes: _angular_core.Signal<string>;
17
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAvatar, never>;
18
+ 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>;
19
+ }
20
+ /**
21
+ * Round hit area around a `ui-avatar` that links somewhere: 44px on touch, 40px from 64rem, with a
22
+ * glow on hover and the press scale. On the current page (`aria-current="page"`, which `routerLinkActive`
23
+ * sets through `ariaCurrentWhenActive`) it holds a soft halo, drawn at once when the route changes. The avatar
24
+ * itself keeps its own size.
25
+ *
26
+ * @example
27
+ * <a uiAvatarLink routerLink="/profile"><ui-avatar initials="JR" label="Profile" size="auto" /></a>
28
+ */
29
+ declare class UiAvatarLink {
30
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAvatarLink, never>;
31
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiAvatarLink, "a[uiAvatarLink], button[uiAvatarLink]", never, {}, {}, never, never, true, never>;
32
+ }
33
+
34
+ export { AVATAR_SIZES, UiAvatar, UiAvatarLink };
35
+ export type { AvatarSize };
@@ -0,0 +1,22 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Available back link sizes. `BackLinkSize` is derived from this tuple. */
4
+ declare const BACK_LINK_SIZES: readonly ["md", "sm", "header"];
5
+ type BackLinkSize = (typeof BACK_LINK_SIZES)[number];
6
+ /**
7
+ * Link back to the parent screen: a chevron and the name of the destination.
8
+ *
9
+ * @example
10
+ * <a ui-back-link routerLink="/accounts">Accounts</a>
11
+ */
12
+ declare class UiBackLink {
13
+ readonly size: _angular_core.InputSignal<"md" | "sm" | "header">;
14
+ protected readonly chevron: _angular_core.Signal<number>;
15
+ protected readonly classes: _angular_core.Signal<string>;
16
+ constructor();
17
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiBackLink, never>;
18
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiBackLink, "a[ui-back-link]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
19
+ }
20
+
21
+ export { BACK_LINK_SIZES, UiBackLink };
22
+ export type { BackLinkSize };
@@ -0,0 +1,23 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Available badge variants. `BadgeVariant` is derived from this tuple. */
4
+ declare const BADGE_VARIANTS: readonly ["neutral", "outline"];
5
+ type BadgeVariant = (typeof BADGE_VARIANTS)[number];
6
+ declare const BADGE_SIZES: readonly ["md", "sm"];
7
+ type BadgeSize = (typeof BADGE_SIZES)[number];
8
+ /**
9
+ * Small status descriptor for counts, states or labels, such as an instrument's asset class.
10
+ *
11
+ * @example
12
+ * <ui-badge>ETF</ui-badge>
13
+ */
14
+ declare class UiBadge {
15
+ readonly variant: _angular_core.InputSignal<"neutral" | "outline">;
16
+ readonly size: _angular_core.InputSignal<"md" | "sm">;
17
+ protected readonly classes: _angular_core.Signal<string>;
18
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiBadge, never>;
19
+ 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>;
20
+ }
21
+
22
+ export { BADGE_SIZES, BADGE_VARIANTS, UiBadge };
23
+ export type { BadgeSize, BadgeVariant };
@@ -0,0 +1,29 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Available button variants. `ButtonVariant` is derived from this tuple. */
4
+ declare const BUTTON_VARIANTS: readonly ["primary", "outline", "ghost", "destructive", "quiet", "quiet-destructive", "outline-destructive", "quiet-glow", "tonal"];
5
+ type ButtonVariant = (typeof BUTTON_VARIANTS)[number];
6
+ /** Available button sizes. */
7
+ declare const BUTTON_SIZES: readonly ["compact", "slim", "xs", "sm", "md", "lg", "xl", "xxl", "tall", "block", "icon", "icon-sm"];
8
+ type ButtonSize = (typeof BUTTON_SIZES)[number];
9
+ /**
10
+ * Styled native button or anchor, applied as an attribute so the host keeps every native behavior.
11
+ *
12
+ * @example
13
+ * <button ui-button variant="destructive">Delete</button>
14
+ * <button ui-button size="icon" variant="ghost" aria-label="More actions">...</button>
15
+ */
16
+ declare class UiButton {
17
+ readonly variant: _angular_core.InputSignal<"primary" | "outline" | "ghost" | "destructive" | "quiet" | "quiet-destructive" | "outline-destructive" | "quiet-glow" | "tonal">;
18
+ readonly size: _angular_core.InputSignal<"compact" | "slim" | "xs" | "sm" | "md" | "lg" | "xl" | "xxl" | "tall" | "block" | "icon" | "icon-sm">;
19
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
20
+ readonly busy: _angular_core.InputSignalWithTransform<boolean, unknown>;
21
+ protected readonly inactive: _angular_core.Signal<boolean>;
22
+ protected readonly classes: _angular_core.Signal<string>;
23
+ constructor();
24
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiButton, never>;
25
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiButton, "button[ui-button], a[ui-button]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "busy": { "alias": "busy"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
26
+ }
27
+
28
+ export { BUTTON_SIZES, BUTTON_VARIANTS, UiButton };
29
+ export type { ButtonSize, ButtonVariant };
@@ -0,0 +1,36 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Available card variants. `CardVariant` is derived from this tuple. */
4
+ declare const CARD_VARIANTS: readonly ["default", "elevated", "inset"];
5
+ type CardVariant = (typeof CARD_VARIANTS)[number];
6
+ /** Available card paddings. `CardPadding` is derived from this tuple. */
7
+ declare const CARD_PADDINGS: readonly ["none", "xs", "sm", "md", "list", "rows", "recap", "panel"];
8
+ type CardPadding = (typeof CARD_PADDINGS)[number];
9
+ /** Where the card surface (fill, border, radius) and its padding apply. `CardSurface` is derived from this tuple. */
10
+ declare const CARD_SURFACES: readonly ["always", "lg", "max-lg"];
11
+ type CardSurface = (typeof CARD_SURFACES)[number];
12
+ /**
13
+ * Surface that groups related content: a summary block, a table, a side panel. `surface` limits the
14
+ * fill, border, radius and padding to one side of `64rem`, for a block that is a card on a desktop and
15
+ * plain on an iPhone, or the reverse. `variant="inset"` is the `--background` box that sits inside a
16
+ * card or a dialog: a picked title, a results list, a recap, an empty-state panel.
17
+ *
18
+ * @example
19
+ * <ui-card variant="elevated" padding="sm">Total</ui-card>
20
+ * <ui-card variant="inset" border="hairline" padding="xs">Results</ui-card>
21
+ * <ui-card padding="none" clip>Table that touches the edges, clipped to the corners</ui-card>
22
+ * <ui-card surface="max-lg">Card on an iPhone, plain on a desktop</ui-card>
23
+ */
24
+ declare class UiCard {
25
+ readonly variant: _angular_core.InputSignal<"default" | "elevated" | "inset">;
26
+ readonly padding: _angular_core.InputSignal<"none" | "xs" | "sm" | "md" | "list" | "rows" | "recap" | "panel">;
27
+ readonly surface: _angular_core.InputSignal<"always" | "lg" | "max-lg">;
28
+ readonly border: _angular_core.InputSignal<"none" | "auto" | "border" | "hairline">;
29
+ readonly clip: _angular_core.InputSignalWithTransform<boolean, unknown>;
30
+ protected readonly classes: _angular_core.Signal<string>;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiCard, never>;
32
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiCard, "ui-card", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "surface": { "alias": "surface"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "clip": { "alias": "clip"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
33
+ }
34
+
35
+ export { CARD_PADDINGS, CARD_SURFACES, CARD_VARIANTS, UiCard };
36
+ export type { CardPadding, CardSurface, CardVariant };
@@ -0,0 +1,46 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { ElementRef } from '@angular/core';
3
+ import { UiControl, UiControlError } from '@joanroucoux/cairn-ui/control';
4
+
5
+ type ChoiceChipOption = {
6
+ value: string;
7
+ label: string;
8
+ };
9
+ /**
10
+ * Exclusive choice among a handful of named options, shown as wrapping pills: an account envelope,
11
+ * a category, a frequency. Binds to Signal Forms with `[formField]`.
12
+ *
13
+ * @example
14
+ * <ui-choice-chips label="Envelope" [options]="envelopes" [(value)]="envelope" />
15
+ *
16
+ * @example
17
+ * <ui-choice-chips label="Envelope" [options]="envelopes" [formField]="form.envelope" />
18
+ */
19
+ declare class UiChoiceChips implements UiControl {
20
+ #private;
21
+ readonly options: _angular_core.InputSignal<ChoiceChipOption[]>;
22
+ readonly value: _angular_core.ModelSignal<string>;
23
+ readonly label: _angular_core.InputSignal<string | undefined>;
24
+ readonly ariaLabel: _angular_core.InputSignal<string | undefined>;
25
+ readonly ariaLabelledby: _angular_core.InputSignal<string | undefined>;
26
+ readonly surface: _angular_core.InputSignal<"background" | "card">;
27
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
28
+ readonly errors: _angular_core.InputSignal<readonly UiControlError[]>;
29
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
30
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
31
+ readonly touched: _angular_core.InputSignal<boolean>;
32
+ readonly touch: _angular_core.OutputEmitterRef<void>;
33
+ protected readonly labelId: string;
34
+ protected readonly radios: _angular_core.Signal<readonly ElementRef<HTMLButtonElement>[]>;
35
+ protected readonly labelledBy: _angular_core.Signal<string | null>;
36
+ protected chipClasses(optionValue: string): string;
37
+ protected tabIndexFor(optionValue: string): number;
38
+ protected select(optionValue: string): void;
39
+ protected onFocusOut(event: FocusEvent): void;
40
+ protected onKeydown(event: KeyboardEvent, index: number): void;
41
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiChoiceChips, never>;
42
+ 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>;
43
+ }
44
+
45
+ export { UiChoiceChips };
46
+ export type { ChoiceChipOption };
@@ -0,0 +1,27 @@
1
+ import { InjectionToken, Signal } from '@angular/core';
2
+
3
+ /**
4
+ * The part of a validation error this library reads. Angular's own `ValidationError` satisfies it,
5
+ * which is how a Signal Forms error reaches a field without this package depending on
6
+ * `@angular/forms`.
7
+ */
8
+ type UiControlError = {
9
+ readonly message?: string;
10
+ };
11
+ /** What a styled control offers the field wrapped around it. */
12
+ type UiControl = {
13
+ readonly errors: Signal<readonly UiControlError[]>;
14
+ readonly touched: Signal<boolean>;
15
+ };
16
+ /**
17
+ * Resolves to the styled control projected into a field.
18
+ *
19
+ * Angular's `[formField]` directive fills any input named `errors` or `touched` on the directives
20
+ * sitting on its host element, so a control declaring them receives its own validation state with
21
+ * nothing written at the call site. This token is how the field finds whichever control was
22
+ * projected into it.
23
+ */
24
+ declare const UI_CONTROL: InjectionToken<UiControl>;
25
+
26
+ export { UI_CONTROL };
27
+ export type { UiControl, UiControlError };
@@ -0,0 +1,38 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Available delta emphases. `DeltaEmphasis` is derived from this tuple. */
4
+ declare const DELTA_EMPHASES: readonly ["text", "pill"];
5
+ type DeltaEmphasis = (typeof DELTA_EMPHASES)[number];
6
+ /** Type sizes. `DeltaSize` is derived from this tuple. */
7
+ declare const DELTA_SIZES: readonly ["label", "inherit"];
8
+ type DeltaSize = (typeof DELTA_SIZES)[number];
9
+ /** Font weights. `DeltaWeight` is derived from this tuple. */
10
+ declare const DELTA_WEIGHTS: readonly ["medium", "regular"];
11
+ type DeltaWeight = (typeof DELTA_WEIGHTS)[number];
12
+ type Sign = 'positive' | 'negative' | 'neutral' | 'unknown';
13
+ /**
14
+ * Signed amount whose sign carries meaning: a gain, a loss, or an unknown.
15
+ *
16
+ * A null value is not a zero: a holding with no cost basis exists, and showing 0 would falsely
17
+ * claim a known gain of zero. Color never carries the sign on its own: the projected text must
18
+ * already contain a + or a minus sign.
19
+ *
20
+ * @example
21
+ * <ui-delta [value]="holding.dayChangeEur" unknownLabel="Not available">
22
+ * {{ holding.dayChangeEur | signedMoney }}
23
+ * </ui-delta>
24
+ */
25
+ declare class UiDelta {
26
+ readonly value: _angular_core.InputSignal<number | null | undefined>;
27
+ readonly unknownLabel: _angular_core.InputSignal<string>;
28
+ readonly emphasis: _angular_core.InputSignal<"text" | "pill">;
29
+ readonly size: _angular_core.InputSignal<"label" | "inherit">;
30
+ readonly weight: _angular_core.InputSignal<"medium" | "regular">;
31
+ protected readonly sign: _angular_core.Signal<Sign>;
32
+ protected readonly classes: _angular_core.Signal<string>;
33
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiDelta, never>;
34
+ 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; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "weight": { "alias": "weight"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
35
+ }
36
+
37
+ export { DELTA_EMPHASES, DELTA_SIZES, DELTA_WEIGHTS, UiDelta };
38
+ export type { DeltaEmphasis, DeltaSize, DeltaWeight };