@joanroucoux/cairn-ui 0.1.3 → 0.1.5
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.
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, computed, Component, InjectionToken, output, inject, ElementRef, effect, contentChild, afterRenderEffect, forwardRef, Directive, model, viewChildren
|
|
2
|
+
import { input, computed, Component, InjectionToken, output, inject, ElementRef, effect, booleanAttribute, contentChild, afterRenderEffect, forwardRef, Directive, model, viewChildren } from '@angular/core';
|
|
3
3
|
|
|
4
4
|
/** Available avatar sizes. `AvatarSize` is derived from this tuple. */
|
|
5
5
|
const AVATAR_SIZES = ['sm', 'md'];
|
|
@@ -23,10 +23,10 @@ class UiAvatar {
|
|
|
23
23
|
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
24
24
|
classes = computed(() => `${BASE_CLASSES$4} ${SIZE_CLASSES$1[this.size()]}`, /* @ts-ignore */
|
|
25
25
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
26
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
27
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.
|
|
26
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiAvatar, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
27
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: UiAvatar, isStandalone: true, selector: "ui-avatar", inputs: { initials: { classPropertyName: "initials", publicName: "initials", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "img" }, properties: { "attr.aria-label": "label()", "class": "classes()" } }, ngImport: i0, template: '<span aria-hidden="true">{{ initials() }}</span>', isInline: true });
|
|
28
28
|
}
|
|
29
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
29
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiAvatar, decorators: [{
|
|
30
30
|
type: Component,
|
|
31
31
|
args: [{
|
|
32
32
|
selector: 'ui-avatar',
|
|
@@ -59,10 +59,10 @@ class UiBadge {
|
|
|
59
59
|
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
60
60
|
classes = computed(() => `${BASE_CLASSES$3} ${VARIANT_CLASSES$2[this.variant()]}`, /* @ts-ignore */
|
|
61
61
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
62
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
63
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.
|
|
62
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiBadge, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
63
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: UiBadge, isStandalone: true, selector: "ui-badge", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: '<ng-content />', isInline: true });
|
|
64
64
|
}
|
|
65
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
65
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiBadge, decorators: [{
|
|
66
66
|
type: Component,
|
|
67
67
|
args: [{
|
|
68
68
|
selector: 'ui-badge',
|
|
@@ -112,10 +112,10 @@ class UiButton {
|
|
|
112
112
|
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
113
113
|
classes = computed(() => `${BASE_CLASSES$2} ${VARIANT_CLASSES$1[this.variant()]} ${SIZE_CLASSES[this.size()]}`, /* @ts-ignore */
|
|
114
114
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
115
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
116
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.
|
|
115
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
116
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: UiButton, isStandalone: true, selector: "button[ui-button], a[ui-button]", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: '<ng-content />', isInline: true });
|
|
117
117
|
}
|
|
118
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
118
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiButton, decorators: [{
|
|
119
119
|
type: Component,
|
|
120
120
|
args: [{
|
|
121
121
|
selector: 'button[ui-button], a[ui-button]',
|
|
@@ -153,10 +153,10 @@ class UiCard {
|
|
|
153
153
|
...(ngDevMode ? [{ debugName: "padding" }] : /* istanbul ignore next */ []));
|
|
154
154
|
classes = computed(() => `${BASE_CLASSES$1} ${VARIANT_CLASSES[this.variant()]} ${PADDING_CLASSES[this.padding()]}`, /* @ts-ignore */
|
|
155
155
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
156
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
157
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.
|
|
156
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiCard, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
157
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: UiCard, isStandalone: true, selector: "ui-card", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, padding: { classPropertyName: "padding", publicName: "padding", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: '<ng-content />', isInline: true });
|
|
158
158
|
}
|
|
159
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
159
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiCard, decorators: [{
|
|
160
160
|
type: Component,
|
|
161
161
|
args: [{
|
|
162
162
|
selector: 'ui-card',
|
|
@@ -227,8 +227,8 @@ class UiDelta {
|
|
|
227
227
|
return `${BASE_CLASSES} ${TEXT_CLASSES[sign]} ${background}`;
|
|
228
228
|
}, /* @ts-ignore */
|
|
229
229
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
230
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
231
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
230
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiDelta, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
231
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UiDelta, isStandalone: true, selector: "ui-delta", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, unknownLabel: { classPropertyName: "unknownLabel", publicName: "unknownLabel", isSignal: true, isRequired: true, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0, template: `
|
|
232
232
|
@if (sign() === 'unknown') {
|
|
233
233
|
<span aria-hidden="true">—</span>
|
|
234
234
|
<span class="sr-only">{{ unknownLabel() }}</span>
|
|
@@ -237,7 +237,7 @@ class UiDelta {
|
|
|
237
237
|
}
|
|
238
238
|
`, isInline: true });
|
|
239
239
|
}
|
|
240
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
240
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiDelta, decorators: [{
|
|
241
241
|
type: Component,
|
|
242
242
|
args: [{
|
|
243
243
|
selector: 'ui-delta',
|
|
@@ -308,8 +308,8 @@ class UiDialog {
|
|
|
308
308
|
this.dismissed.emit();
|
|
309
309
|
}
|
|
310
310
|
}
|
|
311
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
312
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
311
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiDialog, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
312
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UiDialog, isStandalone: true, selector: "ui-dialog", inputs: { heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: true, transformFunction: null }, description: { classPropertyName: "description", publicName: "description", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dismissed: "dismissed" }, ngImport: i0, template: `
|
|
313
313
|
<dialog
|
|
314
314
|
[attr.aria-describedby]="description() ? descriptionId : null"
|
|
315
315
|
[attr.aria-labelledby]="headingId"
|
|
@@ -333,7 +333,7 @@ class UiDialog {
|
|
|
333
333
|
</dialog>
|
|
334
334
|
`, isInline: true });
|
|
335
335
|
}
|
|
336
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
336
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiDialog, decorators: [{
|
|
337
337
|
type: Component,
|
|
338
338
|
args: [{
|
|
339
339
|
selector: 'ui-dialog',
|
|
@@ -383,10 +383,16 @@ const nextId = (() => {
|
|
|
383
383
|
* <ui-field label="ISIN or name" [error]="blank() ? 'Enter an ISIN' : undefined">
|
|
384
384
|
* <input uiInput type="search" />
|
|
385
385
|
* </ui-field>
|
|
386
|
+
*
|
|
387
|
+
* @example
|
|
388
|
+
* <ui-field label="Search holdings" labelHidden>
|
|
389
|
+
* <input uiInput type="search" placeholder="Instrument or account" />
|
|
390
|
+
* </ui-field>
|
|
386
391
|
*/
|
|
387
392
|
class UiField {
|
|
388
393
|
label = input.required(/* @ts-ignore */
|
|
389
394
|
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
395
|
+
labelHidden = input(false, { ...(ngDevMode ? { debugName: "labelHidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
390
396
|
hint = input(/* @ts-ignore */
|
|
391
397
|
...(ngDevMode ? [undefined, { debugName: "hint" }] : /* istanbul ignore next */ []));
|
|
392
398
|
error = input(/* @ts-ignore */
|
|
@@ -397,6 +403,8 @@ class UiField {
|
|
|
397
403
|
#host = inject(ElementRef);
|
|
398
404
|
control = contentChild(UI_CONTROL, /* @ts-ignore */
|
|
399
405
|
...(ngDevMode ? [{ debugName: "control" }] : /* istanbul ignore next */ []));
|
|
406
|
+
labelClasses = computed(() => this.labelHidden() ? 'sr-only' : 'text-[13px] font-medium text-(--foreground)', /* @ts-ignore */
|
|
407
|
+
...(ngDevMode ? [{ debugName: "labelClasses" }] : /* istanbul ignore next */ []));
|
|
400
408
|
/**
|
|
401
409
|
* The caller's own `error` wins: it is the only way to report something the control does not
|
|
402
410
|
* know about, such as a search box refusing an empty query.
|
|
@@ -437,11 +445,11 @@ class UiField {
|
|
|
437
445
|
}
|
|
438
446
|
});
|
|
439
447
|
}
|
|
440
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
441
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
448
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiField, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
449
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UiField, isStandalone: true, selector: "ui-field", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, labelHidden: { classPropertyName: "labelHidden", publicName: "labelHidden", isSignal: true, isRequired: false, transformFunction: null }, hint: { classPropertyName: "hint", publicName: "hint", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "control", first: true, predicate: UI_CONTROL, descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
442
450
|
<div class="group flex flex-col gap-1.5">
|
|
443
451
|
<!-- eslint-disable-next-line @angular-eslint/template/label-has-associated-control -- htmlFor is wired at runtime, once the projected control's id is known -->
|
|
444
|
-
<label class="
|
|
452
|
+
<label [class]="labelClasses()">{{ label() }}</label>
|
|
445
453
|
|
|
446
454
|
<ng-content />
|
|
447
455
|
|
|
@@ -455,14 +463,14 @@ class UiField {
|
|
|
455
463
|
</div>
|
|
456
464
|
`, isInline: true });
|
|
457
465
|
}
|
|
458
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
466
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiField, decorators: [{
|
|
459
467
|
type: Component,
|
|
460
468
|
args: [{
|
|
461
469
|
selector: 'ui-field',
|
|
462
470
|
template: `
|
|
463
471
|
<div class="group flex flex-col gap-1.5">
|
|
464
472
|
<!-- eslint-disable-next-line @angular-eslint/template/label-has-associated-control -- htmlFor is wired at runtime, once the projected control's id is known -->
|
|
465
|
-
<label class="
|
|
473
|
+
<label [class]="labelClasses()">{{ label() }}</label>
|
|
466
474
|
|
|
467
475
|
<ng-content />
|
|
468
476
|
|
|
@@ -476,7 +484,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
|
|
|
476
484
|
</div>
|
|
477
485
|
`,
|
|
478
486
|
}]
|
|
479
|
-
}], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], control: [{ type: i0.ContentChild, args: [i0.forwardRef(() => UI_CONTROL), { isSignal: true }] }] } });
|
|
487
|
+
}], ctorParameters: () => [], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], labelHidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelHidden", required: false }] }], hint: [{ type: i0.Input, args: [{ isSignal: true, alias: "hint", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], control: [{ type: i0.ContentChild, args: [i0.forwardRef(() => UI_CONTROL), { isSignal: true }] }] } });
|
|
480
488
|
|
|
481
489
|
/** Available control sizes. `md` is the 44px touch target. */
|
|
482
490
|
const CONTROL_SIZES = ['sm', 'md'];
|
|
@@ -505,10 +513,10 @@ class UiInput {
|
|
|
505
513
|
...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
|
|
506
514
|
classes = computed(() => `${CONTROL_BASE_CLASSES} ${CONTROL_SIZE_CLASSES[this.size()]}`, /* @ts-ignore */
|
|
507
515
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
508
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
509
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.
|
|
516
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiInput, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
517
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.5", type: UiInput, isStandalone: true, selector: "input[uiInput]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiInput) }], ngImport: i0 });
|
|
510
518
|
}
|
|
511
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
519
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiInput, decorators: [{
|
|
512
520
|
type: Directive,
|
|
513
521
|
args: [{
|
|
514
522
|
selector: 'input[uiInput]',
|
|
@@ -534,10 +542,10 @@ class UiTextarea {
|
|
|
534
542
|
...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
|
|
535
543
|
touched = input(false, /* @ts-ignore */
|
|
536
544
|
...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
|
|
537
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
538
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.
|
|
545
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTextarea, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
546
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.5", type: UiTextarea, isStandalone: true, selector: "textarea[uiTextarea]", inputs: { errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "w-full rounded-md border border-(--border) bg-transparent px-3 text-sm text-(--foreground) transition-colors placeholder:text-(--muted-foreground) enabled:hover:outline-2 enabled:hover:outline-offset-2 enabled:hover:outline-(--ring) enabled:group-hover:outline-2 enabled:group-hover:outline-offset-2 enabled:group-hover:outline-(--ring) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) disabled:cursor-not-allowed disabled:opacity-50 min-h-24 py-2" }, providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiTextarea) }], ngImport: i0 });
|
|
539
547
|
}
|
|
540
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
548
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTextarea, decorators: [{
|
|
541
549
|
type: Directive,
|
|
542
550
|
args: [{
|
|
543
551
|
selector: 'textarea[uiTextarea]',
|
|
@@ -578,8 +586,8 @@ class UiMeter {
|
|
|
578
586
|
...(ngDevMode ? [{ debugName: "percent" }] : /* istanbul ignore next */ []));
|
|
579
587
|
fillClasses = computed(() => `h-full rounded-sm ${TONE_CLASSES[this.tone()]}`, /* @ts-ignore */
|
|
580
588
|
...(ngDevMode ? [{ debugName: "fillClasses" }] : /* istanbul ignore next */ []));
|
|
581
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
582
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.
|
|
589
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiMeter, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
590
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: UiMeter, isStandalone: true, selector: "ui-meter", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, valueText: { classPropertyName: "valueText", publicName: "valueText", isSignal: true, isRequired: true, transformFunction: null }, tone: { classPropertyName: "tone", publicName: "tone", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
583
591
|
<div
|
|
584
592
|
class="h-2.5 w-full overflow-hidden rounded-sm bg-(--elevated)"
|
|
585
593
|
role="meter"
|
|
@@ -593,7 +601,7 @@ class UiMeter {
|
|
|
593
601
|
</div>
|
|
594
602
|
`, isInline: true });
|
|
595
603
|
}
|
|
596
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
604
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiMeter, decorators: [{
|
|
597
605
|
type: Component,
|
|
598
606
|
args: [{
|
|
599
607
|
selector: 'ui-meter',
|
|
@@ -655,8 +663,8 @@ class UiSegmented {
|
|
|
655
663
|
this.value.set(next.value);
|
|
656
664
|
this.radios()[nextIndex]?.nativeElement.focus();
|
|
657
665
|
}
|
|
658
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
659
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
666
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiSegmented, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
667
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UiSegmented, isStandalone: true, selector: "ui-segmented", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { value: "valueChange" }, viewQueries: [{ propertyName: "radios", predicate: ["radio"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
660
668
|
<div class="flex gap-1" role="radiogroup" [attr.aria-label]="label()">
|
|
661
669
|
@for (option of options(); track option.value) {
|
|
662
670
|
<button
|
|
@@ -675,7 +683,7 @@ class UiSegmented {
|
|
|
675
683
|
</div>
|
|
676
684
|
`, isInline: true });
|
|
677
685
|
}
|
|
678
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
686
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiSegmented, decorators: [{
|
|
679
687
|
type: Component,
|
|
680
688
|
args: [{
|
|
681
689
|
selector: 'ui-segmented',
|
|
@@ -746,10 +754,10 @@ class UiSelect {
|
|
|
746
754
|
...(ngDevMode ? [{ debugName: "touched" }] : /* istanbul ignore next */ []));
|
|
747
755
|
classes = computed(() => `${CONTROL_BASE_CLASSES} ${SELECT_CLASSES} ${PICKER_CLASSES} ${CONTROL_SIZE_CLASSES[this.size()]}`, /* @ts-ignore */
|
|
748
756
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
749
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
750
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.
|
|
757
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiSelect, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
758
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.5", type: UiSelect, isStandalone: true, selector: "select[uiSelect]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, errors: { classPropertyName: "errors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiSelect) }], ngImport: i0 });
|
|
751
759
|
}
|
|
752
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
760
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiSelect, decorators: [{
|
|
753
761
|
type: Directive,
|
|
754
762
|
args: [{
|
|
755
763
|
selector: 'select[uiSelect]',
|
|
@@ -779,8 +787,8 @@ class UiSkeleton {
|
|
|
779
787
|
return Array.from({ length: count }, (_, index) => (index === count - 1 && count > 1 ? LAST_LINE_WIDTH : '100%'));
|
|
780
788
|
}, /* @ts-ignore */
|
|
781
789
|
...(ngDevMode ? [{ debugName: "bars" }] : /* istanbul ignore next */ []));
|
|
782
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
783
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.
|
|
790
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiSkeleton, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
791
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: UiSkeleton, isStandalone: true, selector: "ui-skeleton", inputs: { lines: { classPropertyName: "lines", publicName: "lines", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "aria-hidden": "true" }, classAttribute: "flex flex-col gap-2" }, ngImport: i0, template: `
|
|
784
792
|
@for (line of bars(); track $index) {
|
|
785
793
|
<span
|
|
786
794
|
class="block rounded bg-(--soft) motion-safe:animate-pulse"
|
|
@@ -790,7 +798,7 @@ class UiSkeleton {
|
|
|
790
798
|
}
|
|
791
799
|
`, isInline: true });
|
|
792
800
|
}
|
|
793
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
801
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiSkeleton, decorators: [{
|
|
794
802
|
type: Component,
|
|
795
803
|
args: [{
|
|
796
804
|
selector: 'ui-skeleton',
|
|
@@ -810,6 +818,83 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
|
|
|
810
818
|
}]
|
|
811
819
|
}], propDecorators: { lines: [{ type: i0.Input, args: [{ isSignal: true, alias: "lines", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }] } });
|
|
812
820
|
|
|
821
|
+
/** Available stat sizes. `StatSize` is derived from this tuple. */
|
|
822
|
+
const STAT_SIZES = ['hero', 'tile'];
|
|
823
|
+
const VALUE_CLASSES = {
|
|
824
|
+
hero: 'text-[48px] leading-[1.1] font-semibold text-(--foreground)',
|
|
825
|
+
tile: 'text-2xl font-semibold text-(--foreground)',
|
|
826
|
+
};
|
|
827
|
+
const LABEL_CLASSES = 'text-[13px] font-medium text-(--subtle-foreground)';
|
|
828
|
+
/**
|
|
829
|
+
* Label, figure and a named period of change, at two sizes: a `hero` for a screen's single
|
|
830
|
+
* headline number, or a smaller `tile` repeated in a grid. The figure itself, its delta and its
|
|
831
|
+
* caption are all projected, so the component carries no formatting and no currency of its own.
|
|
832
|
+
*
|
|
833
|
+
* The `hero` size never sets `tabular-nums` on the figure: a lone headline number reads better
|
|
834
|
+
* with its digits at their natural width, unlike a column of aligned figures.
|
|
835
|
+
*
|
|
836
|
+
* @example
|
|
837
|
+
* <ui-stat label="Net worth" size="hero">
|
|
838
|
+
* <span uiStatValue>128,656 EUR</span>
|
|
839
|
+
* <ui-delta uiStatDelta [value]="dayChange()" unknownLabel="Not available">+316.54 EUR</ui-delta>
|
|
840
|
+
* <span uiStatCaption>today</span>
|
|
841
|
+
* </ui-stat>
|
|
842
|
+
*/
|
|
843
|
+
class UiStat {
|
|
844
|
+
label = input.required(/* @ts-ignore */
|
|
845
|
+
...(ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []));
|
|
846
|
+
size = input('tile', /* @ts-ignore */
|
|
847
|
+
...(ngDevMode ? [{ debugName: "size" }] : /* istanbul ignore next */ []));
|
|
848
|
+
labelClasses = LABEL_CLASSES;
|
|
849
|
+
valueClasses = computed(() => VALUE_CLASSES[this.size()], /* @ts-ignore */
|
|
850
|
+
...(ngDevMode ? [{ debugName: "valueClasses" }] : /* istanbul ignore next */ []));
|
|
851
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiStat, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
852
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.5", type: UiStat, isStandalone: true, selector: "ui-stat", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
853
|
+
<div class="flex items-start justify-between gap-4">
|
|
854
|
+
<div class="flex flex-col gap-1">
|
|
855
|
+
<dl>
|
|
856
|
+
<dt [class]="labelClasses">{{ label() }}</dt>
|
|
857
|
+
<dd [class]="valueClasses()">
|
|
858
|
+
<ng-content select="[uiStatValue]" />
|
|
859
|
+
</dd>
|
|
860
|
+
</dl>
|
|
861
|
+
|
|
862
|
+
<div class="flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-(--muted-foreground)">
|
|
863
|
+
<ng-content select="[uiStatDelta]" />
|
|
864
|
+
<ng-content select="[uiStatCaption]" />
|
|
865
|
+
</div>
|
|
866
|
+
</div>
|
|
867
|
+
|
|
868
|
+
<ng-content select="[uiStatAside]" />
|
|
869
|
+
</div>
|
|
870
|
+
`, isInline: true });
|
|
871
|
+
}
|
|
872
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiStat, decorators: [{
|
|
873
|
+
type: Component,
|
|
874
|
+
args: [{
|
|
875
|
+
selector: 'ui-stat',
|
|
876
|
+
template: `
|
|
877
|
+
<div class="flex items-start justify-between gap-4">
|
|
878
|
+
<div class="flex flex-col gap-1">
|
|
879
|
+
<dl>
|
|
880
|
+
<dt [class]="labelClasses">{{ label() }}</dt>
|
|
881
|
+
<dd [class]="valueClasses()">
|
|
882
|
+
<ng-content select="[uiStatValue]" />
|
|
883
|
+
</dd>
|
|
884
|
+
</dl>
|
|
885
|
+
|
|
886
|
+
<div class="flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-(--muted-foreground)">
|
|
887
|
+
<ng-content select="[uiStatDelta]" />
|
|
888
|
+
<ng-content select="[uiStatCaption]" />
|
|
889
|
+
</div>
|
|
890
|
+
</div>
|
|
891
|
+
|
|
892
|
+
<ng-content select="[uiStatAside]" />
|
|
893
|
+
</div>
|
|
894
|
+
`,
|
|
895
|
+
}]
|
|
896
|
+
}], propDecorators: { label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
|
|
897
|
+
|
|
813
898
|
/** Breakpoints a secondary column can be held back until. */
|
|
814
899
|
const CELL_BREAKPOINTS = ['md', 'lg'];
|
|
815
900
|
const FROM_CLASSES = {
|
|
@@ -822,10 +907,10 @@ const NUMERIC_CLASSES = 'text-right tabular-nums';
|
|
|
822
907
|
const TEXTUAL_CLASSES = 'text-left';
|
|
823
908
|
/** Styled native table. The rows and cells stay plain <tr> and <td>. */
|
|
824
909
|
class UiTable {
|
|
825
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
826
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.
|
|
910
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTable, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
911
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.5", type: UiTable, isStandalone: true, selector: "table[uiTable]", host: { classAttribute: "w-full border-collapse" }, ngImport: i0 });
|
|
827
912
|
}
|
|
828
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
913
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTable, decorators: [{
|
|
829
914
|
type: Directive,
|
|
830
915
|
args: [{
|
|
831
916
|
selector: 'table[uiTable]',
|
|
@@ -848,10 +933,10 @@ class UiTh {
|
|
|
848
933
|
...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
|
|
849
934
|
classes = computed(() => cellClasses(TH_CLASSES, this.numeric(), this.from()), /* @ts-ignore */
|
|
850
935
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
851
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
852
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.
|
|
936
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTh, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
937
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.5", type: UiTh, isStandalone: true, selector: "th[uiTh]", inputs: { numeric: { classPropertyName: "numeric", publicName: "numeric", isSignal: true, isRequired: false, transformFunction: null }, from: { classPropertyName: "from", publicName: "from", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
853
938
|
}
|
|
854
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
939
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTh, decorators: [{
|
|
855
940
|
type: Directive,
|
|
856
941
|
args: [{
|
|
857
942
|
selector: 'th[uiTh]',
|
|
@@ -867,10 +952,10 @@ class UiTd {
|
|
|
867
952
|
...(ngDevMode ? [{ debugName: "from" }] : /* istanbul ignore next */ []));
|
|
868
953
|
classes = computed(() => cellClasses(TD_CLASSES, this.numeric(), this.from()), /* @ts-ignore */
|
|
869
954
|
...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
870
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.
|
|
871
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.
|
|
955
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTd, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
956
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.1.5", type: UiTd, isStandalone: true, selector: "td[uiTd]", inputs: { numeric: { classPropertyName: "numeric", publicName: "numeric", isSignal: true, isRequired: false, transformFunction: null }, from: { classPropertyName: "from", publicName: "from", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()" } }, ngImport: i0 });
|
|
872
957
|
}
|
|
873
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.
|
|
958
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: UiTd, decorators: [{
|
|
874
959
|
type: Directive,
|
|
875
960
|
args: [{
|
|
876
961
|
selector: 'td[uiTd]',
|
|
@@ -888,5 +973,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.4", ngImpor
|
|
|
888
973
|
* Generated bundle index. Do not edit.
|
|
889
974
|
*/
|
|
890
975
|
|
|
891
|
-
export { AVATAR_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, DELTA_EMPHASES, DIALOG_WIDTHS, METER_TONES, UiAvatar, UiBadge, UiButton, UiCard, UiDelta, UiDialog, UiField, UiInput, UiMeter, UiSegmented, UiSelect, UiSkeleton, UiTable, UiTd, UiTextarea, UiTh };
|
|
976
|
+
export { AVATAR_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, DELTA_EMPHASES, DIALOG_WIDTHS, METER_TONES, STAT_SIZES, UiAvatar, UiBadge, UiButton, UiCard, UiDelta, UiDialog, UiField, UiInput, UiMeter, UiSegmented, UiSelect, UiSkeleton, UiStat, UiTable, UiTd, UiTextarea, UiTh };
|
|
892
977
|
//# sourceMappingURL=joanroucoux-cairn-ui.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"joanroucoux-cairn-ui.mjs","sources":["../../../projects/ui/src/lib/avatar/avatar.ts","../../../projects/ui/src/lib/badge/badge.ts","../../../projects/ui/src/lib/button/button.ts","../../../projects/ui/src/lib/card/card.ts","../../../projects/ui/src/lib/control/control.ts","../../../projects/ui/src/lib/delta/delta.ts","../../../projects/ui/src/lib/dialog/dialog.ts","../../../projects/ui/src/lib/field/field.ts","../../../projects/ui/src/lib/input/input.ts","../../../projects/ui/src/lib/meter/meter.ts","../../../projects/ui/src/lib/segmented/segmented.ts","../../../projects/ui/src/lib/select/select.ts","../../../projects/ui/src/lib/skeleton/skeleton.ts","../../../projects/ui/src/lib/table/table.ts","../../../projects/ui/src/public-api.ts","../../../projects/ui/src/joanroucoux-cairn-ui.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\n/** Available avatar sizes. `AvatarSize` is derived from this tuple. */\nexport const AVATAR_SIZES = ['sm', 'md'] as const;\nexport type AvatarSize = (typeof AVATAR_SIZES)[number];\n\nconst BASE_CLASSES =\n 'inline-flex items-center justify-center rounded-full border border-(--primary) bg-(--soft) font-semibold tabular-nums text-(--primary)';\n\nconst SIZE_CLASSES: Record<AvatarSize, string> = {\n sm: 'size-8 text-xs',\n md: 'size-11 text-sm',\n};\n\n/**\n * Initials in a disc, standing in for a person. Single-user application: there is exactly one.\n *\n * @example\n * <ui-avatar initials=\"JR\" label=\"My account\" />\n */\n@Component({\n selector: 'ui-avatar',\n template: '<span aria-hidden=\"true\">{{ initials() }}</span>',\n host: {\n role: 'img',\n '[attr.aria-label]': 'label()',\n '[class]': 'classes()',\n },\n})\nexport class UiAvatar {\n readonly initials = input.required<string>();\n readonly label = input.required<string>();\n readonly size = input<AvatarSize>('md');\n\n protected readonly classes = computed(() => `${BASE_CLASSES} ${SIZE_CLASSES[this.size()]}`);\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Available badge variants. `BadgeVariant` is derived from this tuple. */\nexport const BADGE_VARIANTS = ['primary', 'secondary', 'destructive', 'outline'] as const;\nexport type BadgeVariant = (typeof BADGE_VARIANTS)[number];\n\nconst BASE_CLASSES = 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium';\n\nconst VARIANT_CLASSES: Record<BadgeVariant, string> = {\n primary: 'bg-(--primary) text-(--primary-foreground)',\n secondary: 'bg-(--secondary) text-(--secondary-foreground)',\n destructive: 'bg-(--destructive) text-(--destructive-foreground)',\n outline: 'border border-(--border) text-(--foreground)',\n};\n\n/**\n * Small status descriptor for counts, states or labels.\n *\n * @example\n * <ui-badge variant=\"secondary\">Draft</ui-badge>\n */\n@Component({\n selector: 'ui-badge',\n template: '<ng-content />',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiBadge {\n readonly variant = input<BadgeVariant>('primary');\n\n protected readonly classes = computed(() => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]}`);\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Available button variants. `ButtonVariant` is derived from this tuple. */\nexport const BUTTON_VARIANTS = ['primary', 'secondary', 'outline', 'destructive', 'ghost'] as const;\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\n\n/** Available button sizes. `md` is the 44px touch target Cairn asks for everywhere. */\nexport const BUTTON_SIZES = ['sm', 'md', 'lg'] as const;\nexport type ButtonSize = (typeof BUTTON_SIZES)[number];\n\nconst BASE_CLASSES =\n // Tailwind's preflight sets buttons to cursor: default (matching the native element) since v3.4:\n // cursor-pointer restores the hand cursor consumers expect from a clickable control.\n 'inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) disabled:pointer-events-none disabled:opacity-50';\n\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n 'bg-(--primary) bg-linear-135 from-(--primary) to-(--primary-to) text-(--primary-foreground) hover:opacity-90',\n secondary: 'bg-(--secondary) text-(--secondary-foreground) hover:bg-(--secondary)/80',\n outline: 'border border-(--border) bg-transparent hover:bg-(--soft)',\n destructive: 'bg-(--destructive) text-(--destructive-foreground) hover:bg-(--destructive)/90',\n ghost: 'hover:bg-(--accent) hover:text-(--accent-foreground)',\n};\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n sm: 'h-9 px-3 text-[13px]',\n md: 'h-11 px-4 text-sm',\n lg: 'h-12 px-6 text-base',\n};\n\n/**\n * Styled native button. Applied as an attribute so the host keeps every native\n * button behavior (type, disabled, form submission, accessibility) for free.\n *\n * Also applies to an anchor, for the one case where the action really is a navigation:\n * a download the browser has to perform itself. The element stays a link, and so does\n * its role - never use this to make an ordinary link look like a form control.\n *\n * @example\n * <button ui-button variant=\"destructive\" size=\"sm\">Delete</button>\n * <a ui-button variant=\"outline\" href=\"/api/holdings/export\" download>Export</a>\n */\n@Component({\n selector: 'button[ui-button], a[ui-button]',\n template: '<ng-content />',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiButton {\n readonly variant = input<ButtonVariant>('primary');\n readonly size = input<ButtonSize>('md');\n\n protected readonly classes = computed(\n () => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]} ${SIZE_CLASSES[this.size()]}`,\n );\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Available card variants. `CardVariant` is derived from this tuple. */\nexport const CARD_VARIANTS = ['default', 'elevated'] as const;\nexport type CardVariant = (typeof CARD_VARIANTS)[number];\n\n/** Available card paddings. `CardPadding` is derived from this tuple. */\nexport const CARD_PADDINGS = ['none', 'sm', 'md'] as const;\nexport type CardPadding = (typeof CARD_PADDINGS)[number];\n\nconst BASE_CLASSES = 'block rounded-xl border';\n\nconst VARIANT_CLASSES: Record<CardVariant, string> = {\n default: 'bg-(--card) border-(--border) text-(--card-foreground)',\n elevated: 'bg-(--elevated) border-(--hairline) text-(--foreground)',\n};\n\nconst PADDING_CLASSES: Record<CardPadding, string> = {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-5',\n};\n\n/**\n * Surface that groups related content: a summary block, a table, a side panel.\n *\n * @example\n * <ui-card variant=\"elevated\" padding=\"sm\">Total</ui-card>\n */\n@Component({\n selector: 'ui-card',\n template: '<ng-content />',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiCard {\n readonly variant = input<CardVariant>('default');\n readonly padding = input<CardPadding>('md');\n\n protected readonly classes = computed(\n () => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]} ${PADDING_CLASSES[this.padding()]}`,\n );\n}\n","import { InjectionToken, type Signal } from '@angular/core';\n\n/**\n * The part of a validation error this library reads. Angular's own `ValidationError` satisfies it,\n * which is how a Signal Forms error reaches a field without this package depending on\n * `@angular/forms`.\n */\nexport type UiControlError = { readonly message?: string };\n\n/** What a styled control offers the field wrapped around it. */\nexport type UiControl = {\n readonly errors: Signal<readonly UiControlError[]>;\n readonly touched: Signal<boolean>;\n};\n\n/**\n * Resolves to the styled control projected into a field.\n *\n * Angular's `[formField]` directive fills any input named `errors` or `touched` on the directives\n * sitting on its host element, so a control declaring them receives its own validation state with\n * nothing written at the call site. This token is how the field finds whichever control was\n * projected into it.\n */\nexport const UI_CONTROL = new InjectionToken<UiControl>('UI_CONTROL');\n","import { Component, computed, input } from '@angular/core';\n\n/** Available delta emphases. `DeltaEmphasis` is derived from this tuple. */\nexport const DELTA_EMPHASES = ['text', 'pill'] as const;\nexport type DeltaEmphasis = (typeof DELTA_EMPHASES)[number];\n\nconst BASE_CLASSES = 'inline-flex items-center gap-1 font-semibold tabular-nums';\n\nconst PILL_CLASSES = 'rounded-md px-2.5 py-1';\n\ntype Sign = 'positive' | 'negative' | 'neutral' | 'unknown';\n\nconst TEXT_CLASSES: Record<Sign, string> = {\n positive: 'text-(--positive)',\n negative: 'text-(--negative)',\n neutral: 'text-(--muted-foreground)',\n unknown: 'text-(--subtle-foreground)',\n};\n\nconst PILL_BACKGROUND_CLASS = 'bg-(--muted)';\n\n/**\n * Signed amount whose sign carries meaning: a gain, a loss, or an unknown.\n *\n * A null value is not a zero: a holding with no cost basis exists, and showing 0 would falsely\n * claim a known gain of zero. Color never carries the sign on its own: the projected text must\n * already contain a + or a minus sign.\n *\n * @example\n * <ui-delta [value]=\"holding.dayChangeEur\" unknownLabel=\"Not available\">\n * {{ holding.dayChangeEur | signedMoney }}\n * </ui-delta>\n */\n@Component({\n selector: 'ui-delta',\n template: `\n @if (sign() === 'unknown') {\n <span aria-hidden=\"true\">—</span>\n <span class=\"sr-only\">{{ unknownLabel() }}</span>\n } @else {\n <ng-content />\n }\n `,\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiDelta {\n readonly value = input.required<number | null | undefined>();\n readonly unknownLabel = input.required<string>();\n readonly emphasis = input<DeltaEmphasis>('text');\n\n protected readonly sign = computed<Sign>(() => {\n const value = this.value();\n\n if (value === null || value === undefined) {\n return 'unknown';\n }\n if (value > 0) {\n return 'positive';\n }\n if (value < 0) {\n return 'negative';\n }\n return 'neutral';\n });\n\n protected readonly classes = computed(() => {\n const sign = this.sign();\n const background = this.emphasis() === 'pill' ? `${PILL_CLASSES} ${PILL_BACKGROUND_CLASS}` : 'bg-transparent';\n\n return `${BASE_CLASSES} ${TEXT_CLASSES[sign]} ${background}`;\n });\n}\n","import { Component, ElementRef, computed, effect, inject, input, output } from '@angular/core';\n\n/** Available dialog widths. `DialogWidth` is derived from this tuple. */\nexport const DIALOG_WIDTHS = ['md', 'lg'] as const;\nexport type DialogWidth = (typeof DIALOG_WIDTHS)[number];\n\nconst WIDTH_CLASSES: Record<DialogWidth, string> = {\n md: 'max-w-md',\n lg: 'max-w-lg',\n};\n\nconst nextId = (() => {\n let count = 0;\n\n return () => `ui-dialog-${++count}`;\n})();\n\n/**\n * Modal dialog on the native <dialog>: focus trap, focus return, Escape and the top layer\n * come from the platform. Two projection slots - the body, and [dialogActions] for the footer.\n *\n * @example\n * <ui-dialog heading=\"Delete this holding?\" [open]=\"confirming()\" (dismissed)=\"confirming.set(false)\">\n * <p>This cannot be undone.</p>\n * <button dialogActions ui-button variant=\"outline\" (click)=\"confirming.set(false)\">Cancel</button>\n * </ui-dialog>\n */\n@Component({\n selector: 'ui-dialog',\n template: `\n <dialog\n [attr.aria-describedby]=\"description() ? descriptionId : null\"\n [attr.aria-labelledby]=\"headingId\"\n [class]=\"classes()\"\n (close)=\"onNativeClose()\"\n >\n <h2 class=\"text-lg font-semibold tracking-tight\" [id]=\"headingId\">{{ heading() }}</h2>\n\n @if (description()) {\n <p class=\"mt-2 text-sm text-(--muted-foreground)\" [id]=\"descriptionId\">{{ description() }}</p>\n }\n\n <!-- empty:hidden keeps a body-less dialog from carrying the body's top margin. -->\n <div class=\"mt-4 flex flex-col gap-4 empty:hidden\">\n <ng-content />\n </div>\n\n <div class=\"mt-6 flex justify-end gap-3\">\n <ng-content select=\"[dialogActions]\" />\n </div>\n </dialog>\n `,\n})\nexport class UiDialog {\n readonly heading = input.required<string>();\n readonly description = input<string>();\n readonly width = input<DialogWidth>('lg');\n readonly open = input(false);\n readonly dismissed = output<void>();\n\n protected readonly headingId = nextId();\n protected readonly descriptionId = `${this.headingId}-description`;\n\n protected readonly classes = computed(\n () =>\n `w-full m-auto ${WIDTH_CLASSES[this.width()]} rounded-xl border border-(--border) bg-(--card) p-6 text-(--foreground) backdrop:bg-black/60`,\n );\n\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n constructor() {\n effect(() => {\n // viewChild.required can't target a #private field (NG1053); safe because the template has exactly one <dialog>.\n const dialog = this.#host.nativeElement.querySelector('dialog') as HTMLDialogElement;\n\n if (this.open() && !dialog.open) {\n dialog.showModal();\n } else if (!this.open() && dialog.open) {\n dialog.close();\n }\n });\n }\n\n protected onNativeClose(): void {\n // The owner already knows about a close it asked for; only a close it did not ask for is news.\n if (this.open()) {\n this.dismissed.emit();\n }\n }\n}\n","import { Component, ElementRef, afterRenderEffect, computed, contentChild, inject, input } from '@angular/core';\n\nimport { UI_CONTROL } from '../control/control';\n\nconst nextId = (() => {\n let count = 0;\n\n return (): string => `ui-field-${++count}`;\n})();\n\n/**\n * Label, control, hint and error as one unit. The control stays a plain native element:\n * the field finds it in its own projected content and wires the ARIA attributes onto it.\n *\n * The message comes from the caller's `error`, or, where none is set, from the projected control's\n * own validation state once it is touched.\n *\n * @example\n * <ui-field label=\"Quantity\" hint=\"Leave empty if unknown\">\n * <input uiInput type=\"number\" [formField]=\"form.quantity\" />\n * </ui-field>\n *\n * @example\n * <ui-field label=\"ISIN or name\" [error]=\"blank() ? 'Enter an ISIN' : undefined\">\n * <input uiInput type=\"search\" />\n * </ui-field>\n */\n@Component({\n selector: 'ui-field',\n template: `\n <div class=\"group flex flex-col gap-1.5\">\n <!-- eslint-disable-next-line @angular-eslint/template/label-has-associated-control -- htmlFor is wired at runtime, once the projected control's id is known -->\n <label class=\"text-[13px] font-medium text-(--foreground)\">{{ label() }}</label>\n\n <ng-content />\n\n @if (hint()) {\n <span class=\"text-[11.5px] text-(--subtle-foreground)\" [id]=\"hintId\">{{ hint() }}</span>\n }\n\n @if (message()) {\n <p class=\"text-[11.5px] text-(--negative)\" role=\"alert\" [id]=\"errorId\">{{ message() }}</p>\n }\n </div>\n `,\n})\nexport class UiField {\n readonly label = input.required<string>();\n readonly hint = input<string>();\n readonly error = input<string>();\n\n readonly #id = nextId();\n protected readonly hintId = `${this.#id}-hint`;\n protected readonly errorId = `${this.#id}-error`;\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n protected readonly control = contentChild(UI_CONTROL);\n\n /**\n * The caller's own `error` wins: it is the only way to report something the control does not\n * know about, such as a search box refusing an empty query.\n */\n protected readonly message = computed(() => {\n const explicit = this.error();\n\n if (explicit) {\n return explicit;\n }\n\n const control = this.control();\n\n if (!control?.touched()) {\n return undefined;\n }\n\n return control.errors().find((error) => error.message)?.message;\n });\n\n constructor() {\n afterRenderEffect(() => {\n // querySelector, not viewChild.required, so the \"no control found\" guard below stays reachable and testable.\n const control = this.#host.nativeElement.querySelector<HTMLElement>('input, select, textarea');\n\n if (!control) {\n return;\n }\n\n control.id ||= this.#id;\n this.#host.nativeElement.querySelector('label')!.htmlFor = control.id;\n\n const describedBy = [this.hint() ? this.hintId : null, this.message() ? this.errorId : null].filter(Boolean);\n\n if (describedBy.length > 0) {\n control.setAttribute('aria-describedby', describedBy.join(' '));\n } else {\n control.removeAttribute('aria-describedby');\n }\n\n if (this.message()) {\n control.setAttribute('aria-invalid', 'true');\n } else {\n control.removeAttribute('aria-invalid');\n }\n });\n }\n}\n","import { Directive, computed, forwardRef, input } from '@angular/core';\n\nimport { UI_CONTROL, type UiControl, type UiControlError } from '../control/control';\n\n/** Available control sizes. `md` is the 44px touch target. */\nexport const CONTROL_SIZES = ['sm', 'md'] as const;\nexport type ControlSize = (typeof CONTROL_SIZES)[number];\n\nexport const CONTROL_BASE_CLASSES =\n 'w-full rounded-md border border-(--border) bg-transparent px-3 text-sm text-(--foreground) transition-colors placeholder:text-(--muted-foreground) enabled:hover:outline-2 enabled:hover:outline-offset-2 enabled:hover:outline-(--ring) enabled:group-hover:outline-2 enabled:group-hover:outline-offset-2 enabled:group-hover:outline-(--ring) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) disabled:cursor-not-allowed disabled:opacity-50';\n\nexport const CONTROL_SIZE_CLASSES: Record<ControlSize, string> = {\n sm: 'h-9',\n md: 'h-11',\n};\n\n/**\n * Styled native text input. A directive (not a wrapper component) so the host\n * stays a plain <input>: every forms flavor (ngModel, reactive, signal forms)\n * and every native attribute keep working without any plumbing.\n *\n * Declares the `errors` and `touched` inputs Angular's `[formField]` fills, so a `ui-field` around\n * it can show the message without any binding here.\n *\n * @example\n * <input uiInput type=\"email\" placeholder=\"you@example.com\" />\n */\n@Directive({\n selector: 'input[uiInput]',\n host: {\n '[class]': 'classes()',\n },\n providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiInput) }],\n})\nexport class UiInput implements UiControl {\n readonly size = input<ControlSize>('md');\n readonly errors = input<readonly UiControlError[]>([]);\n readonly touched = input(false);\n\n protected readonly classes = computed(() => `${CONTROL_BASE_CLASSES} ${CONTROL_SIZE_CLASSES[this.size()]}`);\n}\n\n/**\n * Styled native textarea. Lives beside the input because it shares every one of its\n * classes; it takes no size, since a textarea grows from a floor instead of sitting\n * at a fixed height.\n *\n * Declares the `errors` and `touched` inputs Angular's `[formField]` fills, so a `ui-field` around\n * it can show the message without any binding here.\n *\n * @example\n * <textarea uiTextarea maxlength=\"280\"></textarea>\n */\n@Directive({\n selector: 'textarea[uiTextarea]',\n host: {\n class: `${CONTROL_BASE_CLASSES} min-h-24 py-2`,\n },\n providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiTextarea) }],\n})\nexport class UiTextarea implements UiControl {\n readonly errors = input<readonly UiControlError[]>([]);\n readonly touched = input(false);\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Ramp step used to paint the fill. `MeterTone` is derived from this tuple. */\nexport const METER_TONES = [1, 2, 3, 4, 5, 6] as const;\nexport type MeterTone = (typeof METER_TONES)[number];\n\nconst TONE_CLASSES: Record<MeterTone, string> = {\n 1: 'bg-(--ramp-1)',\n 2: 'bg-(--ramp-2)',\n 3: 'bg-(--ramp-3)',\n 4: 'bg-(--ramp-4)',\n 5: 'bg-(--ramp-5)',\n 6: 'bg-(--ramp-6)',\n};\n\n/**\n * Proportion of a whole, drawn as a single bar. One bar per category, never a stacked\n * strip: without hue to separate segments, length has to do the work alone.\n *\n * @example\n * <ui-meter [value]=\"0.463\" label=\"Funds\" valueText=\"46.3% - 128,656.00 EUR\" [tone]=\"1\" />\n */\n@Component({\n selector: 'ui-meter',\n template: `\n <div\n class=\"h-2.5 w-full overflow-hidden rounded-sm bg-(--elevated)\"\n role=\"meter\"\n [attr.aria-label]=\"label()\"\n [attr.aria-valuemax]=\"1\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuetext]=\"valueText()\"\n >\n <div data-testid=\"meter-fill\" [class]=\"fillClasses()\" [style.width.%]=\"percent()\"></div>\n </div>\n `,\n})\nexport class UiMeter {\n readonly value = input.required<number>();\n readonly label = input.required<string>();\n readonly valueText = input.required<string>();\n readonly tone = input<MeterTone>(1);\n\n protected readonly percent = computed(() => Math.min(100, Math.max(0, this.value() * 100)));\n\n protected readonly fillClasses = computed(() => `h-full rounded-sm ${TONE_CLASSES[this.tone()]}`);\n}\n","import { Component, ElementRef, input, model, viewChildren } from '@angular/core';\n\nexport type SegmentedOption = {\n value: string;\n label: string;\n};\n\nconst OPTION_CLASSES =\n 'min-h-11 flex-1 cursor-pointer rounded-md px-3 text-xs font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring)';\n\nconst SELECTED_CLASSES = 'bg-(--primary) bg-linear-135 from-(--primary) to-(--primary-to) text-(--primary-foreground)';\n\nconst UNSELECTED_CLASSES = 'bg-(--elevated) text-(--muted-foreground) hover:text-(--foreground)';\n\n/**\n * Exclusive choice within a small, known set: a time range, a unit, a mode.\n *\n * @example\n * <ui-segmented [options]=\"ranges\" label=\"Time range\" [(value)]=\"range\" />\n */\n@Component({\n selector: 'ui-segmented',\n template: `\n <div class=\"flex gap-1\" role=\"radiogroup\" [attr.aria-label]=\"label()\">\n @for (option of options(); track option.value) {\n <button\n #radio\n role=\"radio\"\n type=\"button\"\n [attr.aria-checked]=\"option.value === value()\"\n [attr.tabindex]=\"tabIndexFor(option.value)\"\n [class]=\"optionClasses(option.value)\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event)\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n `,\n})\nexport class UiSegmented {\n readonly options = input.required<SegmentedOption[]>();\n readonly label = input.required<string>();\n readonly value = model.required<string>();\n\n protected readonly radios = viewChildren<ElementRef<HTMLButtonElement>>('radio');\n\n protected optionClasses(optionValue: string): string {\n return `${OPTION_CLASSES} ${optionValue === this.value() ? SELECTED_CLASSES : UNSELECTED_CLASSES}`;\n }\n\n protected tabIndexFor(optionValue: string): number {\n const opts = this.options();\n const tabStopValue = opts.some((option) => option.value === this.value()) ? this.value() : opts[0]?.value;\n\n return optionValue === tabStopValue ? 0 : -1;\n }\n\n protected select(optionValue: string): void {\n this.value.set(optionValue);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const delta = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 }[event.key];\n if (delta === undefined) {\n return;\n }\n event.preventDefault();\n\n const opts = this.options();\n const currentIndex = opts.findIndex((option) => option.value === this.value());\n const nextIndex = (currentIndex + delta + opts.length) % opts.length;\n const next = opts[nextIndex]!;\n\n this.value.set(next.value);\n this.radios()[nextIndex]?.nativeElement.focus();\n }\n}\n","import { Directive, computed, forwardRef, input } from '@angular/core';\n\nimport { UI_CONTROL, type UiControl, type UiControlError } from '../control/control';\nimport { CONTROL_BASE_CLASSES, CONTROL_SIZE_CLASSES, type ControlSize } from '../input/input';\n\nconst SELECT_CLASSES = 'cursor-pointer pr-8';\n\n// Spelled out prefix included: Tailwind scans for literal strings, so a prefix applied in code\n// emits nothing. Dropping `supports` leaves Firefox the padding of a chevron it does not lay out.\nconst PICKER_CLASSES = [\n 'pointer-fine:supports-[appearance:base-select]:[appearance:base-select]',\n 'pointer-fine:supports-[appearance:base-select]:items-center',\n 'pointer-fine:supports-[appearance:base-select]:pr-3',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:cursor-pointer',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:rounded-md',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:px-2.5',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:py-2',\n 'pointer-fine:supports-[appearance:base-select]:[&_option:hover]:bg-(--soft)',\n 'pointer-fine:supports-[appearance:base-select]:[&_option:focus]:bg-(--soft)',\n 'pointer-fine:supports-[appearance:base-select]:[&_option:checked]:font-medium',\n '[&::picker-icon]:text-[11px]',\n '[&::picker-icon]:text-(--muted-foreground)',\n '[&::picker(select)]:[appearance:base-select]',\n '[&::picker(select)]:my-1.5',\n '[&::picker(select)]:rounded-lg',\n '[&::picker(select)]:border',\n '[&::picker(select)]:border-(--border)',\n '[&::picker(select)]:bg-(--card)',\n '[&::picker(select)]:[position-try-fallbacks:none]',\n '[&::picker(select)]:overflow-y-auto',\n '[&::picker(select)]:p-1',\n '[&::picker(select)]:text-(--card-foreground)',\n].join(' ');\n\n/**\n * Styled native select, drop-down list included where the browser allows it. It stays a native\n * `<select>`: keyboard, typeahead and semantics come from the platform, not from a rebuilt listbox.\n *\n * Declares the `errors` and `touched` inputs Angular's `[formField]` fills, so a `ui-field` around\n * it can show the message without any binding here.\n *\n * @example\n * <select uiSelect><option value=\"pea\">PEA</option></select>\n */\n@Directive({\n selector: 'select[uiSelect]',\n host: {\n '[class]': 'classes()',\n },\n providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiSelect) }],\n})\nexport class UiSelect implements UiControl {\n readonly size = input<ControlSize>('md');\n readonly errors = input<readonly UiControlError[]>([]);\n readonly touched = input(false);\n\n protected readonly classes = computed(\n () => `${CONTROL_BASE_CLASSES} ${SELECT_CLASSES} ${PICKER_CLASSES} ${CONTROL_SIZE_CLASSES[this.size()]}`,\n );\n}\n","import { Component, computed, input } from '@angular/core';\n\nconst LAST_LINE_WIDTH = '62%';\n\n/**\n * Decorative placeholder for content that is still loading. Deliberately hidden from\n * assistive technology: the calling screen keeps its own role=\"status\" sentence.\n *\n * @example\n * <ui-skeleton [lines]=\"3\" />\n * <ui-skeleton [height]=\"196\" />\n */\n@Component({\n selector: 'ui-skeleton',\n template: `\n @for (line of bars(); track $index) {\n <span\n class=\"block rounded bg-(--soft) motion-safe:animate-pulse\"\n [style.height.px]=\"height()\"\n [style.width]=\"line\"\n ></span>\n }\n `,\n host: {\n 'aria-hidden': 'true',\n class: 'flex flex-col gap-2',\n },\n})\nexport class UiSkeleton {\n readonly lines = input(1);\n readonly height = input(12);\n\n protected readonly bars = computed(() => {\n const count = Math.max(1, this.lines());\n\n return Array.from({ length: count }, (_, index) => (index === count - 1 && count > 1 ? LAST_LINE_WIDTH : '100%'));\n });\n}\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\n\n/** Breakpoints a secondary column can be held back until. */\nexport const CELL_BREAKPOINTS = ['md', 'lg'] as const;\nexport type CellBreakpoint = (typeof CELL_BREAKPOINTS)[number];\n\nconst FROM_CLASSES: Record<CellBreakpoint, string> = {\n md: 'hidden md:table-cell',\n lg: 'hidden lg:table-cell',\n};\n\nconst TH_CLASSES =\n 'px-3 py-2 align-bottom text-[11px] font-medium uppercase tracking-[0.05em] text-(--subtle-foreground)';\nconst TD_CLASSES = 'border-t border-(--hairline) px-3 py-2.5 align-middle text-sm';\nconst NUMERIC_CLASSES = 'text-right tabular-nums';\nconst TEXTUAL_CLASSES = 'text-left';\n\n/** Styled native table. The rows and cells stay plain <tr> and <td>. */\n@Directive({\n selector: 'table[uiTable]',\n host: {\n class: 'w-full border-collapse',\n },\n})\nexport class UiTable {}\n\nconst cellClasses = (base: string, numeric: boolean, from: CellBreakpoint | null): string =>\n [base, numeric ? NUMERIC_CLASSES : TEXTUAL_CLASSES, from ? FROM_CLASSES[from] : ''].filter(Boolean).join(' ');\n\n/**\n * Column header. `numeric` right-aligns and lines the digits up; `from` holds a\n * secondary column back until the viewport is wide enough for it.\n *\n * @example\n * <th uiTh numeric from=\"md\">Average cost</th>\n */\n@Directive({\n selector: 'th[uiTh]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiTh {\n readonly numeric = input(false, { transform: booleanAttribute });\n readonly from = input<CellBreakpoint | null>(null);\n\n protected readonly classes = computed(() => cellClasses(TH_CLASSES, this.numeric(), this.from()));\n}\n\n/** Body cell. Same two inputs as `UiTh`, and they must be set on both to match. */\n@Directive({\n selector: 'td[uiTd]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiTd {\n readonly numeric = input(false, { transform: booleanAttribute });\n readonly from = input<CellBreakpoint | null>(null);\n\n protected readonly classes = computed(() => cellClasses(TD_CLASSES, this.numeric(), this.from()));\n}\n","/*\n * Public API surface of the ui library.\n */\n\nexport { AVATAR_SIZES, UiAvatar, type AvatarSize } from './lib/avatar/avatar';\nexport { BADGE_VARIANTS, UiBadge, type BadgeVariant } from './lib/badge/badge';\nexport { BUTTON_SIZES, BUTTON_VARIANTS, UiButton, type ButtonSize, type ButtonVariant } from './lib/button/button';\nexport { CARD_PADDINGS, CARD_VARIANTS, UiCard, type CardPadding, type CardVariant } from './lib/card/card';\nexport { type UiControlError } from './lib/control/control';\nexport { DELTA_EMPHASES, UiDelta, type DeltaEmphasis } from './lib/delta/delta';\nexport { DIALOG_WIDTHS, UiDialog, type DialogWidth } from './lib/dialog/dialog';\nexport { UiField } from './lib/field/field';\nexport { CONTROL_SIZES, UiInput, UiTextarea, type ControlSize } from './lib/input/input';\nexport { METER_TONES, UiMeter, type MeterTone } from './lib/meter/meter';\nexport { UiSegmented, type SegmentedOption } from './lib/segmented/segmented';\nexport { UiSelect } from './lib/select/select';\nexport { UiSkeleton } from './lib/skeleton/skeleton';\nexport { CELL_BREAKPOINTS, UiTable, UiTd, UiTh, type CellBreakpoint } from './lib/table/table';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BASE_CLASSES","SIZE_CLASSES","VARIANT_CLASSES","nextId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"joanroucoux-cairn-ui.mjs","sources":["../../../projects/ui/src/lib/avatar/avatar.ts","../../../projects/ui/src/lib/badge/badge.ts","../../../projects/ui/src/lib/button/button.ts","../../../projects/ui/src/lib/card/card.ts","../../../projects/ui/src/lib/control/control.ts","../../../projects/ui/src/lib/delta/delta.ts","../../../projects/ui/src/lib/dialog/dialog.ts","../../../projects/ui/src/lib/field/field.ts","../../../projects/ui/src/lib/input/input.ts","../../../projects/ui/src/lib/meter/meter.ts","../../../projects/ui/src/lib/segmented/segmented.ts","../../../projects/ui/src/lib/select/select.ts","../../../projects/ui/src/lib/skeleton/skeleton.ts","../../../projects/ui/src/lib/stat/stat.ts","../../../projects/ui/src/lib/table/table.ts","../../../projects/ui/src/public-api.ts","../../../projects/ui/src/joanroucoux-cairn-ui.ts"],"sourcesContent":["import { Component, computed, input } from '@angular/core';\n\n/** Available avatar sizes. `AvatarSize` is derived from this tuple. */\nexport const AVATAR_SIZES = ['sm', 'md'] as const;\nexport type AvatarSize = (typeof AVATAR_SIZES)[number];\n\nconst BASE_CLASSES =\n 'inline-flex items-center justify-center rounded-full border border-(--primary) bg-(--soft) font-semibold tabular-nums text-(--primary)';\n\nconst SIZE_CLASSES: Record<AvatarSize, string> = {\n sm: 'size-8 text-xs',\n md: 'size-11 text-sm',\n};\n\n/**\n * Initials in a disc, standing in for a person. Single-user application: there is exactly one.\n *\n * @example\n * <ui-avatar initials=\"JR\" label=\"My account\" />\n */\n@Component({\n selector: 'ui-avatar',\n template: '<span aria-hidden=\"true\">{{ initials() }}</span>',\n host: {\n role: 'img',\n '[attr.aria-label]': 'label()',\n '[class]': 'classes()',\n },\n})\nexport class UiAvatar {\n readonly initials = input.required<string>();\n readonly label = input.required<string>();\n readonly size = input<AvatarSize>('md');\n\n protected readonly classes = computed(() => `${BASE_CLASSES} ${SIZE_CLASSES[this.size()]}`);\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Available badge variants. `BadgeVariant` is derived from this tuple. */\nexport const BADGE_VARIANTS = ['primary', 'secondary', 'destructive', 'outline'] as const;\nexport type BadgeVariant = (typeof BADGE_VARIANTS)[number];\n\nconst BASE_CLASSES = 'inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium';\n\nconst VARIANT_CLASSES: Record<BadgeVariant, string> = {\n primary: 'bg-(--primary) text-(--primary-foreground)',\n secondary: 'bg-(--secondary) text-(--secondary-foreground)',\n destructive: 'bg-(--destructive) text-(--destructive-foreground)',\n outline: 'border border-(--border) text-(--foreground)',\n};\n\n/**\n * Small status descriptor for counts, states or labels.\n *\n * @example\n * <ui-badge variant=\"secondary\">Draft</ui-badge>\n */\n@Component({\n selector: 'ui-badge',\n template: '<ng-content />',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiBadge {\n readonly variant = input<BadgeVariant>('primary');\n\n protected readonly classes = computed(() => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]}`);\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Available button variants. `ButtonVariant` is derived from this tuple. */\nexport const BUTTON_VARIANTS = ['primary', 'secondary', 'outline', 'destructive', 'ghost'] as const;\nexport type ButtonVariant = (typeof BUTTON_VARIANTS)[number];\n\n/** Available button sizes. `md` is the 44px touch target Cairn asks for everywhere. */\nexport const BUTTON_SIZES = ['sm', 'md', 'lg'] as const;\nexport type ButtonSize = (typeof BUTTON_SIZES)[number];\n\nconst BASE_CLASSES =\n // Tailwind's preflight sets buttons to cursor: default (matching the native element) since v3.4:\n // cursor-pointer restores the hand cursor consumers expect from a clickable control.\n 'inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors cursor-pointer focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) disabled:pointer-events-none disabled:opacity-50';\n\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n 'bg-(--primary) bg-linear-135 from-(--primary) to-(--primary-to) text-(--primary-foreground) hover:opacity-90',\n secondary: 'bg-(--secondary) text-(--secondary-foreground) hover:bg-(--secondary)/80',\n outline: 'border border-(--border) bg-transparent hover:bg-(--soft)',\n destructive: 'bg-(--destructive) text-(--destructive-foreground) hover:bg-(--destructive)/90',\n ghost: 'hover:bg-(--accent) hover:text-(--accent-foreground)',\n};\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n sm: 'h-9 px-3 text-[13px]',\n md: 'h-11 px-4 text-sm',\n lg: 'h-12 px-6 text-base',\n};\n\n/**\n * Styled native button. Applied as an attribute so the host keeps every native\n * button behavior (type, disabled, form submission, accessibility) for free.\n *\n * Also applies to an anchor, for the one case where the action really is a navigation:\n * a download the browser has to perform itself. The element stays a link, and so does\n * its role - never use this to make an ordinary link look like a form control.\n *\n * @example\n * <button ui-button variant=\"destructive\" size=\"sm\">Delete</button>\n * <a ui-button variant=\"outline\" href=\"/api/holdings/export\" download>Export</a>\n */\n@Component({\n selector: 'button[ui-button], a[ui-button]',\n template: '<ng-content />',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiButton {\n readonly variant = input<ButtonVariant>('primary');\n readonly size = input<ButtonSize>('md');\n\n protected readonly classes = computed(\n () => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]} ${SIZE_CLASSES[this.size()]}`,\n );\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Available card variants. `CardVariant` is derived from this tuple. */\nexport const CARD_VARIANTS = ['default', 'elevated'] as const;\nexport type CardVariant = (typeof CARD_VARIANTS)[number];\n\n/** Available card paddings. `CardPadding` is derived from this tuple. */\nexport const CARD_PADDINGS = ['none', 'sm', 'md'] as const;\nexport type CardPadding = (typeof CARD_PADDINGS)[number];\n\nconst BASE_CLASSES = 'block rounded-xl border';\n\nconst VARIANT_CLASSES: Record<CardVariant, string> = {\n default: 'bg-(--card) border-(--border) text-(--card-foreground)',\n elevated: 'bg-(--elevated) border-(--hairline) text-(--foreground)',\n};\n\nconst PADDING_CLASSES: Record<CardPadding, string> = {\n none: 'p-0',\n sm: 'p-3',\n md: 'p-5',\n};\n\n/**\n * Surface that groups related content: a summary block, a table, a side panel.\n *\n * @example\n * <ui-card variant=\"elevated\" padding=\"sm\">Total</ui-card>\n */\n@Component({\n selector: 'ui-card',\n template: '<ng-content />',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiCard {\n readonly variant = input<CardVariant>('default');\n readonly padding = input<CardPadding>('md');\n\n protected readonly classes = computed(\n () => `${BASE_CLASSES} ${VARIANT_CLASSES[this.variant()]} ${PADDING_CLASSES[this.padding()]}`,\n );\n}\n","import { InjectionToken, type Signal } from '@angular/core';\n\n/**\n * The part of a validation error this library reads. Angular's own `ValidationError` satisfies it,\n * which is how a Signal Forms error reaches a field without this package depending on\n * `@angular/forms`.\n */\nexport type UiControlError = { readonly message?: string };\n\n/** What a styled control offers the field wrapped around it. */\nexport type UiControl = {\n readonly errors: Signal<readonly UiControlError[]>;\n readonly touched: Signal<boolean>;\n};\n\n/**\n * Resolves to the styled control projected into a field.\n *\n * Angular's `[formField]` directive fills any input named `errors` or `touched` on the directives\n * sitting on its host element, so a control declaring them receives its own validation state with\n * nothing written at the call site. This token is how the field finds whichever control was\n * projected into it.\n */\nexport const UI_CONTROL = new InjectionToken<UiControl>('UI_CONTROL');\n","import { Component, computed, input } from '@angular/core';\n\n/** Available delta emphases. `DeltaEmphasis` is derived from this tuple. */\nexport const DELTA_EMPHASES = ['text', 'pill'] as const;\nexport type DeltaEmphasis = (typeof DELTA_EMPHASES)[number];\n\nconst BASE_CLASSES = 'inline-flex items-center gap-1 font-semibold tabular-nums';\n\nconst PILL_CLASSES = 'rounded-md px-2.5 py-1';\n\ntype Sign = 'positive' | 'negative' | 'neutral' | 'unknown';\n\nconst TEXT_CLASSES: Record<Sign, string> = {\n positive: 'text-(--positive)',\n negative: 'text-(--negative)',\n neutral: 'text-(--muted-foreground)',\n unknown: 'text-(--subtle-foreground)',\n};\n\nconst PILL_BACKGROUND_CLASS = 'bg-(--muted)';\n\n/**\n * Signed amount whose sign carries meaning: a gain, a loss, or an unknown.\n *\n * A null value is not a zero: a holding with no cost basis exists, and showing 0 would falsely\n * claim a known gain of zero. Color never carries the sign on its own: the projected text must\n * already contain a + or a minus sign.\n *\n * @example\n * <ui-delta [value]=\"holding.dayChangeEur\" unknownLabel=\"Not available\">\n * {{ holding.dayChangeEur | signedMoney }}\n * </ui-delta>\n */\n@Component({\n selector: 'ui-delta',\n template: `\n @if (sign() === 'unknown') {\n <span aria-hidden=\"true\">—</span>\n <span class=\"sr-only\">{{ unknownLabel() }}</span>\n } @else {\n <ng-content />\n }\n `,\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiDelta {\n readonly value = input.required<number | null | undefined>();\n readonly unknownLabel = input.required<string>();\n readonly emphasis = input<DeltaEmphasis>('text');\n\n protected readonly sign = computed<Sign>(() => {\n const value = this.value();\n\n if (value === null || value === undefined) {\n return 'unknown';\n }\n if (value > 0) {\n return 'positive';\n }\n if (value < 0) {\n return 'negative';\n }\n return 'neutral';\n });\n\n protected readonly classes = computed(() => {\n const sign = this.sign();\n const background = this.emphasis() === 'pill' ? `${PILL_CLASSES} ${PILL_BACKGROUND_CLASS}` : 'bg-transparent';\n\n return `${BASE_CLASSES} ${TEXT_CLASSES[sign]} ${background}`;\n });\n}\n","import { Component, ElementRef, computed, effect, inject, input, output } from '@angular/core';\n\n/** Available dialog widths. `DialogWidth` is derived from this tuple. */\nexport const DIALOG_WIDTHS = ['md', 'lg'] as const;\nexport type DialogWidth = (typeof DIALOG_WIDTHS)[number];\n\nconst WIDTH_CLASSES: Record<DialogWidth, string> = {\n md: 'max-w-md',\n lg: 'max-w-lg',\n};\n\nconst nextId = (() => {\n let count = 0;\n\n return () => `ui-dialog-${++count}`;\n})();\n\n/**\n * Modal dialog on the native <dialog>: focus trap, focus return, Escape and the top layer\n * come from the platform. Two projection slots - the body, and [dialogActions] for the footer.\n *\n * @example\n * <ui-dialog heading=\"Delete this holding?\" [open]=\"confirming()\" (dismissed)=\"confirming.set(false)\">\n * <p>This cannot be undone.</p>\n * <button dialogActions ui-button variant=\"outline\" (click)=\"confirming.set(false)\">Cancel</button>\n * </ui-dialog>\n */\n@Component({\n selector: 'ui-dialog',\n template: `\n <dialog\n [attr.aria-describedby]=\"description() ? descriptionId : null\"\n [attr.aria-labelledby]=\"headingId\"\n [class]=\"classes()\"\n (close)=\"onNativeClose()\"\n >\n <h2 class=\"text-lg font-semibold tracking-tight\" [id]=\"headingId\">{{ heading() }}</h2>\n\n @if (description()) {\n <p class=\"mt-2 text-sm text-(--muted-foreground)\" [id]=\"descriptionId\">{{ description() }}</p>\n }\n\n <!-- empty:hidden keeps a body-less dialog from carrying the body's top margin. -->\n <div class=\"mt-4 flex flex-col gap-4 empty:hidden\">\n <ng-content />\n </div>\n\n <div class=\"mt-6 flex justify-end gap-3\">\n <ng-content select=\"[dialogActions]\" />\n </div>\n </dialog>\n `,\n})\nexport class UiDialog {\n readonly heading = input.required<string>();\n readonly description = input<string>();\n readonly width = input<DialogWidth>('lg');\n readonly open = input(false);\n readonly dismissed = output<void>();\n\n protected readonly headingId = nextId();\n protected readonly descriptionId = `${this.headingId}-description`;\n\n protected readonly classes = computed(\n () =>\n `w-full m-auto ${WIDTH_CLASSES[this.width()]} rounded-xl border border-(--border) bg-(--card) p-6 text-(--foreground) backdrop:bg-black/60`,\n );\n\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n constructor() {\n effect(() => {\n // viewChild.required can't target a #private field (NG1053); safe because the template has exactly one <dialog>.\n const dialog = this.#host.nativeElement.querySelector('dialog') as HTMLDialogElement;\n\n if (this.open() && !dialog.open) {\n dialog.showModal();\n } else if (!this.open() && dialog.open) {\n dialog.close();\n }\n });\n }\n\n protected onNativeClose(): void {\n // The owner already knows about a close it asked for; only a close it did not ask for is news.\n if (this.open()) {\n this.dismissed.emit();\n }\n }\n}\n","import {\n Component,\n ElementRef,\n afterRenderEffect,\n booleanAttribute,\n computed,\n contentChild,\n inject,\n input,\n} from '@angular/core';\n\nimport { UI_CONTROL } from '../control/control';\n\nconst nextId = (() => {\n let count = 0;\n\n return (): string => `ui-field-${++count}`;\n})();\n\n/**\n * Label, control, hint and error as one unit. The control stays a plain native element:\n * the field finds it in its own projected content and wires the ARIA attributes onto it.\n *\n * The message comes from the caller's `error`, or, where none is set, from the projected control's\n * own validation state once it is touched.\n *\n * @example\n * <ui-field label=\"Quantity\" hint=\"Leave empty if unknown\">\n * <input uiInput type=\"number\" [formField]=\"form.quantity\" />\n * </ui-field>\n *\n * @example\n * <ui-field label=\"ISIN or name\" [error]=\"blank() ? 'Enter an ISIN' : undefined\">\n * <input uiInput type=\"search\" />\n * </ui-field>\n *\n * @example\n * <ui-field label=\"Search holdings\" labelHidden>\n * <input uiInput type=\"search\" placeholder=\"Instrument or account\" />\n * </ui-field>\n */\n@Component({\n selector: 'ui-field',\n template: `\n <div class=\"group flex flex-col gap-1.5\">\n <!-- eslint-disable-next-line @angular-eslint/template/label-has-associated-control -- htmlFor is wired at runtime, once the projected control's id is known -->\n <label [class]=\"labelClasses()\">{{ label() }}</label>\n\n <ng-content />\n\n @if (hint()) {\n <span class=\"text-[11.5px] text-(--subtle-foreground)\" [id]=\"hintId\">{{ hint() }}</span>\n }\n\n @if (message()) {\n <p class=\"text-[11.5px] text-(--negative)\" role=\"alert\" [id]=\"errorId\">{{ message() }}</p>\n }\n </div>\n `,\n})\nexport class UiField {\n readonly label = input.required<string>();\n readonly labelHidden = input(false, { transform: booleanAttribute });\n readonly hint = input<string>();\n readonly error = input<string>();\n\n readonly #id = nextId();\n protected readonly hintId = `${this.#id}-hint`;\n protected readonly errorId = `${this.#id}-error`;\n readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n protected readonly control = contentChild(UI_CONTROL);\n\n protected readonly labelClasses = computed(() =>\n this.labelHidden() ? 'sr-only' : 'text-[13px] font-medium text-(--foreground)',\n );\n\n /**\n * The caller's own `error` wins: it is the only way to report something the control does not\n * know about, such as a search box refusing an empty query.\n */\n protected readonly message = computed(() => {\n const explicit = this.error();\n\n if (explicit) {\n return explicit;\n }\n\n const control = this.control();\n\n if (!control?.touched()) {\n return undefined;\n }\n\n return control.errors().find((error) => error.message)?.message;\n });\n\n constructor() {\n afterRenderEffect(() => {\n // querySelector, not viewChild.required, so the \"no control found\" guard below stays reachable and testable.\n const control = this.#host.nativeElement.querySelector<HTMLElement>('input, select, textarea');\n\n if (!control) {\n return;\n }\n\n control.id ||= this.#id;\n this.#host.nativeElement.querySelector('label')!.htmlFor = control.id;\n\n const describedBy = [this.hint() ? this.hintId : null, this.message() ? this.errorId : null].filter(Boolean);\n\n if (describedBy.length > 0) {\n control.setAttribute('aria-describedby', describedBy.join(' '));\n } else {\n control.removeAttribute('aria-describedby');\n }\n\n if (this.message()) {\n control.setAttribute('aria-invalid', 'true');\n } else {\n control.removeAttribute('aria-invalid');\n }\n });\n }\n}\n","import { Directive, computed, forwardRef, input } from '@angular/core';\n\nimport { UI_CONTROL, type UiControl, type UiControlError } from '../control/control';\n\n/** Available control sizes. `md` is the 44px touch target. */\nexport const CONTROL_SIZES = ['sm', 'md'] as const;\nexport type ControlSize = (typeof CONTROL_SIZES)[number];\n\nexport const CONTROL_BASE_CLASSES =\n 'w-full rounded-md border border-(--border) bg-transparent px-3 text-sm text-(--foreground) transition-colors placeholder:text-(--muted-foreground) enabled:hover:outline-2 enabled:hover:outline-offset-2 enabled:hover:outline-(--ring) enabled:group-hover:outline-2 enabled:group-hover:outline-offset-2 enabled:group-hover:outline-(--ring) focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring) disabled:cursor-not-allowed disabled:opacity-50';\n\nexport const CONTROL_SIZE_CLASSES: Record<ControlSize, string> = {\n sm: 'h-9',\n md: 'h-11',\n};\n\n/**\n * Styled native text input. A directive (not a wrapper component) so the host\n * stays a plain <input>: every forms flavor (ngModel, reactive, signal forms)\n * and every native attribute keep working without any plumbing.\n *\n * Declares the `errors` and `touched` inputs Angular's `[formField]` fills, so a `ui-field` around\n * it can show the message without any binding here.\n *\n * @example\n * <input uiInput type=\"email\" placeholder=\"you@example.com\" />\n */\n@Directive({\n selector: 'input[uiInput]',\n host: {\n '[class]': 'classes()',\n },\n providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiInput) }],\n})\nexport class UiInput implements UiControl {\n readonly size = input<ControlSize>('md');\n readonly errors = input<readonly UiControlError[]>([]);\n readonly touched = input(false);\n\n protected readonly classes = computed(() => `${CONTROL_BASE_CLASSES} ${CONTROL_SIZE_CLASSES[this.size()]}`);\n}\n\n/**\n * Styled native textarea. Lives beside the input because it shares every one of its\n * classes; it takes no size, since a textarea grows from a floor instead of sitting\n * at a fixed height.\n *\n * Declares the `errors` and `touched` inputs Angular's `[formField]` fills, so a `ui-field` around\n * it can show the message without any binding here.\n *\n * @example\n * <textarea uiTextarea maxlength=\"280\"></textarea>\n */\n@Directive({\n selector: 'textarea[uiTextarea]',\n host: {\n class: `${CONTROL_BASE_CLASSES} min-h-24 py-2`,\n },\n providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiTextarea) }],\n})\nexport class UiTextarea implements UiControl {\n readonly errors = input<readonly UiControlError[]>([]);\n readonly touched = input(false);\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Ramp step used to paint the fill. `MeterTone` is derived from this tuple. */\nexport const METER_TONES = [1, 2, 3, 4, 5, 6] as const;\nexport type MeterTone = (typeof METER_TONES)[number];\n\nconst TONE_CLASSES: Record<MeterTone, string> = {\n 1: 'bg-(--ramp-1)',\n 2: 'bg-(--ramp-2)',\n 3: 'bg-(--ramp-3)',\n 4: 'bg-(--ramp-4)',\n 5: 'bg-(--ramp-5)',\n 6: 'bg-(--ramp-6)',\n};\n\n/**\n * Proportion of a whole, drawn as a single bar. One bar per category, never a stacked\n * strip: without hue to separate segments, length has to do the work alone.\n *\n * @example\n * <ui-meter [value]=\"0.463\" label=\"Funds\" valueText=\"46.3% - 128,656.00 EUR\" [tone]=\"1\" />\n */\n@Component({\n selector: 'ui-meter',\n template: `\n <div\n class=\"h-2.5 w-full overflow-hidden rounded-sm bg-(--elevated)\"\n role=\"meter\"\n [attr.aria-label]=\"label()\"\n [attr.aria-valuemax]=\"1\"\n [attr.aria-valuemin]=\"0\"\n [attr.aria-valuenow]=\"value()\"\n [attr.aria-valuetext]=\"valueText()\"\n >\n <div data-testid=\"meter-fill\" [class]=\"fillClasses()\" [style.width.%]=\"percent()\"></div>\n </div>\n `,\n})\nexport class UiMeter {\n readonly value = input.required<number>();\n readonly label = input.required<string>();\n readonly valueText = input.required<string>();\n readonly tone = input<MeterTone>(1);\n\n protected readonly percent = computed(() => Math.min(100, Math.max(0, this.value() * 100)));\n\n protected readonly fillClasses = computed(() => `h-full rounded-sm ${TONE_CLASSES[this.tone()]}`);\n}\n","import { Component, ElementRef, input, model, viewChildren } from '@angular/core';\n\nexport type SegmentedOption = {\n value: string;\n label: string;\n};\n\nconst OPTION_CLASSES =\n 'min-h-11 flex-1 cursor-pointer rounded-md px-3 text-xs font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-(--ring)';\n\nconst SELECTED_CLASSES = 'bg-(--primary) bg-linear-135 from-(--primary) to-(--primary-to) text-(--primary-foreground)';\n\nconst UNSELECTED_CLASSES = 'bg-(--elevated) text-(--muted-foreground) hover:text-(--foreground)';\n\n/**\n * Exclusive choice within a small, known set: a time range, a unit, a mode.\n *\n * @example\n * <ui-segmented [options]=\"ranges\" label=\"Time range\" [(value)]=\"range\" />\n */\n@Component({\n selector: 'ui-segmented',\n template: `\n <div class=\"flex gap-1\" role=\"radiogroup\" [attr.aria-label]=\"label()\">\n @for (option of options(); track option.value) {\n <button\n #radio\n role=\"radio\"\n type=\"button\"\n [attr.aria-checked]=\"option.value === value()\"\n [attr.tabindex]=\"tabIndexFor(option.value)\"\n [class]=\"optionClasses(option.value)\"\n (click)=\"select(option.value)\"\n (keydown)=\"onKeydown($event)\"\n >\n {{ option.label }}\n </button>\n }\n </div>\n `,\n})\nexport class UiSegmented {\n readonly options = input.required<SegmentedOption[]>();\n readonly label = input.required<string>();\n readonly value = model.required<string>();\n\n protected readonly radios = viewChildren<ElementRef<HTMLButtonElement>>('radio');\n\n protected optionClasses(optionValue: string): string {\n return `${OPTION_CLASSES} ${optionValue === this.value() ? SELECTED_CLASSES : UNSELECTED_CLASSES}`;\n }\n\n protected tabIndexFor(optionValue: string): number {\n const opts = this.options();\n const tabStopValue = opts.some((option) => option.value === this.value()) ? this.value() : opts[0]?.value;\n\n return optionValue === tabStopValue ? 0 : -1;\n }\n\n protected select(optionValue: string): void {\n this.value.set(optionValue);\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n const delta = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 }[event.key];\n if (delta === undefined) {\n return;\n }\n event.preventDefault();\n\n const opts = this.options();\n const currentIndex = opts.findIndex((option) => option.value === this.value());\n const nextIndex = (currentIndex + delta + opts.length) % opts.length;\n const next = opts[nextIndex]!;\n\n this.value.set(next.value);\n this.radios()[nextIndex]?.nativeElement.focus();\n }\n}\n","import { Directive, computed, forwardRef, input } from '@angular/core';\n\nimport { UI_CONTROL, type UiControl, type UiControlError } from '../control/control';\nimport { CONTROL_BASE_CLASSES, CONTROL_SIZE_CLASSES, type ControlSize } from '../input/input';\n\nconst SELECT_CLASSES = 'cursor-pointer pr-8';\n\n// Spelled out prefix included: Tailwind scans for literal strings, so a prefix applied in code\n// emits nothing. Dropping `supports` leaves Firefox the padding of a chevron it does not lay out.\nconst PICKER_CLASSES = [\n 'pointer-fine:supports-[appearance:base-select]:[appearance:base-select]',\n 'pointer-fine:supports-[appearance:base-select]:items-center',\n 'pointer-fine:supports-[appearance:base-select]:pr-3',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:cursor-pointer',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:rounded-md',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:px-2.5',\n 'pointer-fine:supports-[appearance:base-select]:[&_option]:py-2',\n 'pointer-fine:supports-[appearance:base-select]:[&_option:hover]:bg-(--soft)',\n 'pointer-fine:supports-[appearance:base-select]:[&_option:focus]:bg-(--soft)',\n 'pointer-fine:supports-[appearance:base-select]:[&_option:checked]:font-medium',\n '[&::picker-icon]:text-[11px]',\n '[&::picker-icon]:text-(--muted-foreground)',\n '[&::picker(select)]:[appearance:base-select]',\n '[&::picker(select)]:my-1.5',\n '[&::picker(select)]:rounded-lg',\n '[&::picker(select)]:border',\n '[&::picker(select)]:border-(--border)',\n '[&::picker(select)]:bg-(--card)',\n '[&::picker(select)]:[position-try-fallbacks:none]',\n '[&::picker(select)]:overflow-y-auto',\n '[&::picker(select)]:p-1',\n '[&::picker(select)]:text-(--card-foreground)',\n].join(' ');\n\n/**\n * Styled native select, drop-down list included where the browser allows it. It stays a native\n * `<select>`: keyboard, typeahead and semantics come from the platform, not from a rebuilt listbox.\n *\n * Declares the `errors` and `touched` inputs Angular's `[formField]` fills, so a `ui-field` around\n * it can show the message without any binding here.\n *\n * @example\n * <select uiSelect><option value=\"pea\">PEA</option></select>\n */\n@Directive({\n selector: 'select[uiSelect]',\n host: {\n '[class]': 'classes()',\n },\n providers: [{ provide: UI_CONTROL, useExisting: forwardRef(() => UiSelect) }],\n})\nexport class UiSelect implements UiControl {\n readonly size = input<ControlSize>('md');\n readonly errors = input<readonly UiControlError[]>([]);\n readonly touched = input(false);\n\n protected readonly classes = computed(\n () => `${CONTROL_BASE_CLASSES} ${SELECT_CLASSES} ${PICKER_CLASSES} ${CONTROL_SIZE_CLASSES[this.size()]}`,\n );\n}\n","import { Component, computed, input } from '@angular/core';\n\nconst LAST_LINE_WIDTH = '62%';\n\n/**\n * Decorative placeholder for content that is still loading. Deliberately hidden from\n * assistive technology: the calling screen keeps its own role=\"status\" sentence.\n *\n * @example\n * <ui-skeleton [lines]=\"3\" />\n * <ui-skeleton [height]=\"196\" />\n */\n@Component({\n selector: 'ui-skeleton',\n template: `\n @for (line of bars(); track $index) {\n <span\n class=\"block rounded bg-(--soft) motion-safe:animate-pulse\"\n [style.height.px]=\"height()\"\n [style.width]=\"line\"\n ></span>\n }\n `,\n host: {\n 'aria-hidden': 'true',\n class: 'flex flex-col gap-2',\n },\n})\nexport class UiSkeleton {\n readonly lines = input(1);\n readonly height = input(12);\n\n protected readonly bars = computed(() => {\n const count = Math.max(1, this.lines());\n\n return Array.from({ length: count }, (_, index) => (index === count - 1 && count > 1 ? LAST_LINE_WIDTH : '100%'));\n });\n}\n","import { Component, computed, input } from '@angular/core';\n\n/** Available stat sizes. `StatSize` is derived from this tuple. */\nexport const STAT_SIZES = ['hero', 'tile'] as const;\nexport type StatSize = (typeof STAT_SIZES)[number];\n\nconst VALUE_CLASSES: Record<StatSize, string> = {\n hero: 'text-[48px] leading-[1.1] font-semibold text-(--foreground)',\n tile: 'text-2xl font-semibold text-(--foreground)',\n};\n\nconst LABEL_CLASSES = 'text-[13px] font-medium text-(--subtle-foreground)';\n\n/**\n * Label, figure and a named period of change, at two sizes: a `hero` for a screen's single\n * headline number, or a smaller `tile` repeated in a grid. The figure itself, its delta and its\n * caption are all projected, so the component carries no formatting and no currency of its own.\n *\n * The `hero` size never sets `tabular-nums` on the figure: a lone headline number reads better\n * with its digits at their natural width, unlike a column of aligned figures.\n *\n * @example\n * <ui-stat label=\"Net worth\" size=\"hero\">\n * <span uiStatValue>128,656 EUR</span>\n * <ui-delta uiStatDelta [value]=\"dayChange()\" unknownLabel=\"Not available\">+316.54 EUR</ui-delta>\n * <span uiStatCaption>today</span>\n * </ui-stat>\n */\n@Component({\n selector: 'ui-stat',\n template: `\n <div class=\"flex items-start justify-between gap-4\">\n <div class=\"flex flex-col gap-1\">\n <dl>\n <dt [class]=\"labelClasses\">{{ label() }}</dt>\n <dd [class]=\"valueClasses()\">\n <ng-content select=\"[uiStatValue]\" />\n </dd>\n </dl>\n\n <div class=\"flex flex-wrap items-center gap-x-2 gap-y-1 text-sm text-(--muted-foreground)\">\n <ng-content select=\"[uiStatDelta]\" />\n <ng-content select=\"[uiStatCaption]\" />\n </div>\n </div>\n\n <ng-content select=\"[uiStatAside]\" />\n </div>\n `,\n})\nexport class UiStat {\n readonly label = input.required<string>();\n readonly size = input<StatSize>('tile');\n\n protected readonly labelClasses = LABEL_CLASSES;\n\n protected readonly valueClasses = computed(() => VALUE_CLASSES[this.size()]);\n}\n","import { Directive, booleanAttribute, computed, input } from '@angular/core';\n\n/** Breakpoints a secondary column can be held back until. */\nexport const CELL_BREAKPOINTS = ['md', 'lg'] as const;\nexport type CellBreakpoint = (typeof CELL_BREAKPOINTS)[number];\n\nconst FROM_CLASSES: Record<CellBreakpoint, string> = {\n md: 'hidden md:table-cell',\n lg: 'hidden lg:table-cell',\n};\n\nconst TH_CLASSES =\n 'px-3 py-2 align-bottom text-[11px] font-medium uppercase tracking-[0.05em] text-(--subtle-foreground)';\nconst TD_CLASSES = 'border-t border-(--hairline) px-3 py-2.5 align-middle text-sm';\nconst NUMERIC_CLASSES = 'text-right tabular-nums';\nconst TEXTUAL_CLASSES = 'text-left';\n\n/** Styled native table. The rows and cells stay plain <tr> and <td>. */\n@Directive({\n selector: 'table[uiTable]',\n host: {\n class: 'w-full border-collapse',\n },\n})\nexport class UiTable {}\n\nconst cellClasses = (base: string, numeric: boolean, from: CellBreakpoint | null): string =>\n [base, numeric ? NUMERIC_CLASSES : TEXTUAL_CLASSES, from ? FROM_CLASSES[from] : ''].filter(Boolean).join(' ');\n\n/**\n * Column header. `numeric` right-aligns and lines the digits up; `from` holds a\n * secondary column back until the viewport is wide enough for it.\n *\n * @example\n * <th uiTh numeric from=\"md\">Average cost</th>\n */\n@Directive({\n selector: 'th[uiTh]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiTh {\n readonly numeric = input(false, { transform: booleanAttribute });\n readonly from = input<CellBreakpoint | null>(null);\n\n protected readonly classes = computed(() => cellClasses(TH_CLASSES, this.numeric(), this.from()));\n}\n\n/** Body cell. Same two inputs as `UiTh`, and they must be set on both to match. */\n@Directive({\n selector: 'td[uiTd]',\n host: {\n '[class]': 'classes()',\n },\n})\nexport class UiTd {\n readonly numeric = input(false, { transform: booleanAttribute });\n readonly from = input<CellBreakpoint | null>(null);\n\n protected readonly classes = computed(() => cellClasses(TD_CLASSES, this.numeric(), this.from()));\n}\n","/*\n * Public API surface of the ui library.\n */\n\nexport { AVATAR_SIZES, UiAvatar, type AvatarSize } from './lib/avatar/avatar';\nexport { BADGE_VARIANTS, UiBadge, type BadgeVariant } from './lib/badge/badge';\nexport { BUTTON_SIZES, BUTTON_VARIANTS, UiButton, type ButtonSize, type ButtonVariant } from './lib/button/button';\nexport { CARD_PADDINGS, CARD_VARIANTS, UiCard, type CardPadding, type CardVariant } from './lib/card/card';\nexport { type UiControlError } from './lib/control/control';\nexport { DELTA_EMPHASES, UiDelta, type DeltaEmphasis } from './lib/delta/delta';\nexport { DIALOG_WIDTHS, UiDialog, type DialogWidth } from './lib/dialog/dialog';\nexport { UiField } from './lib/field/field';\nexport { CONTROL_SIZES, UiInput, UiTextarea, type ControlSize } from './lib/input/input';\nexport { METER_TONES, UiMeter, type MeterTone } from './lib/meter/meter';\nexport { UiSegmented, type SegmentedOption } from './lib/segmented/segmented';\nexport { UiSelect } from './lib/select/select';\nexport { UiSkeleton } from './lib/skeleton/skeleton';\nexport { STAT_SIZES, UiStat, type StatSize } from './lib/stat/stat';\nexport { CELL_BREAKPOINTS, UiTable, UiTd, UiTh, type CellBreakpoint } from './lib/table/table';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["BASE_CLASSES","SIZE_CLASSES","VARIANT_CLASSES","nextId"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@ type AvatarSize = (typeof AVATAR_SIZES)[number];
|
|
|
13
13
|
declare class UiAvatar {
|
|
14
14
|
readonly initials: _angular_core.InputSignal<string>;
|
|
15
15
|
readonly label: _angular_core.InputSignal<string>;
|
|
16
|
-
readonly size: _angular_core.InputSignal<"
|
|
16
|
+
readonly size: _angular_core.InputSignal<"sm" | "md">;
|
|
17
17
|
protected readonly classes: _angular_core.Signal<string>;
|
|
18
18
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiAvatar, never>;
|
|
19
19
|
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>;
|
|
@@ -55,7 +55,7 @@ type ButtonSize = (typeof BUTTON_SIZES)[number];
|
|
|
55
55
|
*/
|
|
56
56
|
declare class UiButton {
|
|
57
57
|
readonly variant: _angular_core.InputSignal<"primary" | "secondary" | "destructive" | "outline" | "ghost">;
|
|
58
|
-
readonly size: _angular_core.InputSignal<"
|
|
58
|
+
readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
|
|
59
59
|
protected readonly classes: _angular_core.Signal<string>;
|
|
60
60
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiButton, never>;
|
|
61
61
|
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; }; }, {}, never, ["*"], true, never>;
|
|
@@ -75,7 +75,7 @@ type CardPadding = (typeof CARD_PADDINGS)[number];
|
|
|
75
75
|
*/
|
|
76
76
|
declare class UiCard {
|
|
77
77
|
readonly variant: _angular_core.InputSignal<"default" | "elevated">;
|
|
78
|
-
readonly padding: _angular_core.InputSignal<"
|
|
78
|
+
readonly padding: _angular_core.InputSignal<"sm" | "md" | "none">;
|
|
79
79
|
protected readonly classes: _angular_core.Signal<string>;
|
|
80
80
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiCard, never>;
|
|
81
81
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiCard, "ui-card", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
@@ -166,15 +166,22 @@ declare class UiDialog {
|
|
|
166
166
|
* <ui-field label="ISIN or name" [error]="blank() ? 'Enter an ISIN' : undefined">
|
|
167
167
|
* <input uiInput type="search" />
|
|
168
168
|
* </ui-field>
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* <ui-field label="Search holdings" labelHidden>
|
|
172
|
+
* <input uiInput type="search" placeholder="Instrument or account" />
|
|
173
|
+
* </ui-field>
|
|
169
174
|
*/
|
|
170
175
|
declare class UiField {
|
|
171
176
|
#private;
|
|
172
177
|
readonly label: _angular_core.InputSignal<string>;
|
|
178
|
+
readonly labelHidden: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
173
179
|
readonly hint: _angular_core.InputSignal<string | undefined>;
|
|
174
180
|
readonly error: _angular_core.InputSignal<string | undefined>;
|
|
175
181
|
protected readonly hintId: string;
|
|
176
182
|
protected readonly errorId: string;
|
|
177
183
|
protected readonly control: _angular_core.Signal<UiControl | undefined>;
|
|
184
|
+
protected readonly labelClasses: _angular_core.Signal<"sr-only" | "text-[13px] font-medium text-(--foreground)">;
|
|
178
185
|
/**
|
|
179
186
|
* The caller's own `error` wins: it is the only way to report something the control does not
|
|
180
187
|
* know about, such as a search box refusing an empty query.
|
|
@@ -182,7 +189,7 @@ declare class UiField {
|
|
|
182
189
|
protected readonly message: _angular_core.Signal<string | undefined>;
|
|
183
190
|
constructor();
|
|
184
191
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiField, never>;
|
|
185
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiField, "ui-field", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; }, {}, ["control"], ["*"], true, never>;
|
|
192
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiField, "ui-field", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "labelHidden": { "alias": "labelHidden"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; }, {}, ["control"], ["*"], true, never>;
|
|
186
193
|
}
|
|
187
194
|
|
|
188
195
|
/** Available control sizes. `md` is the 44px touch target. */
|
|
@@ -200,7 +207,7 @@ type ControlSize = (typeof CONTROL_SIZES)[number];
|
|
|
200
207
|
* <input uiInput type="email" placeholder="you@example.com" />
|
|
201
208
|
*/
|
|
202
209
|
declare class UiInput implements UiControl {
|
|
203
|
-
readonly size: _angular_core.InputSignal<"
|
|
210
|
+
readonly size: _angular_core.InputSignal<"sm" | "md">;
|
|
204
211
|
readonly errors: _angular_core.InputSignal<readonly UiControlError[]>;
|
|
205
212
|
readonly touched: _angular_core.InputSignal<boolean>;
|
|
206
213
|
protected readonly classes: _angular_core.Signal<string>;
|
|
@@ -280,7 +287,7 @@ declare class UiSegmented {
|
|
|
280
287
|
* <select uiSelect><option value="pea">PEA</option></select>
|
|
281
288
|
*/
|
|
282
289
|
declare class UiSelect implements UiControl {
|
|
283
|
-
readonly size: _angular_core.InputSignal<"
|
|
290
|
+
readonly size: _angular_core.InputSignal<"sm" | "md">;
|
|
284
291
|
readonly errors: _angular_core.InputSignal<readonly UiControlError[]>;
|
|
285
292
|
readonly touched: _angular_core.InputSignal<boolean>;
|
|
286
293
|
protected readonly classes: _angular_core.Signal<string>;
|
|
@@ -304,6 +311,33 @@ declare class UiSkeleton {
|
|
|
304
311
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiSkeleton, "ui-skeleton", never, { "lines": { "alias": "lines"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
305
312
|
}
|
|
306
313
|
|
|
314
|
+
/** Available stat sizes. `StatSize` is derived from this tuple. */
|
|
315
|
+
declare const STAT_SIZES: readonly ["hero", "tile"];
|
|
316
|
+
type StatSize = (typeof STAT_SIZES)[number];
|
|
317
|
+
/**
|
|
318
|
+
* Label, figure and a named period of change, at two sizes: a `hero` for a screen's single
|
|
319
|
+
* headline number, or a smaller `tile` repeated in a grid. The figure itself, its delta and its
|
|
320
|
+
* caption are all projected, so the component carries no formatting and no currency of its own.
|
|
321
|
+
*
|
|
322
|
+
* The `hero` size never sets `tabular-nums` on the figure: a lone headline number reads better
|
|
323
|
+
* with its digits at their natural width, unlike a column of aligned figures.
|
|
324
|
+
*
|
|
325
|
+
* @example
|
|
326
|
+
* <ui-stat label="Net worth" size="hero">
|
|
327
|
+
* <span uiStatValue>128,656 EUR</span>
|
|
328
|
+
* <ui-delta uiStatDelta [value]="dayChange()" unknownLabel="Not available">+316.54 EUR</ui-delta>
|
|
329
|
+
* <span uiStatCaption>today</span>
|
|
330
|
+
* </ui-stat>
|
|
331
|
+
*/
|
|
332
|
+
declare class UiStat {
|
|
333
|
+
readonly label: _angular_core.InputSignal<string>;
|
|
334
|
+
readonly size: _angular_core.InputSignal<"hero" | "tile">;
|
|
335
|
+
protected readonly labelClasses = "text-[13px] font-medium text-(--subtle-foreground)";
|
|
336
|
+
protected readonly valueClasses: _angular_core.Signal<string>;
|
|
337
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiStat, never>;
|
|
338
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiStat, "ui-stat", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["[uiStatValue]", "[uiStatDelta]", "[uiStatCaption]", "[uiStatAside]"], true, never>;
|
|
339
|
+
}
|
|
340
|
+
|
|
307
341
|
/** Breakpoints a secondary column can be held back until. */
|
|
308
342
|
declare const CELL_BREAKPOINTS: readonly ["md", "lg"];
|
|
309
343
|
type CellBreakpoint = (typeof CELL_BREAKPOINTS)[number];
|
|
@@ -335,5 +369,5 @@ declare class UiTd {
|
|
|
335
369
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UiTd, "td[uiTd]", never, { "numeric": { "alias": "numeric"; "required": false; "isSignal": true; }; "from": { "alias": "from"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
336
370
|
}
|
|
337
371
|
|
|
338
|
-
export { AVATAR_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, DELTA_EMPHASES, DIALOG_WIDTHS, METER_TONES, UiAvatar, UiBadge, UiButton, UiCard, UiDelta, UiDialog, UiField, UiInput, UiMeter, UiSegmented, UiSelect, UiSkeleton, UiTable, UiTd, UiTextarea, UiTh };
|
|
339
|
-
export type { AvatarSize, BadgeVariant, ButtonSize, ButtonVariant, CardPadding, CardVariant, CellBreakpoint, ControlSize, DeltaEmphasis, DialogWidth, MeterTone, SegmentedOption, UiControlError };
|
|
372
|
+
export { AVATAR_SIZES, BADGE_VARIANTS, BUTTON_SIZES, BUTTON_VARIANTS, CARD_PADDINGS, CARD_VARIANTS, CELL_BREAKPOINTS, CONTROL_SIZES, DELTA_EMPHASES, DIALOG_WIDTHS, METER_TONES, STAT_SIZES, UiAvatar, UiBadge, UiButton, UiCard, UiDelta, UiDialog, UiField, UiInput, UiMeter, UiSegmented, UiSelect, UiSkeleton, UiStat, UiTable, UiTd, UiTextarea, UiTh };
|
|
373
|
+
export type { AvatarSize, BadgeVariant, ButtonSize, ButtonVariant, CardPadding, CardVariant, CellBreakpoint, ControlSize, DeltaEmphasis, DialogWidth, MeterTone, SegmentedOption, StatSize, UiControlError };
|